diff --git a/kcmkwin/kwincompositing/compositing.cpp b/kcmkwin/kwincompositing/compositing.cpp
index 46fc3335ed..1e02f778fe 100644
--- a/kcmkwin/kwincompositing/compositing.cpp
+++ b/kcmkwin/kwincompositing/compositing.cpp
@@ -161,6 +161,13 @@ bool Compositing::OpenGLIsBroken()
return false;
}
+void Compositing::reenableOpenGLDetection()
+{
+ KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Compositing");
+ kwinConfig.writeEntry("OpenGLIsUnsafe", false);
+ kwinConfig.sync();
+}
+
int Compositing::animationSpeed() const
{
return m_animationSpeed;
diff --git a/kcmkwin/kwincompositing/compositing.h b/kcmkwin/kwincompositing/compositing.h
index 2f1df35f12..05ee523e21 100644
--- a/kcmkwin/kwincompositing/compositing.h
+++ b/kcmkwin/kwincompositing/compositing.h
@@ -50,6 +50,7 @@ public:
Q_INVOKABLE bool OpenGLIsUnsafe() const;
Q_INVOKABLE bool OpenGLIsBroken();
+ Q_INVOKABLE void reenableOpenGLDetection();
int animationSpeed() const;
int windowThumbnail() const;
int glScaleFilter() const;
diff --git a/kcmkwin/kwincompositing/compositing.ui b/kcmkwin/kwincompositing/compositing.ui
index 571f0a51d2..0f30f12402 100644
--- a/kcmkwin/kwincompositing/compositing.ui
+++ b/kcmkwin/kwincompositing/compositing.ui
@@ -7,7 +7,7 @@
0
0
402
- 300
+ 335
@@ -17,21 +17,21 @@
QFormLayout::AllNonFixedFieldsGrow
- -
+
-
Enable compositor on startup
- -
+
-
Animation speed:
- -
+
-
-
@@ -82,14 +82,14 @@
- -
+
-
Scale method:
- -
+
-
-
@@ -108,14 +108,14 @@
- -
+
-
Scale method:
- -
+
-
-
@@ -129,41 +129,41 @@
- -
+
-
Qt::Horizontal
- -
+
-
Rendering backend:
- -
+
-
- -
+
-
OpenGL interface:
- -
+
-
- -
+
-
Tearing prevention ("vsync"):
- -
+
-
-
@@ -192,18 +192,18 @@
- -
+
-
Keep window thumbnails:
- -
+
-
-
- Always (Breaks Animations)
+ Always
-
@@ -218,43 +218,152 @@
- -
+
-
Expert:
- -
+
-
Suspend compositor for full screen windows
- -
+
-
Experimental:
- -
+
-
Enable color correction
- -
+
-
Qt::Horizontal
+ -
+
+
-
+
+
+ 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.
+
+
+ true
+
+
+ false
+
+
+ KMessageWidget::Warning
+
+
+
+ -
+
+
+ EGL is not supported by all OpenGL drivers. If not supported the Compositor will be disabled.
+
+
+ true
+
+
+ false
+
+
+ KMessageWidget::Warning
+
+
+
+ -
+
+
+ Scale method "Accurate" is not supported by all hardware and can cause performance regressions and rendering artifacts.
+
+
+ true
+
+
+ false
+
+
+ KMessageWidget::Warning
+
+
+
+ -
+
+
+ true
+
+
+ false
+
+
+ KMessageWidget::Warning
+
+
+
+ -
+
+
+ Keeping the window thumbnail always interferes with the minimized state of windows. This can result in windows not suspending their work when minimized.
+
+
+ true
+
+
+ false
+
+
+ KMessageWidget::Warning
+
+
+
+ -
+
+
+ Having full screen windows bypass the compositor is not supported on every hardware.
+
+
+ true
+
+
+ false
+
+
+ KMessageWidget::Information
+
+
+
+
+
+
+
+ KMessageWidget
+ QFrame
+
+ 1
+
+
diff --git a/kcmkwin/kwincompositing/main.cpp b/kcmkwin/kwincompositing/main.cpp
index 4712adecd8..b45c4176b4 100644
--- a/kcmkwin/kwincompositing/main.cpp
+++ b/kcmkwin/kwincompositing/main.cpp
@@ -78,6 +78,16 @@ KWinCompositingSettings::KWinCompositingSettings(QWidget *parent, const QVariant
, m_compositing(new KWin::Compositing::Compositing(this))
{
m_form.setupUi(this);
+ m_form.glCrashedWarning->setIcon(QIcon::fromTheme(QStringLiteral("dialog-warning")));
+ QAction *reenableGLAction = new QAction(i18n("Re-enable OpenGL detection"), this);
+ connect(reenableGLAction, &QAction::triggered, m_compositing, &KWin::Compositing::Compositing::reenableOpenGLDetection);
+ connect(reenableGLAction, &QAction::triggered, m_form.glCrashedWarning, &KMessageWidget::animatedHide);
+ m_form.glCrashedWarning->addAction(reenableGLAction);
+ m_form.interfaceWarning->setIcon(QIcon::fromTheme(QStringLiteral("dialog-warning")));
+ m_form.scaleWarning->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.unredirectInformation->setIcon(QIcon::fromTheme(QStringLiteral("dialog-information")));
init();
}
@@ -103,6 +113,15 @@ void KWinCompositingSettings::init()
m_form.glScaleFilter->setCurrentIndex(m_compositing->glScaleFilter());
connect(m_compositing, &Compositing::glScaleFilterChanged, m_form.glScaleFilter, &QComboBox::setCurrentIndex);
connect(m_form.glScaleFilter, currentIndexChangedSignal, m_compositing, &Compositing::setGlScaleFilter);
+ connect(m_form.glScaleFilter, currentIndexChangedSignal,
+ [this](int index) {
+ if (index == 2) {
+ m_form.scaleWarning->animatedShow();
+ } else {
+ m_form.scaleWarning->animatedHide();
+ }
+ }
+ );
// xrender scale filter
m_form.xrScaleFilter->setCurrentIndex(m_compositing->xrScaleFilter());
@@ -113,22 +132,69 @@ void KWinCompositingSettings::init()
m_form.tearingPrevention->setCurrentIndex(m_compositing->glSwapStrategy());
connect(m_compositing, &Compositing::glSwapStrategyChanged, m_form.tearingPrevention, &QComboBox::setCurrentIndex);
connect(m_form.tearingPrevention, currentIndexChangedSignal, m_compositing, &Compositing::setGlSwapStrategy);
+ connect(m_form.tearingPrevention, currentIndexChangedSignal,
+ [this](int index) {
+ if (index == 2) {
+ // only when cheap - tearing
+ m_form.tearingWarning->setText(i18n("\"Only when cheap\" only prevents tearing for full screen changes like a video."));
+ m_form.tearingWarning->animatedShow();
+ } else if (index == 3) {
+ // full screen repaints
+ m_form.tearingWarning->setText(i18n("\"Full screen repaints\" can cause performance problems."));
+ m_form.tearingWarning->animatedShow();
+ } else if (index == 4) {
+ // re-use screen content
+ m_form.tearingWarning->setText(i18n("\"Re-use screen content\" causes performance severe problems on MESA drivers."));
+ m_form.tearingWarning->animatedShow();
+ } else {
+ m_form.tearingWarning->animatedHide();
+ }
+ }
+ );
// windowThumbnail
m_form.windowThumbnail->setCurrentIndex(m_compositing->windowThumbnail());
connect(m_compositing, &Compositing::windowThumbnailChanged, m_form.windowThumbnail, &QComboBox::setCurrentIndex);
connect(m_form.windowThumbnail, currentIndexChangedSignal, m_compositing, &Compositing::setWindowThumbnail);
+ connect(m_form.windowThumbnail, currentIndexChangedSignal,
+ [this](int index) {
+ if (index == 0) {
+ m_form.windowThumbnailWarning->animatedShow();
+ } else {
+ m_form.windowThumbnailWarning->animatedHide();
+ }
+ }
+ );
// openglPlatformInterface
m_form.openGLPlatformInterface->setModel(m_compositing->openGLPlatformInterfaceModel());
m_form.openGLPlatformInterface->setCurrentIndex(m_compositing->openGLPlatformInterface());
connect(m_compositing, &Compositing::openGLPlatformInterfaceChanged, m_form.openGLPlatformInterface, &QComboBox::setCurrentIndex);
connect(m_form.openGLPlatformInterface, currentIndexChangedSignal, m_compositing, &Compositing::setOpenGLPlatformInterface);
+ connect(m_form.openGLPlatformInterface, currentIndexChangedSignal,
+ [this]() {
+ if (m_form.openGLPlatformInterface->count() > 1 // only if egl and glx are supported
+ && m_form.openGLPlatformInterface->currentData().toString() == QStringLiteral("egl")) {
+ m_form.interfaceWarning->animatedShow();
+ } else {
+ m_form.interfaceWarning->animatedHide();
+ }
+ }
+ );
// unredirect fullscreen
m_form.unredirectFullscreen->setChecked(m_compositing->unredirectFullscreen());
connect(m_compositing, &Compositing::unredirectFullscreenChanged, m_form.unredirectFullscreen, &QCheckBox::setChecked);
connect(m_form.unredirectFullscreen, &QCheckBox::toggled, m_compositing, &Compositing::setUnredirectFullscreen);
+ connect(m_form.unredirectFullscreen, &QCheckBox::toggled,
+ [this](bool enabled) {
+ if (enabled) {
+ m_form.unredirectInformation->animatedShow();
+ } else {
+ m_form.unredirectInformation->animatedHide();
+ }
+ }
+ );
// color correction
m_form.colorCorrection->setChecked(m_compositing->glColorCorrection());
@@ -164,6 +230,10 @@ void KWinCompositingSettings::init()
showHideBasedOnType();
}
);
+
+ if (m_compositing->OpenGLIsUnsafe()) {
+ m_form.glCrashedWarning->animatedShow();
+ }
}
void KWinCompositingSettings::load()