From c16472e53507ee05efbb9860ce78b808fcd18839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Fri, 23 May 2014 10:11:02 +0200 Subject: [PATCH] [kcmkwin/compositing] Use a classic ui file for the Compositor settings For a classic user interface like the advanced compositor settings the good old widgets are still better suited than the new QuickControls. REVIEW: 118273 --- kcmkwin/kwincompositing/CMakeLists.txt | 2 + kcmkwin/kwincompositing/compositing.ui | 260 +++++++++++++++++++++++++ kcmkwin/kwincompositing/main.cpp | 129 +++++++++++- 3 files changed, 387 insertions(+), 4 deletions(-) create mode 100644 kcmkwin/kwincompositing/compositing.ui 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))