From: Marco Martin Date: Wed, 28 Jan 2015 08:58:47 +0000 Subject: use xembed for the qml view of window decorations modul X-Git-Url: http://quickgit.kde.org/?p=kwin.git&a=commitdiff&h=63885cc5b3f2922441dac0af96ed001b737e78ea --- use xembed for the qml view of window decorations modul the only way to ensure the view won't randomly become black (probably QQuickwidget won't be fixed in qt anytime soon or ever in 5.x lifetime due to how architecturally is) basically systemsettings has no control of what gets loaded in, if one other kcm will call winId(), this one will break. BUG:341971 --- --- a/kcmkwin/kwindecoration/kcm.cpp +++ b/kcmkwin/kwindecoration/kcm.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -77,21 +78,26 @@ ConfigurationModule::ConfigurationModule(QWidget *parent, const QVariantList &ar m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); connect(m_ui->filter, &QLineEdit::textChanged, m_proxyModel, &QSortFilterProxyModel::setFilterFixedString); + m_quickView = new QQuickView(0); KDeclarative::KDeclarative kdeclarative; - kdeclarative.setDeclarativeEngine(m_ui->view->engine()); + kdeclarative.setDeclarativeEngine(m_quickView->engine()); kdeclarative.setTranslationDomain(QStringLiteral(TRANSLATION_DOMAIN)); kdeclarative.setupBindings(); qmlRegisterType(); - m_ui->view->rootContext()->setContextProperty(QStringLiteral("decorationsModel"), m_proxyModel); + QWidget *widget = QWidget::createWindowContainer(m_quickView, this); + QVBoxLayout* layout = new QVBoxLayout(m_ui->view); + layout->addWidget(widget); + + m_quickView->rootContext()->setContextProperty(QStringLiteral("decorationsModel"), m_proxyModel); updateColors(); - m_ui->view->rootContext()->setContextProperty("_borderSizesIndex", 3); // 3 is normal - m_ui->view->rootContext()->setContextProperty("configurationModule", this); - m_ui->view->rootContext()->setContextProperty("titleFont", QFontDatabase::systemFont(QFontDatabase::TitleFont)); - m_ui->view->setResizeMode(QQuickWidget::SizeRootObjectToView); - m_ui->view->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/kcm_kwindecoration/main.qml")))); - if (m_ui->view->status() == QQuickWidget::Ready) { - auto listView = m_ui->view->rootObject()->findChild("listView"); + m_quickView->rootContext()->setContextProperty("_borderSizesIndex", 3); // 3 is normal + m_quickView->rootContext()->setContextProperty("configurationModule", this); + m_quickView->rootContext()->setContextProperty("titleFont", QFontDatabase::systemFont(QFontDatabase::TitleFont)); + m_quickView->setResizeMode(QQuickView::SizeRootObjectToView); + m_quickView->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/kcm_kwindecoration/main.qml")))); + if (m_quickView->status() == QQuickView::Ready) { + auto listView = m_quickView->rootObject()->findChild("listView"); if (listView) { connect(listView, SIGNAL(currentIndexChanged()), this, SLOT(changed())); } @@ -122,7 +128,7 @@ ConfigurationModule::ConfigurationModule(QWidget *parent, const QVariantList &ar ); connect(m_ui->borderSizesCombo, static_cast(&QComboBox::currentIndexChanged), this, [this] (int index) { - auto listView = m_ui->view->rootObject()->findChild("listView"); + auto listView = m_quickView->rootObject()->findChild("listView"); if (listView) { listView->setProperty("borderSizesIndex", index); } @@ -265,7 +271,7 @@ void ConfigurationModule::load() const QString plugin = config.readEntry("library", s_defaultPlugin); const QString theme = config.readEntry("theme", QString()); const QModelIndex index = m_proxyModel->mapFromSource(m_model->findDecoration(plugin, theme)); - if (auto listView = m_ui->view->rootObject()->findChild("listView")) { + if (auto listView = m_quickView->rootObject()->findChild("listView")) { listView->setProperty("currentIndex", index.isValid() ? index.row() : -1); } m_ui->closeWindowsDoubleClick->setChecked(config.readEntry("CloseOnDoubleClickOnMenu", false)); @@ -305,7 +311,7 @@ void ConfigurationModule::save() KConfigGroup config = KSharedConfig::openConfig("kwinrc")->group(s_pluginName); config.writeEntry("CloseOnDoubleClickOnMenu", m_ui->closeWindowsDoubleClick->isChecked()); config.writeEntry("BorderSize", sizeToString(m_ui->borderSizesCombo->currentData().value())); - if (auto listView = m_ui->view->rootObject()->findChild("listView")) { + if (auto listView = m_quickView->rootObject()->findChild("listView")) { const int currentIndex = listView->property("currentIndex").toInt(); if (currentIndex != -1) { const QModelIndex index = m_proxyModel->index(currentIndex, 0); @@ -333,7 +339,7 @@ void ConfigurationModule::save() void ConfigurationModule::defaults() { - if (auto listView = m_ui->view->rootObject()->findChild("listView")) { + if (auto listView = m_quickView->rootObject()->findChild("listView")) { const QModelIndex index = m_proxyModel->mapFromSource(m_model->findDecoration(s_defaultPlugin)); listView->setProperty("currentIndex", index.isValid() ? index.row() : -1); } @@ -346,7 +352,7 @@ void ConfigurationModule::showKNS(const QString &config) { QPointer downloadDialog = new KNS3::DownloadDialog(config, this); if (downloadDialog->exec() == QDialog::Accepted && !downloadDialog->changedEntries().isEmpty()) { - auto listView = m_ui->view->rootObject()->findChild("listView"); + auto listView = m_quickView->rootObject()->findChild("listView"); QString selectedPluginName; QString selectedThemeName; if (listView) { @@ -396,8 +402,8 @@ bool ConfigurationModule::eventFilter(QObject *watched, QEvent *e) void ConfigurationModule::updateColors() { - m_ui->view->setClearColor(m_ui->view->palette().color(QPalette::Window)); - m_ui->view->rootContext()->setContextProperty("highlightColor", QPalette().color(QPalette::Highlight)); + m_quickView->rootContext()->setContextProperty("backgroundColor", QPalette().color(QPalette::Window)); + m_quickView->rootContext()->setContextProperty("highlightColor", QPalette().color(QPalette::Highlight)); } } --- a/kcmkwin/kwindecoration/kcm.h +++ b/kcmkwin/kwindecoration/kcm.h @@ -25,6 +25,7 @@ #include class QSortFilterProxyModel; +class QQuickView; namespace KDecoration2 { @@ -73,6 +74,7 @@ private: DecorationsModel *m_model; QSortFilterProxyModel *m_proxyModel; ConfigurationForm *m_ui; + QQuickView *m_quickView; Preview::ButtonsModel *m_leftButtons; Preview::ButtonsModel *m_rightButtons; Preview::ButtonsModel *m_availableButtons; --- a/kcmkwin/kwindecoration/kcm.ui +++ b/kcmkwin/kwindecoration/kcm.ui @@ -39,16 +39,13 @@ - + 0 0 - - QQuickWidget::SizeRootObjectToView - --- a/kcmkwin/kwindecoration/qml/main.qml +++ b/kcmkwin/kwindecoration/qml/main.qml @@ -21,12 +21,16 @@ import QtQuick 2.1 import QtQuick.Controls 1.2 import QtQuick.Layouts 1.1 -ColumnLayout { - Previews { - Layout.fillWidth: true - Layout.fillHeight: true - } - Buttons { - Layout.fillWidth: true +Rectangle { + color: backgroundColor + ColumnLayout { + anchors.fill: parent + Previews { + Layout.fillWidth: true + Layout.fillHeight: true + } + Buttons { + Layout.fillWidth: true + } } }