KDE_EXPORT void init_style() { uint flags = KRdbExportQtSettings | KRdbExportQtColors | KRdbExportXftSettings; TDEConfig config("kcmdisplayrc", true /*readonly*/, false /*don't read kdeglobals etc.*/); config.setGroup("X11"); // This key is written by the "colors" module. bool exportKDEColors = config.readBoolEntry("exportKDEColors", true); if (exportKDEColors) flags |= KRdbExportColors; runRdb( flags ); // Write some Qt root property. #ifndef __osf__ // this crashes under Tru64 randomly -- will fix later TQByteArray properties; TQDataStream d(properties, IO_WriteOnly); d.setVersion( 3 ); // Qt2 apps need this. d << kapp->palette() << TDEGlobalSettings::generalFont(); Atom a = XInternAtom(tqt_xdisplay(), "_QT_DESKTOP_PROPERTIES", false); // do it for all root windows - multihead support int screen_count = ScreenCount(tqt_xdisplay()); for (int i = 0; i < screen_count; i++) XChangeProperty(tqt_xdisplay(), RootWindow(tqt_xdisplay(), i), a, a, 8, PropModeReplace, (unsigned char*) properties.data(), properties.size()); #endif }
bool CursorThemeModel::applyCursorTheme(const CursorTheme *theme, const int size) { // Require the Xcursor version that shipped with X11R6.9 or greater, since // in previous versions the Xfixes code wasn't enabled due to a bug in the // build system (freedesktop bug #975). #if HAVE_XFIXES && XFIXES_MAJOR >= 2 && XCURSOR_LIB_VERSION >= 10105 if (!theme) return false; if (!CursorTheme::haveXfixes()) return false; QByteArray themeName = QFile::encodeName(theme->name()); // Set up the proper launch environment for newly started apps OrgKdeKLauncherInterface klauncher(QStringLiteral("org.kde.klauncher5"), QStringLiteral("/KLauncher"), QDBusConnection::sessionBus()); klauncher.setLaunchEnv(QStringLiteral("XCURSOR_THEME"), themeName); // Update the Xcursor X resources runRdb(0); // Notify all applications that the cursor theme has changed KGlobalSettings::self()->emitChange(KGlobalSettings::CursorChanged); // Reload the standard cursors QStringList names; // Qt cursors names << QStringLiteral("left_ptr") << QStringLiteral("up_arrow") << QStringLiteral("cross") << QStringLiteral("wait") << QStringLiteral("left_ptr_watch") << QStringLiteral("ibeam") << QStringLiteral("size_ver") << QStringLiteral("size_hor") << QStringLiteral("size_bdiag") << QStringLiteral("size_fdiag") << QStringLiteral("size_all") << QStringLiteral("split_v") << QStringLiteral("split_h") << QStringLiteral("pointing_hand") << QStringLiteral("openhand") << QStringLiteral("closedhand") << QStringLiteral("forbidden") << QStringLiteral("whats_this") << QStringLiteral("copy") << QStringLiteral("move") << QStringLiteral("link"); // X core cursors names << QStringLiteral("X_cursor") << QStringLiteral("right_ptr") << QStringLiteral("hand1") << QStringLiteral("hand2") << QStringLiteral("watch") << QStringLiteral("xterm") << QStringLiteral("crosshair") << QStringLiteral("left_ptr_watch") << QStringLiteral("center_ptr") << QStringLiteral("sb_h_double_arrow") << QStringLiteral("sb_v_double_arrow") << QStringLiteral("fleur") << QStringLiteral("top_left_corner") << QStringLiteral("top_side") << QStringLiteral("top_right_corner") << QStringLiteral("right_side") << QStringLiteral("bottom_right_corner") << QStringLiteral("bottom_side") << QStringLiteral("bottom_left_corner") << QStringLiteral("left_side") << QStringLiteral("question_arrow") << QStringLiteral("pirate"); foreach (const QString &name, names) { XFixesChangeCursorByName(QX11Info::display(), theme->loadCursor(name, size), QFile::encodeName(name)); }
void KCMStyle::save() { // Don't do anything if we don't need to. if ( !(m_bToolbarsDirty | m_bEffectsDirty | m_bStyleDirty ) ) return; bool allowMenuTransparency = false; bool allowMenuDropShadow = false; // Read the TDEStyle flags to see if the style writer // has enabled menu translucency in the style. if (appliedStyle && appliedStyle->inherits("TDEStyle")) { allowMenuDropShadow = true; TDEStyle* style = dynamic_cast<TDEStyle*>(appliedStyle); if (style) { TDEStyle::TDEStyleFlags flags = style->styleFlags(); if (flags & TDEStyle::AllowMenuTransparency) allowMenuTransparency = true; } } TQString warn_string( i18n("<qt>Selected style: <b>%1</b><br><br>" "One or more effects that you have chosen could not be applied because the selected " "style does not support them; they have therefore been disabled.<br>" "<br>" ).arg( cbStyle->currentText()) ); bool show_warning = false; // Warn the user if they're applying a style that doesn't support // menu translucency and they enabled it. if ( (!allowMenuTransparency) && (cbEnableEffects->isChecked()) && (comboMenuEffect->currentItem() == 3) ) // Make Translucent { warn_string += i18n("Menu translucency is not available.<br>"); comboMenuEffect->setCurrentItem(0); // Disable menu effect. show_warning = true; } if (!allowMenuDropShadow && cbMenuShadow->isChecked()) { warn_string += i18n("Menu drop-shadows are not available."); cbMenuShadow->setChecked(false); show_warning = true; } // Tell the user what features we could not apply on their behalf. if (show_warning) KMessageBox::information(this, warn_string); // Save effects. TDEConfig config( "kdeglobals" ); config.setGroup("KDE"); config.writeEntry( "EffectsEnabled", cbEnableEffects->isChecked()); int item = comboComboEffect->currentItem(); config.writeEntry( "EffectAnimateCombo", item == 1 ); item = comboTooltipEffect->currentItem(); config.writeEntry( "EffectAnimateTooltip", item == 1); config.writeEntry( "EffectFadeTooltip", item == 2 ); item = comboRubberbandEffect->currentItem(); { TQSettings settings; // Only for TDEStyle stuff settings.writeEntry("/TDEStyle/Settings/SemiTransparentRubberband", item == 1); } item = comboMenuHandle->currentItem(); config.writeEntry( "InsertTearOffHandle", item ); item = comboMenuEffect->currentItem(); config.writeEntry( "EffectAnimateMenu", item == 1 ); config.writeEntry( "EffectFadeMenu", item == 2 ); // Handle TDEStyle's menu effects TQString engine("Disabled"); if (item == 3 && cbEnableEffects->isChecked()) // Make Translucent switch( comboMenuEffectType->currentItem()) { case 1: engine = "SoftwareBlend"; break; case 2: engine = "XRender"; break; default: case 0: engine = "SoftwareTint"; break; } { // Braces force a TQSettings::sync() TQSettings settings; // Only for TDEStyle stuff settings.writeEntry("/TDEStyle/Settings/MenuTransparencyEngine", engine); settings.writeEntry("/TDEStyle/Settings/MenuOpacity", slOpacity->value()/100.0); settings.writeEntry("/TDEStyle/Settings/MenuDropShadow", cbEnableEffects->isChecked() && cbMenuShadow->isChecked() ); } // Misc page config.writeEntry( "ShowIconsOnPushButtons", cbIconsOnButtons->isChecked(), true, true ); { // Braces force a TQSettings::sync() TQSettings settings; // Only for TDEStyle stuff settings.writeEntry("/TDEStyle/Settings/ScrollablePopupMenus", cbScrollablePopupMenus->isChecked() ); settings.writeEntry("/TDEStyle/Settings/AutoHideAccelerators", cbAutoHideAccelerators->isChecked() ); settings.writeEntry("/TDEStyle/Settings/MenuAltKeyNavigation", cbMenuAltKeyNavigation->isChecked() ); settings.writeEntry("/TDEStyle/Settings/PopupMenuDelay", m_popupMenuDelay->value() ); } config.writeEntry( "EffectNoTooltip", !cbEnableTooltips->isChecked(), true, true ); config.setGroup("General"); config.writeEntry( "widgetStyle", currentStyle() ); config.setGroup("Toolbar style"); config.writeEntry( "Highlighting", cbHoverButtons->isChecked(), true, true ); config.writeEntry( "TransparentMoving", cbTransparentToolbars->isChecked(), true, true ); TQString tbIcon; switch( comboToolbarIcons->currentItem() ) { case 1: tbIcon = "TextOnly"; break; case 2: tbIcon = "IconTextRight"; break; case 3: tbIcon = "IconTextBottom"; break; case 0: default: tbIcon = "IconOnly"; break; } config.writeEntry( "IconText", tbIcon, true, true ); config.sync(); // Export the changes we made to qtrc, and update all qt-only // applications on the fly, ensuring that we still follow the user's // export fonts/colors settings. if (m_bStyleDirty | m_bEffectsDirty) // Export only if necessary { uint flags = KRdbExportQtSettings; TDEConfig tdeconfig("kcmdisplayrc", true /*readonly*/, false /*no globals*/); tdeconfig.setGroup("X11"); bool exportKDEColors = tdeconfig.readBoolEntry("exportKDEColors", true); if (exportKDEColors) flags |= KRdbExportColors; runRdb( flags ); } // Now allow TDE apps to reconfigure themselves. if ( m_bStyleDirty ) KIPC::sendMessageAll(KIPC::StyleChanged); if ( m_bToolbarsDirty ) // ##### FIXME - Doesn't apply all settings correctly due to bugs in // TDEApplication/TDEToolbar KIPC::sendMessageAll(KIPC::ToolbarStyleChanged); if (m_bEffectsDirty) { KIPC::sendMessageAll(KIPC::SettingsChanged); kapp->dcopClient()->send("twin*", "", "reconfigure()", TQString("")); } //update kicker to re-used tooltips kicker parameter otherwise, it overwritted //by style tooltips parameters. TQByteArray data; kapp->dcopClient()->send( "kicker", "kicker", "configure()", data ); // Clean up m_bEffectsDirty = false; m_bToolbarsDirty = false; m_bStyleDirty = false; emit changed( false ); }
void KCMLookandFeel::setCursorTheme(const QString themeName) { //TODO: use pieces of cursor kcm when moved to plasma-desktop if (themeName.isEmpty()) { return; } KConfig config(QStringLiteral("kcminputrc")); KConfigGroup cg(&config, "Mouse"); cg.writeEntry("cursorTheme", themeName); cg.sync(); // Require the Xcursor version that shipped with X11R6.9 or greater, since // in previous versions the Xfixes code wasn't enabled due to a bug in the // build system (freedesktop bug #975). #if HAVE_XFIXES && XFIXES_MAJOR >= 2 && XCURSOR_LIB_VERSION >= 10105 QDir themeDir = cursorThemeDir(themeName, 0); if (!themeDir.exists()) { return; } XCursorTheme theme(themeDir); if (!CursorTheme::haveXfixes()) { return; } // Set up the proper launch environment for newly started apps OrgKdeKLauncherInterface klauncher(QStringLiteral("org.kde.klauncher5"), QStringLiteral("/KLauncher"), QDBusConnection::sessionBus()); klauncher.setLaunchEnv(QStringLiteral("XCURSOR_THEME"), themeName); // Update the Xcursor X resources runRdb(0); // Notify all applications that the cursor theme has changed KGlobalSettings::self()->emitChange(KGlobalSettings::CursorChanged); // Reload the standard cursors QStringList names; // Qt cursors names << QStringLiteral("left_ptr") << QStringLiteral("up_arrow") << QStringLiteral("cross") << QStringLiteral("wait") << QStringLiteral("left_ptr_watch") << QStringLiteral("ibeam") << QStringLiteral("size_ver") << QStringLiteral("size_hor") << QStringLiteral("size_bdiag") << QStringLiteral("size_fdiag") << QStringLiteral("size_all") << QStringLiteral("split_v") << QStringLiteral("split_h") << QStringLiteral("pointing_hand") << QStringLiteral("openhand") << QStringLiteral("closedhand") << QStringLiteral("forbidden") << QStringLiteral("whats_this") << QStringLiteral("copy") << QStringLiteral("move") << QStringLiteral("link"); // X core cursors names << QStringLiteral("X_cursor") << QStringLiteral("right_ptr") << QStringLiteral("hand1") << QStringLiteral("hand2") << QStringLiteral("watch") << QStringLiteral("xterm") << QStringLiteral("crosshair") << QStringLiteral("left_ptr_watch") << QStringLiteral("center_ptr") << QStringLiteral("sb_h_double_arrow") << QStringLiteral("sb_v_double_arrow") << QStringLiteral("fleur") << QStringLiteral("top_left_corner") << QStringLiteral("top_side") << QStringLiteral("top_right_corner") << QStringLiteral("right_side") << QStringLiteral("bottom_right_corner") << QStringLiteral("bottom_side") << QStringLiteral("bottom_left_corner") << QStringLiteral("left_side") << QStringLiteral("question_arrow") << QStringLiteral("pirate"); foreach (const QString &name, names) { XFixesChangeCursorByName(QX11Info::display(), theme.loadCursor(name, 0), QFile::encodeName(name)); }
void KCMLookandFeel::save() { Plasma::Package package = Plasma::PluginLoader::self()->loadPackage(QStringLiteral("Plasma/LookAndFeel")); package.setPath(m_selectedPlugin); if (!package.isValid()) { return; } m_configGroup.writeEntry("LookAndFeelPackage", m_selectedPlugin); if (!package.filePath("defaults").isEmpty()) { KSharedConfigPtr conf = KSharedConfig::openConfig(package.filePath("defaults")); KConfigGroup cg(conf, "kdeglobals"); cg = KConfigGroup(&cg, "KDE"); if (m_applyWidgetStyle) { setWidgetStyle(cg.readEntry("widgetStyle", QString())); } if (m_applyColors) { QString colorsFile = package.filePath("colors"); KConfigGroup cg(conf, "kdeglobals"); cg = KConfigGroup(&cg, "General"); QString colorScheme = cg.readEntry("ColorScheme", QString()); if (!colorsFile.isEmpty()) { if (!colorScheme.isEmpty()) { setColors(colorScheme, colorsFile); } else { setColors(package.metadata().name(), colorsFile); } } else if (!colorScheme.isEmpty()) { colorScheme.remove('\''); // So Foo's does not become FooS QRegExp fixer(QStringLiteral("[\\W,.-]+(.?)")); int offset; while ((offset = fixer.indexIn(colorScheme)) >= 0) { colorScheme.replace(offset, fixer.matchedLength(), fixer.cap(1).toUpper()); } colorScheme.replace(0, 1, colorScheme.at(0).toUpper()); QString src = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "color-schemes/" + colorScheme + ".colors"); setColors(colorScheme, src); } } if (m_applyIcons) { cg = KConfigGroup(conf, "kdeglobals"); cg = KConfigGroup(&cg, "Icons"); setIcons(cg.readEntry("Theme", QString())); } if (m_applyPlasmaTheme) { cg = KConfigGroup(conf, "plasmarc"); cg = KConfigGroup(&cg, "Theme"); setPlasmaTheme(cg.readEntry("name", QString())); } if (m_applyCursors) { cg = KConfigGroup(conf, "kcminputrc"); cg = KConfigGroup(&cg, "Mouse"); setCursorTheme(cg.readEntry("cursorTheme", QString())); } if (m_applyWindowSwitcher) { cg = KConfigGroup(conf, "kwinrc"); cg = KConfigGroup(&cg, "WindowSwitcher"); setWindowSwitcher(cg.readEntry("LayoutName", QString())); } if (m_applyDesktopSwitcher) { cg = KConfigGroup(conf, "kwinrc"); cg = KConfigGroup(&cg, "DesktopSwitcher"); setDesktopSwitcher(cg.readEntry("LayoutName", QString())); } } //TODO: option to enable/disable apply? they don't seem required by UI design setSplashScreen(m_selectedPlugin); setLockScreen(m_selectedPlugin); m_configGroup.sync(); runRdb(KRdbExportQtColors | KRdbExportGtkTheme | KRdbExportColors | KRdbExportQtSettings | KRdbExportXftSettings); }