[kcmkwin/compositing] Hide config options which don't make sense if Compositing is required

Summary:
On Wayland compositing is required. It doesn't make any sense to offer
the user to disable the compositor or to allow windows to block
compositing.

The Compositor DBus interface gains a new property whether the platform
requires compositing. This is queried by the compositing kcm and based
on that the two mentioned options get hidden and not stored to config
file.

Test Plan: Opened the KCM on Wayland

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D2586
icc-effect-5.14.5
Martin Gräßlin 2016-08-26 12:56:25 +02:00
parent 853020336f
commit e8e6e31a87
6 changed files with 36 additions and 6 deletions

View File

@ -235,6 +235,11 @@ bool CompositorDBusInterface::isOpenGLBroken() const
return kwinApp()->platform()->openGLCompositingIsBroken(); return kwinApp()->platform()->openGLCompositingIsBroken();
} }
bool CompositorDBusInterface::platformRequiresCompositing() const
{
return kwinApp()->platform()->requiresCompositing();
}
void CompositorDBusInterface::resume() void CompositorDBusInterface::resume()
{ {
m_compositor->resume(Compositor::ScriptSuspend); m_compositor->resume(Compositor::ScriptSuspend);

View File

@ -115,6 +115,7 @@ class CompositorDBusInterface : public QObject
* Values depend on operation mode and compile time options. * Values depend on operation mode and compile time options.
**/ **/
Q_PROPERTY(QStringList supportedOpenGLPlatformInterfaces READ supportedOpenGLPlatformInterfaces) Q_PROPERTY(QStringList supportedOpenGLPlatformInterfaces READ supportedOpenGLPlatformInterfaces)
Q_PROPERTY(bool platformRequiresCompositing READ platformRequiresCompositing)
public: public:
explicit CompositorDBusInterface(Compositor *parent); explicit CompositorDBusInterface(Compositor *parent);
virtual ~CompositorDBusInterface() = default; virtual ~CompositorDBusInterface() = default;
@ -125,6 +126,7 @@ public:
bool isOpenGLBroken() const; bool isOpenGLBroken() const;
QString compositingType() const; QString compositingType() const;
QStringList supportedOpenGLPlatformInterfaces() const; QStringList supportedOpenGLPlatformInterfaces() const;
bool platformRequiresCompositing() const;
public Q_SLOTS: public Q_SLOTS:
/** /**

View File

@ -49,6 +49,7 @@ Compositing::Compositing(QObject *parent)
, m_openGLPlatformInterfaceModel(new OpenGLPlatformInterfaceModel(this)) , m_openGLPlatformInterfaceModel(new OpenGLPlatformInterfaceModel(this))
, m_openGLPlatformInterface(0) , m_openGLPlatformInterface(0)
, m_windowsBlockCompositing(true) , m_windowsBlockCompositing(true)
, m_compositingInterface(new OrgKdeKwinCompositingInterface(QStringLiteral("org.kde.KWin"), QStringLiteral("/Compositor"), QDBusConnection::sessionBus(), this))
{ {
reset(); reset();
connect(this, &Compositing::animationSpeedChanged, this, &Compositing::changed); connect(this, &Compositing::animationSpeedChanged, this, &Compositing::changed);
@ -142,16 +143,13 @@ bool Compositing::OpenGLIsUnsafe() const
bool Compositing::OpenGLIsBroken() bool Compositing::OpenGLIsBroken()
{ {
OrgKdeKwinCompositingInterface interface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/Compositor"),
QDBusConnection::sessionBus());
KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing"); KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing");
QString oldBackend = kwinConfig.readEntry("Backend", "OpenGL"); QString oldBackend = kwinConfig.readEntry("Backend", "OpenGL");
kwinConfig.writeEntry("Backend", "OpenGL"); kwinConfig.writeEntry("Backend", "OpenGL");
kwinConfig.sync(); kwinConfig.sync();
if (interface.openGLIsBroken()) { if (m_compositingInterface->openGLIsBroken()) {
kwinConfig.writeEntry("Backend", oldBackend); kwinConfig.writeEntry("Backend", oldBackend);
kwinConfig.sync(); kwinConfig.sync();
return true; return true;
@ -274,6 +272,9 @@ void Compositing::setCompositingType(int index)
void Compositing::setCompositingEnabled(bool enabled) void Compositing::setCompositingEnabled(bool enabled)
{ {
if (compositingRequired()) {
return;
}
if (enabled == m_compositingEnabled) { if (enabled == m_compositingEnabled) {
return; return;
} }
@ -289,7 +290,9 @@ void Compositing::save()
kwinConfig.writeEntry("HiddenPreviews", windowThumbnail() + 4); kwinConfig.writeEntry("HiddenPreviews", windowThumbnail() + 4);
kwinConfig.writeEntry("GLTextureFilter", glScaleFilter()); kwinConfig.writeEntry("GLTextureFilter", glScaleFilter());
kwinConfig.writeEntry("XRenderSmoothScale", xrScaleFilter()); kwinConfig.writeEntry("XRenderSmoothScale", xrScaleFilter());
kwinConfig.writeEntry("Enabled", compositingEnabled()); if (!compositingRequired()) {
kwinConfig.writeEntry("Enabled", compositingEnabled());
}
auto swapStrategy = [this] { auto swapStrategy = [this] {
switch (glSwapStrategy()) { switch (glSwapStrategy()) {
case 0: case 0:
@ -329,7 +332,9 @@ void Compositing::save()
if (glIndex.isValid()) { if (glIndex.isValid()) {
kwinConfig.writeEntry("GLPlatformInterface", glIndex.data(Qt::UserRole).toString()); kwinConfig.writeEntry("GLPlatformInterface", glIndex.data(Qt::UserRole).toString());
} }
kwinConfig.writeEntry("WindowsBlockCompositing", windowsBlockCompositing()); if (!compositingRequired()) {
kwinConfig.writeEntry("WindowsBlockCompositing", windowsBlockCompositing());
}
kwinConfig.sync(); kwinConfig.sync();
if (m_changed) { if (m_changed) {
@ -368,6 +373,9 @@ bool Compositing::windowsBlockCompositing() const
void Compositing::setWindowsBlockCompositing(bool set) void Compositing::setWindowsBlockCompositing(bool set)
{ {
if (compositingRequired()) {
return;
}
if (m_windowsBlockCompositing == set) { if (m_windowsBlockCompositing == set) {
return; return;
} }
@ -375,6 +383,11 @@ void Compositing::setWindowsBlockCompositing(bool set)
emit windowsBlockCompositingChanged(set); emit windowsBlockCompositingChanged(set);
} }
bool Compositing::compositingRequired() const
{
return m_compositingInterface->platformRequiresCompositing();
}
CompositingType::CompositingType(QObject *parent) CompositingType::CompositingType(QObject *parent)
: QAbstractItemModel(parent) { : QAbstractItemModel(parent) {

View File

@ -25,6 +25,8 @@
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QObject> #include <QObject>
class OrgKdeKwinCompositingInterface;
namespace KWin { namespace KWin {
namespace Compositing { namespace Compositing {
@ -45,6 +47,7 @@ class Compositing : public QObject
Q_PROPERTY(KWin::Compositing::OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel READ openGLPlatformInterfaceModel CONSTANT) Q_PROPERTY(KWin::Compositing::OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel READ openGLPlatformInterfaceModel CONSTANT)
Q_PROPERTY(int openGLPlatformInterface READ openGLPlatformInterface WRITE setOpenGLPlatformInterface NOTIFY openGLPlatformInterfaceChanged) Q_PROPERTY(int openGLPlatformInterface READ openGLPlatformInterface WRITE setOpenGLPlatformInterface NOTIFY openGLPlatformInterfaceChanged)
Q_PROPERTY(bool windowsBlockCompositing READ windowsBlockCompositing WRITE setWindowsBlockCompositing NOTIFY windowsBlockCompositingChanged) Q_PROPERTY(bool windowsBlockCompositing READ windowsBlockCompositing WRITE setWindowsBlockCompositing NOTIFY windowsBlockCompositingChanged)
Q_PROPERTY(bool compositingRequired READ compositingRequired CONSTANT)
public: public:
explicit Compositing(QObject *parent = 0); explicit Compositing(QObject *parent = 0);
@ -61,6 +64,7 @@ public:
bool compositingEnabled() const; bool compositingEnabled() const;
int openGLPlatformInterface() const; int openGLPlatformInterface() const;
bool windowsBlockCompositing() const; bool windowsBlockCompositing() const;
bool compositingRequired() const;
OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel() const; OpenGLPlatformInterfaceModel *openGLPlatformInterfaceModel() const;
@ -107,6 +111,8 @@ private:
OpenGLPlatformInterfaceModel *m_openGLPlatformInterfaceModel; OpenGLPlatformInterfaceModel *m_openGLPlatformInterfaceModel;
int m_openGLPlatformInterface; int m_openGLPlatformInterface;
bool m_windowsBlockCompositing; bool m_windowsBlockCompositing;
bool m_windowsBlockingCompositing;
OrgKdeKwinCompositingInterface *m_compositingInterface;
}; };

View File

@ -87,6 +87,9 @@ KWinCompositingSettings::KWinCompositingSettings(QWidget *parent, const QVariant
m_form.tearingWarning->setIcon(QIcon::fromTheme(QStringLiteral("dialog-warning"))); m_form.tearingWarning->setIcon(QIcon::fromTheme(QStringLiteral("dialog-warning")));
m_form.windowThumbnailWarning->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(); init();
} }

View File

@ -7,6 +7,7 @@
<property name="openGLIsBroken" type="b" access="read"/> <property name="openGLIsBroken" type="b" access="read"/>
<property name="compositingType" type="s" access="read"/> <property name="compositingType" type="s" access="read"/>
<property name="supportedOpenGLPlatformInterfaces" type="as" access="read"/> <property name="supportedOpenGLPlatformInterfaces" type="as" access="read"/>
<property name="platformRequiresCompositing" type="b" access="read"/>
<signal name="compositingToggled"> <signal name="compositingToggled">
<arg name="active" type="b" direction="out"/> <arg name="active" type="b" direction="out"/>
</signal> </signal>