-
-
-namespace KWin
-{
-
-extern int screen_number; // main.cpp
-extern bool is_multihead;
-
-CompositingPrefs::CompositingPrefs()
-{
-}
-
-CompositingPrefs::~CompositingPrefs()
-{
-}
-
-bool CompositingPrefs::openGlIsBroken()
-{
- const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (is_multihead ? QString::number(screen_number) : QString()));
- return KConfigGroup(kwinApp()->config(), "Compositing").readEntry(unsafeKey, false);
-}
-
-bool CompositingPrefs::compositingPossible()
-{
- // first off, check whether we figured that we'll crash on detection because of a buggy driver
- KConfigGroup gl_workaround_group(kwinApp()->config(), "Compositing");
- const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (is_multihead ? QString::number(screen_number) : QString()));
- if (gl_workaround_group.readEntry("Backend", "OpenGL") == QLatin1String("OpenGL") &&
- gl_workaround_group.readEntry(unsafeKey, false))
- return false;
-
- if (kwinApp()->shouldUseWaylandForCompositing()) {
- // don't do X specific checks if we are not going to use X for compositing
- return true;
- }
-
- if (!Xcb::Extensions::self()->isCompositeAvailable()) {
- qCDebug(KWIN_CORE) << "No composite extension available";
- return false;
- }
- if (!Xcb::Extensions::self()->isDamageAvailable()) {
- qCDebug(KWIN_CORE) << "No damage extension available";
- return false;
- }
- if (hasGlx())
- return true;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (Xcb::Extensions::self()->isRenderAvailable() && Xcb::Extensions::self()->isFixesAvailable())
- return true;
-#endif
- if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
- return true;
- } else if (qstrcmp(qgetenv("KWIN_COMPOSE"), "O2ES") == 0) {
- return true;
- }
- qCDebug(KWIN_CORE) << "No OpenGL or XRender/XFixes support";
- return false;
-}
-
-QString CompositingPrefs::compositingNotPossibleReason()
-{
- // first off, check whether we figured that we'll crash on detection because of a buggy driver
- KConfigGroup gl_workaround_group(kwinApp()->config(), "Compositing");
- const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (is_multihead ? QString::number(screen_number) : QString()));
- if (gl_workaround_group.readEntry("Backend", "OpenGL") == QLatin1String("OpenGL") &&
- gl_workaround_group.readEntry(unsafeKey, false))
- return i18n("OpenGL compositing (the default) has crashed KWin in the past.
"
- "This was most likely due to a driver bug."
- "If you think that you have meanwhile upgraded to a stable driver,
"
- "you can reset this protection but be aware that this might result in an immediate crash!
"
- "Alternatively, you might want to use the XRender backend instead.
");
-
- if (!Xcb::Extensions::self()->isCompositeAvailable() || !Xcb::Extensions::self()->isDamageAvailable()) {
- return i18n("Required X extensions (XComposite and XDamage) are not available.");
- }
-#if !defined( KWIN_HAVE_XRENDER_COMPOSITING )
- if (!hasGlx())
- return i18n("GLX/OpenGL are not available and only OpenGL support is compiled.");
-#else
- if (!(hasGlx()
- || (Xcb::Extensions::self()->isRenderAvailable() && Xcb::Extensions::self()->isFixesAvailable()))) {
- return i18n("GLX/OpenGL and XRender/XFixes are not available.");
- }
-#endif
- return QString();
-}
-
-bool CompositingPrefs::hasGlx()
-{
- return Xcb::Extensions::self()->hasGlx();
-}
-
-} // namespace
-
diff --git a/compositingprefs.h b/compositingprefs.h
deleted file mode 100644
index 889ed8b978..0000000000
--- a/compositingprefs.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/********************************************************************
- KWin - the KDE window manager
- This file is part of the KDE project.
-
-Copyright (C) 2007 Rivo Laks
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-*********************************************************************/
-
-#ifndef KWIN_COMPOSITINGPREFS_H
-#define KWIN_COMPOSITINGPREFS_H
-
-#include
-#include
-
-#include "kwinglutils.h"
-#include "kwinglobals.h"
-
-
-namespace KWin
-{
-
-class CompositingPrefs
-{
-public:
- CompositingPrefs();
- ~CompositingPrefs();
-
- static bool compositingPossible();
- static QString compositingNotPossibleReason();
- static bool openGlIsBroken();
- /**
- * Tests whether GLX is supported and returns @c true
- * in case KWin is compiled with OpenGL support and GLX
- * is available.
- *
- * If KWin is compiled with OpenGL ES or without OpenGL at
- * all, @c false is returned.
- * @returns @c true if GLX is available, @c false otherwise and if not build with OpenGL support.
- **/
- static bool hasGlx();
-};
-
-}
-
-#endif //KWIN_COMPOSITINGPREFS_H
-
-
diff --git a/dbusinterface.cpp b/dbusinterface.cpp
index 99dd7762be..302355bd9a 100644
--- a/dbusinterface.cpp
+++ b/dbusinterface.cpp
@@ -25,10 +25,10 @@ along with this program. If not, see .
// kwin
#include "atoms.h"
#include "composite.h"
-#include "compositingprefs.h"
#include "debug_console.h"
#include "main.h"
#include "placement.h"
+#include "platform.h"
#include "kwinadaptor.h"
#include "scene.h"
#include "workspace.h"
@@ -195,7 +195,7 @@ CompositorDBusInterface::CompositorDBusInterface(Compositor *parent)
QString CompositorDBusInterface::compositingNotPossibleReason() const
{
- return CompositingPrefs::compositingNotPossibleReason();
+ return kwinApp()->platform()->compositingNotPossibleReason();
}
QString CompositorDBusInterface::compositingType() const
@@ -227,12 +227,12 @@ bool CompositorDBusInterface::isActive() const
bool CompositorDBusInterface::isCompositingPossible() const
{
- return CompositingPrefs::compositingPossible();
+ return kwinApp()->platform()->compositingPossible();
}
bool CompositorDBusInterface::isOpenGLBroken() const
{
- return CompositingPrefs::openGlIsBroken();
+ return kwinApp()->platform()->openGLCompositingIsBroken();
}
void CompositorDBusInterface::resume()
diff --git a/options.cpp b/options.cpp
index 9054cffde6..dbd957fedc 100644
--- a/options.cpp
+++ b/options.cpp
@@ -29,7 +29,6 @@ along with this program. If not, see .
#include
-#include "compositingprefs.h"
#include "screens.h"
#include "settings.h"
#include "xcbutils.h"
diff --git a/platform.cpp b/platform.cpp
index 1273df848e..736e38446d 100644
--- a/platform.cpp
+++ b/platform.cpp
@@ -286,4 +286,19 @@ bool Platform::requiresCompositing() const
return true;
}
+bool Platform::compositingPossible() const
+{
+ return true;
+}
+
+QString Platform::compositingNotPossibleReason() const
+{
+ return QString();
+}
+
+bool Platform::openGLCompositingIsBroken() const
+{
+ return false;
+}
+
}
diff --git a/platform.h b/platform.h
index 036874268e..b865afc866 100644
--- a/platform.h
+++ b/platform.h
@@ -100,6 +100,30 @@ public:
* without compositing (e.g. rendering is done by the windowing system), re-implement this method.
**/
virtual bool requiresCompositing() const;
+ /**
+ * Whether Compositing is possible in the Platform.
+ * Returning @c false in this method makes only sense if @link{requiresCompositing} returns @c false.
+ *
+ * The default implementation returns @c true.
+ * @see requiresCompositing
+ **/
+ virtual bool compositingPossible() const;
+ /**
+ * Returns a user facing text explaining why compositing is not possible in case
+ * @link{compositingPossible} returns @c false.
+ *
+ * The default implementation returns an empty string.
+ * @see compositingPossible
+ **/
+ virtual QString compositingNotPossibleReason() const;
+ /**
+ * Whether OpenGL compositing is broken.
+ * The Platform can implement this method if it is able to detect whether OpenGL compositing
+ * broke (e.g. triggered a crash in a previous run).
+ *
+ * Default implementation returns @c false.
+ **/
+ virtual bool openGLCompositingIsBroken() const;
bool usesSoftwareCursor() const {
return m_softWareCursor;
diff --git a/plugins/platforms/x11/standalone/x11_platform.cpp b/plugins/platforms/x11/standalone/x11_platform.cpp
index fa090a8865..269842612c 100644
--- a/plugins/platforms/x11/standalone/x11_platform.cpp
+++ b/plugins/platforms/x11/standalone/x11_platform.cpp
@@ -27,6 +27,10 @@ along with this program. If not, see .
#include "screens_xrandr.h"
#include "options.h"
+#include
+#include
+
+#include
#include
namespace KWin
@@ -79,5 +83,76 @@ bool X11StandalonePlatform::requiresCompositing() const
return false;
}
+bool X11StandalonePlatform::openGLCompositingIsBroken() const
+{
+ const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (kwinApp()->isX11MultiHead() ? QString::number(kwinApp()->x11ScreenNumber()) : QString()));
+ return KConfigGroup(kwinApp()->config(), "Compositing").readEntry(unsafeKey, false);
+}
+
+QString X11StandalonePlatform::compositingNotPossibleReason() const
+{
+ // first off, check whether we figured that we'll crash on detection because of a buggy driver
+ KConfigGroup gl_workaround_group(kwinApp()->config(), "Compositing");
+ const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (kwinApp()->isX11MultiHead() ? QString::number(kwinApp()->x11ScreenNumber()) : QString()));
+ if (gl_workaround_group.readEntry("Backend", "OpenGL") == QLatin1String("OpenGL") &&
+ gl_workaround_group.readEntry(unsafeKey, false))
+ return i18n("OpenGL compositing (the default) has crashed KWin in the past.
"
+ "This was most likely due to a driver bug."
+ "If you think that you have meanwhile upgraded to a stable driver,
"
+ "you can reset this protection but be aware that this might result in an immediate crash!
"
+ "Alternatively, you might want to use the XRender backend instead.
");
+
+ if (!Xcb::Extensions::self()->isCompositeAvailable() || !Xcb::Extensions::self()->isDamageAvailable()) {
+ return i18n("Required X extensions (XComposite and XDamage) are not available.");
+ }
+#if !defined( KWIN_HAVE_XRENDER_COMPOSITING )
+ if (!hasGlx())
+ return i18n("GLX/OpenGL are not available and only OpenGL support is compiled.");
+#else
+ if (!(hasGlx()
+ || (Xcb::Extensions::self()->isRenderAvailable() && Xcb::Extensions::self()->isFixesAvailable()))) {
+ return i18n("GLX/OpenGL and XRender/XFixes are not available.");
+ }
+#endif
+ return QString();
+}
+
+bool X11StandalonePlatform::compositingPossible() const
+{
+ // first off, check whether we figured that we'll crash on detection because of a buggy driver
+ KConfigGroup gl_workaround_group(kwinApp()->config(), "Compositing");
+ const QString unsafeKey(QLatin1String("OpenGLIsUnsafe") + (kwinApp()->isX11MultiHead() ? QString::number(kwinApp()->x11ScreenNumber()) : QString()));
+ if (gl_workaround_group.readEntry("Backend", "OpenGL") == QLatin1String("OpenGL") &&
+ gl_workaround_group.readEntry(unsafeKey, false))
+ return false;
+
+
+ if (!Xcb::Extensions::self()->isCompositeAvailable()) {
+ qCDebug(KWIN_CORE) << "No composite extension available";
+ return false;
+ }
+ if (!Xcb::Extensions::self()->isDamageAvailable()) {
+ qCDebug(KWIN_CORE) << "No damage extension available";
+ return false;
+ }
+ if (hasGlx())
+ return true;
+#ifdef KWIN_HAVE_XRENDER_COMPOSITING
+ if (Xcb::Extensions::self()->isRenderAvailable() && Xcb::Extensions::self()->isFixesAvailable())
+ return true;
+#endif
+ if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
+ return true;
+ } else if (qstrcmp(qgetenv("KWIN_COMPOSE"), "O2ES") == 0) {
+ return true;
+ }
+ qCDebug(KWIN_CORE) << "No OpenGL or XRender/XFixes support";
+ return false;
+}
+
+bool X11StandalonePlatform::hasGlx()
+{
+ return Xcb::Extensions::self()->hasGlx();
+}
}
diff --git a/plugins/platforms/x11/standalone/x11_platform.h b/plugins/platforms/x11/standalone/x11_platform.h
index 949f804cab..dd6c71b6ba 100644
--- a/plugins/platforms/x11/standalone/x11_platform.h
+++ b/plugins/platforms/x11/standalone/x11_platform.h
@@ -42,6 +42,21 @@ public:
OpenGLBackend *createOpenGLBackend() override;
Edge *createScreenEdge(ScreenEdges *parent) override;
bool requiresCompositing() const override;
+ bool compositingPossible() const override;
+ QString compositingNotPossibleReason() const override;
+ bool openGLCompositingIsBroken() const override;
+
+private:
+ /**
+ * Tests whether GLX is supported and returns @c true
+ * in case KWin is compiled with OpenGL support and GLX
+ * is available.
+ *
+ * If KWin is compiled with OpenGL ES or without OpenGL at
+ * all, @c false is returned.
+ * @returns @c true if GLX is available, @c false otherwise and if not build with OpenGL support.
+ **/
+ static bool hasGlx();
};