diff --git a/kded/configeditor.h b/kded/configeditor.h --- a/kded/configeditor.h +++ b/kded/configeditor.h @@ -28,6 +28,7 @@ namespace ConfigEditor { void setGtk2ConfigValue(const QString ¶mName, const QString ¶mValue); + void setGtk3ConfigValueDconf(const QString ¶mName, bool paramValue, const QString &category = QStringLiteral("org.gnome.desktop.interface")); 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 @@ -35,6 +35,12 @@ #include "configeditor.h" +void ConfigEditor::setGtk3ConfigValueDconf(const QString ¶mName, bool paramValue, const QString &category) +{ + g_autoptr(GSettings) gsettings = g_settings_new(category.toUtf8().constData()); + g_settings_set_boolean(gsettings, paramName.toUtf8().constData(), paramValue); +} + void ConfigEditor::setGtk3ConfigValueDconf(const QString ¶mName, const QString ¶mValue, const QString &category) { g_autoptr(GSettings) gsettings = g_settings_new(category.toUtf8().constData()); @@ -164,6 +170,7 @@ QStringLiteral("gtk-menu-images"), QStringLiteral("gtk-button-images"), QStringLiteral("gtk-primary-button-warps-slider"), + QStringLiteral("gtk-enable-animations"), }; QString newConfigString; @@ -189,6 +196,7 @@ QStringLiteral("Gtk/MenuImages"), QStringLiteral("Gtk/ToolbarStyle"), QStringLiteral("Gtk/PrimaryButtonWarpsSlider"), + QStringLiteral("Gtk/EnableAnimations"), }; QString newConfigString; diff --git a/kded/configvalueprovider.h b/kded/configvalueprovider.h --- a/kded/configvalueprovider.h +++ b/kded/configvalueprovider.h @@ -45,6 +45,7 @@ QString scrollbarBehavior() const; QString preferDarkTheme() const; QString windowDecorationsButtonsOrder() const; + QString enableAnimations() const; private: QString toolbarStyleInDesiredNotation(const QString &kdeConfigValue, ToolbarStyleNotation notation) const; diff --git a/kded/configvalueprovider.cpp b/kded/configvalueprovider.cpp --- a/kded/configvalueprovider.cpp +++ b/kded/configvalueprovider.cpp @@ -140,6 +140,20 @@ return buttonsOnLeftInGtkNotation + QStringLiteral(":") + buttonsOnRightInGtkNotation; } +QString ConfigValueProvider::enableAnimations() const +{ + KConfigGroup generalCfg = kdeglobalsConfig->group(QStringLiteral("KDE")); + const qreal animationSpeedModifier = qMax(0.0, generalCfg.readEntry("AnimationDurationFactor", 1.0)); + + const bool enableAnimations = !qFuzzyIsNull(animationSpeedModifier); + + if (enableAnimations) { + return QStringLiteral("1"); + } else { + return QStringLiteral("0"); + } +} + QString ConfigValueProvider::toolbarStyleInDesiredNotation(const QString &kdeConfigValue, ConfigValueProvider::ToolbarStyleNotation notation) const { QStringList toolbarStyles {}; diff --git a/kded/gtkconfig.h b/kded/gtkconfig.h --- a/kded/gtkconfig.h +++ b/kded/gtkconfig.h @@ -69,6 +69,7 @@ void setScrollbarBehavior() const; void setDarkThemePreference() const; void setWindowDecorationsButtonsOrder() const; + void setEnableAnimations() const; void applyAllSettings() const; @@ -83,10 +84,12 @@ Q_SCRIPTABLE void showGtk3ThemePreview(const QString &themeName) const; void onGlobalSettingsChange(int settingsChangeType, int arg) const; + void onKdeglobalsSettingsChange(const KConfigGroup &group, const QByteArrayList &names) const; void onKWinSettingsChange(const KConfigGroup &group, const QByteArrayList &names) const; private: QScopedPointer configValueProvider; QScopedPointer themePreviewer; + KConfigWatcher::Ptr kdeglobalsConfigWatcher; KConfigWatcher::Ptr kwinConfigWatcher; }; diff --git a/kded/gtkconfig.cpp b/kded/gtkconfig.cpp --- a/kded/gtkconfig.cpp +++ b/kded/gtkconfig.cpp @@ -38,14 +38,16 @@ KDEDModule(parent), configValueProvider(new ConfigValueProvider()), themePreviewer(new ThemePreviewer(this)), + kdeglobalsConfigWatcher(KConfigWatcher::create(KSharedConfig::openConfig(QStringLiteral("kdeglobals")))), kwinConfigWatcher(KConfigWatcher::create(KSharedConfig::openConfig(QStringLiteral("kwinrc")))) { QDBusConnection dbus = QDBusConnection::sessionBus(); dbus.registerService(QStringLiteral("org.kde.GtkConfig")); dbus.registerObject(QStringLiteral("/GtkConfig"), this, QDBusConnection::ExportScriptableSlots); connect(qGuiApp, &QGuiApplication::fontChanged, this, &GtkConfig::setFont); connect(KIconLoader::global(), &KIconLoader::iconChanged, this, &GtkConfig::setIconTheme); + connect(kdeglobalsConfigWatcher.data(), &KConfigWatcher::configChanged, this, &GtkConfig::onKdeglobalsSettingsChange); connect(kwinConfigWatcher.data(), &KConfigWatcher::configChanged, this, &GtkConfig::onKWinSettingsChange); dbus.connect( QString(), @@ -180,6 +182,16 @@ ConfigEditor::setGtk3ConfigValueXSettingsd(QStringLiteral("Gtk/DecorationLayout"), windowDecorationsButtonOrder); } +void GtkConfig::setEnableAnimations() const +{ + const QString enableAnimations = configValueProvider->enableAnimations(); + ConfigEditor::setGtk2ConfigValue(QStringLiteral("gtk-enable-animations"), enableAnimations); + // FIXME work with booleans in configValueProvider... + ConfigEditor::setGtk3ConfigValueDconf(QStringLiteral("enable-animations"), enableAnimations == QLatin1String("1")); + ConfigEditor::setGtk3ConfigValueSettingsIni(QStringLiteral("gtk-enable-animations"), enableAnimations); + ConfigEditor::setGtk3ConfigValueXSettingsd(QStringLiteral("Gtk/EnableAnimations"), enableAnimations); +} + void GtkConfig::applyAllSettings() const { setFont(); @@ -191,6 +203,7 @@ setScrollbarBehavior(); setDarkThemePreference(); setWindowDecorationsButtonsOrder(); + setEnableAnimations(); } void GtkConfig::onGlobalSettingsChange(int settingsChangeType, int arg) const @@ -211,6 +224,14 @@ } } +void GtkConfig::onKdeglobalsSettingsChange(const KConfigGroup &group, const QByteArrayList &names) const +{ + if (group.name() == QLatin1String("KDE") + && names.contains(QByteArrayLiteral("AnimationDurationFactor"))) { + setEnableAnimations(); + } +} + void GtkConfig::onKWinSettingsChange(const KConfigGroup &group, const QByteArrayList &names) const { if (group.name() == QStringLiteral("org.kde.kdecoration2")