diff --git a/kcmkwin/kwincompositing/compositing.h b/kcmkwin/kwincompositing/compositing.h --- a/kcmkwin/kwincompositing/compositing.h +++ b/kcmkwin/kwincompositing/compositing.h @@ -24,6 +24,7 @@ #include #include +#include class OrgKdeKwinCompositingInterface; @@ -53,7 +54,7 @@ Q_INVOKABLE bool OpenGLIsUnsafe() const; Q_INVOKABLE bool OpenGLIsBroken(); Q_INVOKABLE void reenableOpenGLDetection(); - int animationSpeed() const; + qreal animationSpeed() const; int windowThumbnail() const; int glScaleFilter() const; bool xrScaleFilter() const; @@ -66,7 +67,7 @@ OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel() const; - void setAnimationSpeed(int speed); + void setAnimationSpeed(qreal speed); void setWindowThumbnail(int index); void setGlScaleFilter(int index); void setXrScaleFilter(bool filter); @@ -78,13 +79,15 @@ void save(); + static bool isRunningPlasma(); + public Q_SLOTS: void reset(); void defaults(); Q_SIGNALS: void changed(); - void animationSpeedChanged(int); + void animationSpeedChanged(qreal); void windowThumbnailChanged(int); void glScaleFilterChanged(int); void xrScaleFilterChanged(int); @@ -95,7 +98,7 @@ void windowsBlockCompositingChanged(bool); private: - int m_animationSpeed; + qreal m_animationSpeed; int m_windowThumbnail; int m_glScaleFilter; bool m_xrScaleFilter; @@ -108,6 +111,7 @@ bool m_windowsBlockCompositing; bool m_windowsBlockingCompositing; OrgKdeKwinCompositingInterface *m_compositingInterface; + KSharedConfigPtr m_config; }; diff --git a/kcmkwin/kwincompositing/compositing.cpp b/kcmkwin/kwincompositing/compositing.cpp --- a/kcmkwin/kwincompositing/compositing.cpp +++ b/kcmkwin/kwincompositing/compositing.cpp @@ -37,7 +37,7 @@ Compositing::Compositing(QObject *parent) : QObject(parent) - , m_animationSpeed(0) + , m_animationSpeed(1.0) , m_windowThumbnail(0) , m_glScaleFilter(0) , m_xrScaleFilter(false) @@ -49,6 +49,7 @@ , m_openGLPlatformInterface(0) , m_windowsBlockCompositing(true) , m_compositingInterface(new OrgKdeKwinCompositingInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Compositor"), QDBusConnection::sessionBus(), this)) + , m_config(KSharedConfig::openConfig("kwinrc")) { reset(); connect(this, &Compositing::animationSpeedChanged, this, &Compositing::changed); @@ -68,8 +69,10 @@ void Compositing::reset() { - KConfigGroup kwinConfig(KSharedConfig::openConfig(QStringLiteral("kwinrc")), QStringLiteral("Compositing")); - setAnimationSpeed(kwinConfig.readEntry("AnimationSpeed", 3)); + KConfigGroup globalConfig(m_config, QStringLiteral("KDE")); + setAnimationSpeed(globalConfig.readEntry("AnimationDurationFactor", 1.0)); + + KConfigGroup kwinConfig(m_config, QStringLiteral("Compositing")); setWindowThumbnail(kwinConfig.readEntry("HiddenPreviews", 5) - 4); setGlScaleFilter(kwinConfig.readEntry("GLTextureFilter", 2)); setXrScaleFilter(kwinConfig.readEntry("XRenderSmoothScale", false)); @@ -119,7 +122,7 @@ void Compositing::defaults() { - setAnimationSpeed(3); + setAnimationSpeed(1.0); setWindowThumbnail(1); setGlScaleFilter(2); setXrScaleFilter(false); @@ -133,13 +136,13 @@ bool Compositing::OpenGLIsUnsafe() const { - KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing"); + KConfigGroup kwinConfig(m_config, "Compositing"); return kwinConfig.readEntry("OpenGLIsUnsafe", true); } bool Compositing::OpenGLIsBroken() { - KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing"); + KConfigGroup kwinConfig(m_config, "Compositing"); QString oldBackend = kwinConfig.readEntry("Backend", "OpenGL"); kwinConfig.writeEntry("Backend", "OpenGL"); @@ -158,12 +161,12 @@ void Compositing::reenableOpenGLDetection() { - KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing"); + KConfigGroup kwinConfig(m_config, "Compositing"); kwinConfig.writeEntry("OpenGLIsUnsafe", false); kwinConfig.sync(); } -int Compositing::animationSpeed() const +qreal Compositing::animationSpeed() const { return m_animationSpeed; } @@ -198,7 +201,7 @@ return m_compositingEnabled; } -void Compositing::setAnimationSpeed(int speed) +void Compositing::setAnimationSpeed(qreal speed) { if (speed == m_animationSpeed) { return; @@ -267,8 +270,14 @@ void Compositing::save() { - KConfigGroup kwinConfig(KSharedConfig::openConfig(QStringLiteral("kwinrc")), "Compositing"); - kwinConfig.writeEntry("AnimationSpeed", animationSpeed()); + // this writes to the KDE group of the kwinrc, when loading we rely on kconfig cascading to + // load a global value, or allow a kwin override + KConfigGroup generalConfig(m_config, "KDE"); + if (!isRunningPlasma()) { + generalConfig.writeEntry("AnimationDurationFactor", animationSpeed()); + } + KConfigGroup kwinConfig(m_config, "Compositing"); + kwinConfig.writeEntry("HiddenPreviews", windowThumbnail() + 4); kwinConfig.writeEntry("GLTextureFilter", glScaleFilter()); kwinConfig.writeEntry("XRenderSmoothScale", xrScaleFilter()); @@ -365,6 +374,11 @@ return m_compositingInterface->platformRequiresCompositing(); } +bool Compositing::isRunningPlasma() +{ + return qgetenv("XDG_CURRENT_DESKTOP") == "KDE"; +} + CompositingType::CompositingType(QObject *parent) : QAbstractItemModel(parent) { diff --git a/kcmkwin/kwincompositing/compositing.ui b/kcmkwin/kwincompositing/compositing.ui --- a/kcmkwin/kwincompositing/compositing.ui +++ b/kcmkwin/kwincompositing/compositing.ui @@ -6,8 +6,8 @@ 0 0 - 462 - 349 + 526 + 395 @@ -78,72 +78,21 @@ - - + + Animation speed: - - - - - - 6 - - - Qt::Horizontal - - - QSlider::TicksBelow - - - 1 - - - - - - - - - Instant - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Very slow - - - - - - - - + Scale method: - + @@ -162,14 +111,14 @@ - + Scale method: - + @@ -183,38 +132,38 @@ - + Qt::Horizontal - + Rendering backend: - + - + Qt::Horizontal - + Tearing prevention ("vsync"): - + @@ -243,14 +192,14 @@ - + Keep window thumbnails: - + @@ -269,7 +218,7 @@ - + Applications can set a hint to block compositing when the window is open. @@ -281,6 +230,68 @@ + + + + + 0 + 0 + + + + + + + 0 + + + 0 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 1 + + + + + + + + + Very slow + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Instant + + + + + + + + diff --git a/kcmkwin/kwincompositing/main.cpp b/kcmkwin/kwincompositing/main.cpp --- a/kcmkwin/kwincompositing/main.cpp +++ b/kcmkwin/kwincompositing/main.cpp @@ -29,6 +29,9 @@ #include #include +#include +#include + class KWinCompositingSettings : public KCModule { Q_OBJECT @@ -46,6 +49,8 @@ Ui_CompositingForm m_form; }; +static const QVector s_animationMultipliers = {8, 4, 2, 1, 0.5, 0.25, 0.125, 0}; + KWinCompositingSettings::KWinCompositingSettings(QWidget *parent, const QVariantList &args) : KCModule(parent, args) , m_compositing(new KWin::Compositing::Compositing(this)) @@ -79,9 +84,22 @@ connect(m_form.compositingEnabled, &QCheckBox::toggled, m_compositing, &Compositing::setCompositingEnabled); // animation speed - m_form.animationSpeed->setValue(m_compositing->animationSpeed()); - connect(m_compositing, &Compositing::animationSpeedChanged, m_form.animationSpeed, &QSlider::setValue); - connect(m_form.animationSpeed, &QSlider::valueChanged, m_compositing, &Compositing::setAnimationSpeed); + m_form.animationSpeed->setMaximum(s_animationMultipliers.size() - 1); + auto setSpeed = [this](const qreal multiplier) { + auto const it = std::lower_bound(s_animationMultipliers.begin(), s_animationMultipliers.end(), multiplier, std::greater()); + const int index = std::distance(s_animationMultipliers.begin(), it); + m_form.animationSpeed->setValue(index); + }; + setSpeed(m_compositing->animationSpeed()); + connect(m_compositing, &Compositing::animationSpeedChanged, m_form.animationSpeed, setSpeed); + connect(m_form.animationSpeed, &QSlider::valueChanged, m_compositing, [this](int index) { + m_compositing->setAnimationSpeed(s_animationMultipliers[index]); + }); + + if (Compositing::isRunningPlasma()) { + m_form.animationSpeedLabel->hide(); + m_form.animationSpeedControls->hide(); + } // gl scale filter m_form.glScaleFilter->setCurrentIndex(m_compositing->glScaleFilter());