diff --git a/dbusinterface.h b/dbusinterface.h --- a/dbusinterface.h +++ b/dbusinterface.h @@ -115,6 +115,7 @@ * Values depend on operation mode and compile time options. **/ Q_PROPERTY(QStringList supportedOpenGLPlatformInterfaces READ supportedOpenGLPlatformInterfaces) + Q_PROPERTY(bool platformRequiresCompositing READ platformRequiresCompositing) public: explicit CompositorDBusInterface(Compositor *parent); virtual ~CompositorDBusInterface() = default; @@ -125,6 +126,7 @@ bool isOpenGLBroken() const; QString compositingType() const; QStringList supportedOpenGLPlatformInterfaces() const; + bool platformRequiresCompositing() const; public Q_SLOTS: /** diff --git a/dbusinterface.cpp b/dbusinterface.cpp --- a/dbusinterface.cpp +++ b/dbusinterface.cpp @@ -235,6 +235,11 @@ return kwinApp()->platform()->openGLCompositingIsBroken(); } +bool CompositorDBusInterface::platformRequiresCompositing() const +{ + return kwinApp()->platform()->requiresCompositing(); +} + void CompositorDBusInterface::resume() { m_compositor->resume(Compositor::ScriptSuspend); diff --git a/kcmkwin/kwincompositing/compositing.h b/kcmkwin/kwincompositing/compositing.h --- a/kcmkwin/kwincompositing/compositing.h +++ b/kcmkwin/kwincompositing/compositing.h @@ -25,6 +25,8 @@ #include #include +class OrgKdeKwinCompositingInterface; + namespace KWin { namespace Compositing { @@ -45,6 +47,7 @@ Q_PROPERTY(KWin::Compositing::OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel READ openGLPlatformInterfaceModel CONSTANT) Q_PROPERTY(int openGLPlatformInterface READ openGLPlatformInterface WRITE setOpenGLPlatformInterface NOTIFY openGLPlatformInterfaceChanged) Q_PROPERTY(bool windowsBlockCompositing READ windowsBlockCompositing WRITE setWindowsBlockCompositing NOTIFY windowsBlockCompositingChanged) + Q_PROPERTY(bool compositingRequired READ compositingRequired CONSTANT) public: explicit Compositing(QObject *parent = 0); @@ -61,6 +64,7 @@ bool compositingEnabled() const; int openGLPlatformInterface() const; bool windowsBlockCompositing() const; + bool compositingRequired() const; OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel() const; @@ -107,6 +111,8 @@ OpenGLPlatformInterfaceModel *m_openGLPlatformInterfaceModel; int m_openGLPlatformInterface; bool m_windowsBlockCompositing; + bool m_windowsBlockingCompositing; + OrgKdeKwinCompositingInterface *m_compositingInterface; }; diff --git a/kcmkwin/kwincompositing/compositing.cpp b/kcmkwin/kwincompositing/compositing.cpp --- a/kcmkwin/kwincompositing/compositing.cpp +++ b/kcmkwin/kwincompositing/compositing.cpp @@ -49,6 +49,7 @@ , m_openGLPlatformInterfaceModel(new OpenGLPlatformInterfaceModel(this)) , m_openGLPlatformInterface(0) , m_windowsBlockCompositing(true) + , m_compositingInterface(new OrgKdeKwinCompositingInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Compositor"), QDBusConnection::sessionBus(), this)) { reset(); connect(this, &Compositing::animationSpeedChanged, this, &Compositing::changed); @@ -142,16 +143,13 @@ bool Compositing::OpenGLIsBroken() { - OrgKdeKwinCompositingInterface interface(QStringLiteral("org.kde.KWin"), - QStringLiteral("/Compositor"), - QDBusConnection::sessionBus()); KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing"); QString oldBackend = kwinConfig.readEntry("Backend", "OpenGL"); kwinConfig.writeEntry("Backend", "OpenGL"); kwinConfig.sync(); - if (interface.openGLIsBroken()) { + if (m_compositingInterface->openGLIsBroken()) { kwinConfig.writeEntry("Backend", oldBackend); kwinConfig.sync(); return true; @@ -274,6 +272,9 @@ void Compositing::setCompositingEnabled(bool enabled) { + if (compositingRequired()) { + return; + } if (enabled == m_compositingEnabled) { return; } @@ -289,7 +290,9 @@ kwinConfig.writeEntry("HiddenPreviews", windowThumbnail() + 4); kwinConfig.writeEntry("GLTextureFilter", glScaleFilter()); kwinConfig.writeEntry("XRenderSmoothScale", xrScaleFilter()); - kwinConfig.writeEntry("Enabled", compositingEnabled()); + if (!compositingRequired()) { + kwinConfig.writeEntry("Enabled", compositingEnabled()); + } auto swapStrategy = [this] { switch (glSwapStrategy()) { case 0: @@ -329,7 +332,9 @@ if (glIndex.isValid()) { kwinConfig.writeEntry("GLPlatformInterface", glIndex.data(Qt::UserRole).toString()); } - kwinConfig.writeEntry("WindowsBlockCompositing", windowsBlockCompositing()); + if (!compositingRequired()) { + kwinConfig.writeEntry("WindowsBlockCompositing", windowsBlockCompositing()); + } kwinConfig.sync(); if (m_changed) { @@ -368,13 +373,21 @@ void Compositing::setWindowsBlockCompositing(bool set) { + if (compositingRequired()) { + return; + } if (m_windowsBlockCompositing == set) { return; } m_windowsBlockCompositing = set; emit windowsBlockCompositingChanged(set); } +bool Compositing::compositingRequired() const +{ + return m_compositingInterface->platformRequiresCompositing(); +} + CompositingType::CompositingType(QObject *parent) : QAbstractItemModel(parent) { diff --git a/kcmkwin/kwincompositing/main.cpp b/kcmkwin/kwincompositing/main.cpp --- a/kcmkwin/kwincompositing/main.cpp +++ b/kcmkwin/kwincompositing/main.cpp @@ -87,6 +87,9 @@ m_form.tearingWarning->setIcon(QIcon::fromTheme(QStringLiteral("dialog-warning"))); m_form.windowThumbnailWarning->setIcon(QIcon::fromTheme(QStringLiteral("dialog-warning"))); + m_form.compositingEnabled->setVisible(!m_compositing->compositingRequired()); + m_form.windowsBlockCompositing->setVisible(!m_compositing->compositingRequired()); + init(); } diff --git a/org.kde.kwin.Compositing.xml b/org.kde.kwin.Compositing.xml --- a/org.kde.kwin.Compositing.xml +++ b/org.kde.kwin.Compositing.xml @@ -7,6 +7,7 @@ +