Convert EffectView to a QQuickWidget

Summary:
The Qt Wayland support for subsurfaces is broken in many ways, producing
graphical glitches and crashes:
https://bugreports.qt.io/browse/QTBUG-54888 for instance.

Using a QQuickWidget instead of a QQuickView avoids those issues, with
the additional benefit of a nicer API.

Test Plan:
Opened the KCM with kcmshell and systemsettings, no subsurfaces used
anymore.

Reviewers: #plasma, graesslin, davidedmundson

Reviewed By: #plasma, graesslin, davidedmundson

Subscribers: kwin, plasma-devel, #kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D11066
This commit is contained in:
Fabian Vogt 2018-03-05 20:01:23 +01:00
parent e1afef3d45
commit 68a2ec5d63
4 changed files with 10 additions and 12 deletions

View file

@ -34,6 +34,7 @@ add_library(kwincompositing MODULE ${kwincomposing_SRC})
target_link_libraries(kwincompositing target_link_libraries(kwincompositing
Qt5::Quick Qt5::Quick
Qt5::QuickWidgets
Qt5::DBus Qt5::DBus
Qt5::Widgets Qt5::Widgets
KF5::CoreAddons KF5::CoreAddons
@ -64,6 +65,7 @@ ecm_mark_as_test(effectModelTest)
target_link_libraries(effectModelTest target_link_libraries(effectModelTest
Qt5::Quick Qt5::Quick
Qt5::QuickWidgets
Qt5::DBus Qt5::DBus
Qt5::Test Qt5::Test
Qt5::Widgets Qt5::Widgets

View file

@ -229,16 +229,12 @@ KWinCompositingKCM::KWinCompositingKCM(QWidget* parent, const QVariantList& args
{ {
QVBoxLayout *vl = new QVBoxLayout(this); QVBoxLayout *vl = new QVBoxLayout(this);
QWidget *w = QWidget::createWindowContainer(m_view.data(), this); vl->addWidget(m_view.data());
connect(m_view.data(), &QWindow::minimumWidthChanged, w, &QWidget::setMinimumWidth);
connect(m_view.data(), &QWindow::minimumHeightChanged, w, &QWidget::setMinimumHeight);
w->setMinimumSize(m_view->initialSize());
vl->addWidget(w);
setLayout(vl); setLayout(vl);
connect(m_view.data(), &KWin::Compositing::EffectView::changed, [this]{ connect(m_view.data(), &KWin::Compositing::EffectView::changed, [this]{
emit changed(true); emit changed(true);
}); });
w->setFocusPolicy(Qt::StrongFocus); m_view->setFocusPolicy(Qt::StrongFocus);
} }
KWinCompositingKCM::~KWinCompositingKCM() KWinCompositingKCM::~KWinCompositingKCM()

View file

@ -581,8 +581,8 @@ void EffectFilterModel::defaults()
m_effectModel->defaults(); m_effectModel->defaults();
} }
EffectView::EffectView(ViewType type, QWindow *parent) EffectView::EffectView(ViewType type, QWidget *parent)
: QQuickView(parent) : QQuickWidget(parent)
{ {
qRegisterMetaType<OpenGLPlatformInterfaceModel*>(); qRegisterMetaType<OpenGLPlatformInterfaceModel*>();
qmlRegisterType<EffectConfig>("org.kde.kwin.kwincompositing", 1, 0, "EffectConfig"); qmlRegisterType<EffectConfig>("org.kde.kwin.kwincompositing", 1, 0, "EffectConfig");
@ -608,7 +608,7 @@ void EffectView::init(ViewType type)
break; break;
} }
QString mainFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, path, QStandardPaths::LocateFile); QString mainFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, path, QStandardPaths::LocateFile);
setResizeMode(QQuickView::SizeRootObjectToView); setResizeMode(QQuickWidget::SizeRootObjectToView);
setSource(QUrl(mainFile)); setSource(QUrl(mainFile));
rootObject()->setProperty("color", rootObject()->setProperty("color",
KColorScheme(QPalette::Active, KColorScheme::Window, KSharedConfigPtr(0)).background(KColorScheme::NormalBackground).color()); KColorScheme(QPalette::Active, KColorScheme::Window, KSharedConfigPtr(0)).background(KColorScheme::NormalBackground).color());

View file

@ -27,7 +27,7 @@
#include <QAbstractItemModel> #include <QAbstractItemModel>
#include <QHash> #include <QHash>
#include <QList> #include <QList>
#include <QQuickView> #include <QQuickWidget>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QString> #include <QString>
#include <KPluginInfo> #include <KPluginInfo>
@ -114,7 +114,7 @@ private:
}; };
class EffectView : public QQuickView class EffectView : public QQuickWidget
{ {
Q_OBJECT Q_OBJECT
@ -124,7 +124,7 @@ public:
DesktopEffectsView, DesktopEffectsView,
CompositingSettingsView CompositingSettingsView
}; };
EffectView(ViewType type, QWindow *parent = 0); EffectView(ViewType type, QWidget *parent = 0);
void save(); void save();
void load(); void load();