[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