[SCM] qtbase packaging branch, ubuntu+1, updated. ubuntu/5.6.1+dfsg-3ubuntu2-3-g96737e3
Dmitry Shachnev
mitya57 at moszumanska.debian.org
Thu Aug 18 18:32:27 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/qt/qtbase.git;a=commitdiff;h=96737e3
The following commit has been merged in the ubuntu+1 branch:
commit 96737e3634c49198aa3fc32553f3ccef776926ad
Author: Dmitry Shachnev <mitya57 at gmail.com>
Date: Thu Aug 18 21:29:42 2016 +0300
Backport upstream patches for dbusmenu/dbustray code
+ dbustray_use_separate_connections.diff (fix for multiple tray icons)
+ dbusmenu_exclusive_groups.diff (fix for radio actions)
+ qplatformmenubar_createmenu.diff (adding a method to QPlatformMenuBar)
+ dbusmenu_global_menu.diff (add support for D-Bus global menus)
---
debian/changelog | 8 +
debian/patches/dbusmenu_exclusive_groups.diff | 108 ++++
debian/patches/dbusmenu_global_menu.diff | 613 +++++++++++++++++++++
.../patches/dbustray_use_separate_connections.diff | 42 ++
debian/patches/qplatformmenubar_createmenu.diff | 96 ++++
debian/patches/series | 4 +
6 files changed, 871 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index 40f9f88..17a643c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,14 @@ qtbase-opensource-src (5.6.1+dfsg-3ubuntu3) UNRELEASED; urgency=medium
* debian/patches/QDBusServer-delay-processing-of-D-Bus-messages.patch:
- Fix DBus message processing (LP: #1608822)
+ [ Dmitry Shachnev ]
+ * Backport some upstream patches to add support for D-Bus global menus,
+ and improve support for D-Bus tray icons (LP: #1612767):
+ + dbustray_use_separate_connections.diff (fix for multiple tray icons)
+ + dbusmenu_exclusive_groups.diff (fix for radio actions)
+ + qplatformmenubar_createmenu.diff (adding a method to QPlatformMenuBar)
+ + dbusmenu_global_menu.diff (add support for D-Bus global menus)
+
-- Ubuntu Developers <ubuntu-devel-discuss at lists.ubuntu.com> Wed, 17 Aug 2016 09:58:32 +0000
qtbase-opensource-src (5.6.1+dfsg-3ubuntu2~1) yakkety; urgency=medium
diff --git a/debian/patches/dbusmenu_exclusive_groups.diff b/debian/patches/dbusmenu_exclusive_groups.diff
new file mode 100644
index 0000000..ed39cd9
--- /dev/null
+++ b/debian/patches/dbusmenu_exclusive_groups.diff
@@ -0,0 +1,108 @@
+Description: dbusmenu: use proper toggle-type for items that are part of group
+ To achieve that, add a new virtual setHasExclusiveGroup() method to
+ QPlatformMenuItem class (optional because we don't want to break existing
+ platform themes), call it when converting QActions into platform menu items,
+ and use it when exporting the menu items over D-Bus.
+ .
+ Also, send ActionChanged event for actions when their group is changed, so
+ that the platform menus are updated too.
+Origin: https://code.qt.io/cgit/qt/qtbase.git/commit/?id=488cf78e44947eff
+Last-Update: 2016-08-18
+
+--- a/src/gui/kernel/qplatformmenu.h
++++ b/src/gui/kernel/qplatformmenu.h
+@@ -81,6 +81,7 @@
+ virtual void setEnabled(bool enabled) = 0;
+ virtual void setIconSize(int size) = 0;
+ virtual void setNativeContents(WId item) { Q_UNUSED(item); }
++ virtual void setHasExclusiveGroup(bool hasExclusiveGroup) { Q_UNUSED(hasExclusiveGroup); }
+
+ Q_SIGNALS:
+ void activated();
+--- a/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
++++ b/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
+@@ -180,9 +180,8 @@
+ m_properties.insert(QLatin1String("children-display"), QLatin1String("submenu"));
+ m_properties.insert(QLatin1String("enabled"), item->isEnabled());
+ if (item->isCheckable()) {
+- // dbusmenu supports "radio" too, but QPlatformMenuItem doesn't seem to
+- // (QAction would have an exclusive actionGroup)
+- m_properties.insert(QLatin1String("toggle-type"), QLatin1String("checkmark"));
++ QString toggleType = item->hasExclusiveGroup() ? QLatin1String("radio") : QLatin1String("checkmark");
++ m_properties.insert(QLatin1String("toggle-type"), toggleType);
+ m_properties.insert(QLatin1String("toggle-state"), item->isChecked() ? 1 : 0);
+ }
+ const QKeySequence &scut = item->shortcut();
+--- a/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
++++ b/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
+@@ -53,6 +53,7 @@
+ , m_isCheckable(false)
+ , m_isChecked(false)
+ , m_dbusID(nextDBusID++)
++ , m_hasExclusiveGroup(false)
+ {
+ menuItemsByID.insert(m_dbusID, this);
+ }
+@@ -120,6 +121,11 @@
+ m_isChecked = isChecked;
+ }
+
++void QDBusPlatformMenuItem::setHasExclusiveGroup(bool hasExclusiveGroup)
++{
++ m_hasExclusiveGroup = hasExclusiveGroup;
++}
++
+ void QDBusPlatformMenuItem::setShortcut(const QKeySequence &shortcut)
+ {
+ m_shortcut = shortcut;
+--- a/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
++++ b/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
+@@ -91,6 +91,8 @@
+ void setCheckable(bool checkable) Q_DECL_OVERRIDE;
+ bool isChecked() const { return m_isChecked; }
+ void setChecked(bool isChecked) Q_DECL_OVERRIDE;
++ bool hasExclusiveGroup() const { return m_hasExclusiveGroup; }
++ void setHasExclusiveGroup(bool hasExclusiveGroup) Q_DECL_OVERRIDE;
+ QKeySequence shortcut() const { return m_shortcut; }
+ void setShortcut(const QKeySequence& shortcut) Q_DECL_OVERRIDE;
+ void setIconSize(int size) Q_DECL_OVERRIDE { Q_UNUSED(size); }
+@@ -117,7 +119,8 @@
+ bool m_isCheckable : 1;
+ bool m_isChecked : 1;
+ int m_dbusID : 16;
+- int m_reserved : 7;
++ bool m_hasExclusiveGroup : 1;
++ int m_reserved : 6;
+ QKeySequence m_shortcut;
+ };
+
+--- a/src/widgets/kernel/qaction.cpp
++++ b/src/widgets/kernel/qaction.cpp
+@@ -606,6 +606,7 @@
+ d->group = group;
+ if(group)
+ group->addAction(this);
++ d->sendDataChanged();
+ }
+
+ /*!
+--- a/src/widgets/kernel/qactiongroup.cpp
++++ b/src/widgets/kernel/qactiongroup.cpp
+@@ -190,6 +190,7 @@
+ if (oldGroup)
+ oldGroup->removeAction(a);
+ a->d_func()->group = this;
++ a->d_func()->sendDataChanged();
+ }
+ return a;
+ }
+--- a/src/widgets/widgets/qmenu.cpp
++++ b/src/widgets/widgets/qmenu.cpp
+@@ -3225,6 +3225,7 @@
+ item->setShortcut(action->shortcut());
+ item->setCheckable(action->isCheckable());
+ item->setChecked(action->isChecked());
++ item->setHasExclusiveGroup(action->actionGroup() && action->actionGroup()->isExclusive());
+ item->setFont(action->font());
+ item->setRole((QPlatformMenuItem::MenuRole) action->menuRole());
+ item->setEnabled(action->isEnabled());
diff --git a/debian/patches/dbusmenu_global_menu.diff b/debian/patches/dbusmenu_global_menu.diff
new file mode 100644
index 0000000..d4010a7
--- /dev/null
+++ b/debian/patches/dbusmenu_global_menu.diff
@@ -0,0 +1,613 @@
+Description: add native support for D-Bus global menu
+ The protocol was originally developed by Canonical, currently supported
+ by Unity and Plasma.
+Origin: https://code.qt.io/cgit/qt/qtbase.git/commit/?id=b6a824d0a3b4fabd
+Last-Update: 2016-08-18
+
+--- a/src/platformsupport/dbusmenu/dbusmenu.pri
++++ b/src/platformsupport/dbusmenu/dbusmenu.pri
+@@ -6,10 +6,14 @@
+ $$PWD/qdbusmenuadaptor_p.h \
+ $$PWD/qdbusmenutypes_p.h \
+ $$PWD/qdbusmenuconnection_p.h \
++ $$PWD/qdbusmenubar_p.h \
++ $$PWD/qdbusmenuregistrarproxy_p.h \
+ $$PWD/qdbusplatformmenu_p.h \
+
+ SOURCES += \
+ $$PWD/qdbusmenuadaptor.cpp \
+ $$PWD/qdbusmenutypes.cpp \
+ $$PWD/qdbusmenuconnection.cpp \
++ $$PWD/qdbusmenubar.cpp \
++ $$PWD/qdbusmenuregistrarproxy.cpp \
+ $$PWD/qdbusplatformmenu.cpp \
+--- /dev/null
++++ b/src/platformsupport/dbusmenu/qdbusmenubar.cpp
+@@ -0,0 +1,177 @@
++/****************************************************************************
++**
++** Copyright (C) 2016 Dmitry Shachnev <mitya57 at gmail.com>
++** Contact: https://www.qt.io/licensing/
++**
++** This file is part of the QtGui module of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and The Qt Company. For licensing terms
++** and conditions see https://www.qt.io/terms-conditions. For further
++** information use the contact form at https://www.qt.io/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 3 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL3 included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 3 requirements
++** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 2.0 or (at your option) the GNU General
++** Public license version 3 or any later version approved by the KDE Free
++** Qt Foundation. The licenses are as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
++** included in the packaging of this file. Please review the following
++** information to ensure the GNU General Public License requirements will
++** be met: https://www.gnu.org/licenses/gpl-2.0.html and
++** https://www.gnu.org/licenses/gpl-3.0.html.
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qdbusmenubar_p.h"
++#include "qdbusmenuregistrarproxy_p.h"
++
++QT_BEGIN_NAMESPACE
++
++/* note: do not change these to QStringLiteral;
++ we are unloaded before QtDBus is done using the strings.
++ */
++#define REGISTRAR_SERVICE QLatin1String("com.canonical.AppMenu.Registrar")
++#define REGISTRAR_PATH QLatin1String("/com/canonical/AppMenu/Registrar")
++
++QDBusMenuBar::QDBusMenuBar()
++ : QPlatformMenuBar()
++ , m_menu(new QDBusPlatformMenu())
++ , m_menuAdaptor(new QDBusMenuAdaptor(m_menu))
++ , m_windowId(0)
++{
++ QDBusMenuItem::registerDBusTypes();
++ connect(m_menu, &QDBusPlatformMenu::propertiesUpdated,
++ m_menuAdaptor, &QDBusMenuAdaptor::ItemsPropertiesUpdated);
++ connect(m_menu, &QDBusPlatformMenu::updated,
++ m_menuAdaptor, &QDBusMenuAdaptor::LayoutUpdated);
++}
++
++QDBusMenuBar::~QDBusMenuBar()
++{
++ unregisterMenuBar();
++ delete m_menuAdaptor;
++ delete m_menu;
++ qDeleteAll(m_menuItems);
++}
++
++QDBusPlatformMenuItem *QDBusMenuBar::menuItemForMenu(QPlatformMenu *menu)
++{
++ if (!menu)
++ return nullptr;
++ quintptr tag = menu->tag();
++ const auto it = m_menuItems.constFind(tag);
++ if (it != m_menuItems.cend()) {
++ return *it;
++ } else {
++ QDBusPlatformMenuItem *item = new QDBusPlatformMenuItem;
++ updateMenuItem(item, menu);
++ m_menuItems.insert(tag, item);
++ return item;
++ }
++}
++
++void QDBusMenuBar::updateMenuItem(QDBusPlatformMenuItem *item, QPlatformMenu *menu)
++{
++ const QDBusPlatformMenu *ourMenu = qobject_cast<const QDBusPlatformMenu *>(menu);
++ item->setText(ourMenu->text());
++ item->setIcon(ourMenu->icon());
++ item->setEnabled(ourMenu->isEnabled());
++ item->setVisible(ourMenu->isVisible());
++ item->setMenu(menu);
++}
++
++void QDBusMenuBar::insertMenu(QPlatformMenu *menu, QPlatformMenu *before)
++{
++ QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu);
++ QDBusPlatformMenuItem *beforeItem = menuItemForMenu(before);
++ m_menu->insertMenuItem(menuItem, beforeItem);
++ m_menu->emitUpdated();
++}
++
++void QDBusMenuBar::removeMenu(QPlatformMenu *menu)
++{
++ QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu);
++ m_menu->removeMenuItem(menuItem);
++ m_menu->emitUpdated();
++}
++
++void QDBusMenuBar::syncMenu(QPlatformMenu *menu)
++{
++ QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu);
++ updateMenuItem(menuItem, menu);
++}
++
++void QDBusMenuBar::handleReparent(QWindow *newParentWindow)
++{
++ if (newParentWindow && newParentWindow->winId() != m_windowId) {
++ unregisterMenuBar();
++ m_windowId = newParentWindow->winId();
++ registerMenuBar();
++ }
++}
++
++QPlatformMenu *QDBusMenuBar::menuForTag(quintptr tag) const
++{
++ QDBusPlatformMenuItem *menuItem = m_menuItems.value(tag);
++ if (menuItem)
++ return const_cast<QPlatformMenu *>(menuItem->menu());
++ return nullptr;
++}
++
++QPlatformMenu *QDBusMenuBar::createMenu() const
++{
++ return new QDBusPlatformMenu;
++}
++
++void QDBusMenuBar::registerMenuBar()
++{
++ static uint menuBarId = 0;
++
++ QDBusConnection connection = QDBusConnection::sessionBus();
++ m_objectPath = QStringLiteral("/MenuBar/%1").arg(++menuBarId);
++ if (!connection.registerObject(m_objectPath, m_menu))
++ return;
++
++ QDBusMenuRegistrarInterface registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, connection, this);
++ QDBusPendingReply<> r = registrar.RegisterWindow(m_windowId, QDBusObjectPath(m_objectPath));
++ r.waitForFinished();
++ if (r.isError()) {
++ qWarning("Failed to register window menu, reason: %s (\"%s\")",
++ qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message()));
++ connection.unregisterObject(m_objectPath);
++ }
++}
++
++void QDBusMenuBar::unregisterMenuBar()
++{
++ QDBusConnection connection = QDBusConnection::sessionBus();
++
++ if (m_windowId) {
++ QDBusMenuRegistrarInterface registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, connection, this);
++ QDBusPendingReply<> r = registrar.UnregisterWindow(m_windowId);
++ r.waitForFinished();
++ if (r.isError())
++ qWarning("Failed to unregister window menu, reason: %s (\"%s\")",
++ qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message()));
++ }
++
++ if (!m_objectPath.isEmpty())
++ connection.unregisterObject(m_objectPath);
++}
++
++QT_END_NAMESPACE
+--- /dev/null
++++ b/src/platformsupport/dbusmenu/qdbusmenubar_p.h
+@@ -0,0 +1,92 @@
++/****************************************************************************
++**
++** Copyright (C) 2016 Dmitry Shachnev <mitya57 at gmail.com>
++** Contact: https://www.qt.io/licensing/
++**
++** This file is part of the QtGui module of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and The Qt Company. For licensing terms
++** and conditions see https://www.qt.io/terms-conditions. For further
++** information use the contact form at https://www.qt.io/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 3 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL3 included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 3 requirements
++** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 2.0 or (at your option) the GNU General
++** Public license version 3 or any later version approved by the KDE Free
++** Qt Foundation. The licenses are as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
++** included in the packaging of this file. Please review the following
++** information to ensure the GNU General Public License requirements will
++** be met: https://www.gnu.org/licenses/gpl-2.0.html and
++** https://www.gnu.org/licenses/gpl-3.0.html.
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QDBUSMENUBAR_P_H
++#define QDBUSMENUBAR_P_H
++
++//
++// W A R N I N G
++// -------------
++//
++// This file is not part of the Qt API. It exists purely as an
++// implementation detail. This header file may change from version to
++// version without notice, or even be removed.
++//
++// We mean it.
++//
++
++#include <private/qdbusplatformmenu_p.h>
++#include <private/qdbusmenuadaptor_p.h>
++#include <QtCore/QHash>
++#include <QtCore/QString>
++#include <QtGui/QWindow>
++
++QT_BEGIN_NAMESPACE
++
++class QDBusMenuBar : public QPlatformMenuBar
++{
++ Q_OBJECT
++
++public:
++ QDBusMenuBar();
++ virtual ~QDBusMenuBar();
++
++ void insertMenu(QPlatformMenu *menu, QPlatformMenu *before) Q_DECL_OVERRIDE;
++ void removeMenu(QPlatformMenu *menu) Q_DECL_OVERRIDE;
++ void syncMenu(QPlatformMenu *menu) Q_DECL_OVERRIDE;
++ void handleReparent(QWindow *newParentWindow) Q_DECL_OVERRIDE;
++ QPlatformMenu *menuForTag(quintptr tag) const Q_DECL_OVERRIDE;
++ QPlatformMenu *createMenu() const Q_DECL_OVERRIDE;
++
++private:
++ QDBusPlatformMenu *m_menu;
++ QDBusMenuAdaptor *m_menuAdaptor;
++ QHash<quintptr, QDBusPlatformMenuItem *> m_menuItems;
++ uint m_windowId;
++ QString m_objectPath;
++
++ QDBusPlatformMenuItem *menuItemForMenu(QPlatformMenu *menu);
++ static void updateMenuItem(QDBusPlatformMenuItem *item, QPlatformMenu *menu);
++ void registerMenuBar();
++ void unregisterMenuBar();
++};
++
++QT_END_NAMESPACE
++
++#endif // QDBUSMENUBAR_P_H
+--- /dev/null
++++ b/src/platformsupport/dbusmenu/qdbusmenuregistrarproxy.cpp
+@@ -0,0 +1,64 @@
++/****************************************************************************
++**
++** Copyright (C) 2016 Dmitry Shachnev <mitya57 at gmail.com>
++** Contact: https://www.qt.io/licensing/
++**
++** This file is part of the QtGui module of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and The Qt Company. For licensing terms
++** and conditions see https://www.qt.io/terms-conditions. For further
++** information use the contact form at https://www.qt.io/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 3 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL3 included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 3 requirements
++** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 2.0 or (at your option) the GNU General
++** Public license version 3 or any later version approved by the KDE Free
++** Qt Foundation. The licenses are as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
++** included in the packaging of this file. Please review the following
++** information to ensure the GNU General Public License requirements will
++** be met: https://www.gnu.org/licenses/gpl-2.0.html and
++** https://www.gnu.org/licenses/gpl-3.0.html.
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++/*
++ * This file was originally created by qdbusxml2cpp version 0.8
++ * Command line was: qdbusxml2cpp -p qdbusmenuregistrarproxy ../../3rdparty/dbus-ifaces/com.canonical.AppMenu.Registrar.xml
++ *
++ * However it is maintained manually.
++ */
++
++#include "qdbusmenuregistrarproxy_p.h"
++
++QT_BEGIN_NAMESPACE
++
++/*
++ * Implementation of interface class QDBusMenuRegistrarInterface
++ */
++
++QDBusMenuRegistrarInterface::QDBusMenuRegistrarInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
++ : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
++{
++}
++
++QDBusMenuRegistrarInterface::~QDBusMenuRegistrarInterface()
++{
++}
++
++QT_END_NAMESPACE
+--- /dev/null
++++ b/src/platformsupport/dbusmenu/qdbusmenuregistrarproxy_p.h
+@@ -0,0 +1,127 @@
++/****************************************************************************
++**
++** Copyright (C) 2016 Dmitry Shachnev <mitya57 at gmail.com>
++** Contact: https://www.qt.io/licensing/
++**
++** This file is part of the QtGui module of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and The Qt Company. For licensing terms
++** and conditions see https://www.qt.io/terms-conditions. For further
++** information use the contact form at https://www.qt.io/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 3 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL3 included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 3 requirements
++** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 2.0 or (at your option) the GNU General
++** Public license version 3 or any later version approved by the KDE Free
++** Qt Foundation. The licenses are as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
++** included in the packaging of this file. Please review the following
++** information to ensure the GNU General Public License requirements will
++** be met: https://www.gnu.org/licenses/gpl-2.0.html and
++** https://www.gnu.org/licenses/gpl-3.0.html.
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++/*
++ * This file was originally created by qdbusxml2cpp version 0.8
++ * Command line was: qdbusxml2cpp -p qdbusmenuregistrarproxy ../../3rdparty/dbus-ifaces/com.canonical.AppMenu.Registrar.xml
++ *
++ * However it is maintained manually.
++ */
++
++#ifndef QDBUSMENUREGISTRARPROXY_P_H
++#define QDBUSMENUREGISTRARPROXY_P_H
++
++//
++// W A R N I N G
++// -------------
++//
++// This file is not part of the Qt API. It exists purely as an
++// implementation detail. This header file may change from version to
++// version without notice, or even be removed.
++//
++// We mean it.
++//
++
++#include <QtCore/QObject>
++#include <QtCore/QByteArray>
++#include <QtCore/QList>
++#include <QtCore/QString>
++#include <QtCore/QVariant>
++#include <QtDBus/QDBusAbstractInterface>
++#include <QtDBus/QDBusConnection>
++#include <QtDBus/QDBusReply>
++
++QT_BEGIN_NAMESPACE
++
++/*
++ * Proxy class for interface com.canonical.AppMenu.Registrar
++ */
++class QDBusMenuRegistrarInterface : public QDBusAbstractInterface
++{
++ Q_OBJECT
++public:
++ static inline const char *staticInterfaceName()
++ {
++ return "com.canonical.AppMenu.Registrar";
++ }
++
++public:
++ explicit QDBusMenuRegistrarInterface(const QString &service,
++ const QString &path,
++ const QDBusConnection &connection,
++ QObject *parent = nullptr);
++
++ ~QDBusMenuRegistrarInterface();
++
++public Q_SLOTS: // METHODS
++ QDBusPendingReply<QString, QDBusObjectPath> GetMenuForWindow(uint windowId)
++ {
++ QList<QVariant> argumentList;
++ argumentList << QVariant::fromValue(windowId);
++ return asyncCallWithArgumentList(QStringLiteral("GetMenuForWindow"), argumentList);
++ }
++ QDBusReply<QString> GetMenuForWindow(uint windowId, QDBusObjectPath &menuObjectPath)
++ {
++ QList<QVariant> argumentList;
++ argumentList << QVariant::fromValue(windowId);
++ QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("GetMenuForWindow"), argumentList);
++ QList<QVariant> arguments = reply.arguments();
++ if (reply.type() == QDBusMessage::ReplyMessage && arguments.count() == 2)
++ menuObjectPath = qdbus_cast<QDBusObjectPath>(arguments.at(1));
++ return reply;
++ }
++
++ QDBusPendingReply<> RegisterWindow(uint windowId, const QDBusObjectPath &menuObjectPath)
++ {
++ QList<QVariant> argumentList;
++ argumentList << QVariant::fromValue(windowId) << QVariant::fromValue(menuObjectPath);
++ return asyncCallWithArgumentList(QStringLiteral("RegisterWindow"), argumentList);
++ }
++
++ QDBusPendingReply<> UnregisterWindow(uint windowId)
++ {
++ QList<QVariant> argumentList;
++ argumentList << QVariant::fromValue(windowId);
++ return asyncCallWithArgumentList(QStringLiteral("UnregisterWindow"), argumentList);
++ }
++};
++
++QT_END_NAMESPACE
++
++#endif // QDBUSMENUREGISTRARPROXY_P_H
+--- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
++++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
+@@ -53,9 +53,12 @@
+ #include <qpa/qplatformintegration.h>
+ #include <qpa/qplatformservices.h>
+ #include <qpa/qplatformdialoghelper.h>
++#ifndef QT_NO_DBUS
++#include "QtPlatformSupport/private/qdbusplatformmenu_p.h"
++#include "QtPlatformSupport/private/qdbusmenubar_p.h"
++#endif
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ #include "QtPlatformSupport/private/qdbustrayicon_p.h"
+-#include "QtPlatformSupport/private/qdbusplatformmenu_p.h"
+ #endif
+
+ #include <algorithm>
+@@ -108,6 +111,21 @@
+ }
+ #endif
+
++#ifndef QT_NO_DBUS
++static bool checkDBusGlobalMenuAvailable()
++{
++ QDBusConnection connection = QDBusConnection::sessionBus();
++ QString registrarService = QStringLiteral("com.canonical.AppMenu.Registrar");
++ return connection.interface()->isServiceRegistered(registrarService);
++}
++
++static bool isDBusGlobalMenuAvailable()
++{
++ static bool dbusGlobalMenuAvailable = checkDBusGlobalMenuAvailable();
++ return dbusGlobalMenuAvailable;
++}
++#endif
++
+ class QGenericUnixThemePrivate : public QPlatformThemePrivate
+ {
+ public:
+@@ -166,6 +184,15 @@
+ return paths;
+ }
+
++#ifndef QT_NO_DBUS
++QPlatformMenuBar *QGenericUnixTheme::createPlatformMenuBar() const
++{
++ if (isDBusGlobalMenuAvailable())
++ return new QDBusMenuBar();
++ return nullptr;
++}
++#endif
++
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ QPlatformSystemTrayIcon *QGenericUnixTheme::createPlatformSystemTrayIcon() const
+ {
+@@ -553,6 +580,15 @@
+ return new QKdeTheme(kdeDirs, kdeVersion);
+ }
+
++#ifndef QT_NO_DBUS
++QPlatformMenuBar *QKdeTheme::createPlatformMenuBar() const
++{
++ if (isDBusGlobalMenuAvailable())
++ return new QDBusMenuBar();
++ return nullptr;
++}
++#endif
++
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ QPlatformSystemTrayIcon *QKdeTheme::createPlatformSystemTrayIcon() const
+ {
+@@ -649,6 +685,15 @@
+ return QStringLiteral("%1 %2").arg(QLatin1String(defaultSystemFontNameC)).arg(defaultSystemFontSize);
+ }
+
++#ifndef QT_NO_DBUS
++QPlatformMenuBar *QGnomeTheme::createPlatformMenuBar() const
++{
++ if (isDBusGlobalMenuAvailable())
++ return new QDBusMenuBar();
++ return nullptr;
++}
++#endif
++
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ QPlatformSystemTrayIcon *QGnomeTheme::createPlatformSystemTrayIcon() const
+ {
+--- a/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h
++++ b/src/platformsupport/themes/genericunix/qgenericunixthemes_p.h
+@@ -79,6 +79,9 @@
+ QVariant themeHint(ThemeHint hint) const Q_DECL_OVERRIDE;
+
+ static QStringList xdgIconThemePaths();
++#ifndef QT_NO_DBUS
++ QPlatformMenuBar *createPlatformMenuBar() const Q_DECL_OVERRIDE;
++#endif
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const Q_DECL_OVERRIDE;
+ #endif
+@@ -101,6 +104,9 @@
+ const QPalette *palette(Palette type = SystemPalette) const Q_DECL_OVERRIDE;
+
+ const QFont *font(Font type) const Q_DECL_OVERRIDE;
++#ifndef QT_NO_DBUS
++ QPlatformMenuBar *createPlatformMenuBar() const Q_DECL_OVERRIDE;
++#endif
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const Q_DECL_OVERRIDE;
+ #endif
+@@ -121,6 +127,9 @@
+ QString standardButtonText(int button) const Q_DECL_OVERRIDE;
+
+ virtual QString gtkFontName() const;
++#ifndef QT_NO_DBUS
++ QPlatformMenuBar *createPlatformMenuBar() const Q_DECL_OVERRIDE;
++#endif
+ #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const Q_DECL_OVERRIDE;
+ #endif
diff --git a/debian/patches/dbustray_use_separate_connections.diff b/debian/patches/dbustray_use_separate_connections.diff
new file mode 100644
index 0000000..5f52729
--- /dev/null
+++ b/debian/patches/dbustray_use_separate_connections.diff
@@ -0,0 +1,42 @@
+Description: dbustray: use separate D-Bus connections for each tray icon
+ This allows applications to use two or more QSystemTrayIcons.
+Origin: https://code.qt.io/cgit/qt/qtbase.git/commit/?id=f199bb9133fe0446
+Last-Update: 2016-08-18
+
+--- a/src/platformsupport/dbusmenu/qdbusmenuconnection.cpp
++++ b/src/platformsupport/dbusmenu/qdbusmenuconnection.cpp
+@@ -59,9 +59,10 @@
+ A D-Bus connection which is used for both menu and tray icon services.
+ Connects to the session bus and registers with the respective watcher services.
+ */
+-QDBusMenuConnection::QDBusMenuConnection(QObject *parent)
++QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &serviceName)
+ : QObject(parent)
+- , m_connection(QDBusConnection::sessionBus())
++ , m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
++ : QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
+ , m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this))
+ , m_statusNotifierHostRegistered(false)
+ {
+--- a/src/platformsupport/dbusmenu/qdbusmenuconnection_p.h
++++ b/src/platformsupport/dbusmenu/qdbusmenuconnection_p.h
+@@ -61,7 +61,7 @@
+ Q_OBJECT
+
+ public:
+- QDBusMenuConnection(QObject *parent = 0);
++ QDBusMenuConnection(QObject *parent = 0, const QString &serviceName = QString());
+ QDBusConnection connection() const { return m_connection; }
+ bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
+ #ifndef QT_NO_SYSTEMTRAYICON
+--- a/src/platformsupport/dbustray/qdbustrayicon.cpp
++++ b/src/platformsupport/dbustray/qdbustrayicon.cpp
+@@ -165,7 +165,7 @@
+ QDBusMenuConnection * QDBusTrayIcon::dBusConnection()
+ {
+ if (!m_dbusConnection) {
+- m_dbusConnection = new QDBusMenuConnection(this);
++ m_dbusConnection = new QDBusMenuConnection(this, m_instanceId);
+ m_notifier = new QXdgNotificationInterface(XdgNotificationService,
+ XdgNotificationPath, m_dbusConnection->connection(), this);
+ connect(m_notifier, SIGNAL(NotificationClosed(uint,uint)), this, SLOT(notificationClosed(uint,uint)));
diff --git a/debian/patches/qplatformmenubar_createmenu.diff b/debian/patches/qplatformmenubar_createmenu.diff
new file mode 100644
index 0000000..0b0d5dd
--- /dev/null
+++ b/debian/patches/qplatformmenubar_createmenu.diff
@@ -0,0 +1,96 @@
+Description: add createMenu() method to QPlatformMenuBar
+ The D-Bus platform menus are only useful inside menu bars and system
+ tray icons, and should not be created for other cases (like the context
+ menus).
+ .
+ This adds a new virtual createMenu() method to QPlatformMenuBar class,
+ analogous to the already existing QPlatformSystemTrayIcon::createMenu()
+ method, and adds support for it to QMenuBar.
+Origin: https://code.qt.io/cgit/qt/qtbase.git/commit/?id=e4d79e1fdeb6b26b
+Last-Update: 2016-08-18
+
+--- a/src/gui/kernel/qplatformmenu.h
++++ b/src/gui/kernel/qplatformmenu.h
+@@ -142,6 +142,7 @@
+ virtual void handleReparent(QWindow *newParentWindow) = 0;
+
+ virtual QPlatformMenu *menuForTag(quintptr tag) const = 0;
++ virtual QPlatformMenu *createMenu() const { return nullptr; }
+ };
+
+ QT_END_NAMESPACE
+--- a/src/widgets/widgets/qmenubar.cpp
++++ b/src/widgets/widgets/qmenubar.cpp
+@@ -1204,12 +1204,19 @@
+ d->setCurrentAction(0);
+ }
+
+-QPlatformMenu *getPlatformMenu(QAction *action)
++QPlatformMenu *QMenuBarPrivate::getPlatformMenu(QAction *action)
+ {
+ if (!action || !action->menu())
+ return 0;
+
+- return action->menu()->platformMenu();
++ QPlatformMenu *platformMenu = action->menu()->platformMenu();
++ if (!platformMenu && platformMenuBar) {
++ platformMenu = platformMenuBar->createMenu();
++ if (platformMenu)
++ action->menu()->setPlatformMenu(platformMenu);
++ }
++
++ return platformMenu;
+ }
+
+ /*!
+@@ -1230,14 +1237,14 @@
+ return;
+
+ if (e->type() == QEvent::ActionAdded) {
+- QPlatformMenu *menu = getPlatformMenu(e->action());
++ QPlatformMenu *menu = d->getPlatformMenu(e->action());
+ if (menu) {
+ QPlatformMenu* beforeMenu = NULL;
+ for (int beforeIndex = d->indexOf(e->action()) + 1;
+ !beforeMenu && (beforeIndex < actions().size());
+ ++beforeIndex)
+ {
+- beforeMenu = getPlatformMenu(actions().at(beforeIndex));
++ beforeMenu = d->getPlatformMenu(actions().at(beforeIndex));
+ }
+
+ menu->setTag(reinterpret_cast<quintptr>(e->action()));
+@@ -1245,12 +1252,12 @@
+ d->platformMenuBar->insertMenu(menu, beforeMenu);
+ }
+ } else if (e->type() == QEvent::ActionRemoved) {
+- QPlatformMenu *menu = getPlatformMenu(e->action());
++ QPlatformMenu *menu = d->getPlatformMenu(e->action());
+ if (menu)
+ d->platformMenuBar->removeMenu(menu);
+ } else if (e->type() == QEvent::ActionChanged) {
+ QPlatformMenu* cur = d->platformMenuBar->menuForTag(reinterpret_cast<quintptr>(e->action()));
+- QPlatformMenu *menu = getPlatformMenu(e->action());
++ QPlatformMenu *menu = d->getPlatformMenu(e->action());
+
+ // the menu associated with the action can change, need to
+ // remove and/or insert the new platform menu
+@@ -1265,7 +1272,7 @@
+ !beforeMenu && (beforeIndex < actions().size());
+ ++beforeIndex)
+ {
+- beforeMenu = getPlatformMenu(actions().at(beforeIndex));
++ beforeMenu = d->getPlatformMenu(actions().at(beforeIndex));
+ }
+ d->platformMenuBar->insertMenu(menu, beforeMenu);
+ }
+--- a/src/widgets/widgets/qmenubar_p.h
++++ b/src/widgets/widgets/qmenubar_p.h
+@@ -137,6 +137,7 @@
+
+ QBasicTimer autoReleaseTimer;
+ QPlatformMenuBar *platformMenuBar;
++ QPlatformMenu *getPlatformMenu(QAction *action);
+
+ inline int indexOf(QAction *act) const { return q_func()->actions().indexOf(act); }
+
diff --git a/debian/patches/series b/debian/patches/series
index 186b006..5b7acce 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,6 +3,10 @@ no_dbus_dependency.diff
color-fonts.patch
fix-scalable-bitmap-factor-caching.patch
QDBusServer-delay-processing-of-D-Bus-messages.patch
+dbustray_use_separate_connections.diff
+dbusmenu_exclusive_groups.diff
+qplatformmenubar_createmenu.diff
+dbusmenu_global_menu.diff
# Debian specific.
gnukfreebsd.diff
--
qtbase packaging
More information about the pkg-kde-commits
mailing list