Hello community, here is the log from the commit of package libkdecoration2 for openSUSE:Factory checked in at 2017-01-31 12:21:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libkdecoration2 (Old) and /work/SRC/openSUSE:Factory/.libkdecoration2.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libkdecoration2" Changes: -------- --- /work/SRC/openSUSE:Factory/libkdecoration2/libkdecoration2.changes 2017-01-04 17:25:26.443776283 +0100 +++ /work/SRC/openSUSE:Factory/.libkdecoration2.new/libkdecoration2.changes 2017-02-03 17:47:45.135362452 +0100 @@ -1,0 +2,21 @@ +Thu Jan 26 19:58:35 CET 2017 - [email protected] + +- Update to 5.9.0 + * New feature release + * For more details please see: + * https://www.kde.org/announcements/plasma-5.9.0.php +- Changes since 5.8.95: + * None + +------------------------------------------------------------------- +Thu Jan 12 20:39:58 UTC 2017 - [email protected] + +- Update to 5.8.95 (Plasma 5.9 Beta) + * New feature release + * For more details please see: + https://www.kde.org/announcements/plasma-5.8.95.php +- Changes: + * [KDecoration] Restore application menu button. + * Add .arcconfig. + +------------------------------------------------------------------- Old: ---- kdecoration-5.8.5.tar.xz New: ---- kdecoration-5.9.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libkdecoration2.spec ++++++ --- /var/tmp/diff_new_pack.nVmV7d/_old 2017-02-03 17:47:46.075229957 +0100 +++ /var/tmp/diff_new_pack.nVmV7d/_new 2017-02-03 17:47:46.079229392 +0100 @@ -1,7 +1,7 @@ # # spec file for package libkdecoration2 # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define lname libkdecorations2-5 %define lname_private libkdecorations2private5 Name: libkdecoration2 -Version: 5.8.5 +Version: 5.9.0 Release: 0 BuildRequires: cmake >= 2.8.12 BuildRequires: extra-cmake-modules >= 0.0.11 @@ -31,7 +31,7 @@ License: GPL-2.0+ Group: System/GUI/KDE Url: http://www.kde.org -Source: http://download.kde.org/stable/plasma/%{version}/kdecoration-%{version}.tar.xz +Source: kdecoration-%{version}.tar.xz Source1: baselibs.conf BuildRoot: %{_tmppath}/%{name}-%{version}-build ++++++ kdecoration-5.8.5.tar.xz -> kdecoration-5.9.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/.arcconfig new/kdecoration-5.9.0/.arcconfig --- old/kdecoration-5.8.5/.arcconfig 1970-01-01 01:00:00.000000000 +0100 +++ new/kdecoration-5.9.0/.arcconfig 2017-01-26 13:09:41.000000000 +0100 @@ -0,0 +1,4 @@ +{ + "phabricator.uri" : "https://phabricator.kde.org/" +} + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/CMakeLists.txt new/kdecoration-5.9.0/CMakeLists.txt --- old/kdecoration-5.8.5/CMakeLists.txt 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/CMakeLists.txt 2017-01-26 13:09:41.000000000 +0100 @@ -1,5 +1,5 @@ project(decoration-api) -set(PROJECT_VERSION "5.8.5") +set(PROJECT_VERSION "5.9.0") cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/autotests/decorationbuttontest.cpp new/kdecoration-5.9.0/autotests/decorationbuttontest.cpp --- old/kdecoration-5.8.5/autotests/decorationbuttontest.cpp 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/autotests/decorationbuttontest.cpp 2017-01-26 13:09:41.000000000 +0100 @@ -59,6 +59,7 @@ void testMenu(); void testMenuDoubleClick(); void testMenuPressAndHold(); + void testApplicationMenu(); }; void DecorationButtonTest::testButton() @@ -1286,5 +1287,60 @@ QCOMPARE(closeRequestedSpy.count(), 0); } +void DecorationButtonTest::testApplicationMenu() +{ + MockBridge bridge; + auto decoSettings = QSharedPointer<KDecoration2::DecorationSettings>::create(&bridge); + MockDecoration mockDecoration(&bridge); + mockDecoration.setSettings(decoSettings); + MockClient *client = bridge.lastCreatedClient(); + MockButton button(KDecoration2::DecorationButtonType::ApplicationMenu, &mockDecoration); + button.setGeometry(QRect(0, 0, 10, 10)); + + QCOMPARE(button.isEnabled(), true); + QCOMPARE(button.isCheckable(), true); + QCOMPARE(button.isChecked(), false); + QCOMPARE(button.isVisible(), true); + QCOMPARE(button.acceptedButtons(), Qt::LeftButton); + + // clicking the button should trigger a request for application menu + QSignalSpy clickedSpy(&button, SIGNAL(clicked(Qt::MouseButton))); + QVERIFY(clickedSpy.isValid()); + QSignalSpy pressedSpy(&button, SIGNAL(pressed())); + QVERIFY(pressedSpy.isValid()); + QSignalSpy releasedSpy(&button, SIGNAL(released())); + QVERIFY(releasedSpy.isValid()); + QSignalSpy pressedChangedSpy(&button, SIGNAL(pressedChanged(bool))); + QVERIFY(pressedChangedSpy.isValid()); + QSignalSpy applicationMenuRequestedSpy(client, SIGNAL(applicationMenuRequested())); + QVERIFY(applicationMenuRequestedSpy.isValid()); + + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPointF(5, 5), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + pressEvent.setAccepted(false); + button.event(&pressEvent); + QCOMPARE(pressEvent.isAccepted(), true); + QCOMPARE(button.isPressed(), true); + QCOMPARE(clickedSpy.count(), 0); + QCOMPARE(pressedSpy.count(), 1); + QCOMPARE(releasedSpy.count(), 0); + QCOMPARE(applicationMenuRequestedSpy.count(), 0); + QCOMPARE(pressedChangedSpy.count(), 1); + QCOMPARE(pressedChangedSpy.first().first().toBool(), true); + + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPointF(5, 5), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); + releaseEvent.setAccepted(false); + button.event(&releaseEvent); + QCOMPARE(releaseEvent.isAccepted(), true); + QCOMPARE(button.isPressed(), false); + QCOMPARE(clickedSpy.count(), 1); + QCOMPARE(clickedSpy.first().first().value<Qt::MouseButton>(), Qt::LeftButton); + QCOMPARE(pressedSpy.count(), 1); + QCOMPARE(releasedSpy.count(), 1); + QVERIFY(applicationMenuRequestedSpy.wait()); + QCOMPARE(applicationMenuRequestedSpy.count(), 1); + QCOMPARE(pressedChangedSpy.count(), 2); + QCOMPARE(pressedChangedSpy.last().first().toBool(), false); +} + QTEST_MAIN(DecorationButtonTest) #include "decorationbuttontest.moc" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/autotests/mockclient.cpp new/kdecoration-5.9.0/autotests/mockclient.cpp --- old/kdecoration-5.8.5/autotests/mockclient.cpp 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/autotests/mockclient.cpp 2017-01-26 13:09:41.000000000 +0100 @@ -24,7 +24,7 @@ MockClient::MockClient(KDecoration2::DecoratedClient *client, KDecoration2::Decoration *decoration) : QObject() - , DecoratedClientPrivate(client, decoration) + , ApplicationMenuEnabledDecoratedClientPrivate(client, decoration) { } @@ -138,6 +138,16 @@ return QPalette(); } +bool MockClient::hasApplicationMenu() const +{ + return true; +} + +bool MockClient::isApplicationMenuActive() const +{ + return false; +} + bool MockClient::providesContextHelp() const { return m_contextHelp; @@ -191,6 +201,13 @@ emit menuRequested(); } +void MockClient::requestShowApplicationMenu(const QRect &rect, int actionId) +{ + Q_UNUSED(rect); + Q_UNUSED(actionId); + emit applicationMenuRequested(); // FIXME TODO pass geometry +} + void MockClient::requestToggleKeepAbove() { m_keepAbove = !m_keepAbove; @@ -266,3 +283,8 @@ m_height = h; emit client()->heightChanged(h); } + +void MockClient::showApplicationMenu(int actionId) +{ + Q_UNUSED(actionId) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/autotests/mockclient.h new/kdecoration-5.9.0/autotests/mockclient.h --- old/kdecoration-5.8.5/autotests/mockclient.h 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/autotests/mockclient.h 2017-01-26 13:09:41.000000000 +0100 @@ -24,7 +24,7 @@ #include <QObject> -class MockClient : public QObject, public KDecoration2::DecoratedClientPrivate +class MockClient : public QObject, public KDecoration2::ApplicationMenuEnabledDecoratedClientPrivate { Q_OBJECT public: @@ -52,12 +52,15 @@ bool isShadeable() const override; bool isShaded() const override; QPalette palette() const override; + bool hasApplicationMenu() const override; + bool isApplicationMenuActive() const override; bool providesContextHelp() const override; void requestClose() override; void requestContextHelp() override; void requestToggleMaximization(Qt::MouseButtons buttons) override; void requestMinimize() override; void requestShowWindowMenu() override; + void requestShowApplicationMenu(const QRect &rect, int actionId) override; void requestToggleKeepAbove() override; void requestToggleKeepBelow() override; void requestToggleOnAllDesktops() override; @@ -65,6 +68,8 @@ int width() const override; WId windowId() const override; + void showApplicationMenu(int actionId) override; + void setCloseable(bool set); void setMinimizable(bool set); void setProvidesContextHelp(bool set); @@ -79,6 +84,7 @@ void minimizeRequested(); void quickHelpRequested(); void menuRequested(); + void applicationMenuRequested(); private: bool m_closeable = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/decoratedclient.cpp new/kdecoration-5.9.0/src/decoratedclient.cpp --- old/kdecoration-5.8.5/src/decoratedclient.cpp 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/decoratedclient.cpp 2017-01-26 13:09:41.000000000 +0100 @@ -69,6 +69,22 @@ #undef DELEGATE +bool DecoratedClient::hasApplicationMenu() const +{ + if (const auto *appMenuEnabledPrivate = dynamic_cast<ApplicationMenuEnabledDecoratedClientPrivate *>(d.get())) { + return appMenuEnabledPrivate->hasApplicationMenu(); + } + return false; +} + +bool DecoratedClient::isApplicationMenuActive() const +{ + if (const auto *appMenuEnabledPrivate = dynamic_cast<ApplicationMenuEnabledDecoratedClientPrivate *>(d.get())) { + return appMenuEnabledPrivate->isApplicationMenuActive(); + } + return false; +} + QPointer< Decoration > DecoratedClient::decoration() const { return QPointer<Decoration>(d->decoration()); @@ -84,4 +100,11 @@ return d->color(group, role); } +void DecoratedClient::showApplicationMenu(int actionId) +{ + if (auto *appMenuEnabledPrivate = dynamic_cast<ApplicationMenuEnabledDecoratedClientPrivate *>(d.get())) { + appMenuEnabledPrivate->showApplicationMenu(actionId); + } +} + } // namespace diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/decoratedclient.h new/kdecoration-5.9.0/src/decoratedclient.h --- old/kdecoration-5.8.5/src/decoratedclient.h 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/decoratedclient.h 2017-01-26 13:09:41.000000000 +0100 @@ -167,6 +167,17 @@ * will include all Edges. The Decoration can use this information to hide borders. **/ Q_PROPERTY(Qt::Edges adjacentScreenEdges READ adjacentScreenEdges NOTIFY adjacentScreenEdgesChanged) + /** + * Whether the DecoratedClient has an application menu + * @since 5.9 + */ + Q_PROPERTY(bool hasApplicationMenu READ hasApplicationMenu NOTIFY hasApplicationMenuChanged) + /** + * Whether the application menu for this DecoratedClient is currently shown to the user + * The Decoration can use this information to highlight the respective button. + * @since 5.9 + */ + Q_PROPERTY(bool applicationMenuActive READ isApplicationMenuActive NOTIFY applicationMenuActiveChanged) // TODO: properties for windowId and decorationId? @@ -221,6 +232,24 @@ **/ QColor color(ColorGroup group, ColorRole role) const; + /** + * Whether the DecoratedClient has an application menu + * @since 5.9 + */ + bool hasApplicationMenu() const; + /** + * Whether the application menu for this DecoratedClient is currently shown to the user + * The Decoration can use this information to highlight the respective button. + * @since 5.9 + */ + bool isApplicationMenuActive() const; + + /** + * Request the application menu to be shown to the user + * @param actionId The DBus menu ID of the action that should be highlighted, 0 for none. + */ + void showApplicationMenu(int actionId); + Q_SIGNALS: void activeChanged(bool); void captionChanged(QString); @@ -247,6 +276,9 @@ void paletteChanged(const QPalette &palette); void adjacentScreenEdgesChanged(Qt::Edges edges); + void hasApplicationMenuChanged(bool); + void applicationMenuActiveChanged(bool); + private: friend class Decoration; DecoratedClient(Decoration *parent, DecorationBridge *bridge); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/decoration.cpp new/kdecoration-5.9.0/src/decoration.cpp --- old/kdecoration-5.8.5/src/decoration.cpp 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/decoration.cpp 2017-01-26 13:09:41.000000000 +0100 @@ -185,6 +185,24 @@ d->client->d->requestToggleMaximization(buttons); } +void Decoration::showApplicationMenu(int actionId) +{ + auto it = std::find_if(d->buttons.constBegin(), d->buttons.constEnd(), [](DecorationButton *button) { + return button->type() == DecorationButtonType::ApplicationMenu; + }); + + if (it != d->buttons.constEnd()) { + requestShowApplicationMenu((*it)->geometry().toRect(), actionId); + } +} + +void Decoration::requestShowApplicationMenu(const QRect &rect, int actionId) +{ + if (auto *appMenuEnabledPrivate = dynamic_cast<ApplicationMenuEnabledDecoratedClientPrivate *>(d->client->d.get())) { + appMenuEnabledPrivate->requestShowApplicationMenu(rect, actionId); + } +} + #define DELEGATE(name, variableName, type, emitValue) \ void Decoration::name(type a) \ { \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/decoration.h new/kdecoration-5.9.0/src/decoration.h --- old/kdecoration-5.8.5/src/decoration.h 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/decoration.h 2017-01-26 13:09:41.000000000 +0100 @@ -177,6 +177,9 @@ void requestToggleKeepBelow(); void requestShowWindowMenu(); + void showApplicationMenu(int actionId); + void requestShowApplicationMenu(const QRect &rect, int actionId); + void update(const QRect &rect); void update(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/decorationbutton.cpp new/kdecoration-5.9.0/src/decorationbutton.cpp --- old/kdecoration-5.8.5/src/decorationbutton.cpp 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/decorationbutton.cpp 2017-01-26 13:09:41.000000000 +0100 @@ -77,6 +77,16 @@ setPressAndHold(settings->isCloseOnDoubleClickOnMenu()); setAcceptedButtons(Qt::LeftButton | Qt::RightButton); break; + case DecorationButtonType::ApplicationMenu: + setVisible(c->hasApplicationMenu()); + setCheckable(true); // will be "checked" whilst the menu is opened + // FIXME TODO connect directly and figure out the button geometry/offset stuff + QObject::connect(q, &DecorationButton::clicked, decoration.data(), [this] { + decoration->requestShowApplicationMenu(q->geometry().toRect(), 0 /* actionId */); + }, Qt::QueuedConnection); //&Decoration::requestShowApplicationMenu, Qt::QueuedConnection); + QObject::connect(c, &DecoratedClient::hasApplicationMenuChanged, q, &DecorationButton::setVisible); + QObject::connect(c, &DecoratedClient::applicationMenuActiveChanged, q, &DecorationButton::setChecked); + break; case DecorationButtonType::OnAllDesktops: setVisible(settings->isOnAllDesktopsAvailable()); setCheckable(true); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/private/decoratedclientprivate.cpp new/kdecoration-5.9.0/src/private/decoratedclientprivate.cpp --- old/kdecoration-5.8.5/src/private/decoratedclientprivate.cpp 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/private/decoratedclientprivate.cpp 2017-01-26 13:09:41.000000000 +0100 @@ -68,4 +68,12 @@ return QColor(); } +ApplicationMenuEnabledDecoratedClientPrivate::ApplicationMenuEnabledDecoratedClientPrivate(DecoratedClient *client, Decoration *decoration) + : DecoratedClientPrivate(client, decoration) +{ + +} + +ApplicationMenuEnabledDecoratedClientPrivate::~ApplicationMenuEnabledDecoratedClientPrivate() = default; + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kdecoration-5.8.5/src/private/decoratedclientprivate.h new/kdecoration-5.9.0/src/private/decoratedclientprivate.h --- old/kdecoration-5.8.5/src/private/decoratedclientprivate.h 2016-12-27 12:20:29.000000000 +0100 +++ new/kdecoration-5.9.0/src/private/decoratedclientprivate.h 2017-01-26 13:09:41.000000000 +0100 @@ -100,6 +100,21 @@ const QScopedPointer<Private> d; }; +class KDECORATIONS_PRIVATE_EXPORT ApplicationMenuEnabledDecoratedClientPrivate : public DecoratedClientPrivate +{ +public: + ~ApplicationMenuEnabledDecoratedClientPrivate() override; + + virtual bool hasApplicationMenu() const = 0; + virtual bool isApplicationMenuActive() const = 0; + + virtual void showApplicationMenu(int actionId) = 0; + virtual void requestShowApplicationMenu(const QRect &rect, int actionId) = 0; + +protected: + explicit ApplicationMenuEnabledDecoratedClientPrivate(DecoratedClient *client, Decoration *decoration); +}; + } // namespace #endif
