From 6f881c2595f19a4542e6483e90b1c738f6d959bd Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Fri, 15 Oct 2021 17:01:08 +0300 Subject: [PATCH] fix #131,crashes and behavior for Plasma 5.23 --upcoming version 0.10 will be compatible only with Plasma >= 5.23. This patch updates the implementation in order to support kdecoration2 updated implementation that was introduced in Plasma 5.23 --- CMakeLists.txt | 3 ++- README.md | 4 ++-- libappletdecoration/previewbridge.cpp | 15 +-------------- libappletdecoration/previewbridge.h | 1 - libappletdecoration/previewbutton.cpp | 21 +++++++++++++++++++++ libappletdecoration/previewbutton.h | 3 +++ 6 files changed, 29 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2cc751..b0d3c06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ set(EMAIL "mvourlakos@gmail.com") set(QT_MIN_VERSION "5.9.0") set(KF5_MIN_VERSION "5.38.0") +set(KDECORATION2_MIN_VERSION "5.23.0") set(KF5_LOCALE_PREFIX "") @@ -16,7 +17,7 @@ set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED NO_MODULE COMPONENTS Gui Qml Quick) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS CoreAddons Declarative Plasma PlasmaQuick) -find_package(KDecoration2 REQUIRED) +find_package(KDecoration2 ${KDECORATION2_MIN_VERSION} REQUIRED) include(ECMQMLModules) include(CheckIncludeFiles) diff --git a/README.md b/README.md index 09b98b7..4dd9fe3 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ This is a Plasma 5 applet that shows window buttons in your panels. This plasmoi - Qt >= 5.9 - KF5 >= 5.38 -- Plasma >= 5.12 -- KDecoration2 >= 5.12 +- Plasma >= 5.23 +- KDecoration2 >= 5.23 **Qt elements**: Gui Qml Quick diff --git a/libappletdecoration/previewbridge.cpp b/libappletdecoration/previewbridge.cpp index 8f8bd83..b122f10 100644 --- a/libappletdecoration/previewbridge.cpp +++ b/libappletdecoration/previewbridge.cpp @@ -77,19 +77,6 @@ std::unique_ptr PreviewBridge::createClien return std::move(ptr); } -void PreviewBridge::update(KDecoration2::Decoration *decoration, const QRect &geometry) -{ - Q_UNUSED(geometry) - - auto it = std::find_if(m_previewButtons.constBegin(), m_previewButtons.constEnd(), [decoration, geometry](PreviewButtonItem *item) { - return (item->decoration() == decoration) && (item->visualGeometry().contains(geometry.center())); - }); - - if (it != m_previewButtons.constEnd()) { - (*it)->update(); - } -} - std::unique_ptr PreviewBridge::settings(KDecoration2::DecorationSettings *parent) { auto ptr = std::unique_ptr(new PreviewSettings(parent)); @@ -201,7 +188,7 @@ KDecoration2::DecorationButton *PreviewBridge::createButton(KDecoration2::Decora return nullptr; } - return m_factory->create(QStringLiteral("button"), parent, QVariantList({QVariant::fromValue(type), QVariant::fromValue(decoration)})); + return m_factory->create(parent, QVariantList({QVariant::fromValue(type), QVariant::fromValue(decoration)})); } void PreviewBridge::settingsFileChanged(const QString &filename) diff --git a/libappletdecoration/previewbridge.h b/libappletdecoration/previewbridge.h index cf95212..3be6419 100644 --- a/libappletdecoration/previewbridge.h +++ b/libappletdecoration/previewbridge.h @@ -50,7 +50,6 @@ class PreviewBridge : public KDecoration2::DecorationBridge explicit PreviewBridge(QObject *parent = nullptr); virtual ~PreviewBridge(); std::unique_ptr createClient(KDecoration2::DecoratedClient *client, KDecoration2::Decoration *decoration) override; - void update(KDecoration2::Decoration *decoration, const QRect &geometry) override; std::unique_ptr settings(KDecoration2::DecorationSettings *parent) override; PreviewClient *lastCreatedClient() { diff --git a/libappletdecoration/previewbutton.cpp b/libappletdecoration/previewbutton.cpp index 3fcbefe..913af58 100644 --- a/libappletdecoration/previewbutton.cpp +++ b/libappletdecoration/previewbutton.cpp @@ -365,6 +365,20 @@ void PreviewButtonItem::createButton() m_button = m_bridge->createButton(m_sharedDecoration->decoration(), m_type, this); + if (!m_button) { + return; + } + + if (!m_lastAppliedDecoration.isNull()) { + disconnect(m_lastAppliedDecoration.data(), &KDecoration2::Decoration::damaged, this, &PreviewButtonItem::onDamaged); + } + + connect(m_sharedDecoration->decoration(), &KDecoration2::Decoration::damaged, this, &PreviewButtonItem::onDamaged); + m_lastAppliedDecoration = m_sharedDecoration->decoration(); + + m_button->setEnabled(true); + m_button->setVisible(true); + syncInternalGeometry(); } @@ -390,6 +404,13 @@ void PreviewButtonItem::syncInternalGeometry() update(); } +void PreviewButtonItem::onDamaged(const QRegion ®ion) +{ + if (region.intersects(m_visualGeometry)) { + update(); + } +} + void PreviewButtonItem::paint(QPainter *painter) { if (!m_button) { diff --git a/libappletdecoration/previewbutton.h b/libappletdecoration/previewbutton.h index 9a1c97f..f6881ad 100644 --- a/libappletdecoration/previewbutton.h +++ b/libappletdecoration/previewbutton.h @@ -134,11 +134,14 @@ private Q_SLOTS: void createButton(); void syncInternalGeometry(); + void onDamaged(const QRegion ®ion); + private: QPointer m_bridge; QPointer m_client; QPointer m_sharedDecoration; + QPointer m_lastAppliedDecoration; KDecoration2::DecorationButton *m_button = nullptr; KDecoration2::DecorationButtonType m_type = KDecoration2::DecorationButtonType::Custom;