diff --git a/kcmkwin/kwincompositing/CMakeLists.txt b/kcmkwin/kwincompositing/CMakeLists.txt
index 6e78187716..d7d75c96bc 100644
--- a/kcmkwin/kwincompositing/CMakeLists.txt
+++ b/kcmkwin/kwincompositing/CMakeLists.txt
@@ -26,6 +26,8 @@ qt5_add_dbus_interface( kwincomposing_SRC
qt5_add_dbus_interface( kwincomposing_SRC
${KWIN_SOURCE_DIR}/org.kde.kwin.Effects.xml kwin_effects_interface)
+ki18n_wrap_ui(kwincomposing_SRC compositing.ui)
+
add_library(kwincompositing MODULE ${kwincomposing_SRC})
target_link_libraries(kwincompositing
diff --git a/kcmkwin/kwincompositing/compositing.ui b/kcmkwin/kwincompositing/compositing.ui
new file mode 100644
index 0000000000..571f0a51d2
--- /dev/null
+++ b/kcmkwin/kwincompositing/compositing.ui
@@ -0,0 +1,260 @@
+
+
+ CompositingForm
+
+
+
+ 0
+ 0
+ 402
+ 300
+
+
+
+ Form
+
+
+
+ QFormLayout::AllNonFixedFieldsGrow
+
+ -
+
+
+ Enable compositor on startup
+
+
+
+ -
+
+
+ Animation speed:
+
+
+
+ -
+
+
-
+
+
+ 6
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksBelow
+
+
+ 1
+
+
+
+ -
+
+
-
+
+
+ Instant
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+ Very slow
+
+
+
+
+
+
+
+ -
+
+
+ Scale method:
+
+
+
+ -
+
+
-
+
+ Crisp
+
+
+ -
+
+ Smooth
+
+
+ -
+
+ Accurate
+
+
+
+
+ -
+
+
+ Scale method:
+
+
+
+ -
+
+
-
+
+ Crisp
+
+
+ -
+
+ Smooth (slower)
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Rendering backend:
+
+
+
+ -
+
+
+ -
+
+
+ OpenGL interface:
+
+
+
+ -
+
+
+ -
+
+
+ Tearing prevention ("vsync"):
+
+
+
+ -
+
+
-
+
+ Never
+
+
+ -
+
+ Automatic
+
+
+ -
+
+ Only when cheap
+
+
+ -
+
+ Full screen repaints
+
+
+ -
+
+ Re-use screen content
+
+
+
+
+ -
+
+
+ Keep window thumbnails:
+
+
+
+ -
+
+
-
+
+ Always (Breaks Animations)
+
+
+ -
+
+ Only for Shown Windows
+
+
+ -
+
+ Never
+
+
+
+
+ -
+
+
+ Expert:
+
+
+
+ -
+
+
+ Suspend compositor for full screen windows
+
+
+
+ -
+
+
+ Experimental:
+
+
+
+ -
+
+
+ Enable color correction
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+
+
+
+
+
diff --git a/kcmkwin/kwincompositing/main.cpp b/kcmkwin/kwincompositing/main.cpp
index 1c1dc4e6f9..4712adecd8 100644
--- a/kcmkwin/kwincompositing/main.cpp
+++ b/kcmkwin/kwincompositing/main.cpp
@@ -20,8 +20,9 @@
**************************************************************************/
-
+#include "compositing.h"
#include "model.h"
+#include "ui_compositing.h"
#include
#include
@@ -55,14 +56,134 @@ public:
: KWinCompositingKCM(parent, args, KWin::Compositing::EffectView::DesktopEffectsView) {}
};
-class KWinCompositingSettings : public KWinCompositingKCM
+class KWinCompositingSettings : public KCModule
{
Q_OBJECT
public:
- explicit KWinCompositingSettings(QWidget* parent = 0, const QVariantList& args = QVariantList())
- : KWinCompositingKCM(parent, args, KWin::Compositing::EffectView::CompositingSettingsView) {}
+ explicit KWinCompositingSettings(QWidget *parent = 0, const QVariantList &args = QVariantList());
+
+public Q_SLOTS:
+ void load() override;
+ void save() override;
+ void defaults() override;
+
+private:
+ void init();
+ KWin::Compositing::Compositing *m_compositing;
+ Ui_CompositingForm m_form;
};
+KWinCompositingSettings::KWinCompositingSettings(QWidget *parent, const QVariantList &args)
+ : KCModule(parent, args)
+ , m_compositing(new KWin::Compositing::Compositing(this))
+{
+ m_form.setupUi(this);
+
+ init();
+}
+
+void KWinCompositingSettings::init()
+{
+ using namespace KWin::Compositing;
+ auto currentIndexChangedSignal = static_cast(&QComboBox::currentIndexChanged);
+
+ connect(m_compositing, &Compositing::changed, this, static_cast(&KWinCompositingSettings::changed));
+
+ // enabled check box
+ m_form.compositingEnabled->setChecked(m_compositing->compositingEnabled());
+ connect(m_compositing, &Compositing::compositingEnabledChanged, m_form.compositingEnabled, &QCheckBox::setChecked);
+ 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);
+
+ // gl scale filter
+ 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);
+
+ // xrender scale filter
+ m_form.xrScaleFilter->setCurrentIndex(m_compositing->xrScaleFilter());
+ connect(m_compositing, &Compositing::xrScaleFilterChanged, m_form.xrScaleFilter, &QComboBox::setCurrentIndex);
+ connect(m_form.xrScaleFilter, currentIndexChangedSignal, m_compositing, &Compositing::setXrScaleFilter);
+
+ // tearing prevention
+ 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);
+
+ // 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);
+
+ // 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);
+
+ // 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);
+
+ // color correction
+ m_form.colorCorrection->setChecked(m_compositing->glColorCorrection());
+ connect(m_compositing, &Compositing::glColorCorrectionChanged, m_form.colorCorrection, &QCheckBox::setChecked);
+ connect(m_form.colorCorrection, &QCheckBox::toggled, m_compositing, &Compositing::setGlColorCorrection);
+
+ // compositing type
+ CompositingType *type = new CompositingType(this);
+ m_form.type->setModel(type);
+ auto updateCompositingType = [this, type]() {
+ m_form.type->setCurrentIndex(type->indexForCompositingType(m_compositing->compositingType()));
+ };
+ updateCompositingType();
+ connect(m_compositing, &Compositing::compositingTypeChanged,
+ [updateCompositingType]() {
+ updateCompositingType();
+ }
+ );
+ auto showHideBasedOnType = [this, type]() {
+ const int currentType = type->compositingTypeForIndex(m_form.type->currentIndex());
+ m_form.glScaleFilter->setVisible(currentType != CompositingType::XRENDER_INDEX);
+ m_form.glScaleFilterLabel->setVisible(currentType != CompositingType::XRENDER_INDEX);
+ m_form.xrScaleFilter->setVisible(currentType == CompositingType::XRENDER_INDEX);
+ m_form.xrScaleFilterLabel->setVisible(currentType == CompositingType::XRENDER_INDEX);
+ m_form.openGLPlatformInterface->setVisible(currentType != CompositingType::XRENDER_INDEX);
+ m_form.openGLPlatformInterfaceLabel->setVisible(currentType != CompositingType::XRENDER_INDEX);
+ m_form.colorCorrection->setEnabled(currentType == CompositingType::OPENGL31_INDEX || currentType == CompositingType::OPENGL20_INDEX);
+ };
+ showHideBasedOnType();
+ connect(m_form.type, currentIndexChangedSignal,
+ [this, type, showHideBasedOnType]() {
+ m_compositing->setCompositingType(type->compositingTypeForIndex(m_form.type->currentIndex()));
+ showHideBasedOnType();
+ }
+ );
+}
+
+void KWinCompositingSettings::load()
+{
+ KCModule::load();
+ m_compositing->reset();
+}
+
+void KWinCompositingSettings::defaults()
+{
+ KCModule::defaults();
+ m_compositing->defaults();
+}
+
+void KWinCompositingSettings::save()
+{
+ KCModule::save();
+ m_compositing->save();
+}
+
KWinCompositingKCM::KWinCompositingKCM(QWidget* parent, const QVariantList& args, KWin::Compositing::EffectView::ViewType viewType)
: KCModule(parent, args)
, m_view(new KWin::Compositing::EffectView(viewType))