From 484e4be7f66b6f6d4021f6adb4f43531df9649c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 20 Oct 2015 14:22:05 +0200 Subject: [PATCH] [kcmkwin/deco] Delay deleting of PreviewBridge Our decoration is deleted using deleteLater() and that might cause access to the bridge. Given that we also need to deleteLater() the PreviewBridge. To do so the PreviewBridge is no longer directly exposed to QML, but in a wrapper object which holds the bridge as only element. BUG: 344278 FIXED-IN: 5.4.3 REVIEW: 125724 --- .../declarative-plugin/plugin.cpp | 3 +- .../declarative-plugin/previewbridge.cpp | 14 +++++++ .../declarative-plugin/previewbridge.h | 42 +++++++++++++++++++ kcmkwin/kwindecoration/qml/ButtonGroup.qml | 2 +- kcmkwin/kwindecoration/qml/Buttons.qml | 4 +- kcmkwin/kwindecoration/qml/Previews.qml | 8 ++-- 6 files changed, 65 insertions(+), 8 deletions(-) diff --git a/kcmkwin/kwindecoration/declarative-plugin/plugin.cpp b/kcmkwin/kwindecoration/declarative-plugin/plugin.cpp index 3df73c5b55..690aa1333f 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/plugin.cpp +++ b/kcmkwin/kwindecoration/declarative-plugin/plugin.cpp @@ -38,7 +38,7 @@ namespace Preview void Plugin::registerTypes(const char *uri) { Q_ASSERT(QLatin1String(uri) == QLatin1String("org.kde.kwin.private.kdecoration")); - qmlRegisterType(uri, 1, 0, "Bridge"); + qmlRegisterType(uri, 1, 0, "Bridge"); qmlRegisterType(uri, 1, 0, "Settings"); qmlRegisterType(uri, 1, 0, "Decoration"); qmlRegisterType(uri, 1, 0, "Button"); @@ -46,6 +46,7 @@ void Plugin::registerTypes(const char *uri) qmlRegisterType(); qmlRegisterType(); qmlRegisterType(); + qmlRegisterType(); } } diff --git a/kcmkwin/kwindecoration/declarative-plugin/previewbridge.cpp b/kcmkwin/kwindecoration/declarative-plugin/previewbridge.cpp index d6d1ef5c83..7d201f31d4 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/previewbridge.cpp +++ b/kcmkwin/kwindecoration/declarative-plugin/previewbridge.cpp @@ -237,5 +237,19 @@ void PreviewBridge::configure() dialog.exec(); } +BridgeItem::BridgeItem(QObject *parent) + : QObject(parent) + , m_bridge(new PreviewBridge()) +{ + connect(m_bridge, &PreviewBridge::themeChanged, this, &BridgeItem::themeChanged); + connect(m_bridge, &PreviewBridge::pluginChanged, this, &BridgeItem::pluginChanged); + connect(m_bridge, &PreviewBridge::validChanged, this, &BridgeItem::validChanged); +} + +BridgeItem::~BridgeItem() +{ + m_bridge->deleteLater(); +} + } } diff --git a/kcmkwin/kwindecoration/declarative-plugin/previewbridge.h b/kcmkwin/kwindecoration/declarative-plugin/previewbridge.h index fc3c9e073d..fe366eb42e 100644 --- a/kcmkwin/kwindecoration/declarative-plugin/previewbridge.h +++ b/kcmkwin/kwindecoration/declarative-plugin/previewbridge.h @@ -89,6 +89,48 @@ private: bool m_valid; }; +class BridgeItem : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString plugin READ plugin WRITE setPlugin NOTIFY pluginChanged) + Q_PROPERTY(QString theme READ theme WRITE setTheme NOTIFY themeChanged) + Q_PROPERTY(bool valid READ isValid NOTIFY validChanged) + Q_PROPERTY(KDecoration2::Preview::PreviewBridge *bridge READ bridge CONSTANT) + +public: + explicit BridgeItem(QObject *parent = nullptr); + virtual ~BridgeItem(); + + void setPlugin(const QString &plugin) { + m_bridge->setPlugin(plugin); + } + QString plugin() const { + return m_bridge->plugin(); + } + void setTheme(const QString &theme) { + m_bridge->setTheme(theme); + } + QString theme() const { + return m_bridge->theme(); + } + bool isValid() const { + return m_bridge->isValid(); + } + + PreviewBridge *bridge() const { + return m_bridge; + } + +Q_SIGNALS: + void pluginChanged(); + void themeChanged(); + void validChanged(); + +private: + PreviewBridge *m_bridge; + +}; + } } diff --git a/kcmkwin/kwindecoration/qml/ButtonGroup.qml b/kcmkwin/kwindecoration/qml/ButtonGroup.qml index 1548732dd5..a64f446abb 100644 --- a/kcmkwin/kwindecoration/qml/ButtonGroup.qml +++ b/kcmkwin/kwindecoration/qml/ButtonGroup.qml @@ -37,7 +37,7 @@ ListView { id: button property int itemIndex: index property var buttonsModel: parent.ListView.view.model - bridge: bridgeItem + bridge: bridgeItem.bridge settings: settingsItem type: model["button"] anchors.fill: Drag.active ? undefined : parent diff --git a/kcmkwin/kwindecoration/qml/Buttons.qml b/kcmkwin/kwindecoration/qml/Buttons.qml index 7c6997c330..33b6f64efe 100644 --- a/kcmkwin/kwindecoration/qml/Buttons.qml +++ b/kcmkwin/kwindecoration/qml/Buttons.qml @@ -32,7 +32,7 @@ Item { } KDecoration.Settings { id: settingsItem - bridge: bridgeItem + bridge: bridgeItem.bridge } Rectangle { anchors.fill: parent @@ -153,7 +153,7 @@ Item { KDecoration.Button { id: availableButton anchors.centerIn: Drag.active ? undefined : parent - bridge: bridgeItem + bridge: bridgeItem.bridge settings: settingsItem type: model["button"] width: units.iconSizes.small diff --git a/kcmkwin/kwindecoration/qml/Previews.qml b/kcmkwin/kwindecoration/qml/Previews.qml index eabc666432..bc8c56ade1 100644 --- a/kcmkwin/kwindecoration/qml/Previews.qml +++ b/kcmkwin/kwindecoration/qml/Previews.qml @@ -52,7 +52,7 @@ ScrollView { } KDecoration.Settings { id: settingsItem - bridge: bridgeItem + bridge: bridgeItem.bridge borderSizesIndex: listView.borderSizesIndex } MouseArea { @@ -67,7 +67,7 @@ ScrollView { Item { KDecoration.Decoration { id: inactivePreview - bridge: bridgeItem + bridge: bridgeItem.bridge settings: settingsItem anchors.fill: parent Component.onCompleted: { @@ -81,7 +81,7 @@ ScrollView { } KDecoration.Decoration { id: activePreview - bridge: bridgeItem + bridge: bridgeItem.bridge settings: settingsItem anchors.fill: parent Component.onCompleted: { @@ -107,7 +107,7 @@ ScrollView { id: configureButton enabled: model["configureable"] iconName: "configure" - onClicked: bridgeItem.configure() + onClicked: bridgeItem.bridge.configure() } } }