diff --git a/kded/configeditor.h b/kded/configeditor.h --- a/kded/configeditor.h +++ b/kded/configeditor.h @@ -20,14 +20,14 @@ #pragma once #include +#include -class QString; class QFile; namespace ConfigEditor { void setGtk2ConfigValue(const QString ¶mName, const QString ¶mValue); - void setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue); + void setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue, const QString &category = QStringLiteral("org.gnome.desktop.interface")); void setGtk3ConfigValueSettingsIni(const QString ¶mName, const QString ¶mValue); void setGtk3ConfigValueXSettingsd(const QString ¶mName, const QString ¶mValue); }; diff --git a/kded/configeditor.cpp b/kded/configeditor.cpp --- a/kded/configeditor.cpp +++ b/kded/configeditor.cpp @@ -45,9 +45,9 @@ static pid_t pidOfXSettingsd(); -void ConfigEditor::setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue) +void ConfigEditor::setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue, const QString &category) { - g_autoptr(GSettings) gsettings = g_settings_new("org.gnome.desktop.interface"); + g_autoptr(GSettings) gsettings = g_settings_new(category.toUtf8().constData()); g_settings_set_string(gsettings, paramName.toUtf8().constData(), paramValue.toUtf8().constData()); } diff --git a/kded/configvalueprovider.h b/kded/configvalueprovider.h --- a/kded/configvalueprovider.h +++ b/kded/configvalueprovider.h @@ -42,10 +42,13 @@ QString iconsOnButtons() const; QString iconsInMenus() const; QString toolbarStyle(ToolbarStyleNotation notation) const; + QString windowDecorationsButtonsOrder() const; private: QString toolbarStyleInDesiredNotation(const QString &kdeConfigValue, ToolbarStyleNotation notation) const; + QString windowDecorationButtonsOrderInGtkNotation(const QString &kdeConfigValue) const; KSharedConfigPtr kdeglobalsConfig; KSharedConfigPtr inputConfig; + KSharedConfigPtr kwinConfig; }; diff --git a/kded/configvalueprovider.cpp b/kded/configvalueprovider.cpp --- a/kded/configvalueprovider.cpp +++ b/kded/configvalueprovider.cpp @@ -30,7 +30,8 @@ ConfigValueProvider::ConfigValueProvider() : kdeglobalsConfig(KSharedConfig::openConfig(QStringLiteral("kdeglobals"))), - inputConfig(KSharedConfig::openConfig(QStringLiteral("kcminputrc"))) + inputConfig(KSharedConfig::openConfig(QStringLiteral("kcminputrc"))), + kwinConfig(KSharedConfig::openConfig(QStringLiteral("kwinrc"))) { } @@ -98,6 +99,19 @@ return toolbarStyleInDesiredNotation(kdeConfigValue, notation); } +QString ConfigValueProvider::windowDecorationsButtonsOrder() const +{ + kwinConfig->reparseConfiguration(); + KConfigGroup configGroup = kwinConfig->group(QStringLiteral("org.kde.kdecoration2")); + QString buttonsOnLeftKdeConfigValue = configGroup.readEntry(QStringLiteral("ButtonsOnLeft"), "MS"); + QString buttonsOnRightKdeConfigValue = configGroup.readEntry(QStringLiteral("ButtonsOnRight"), "HIAX"); + + QString buttonsOnLeftInGtkNotation = windowDecorationButtonsOrderInGtkNotation(buttonsOnLeftKdeConfigValue); + QString buttonsOnRightInGtkNotation = windowDecorationButtonsOrderInGtkNotation(buttonsOnRightKdeConfigValue); + + return buttonsOnLeftInGtkNotation + QStringLiteral(":") + buttonsOnRightInGtkNotation; +} + QString ConfigValueProvider::toolbarStyleInDesiredNotation(const QString &kdeConfigValue, ConfigValueProvider::ToolbarStyleNotation notation) const { QStringList toolbarStyles {}; @@ -134,3 +148,23 @@ return toolbarStyles[3]; } } + +QString ConfigValueProvider::windowDecorationButtonsOrderInGtkNotation(const QString &kdeConfigValue) const +{ + QString gtkNotation; + + for (const QChar &buttonAbbreviation : kdeConfigValue) { + if (buttonAbbreviation == 'X') { + gtkNotation += QStringLiteral("close,"); + } else if (buttonAbbreviation == 'I') { + gtkNotation += QStringLiteral("minimize,"); + } else if (buttonAbbreviation == 'A') { + gtkNotation += QStringLiteral("maximize,"); + } else if (buttonAbbreviation == 'M') { + gtkNotation += QStringLiteral("menu,"); + } + } + gtkNotation.chop(1); + + return gtkNotation; +} diff --git a/kded/gtkconfig.h b/kded/gtkconfig.h --- a/kded/gtkconfig.h +++ b/kded/gtkconfig.h @@ -62,11 +62,13 @@ void setIconsOnButtons() const; void setIconsInMenus() const; void setToolbarStyle() const; + void setWindowDecorationsButtonsOrder() const; void applyAllSettings() const; public Q_SLOTS: void onGlobalSettingsChange(int settingsChangeType, int arg) const; + void onKWinSettingsChange() const; private: QScopedPointer configValueProvider; diff --git a/kded/gtkconfig.cpp b/kded/gtkconfig.cpp --- a/kded/gtkconfig.cpp +++ b/kded/gtkconfig.cpp @@ -44,7 +44,12 @@ QStringLiteral("notifyChange"), this, SLOT(onGlobalSettingsChange(int,int))); - + QDBusConnection::sessionBus().connect(QString(), + QStringLiteral("/KWin"), + QStringLiteral("org.kde.KWin"), + QStringLiteral("reloadConfig"), + this, + SLOT(onKWinSettingsChange())); applyAllSettings(); } @@ -107,14 +112,23 @@ ConfigEditor::setGtk3ConfigValueXSettingsd(QStringLiteral("Gtk/ToolbarStyle"), toolbarStyleXSettingsd); } +void GtkConfig::setWindowDecorationsButtonsOrder() const +{ + const QString windowDecorationsButtonOrder = configValueProvider->windowDecorationsButtonsOrder(); + ConfigEditor::setGtk3ConfigValueDconf(QStringLiteral("button-layout"), windowDecorationsButtonOrder, QStringLiteral("org.gnome.desktop.wm.preferences")); + ConfigEditor::setGtk3ConfigValueSettingsIni(QStringLiteral("gtk-decoration-layout"), windowDecorationsButtonOrder); + ConfigEditor::setGtk3ConfigValueXSettingsd(QStringLiteral("Gtk/DecorationLayout"), windowDecorationsButtonOrder); +} + void GtkConfig::applyAllSettings() const { setFont(); setIconTheme(KIconLoader::Group::Desktop); setCursorTheme(); setIconsOnButtons(); setIconsInMenus(); setToolbarStyle(); + setWindowDecorationsButtonsOrder(); } void GtkConfig::onGlobalSettingsChange(int settingsChangeType, int arg) const @@ -131,4 +145,9 @@ } } +void GtkConfig::onKWinSettingsChange() const +{ + setWindowDecorationsButtonsOrder(); +} + #include "gtkconfig.moc"