summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/platformsupport/dbusmenu/qdbusmenutypes.cpp37
-rw-r--r--src/platformsupport/dbusmenu/qdbusmenutypes_p.h1
-rw-r--r--src/platformsupport/dbusmenu/qdbusplatformmenu.cpp12
-rw-r--r--src/platformsupport/dbusmenu/qdbusplatformmenu_p.h7
-rw-r--r--src/platformsupport/dbustray/qdbustrayicon.cpp5
5 files changed, 36 insertions, 26 deletions
diff --git a/src/platformsupport/dbusmenu/qdbusmenutypes.cpp b/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
index cacc9817de..73957eacfe 100644
--- a/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
+++ b/src/platformsupport/dbusmenu/qdbusmenutypes.cpp
@@ -87,26 +87,32 @@ uint QDBusMenuLayoutItem::populate(int id, int depth, const QStringList &propert
m_properties.insert(QLatin1String("children-display"), QLatin1String("submenu"));
Q_FOREACH (const QDBusPlatformMenu *menu, QDBusPlatformMenu::topLevelMenus()) {
if (menu)
- Q_FOREACH (const QDBusPlatformMenuItem *item, menu->items()) {
- QDBusMenuLayoutItem child;
- child.populate(item, depth - 1, propertyNames);
- m_children << child;
- }
+ populate(menu, depth, propertyNames);
}
- } else {
- // TODO insert menu properties (name-value pairs)
+ return 1; // revision
}
- QDBusPlatformMenu *menu = QDBusPlatformMenu::byId(id);
- if (depth != 0 && menu) {
- Q_FOREACH (QDBusPlatformMenuItem *item, menu->items()) {
- QDBusMenuLayoutItem child;
- child.populate(item, depth - 1, propertyNames);
- m_children << child;
- }
+
+ const QDBusPlatformMenu *menu = QDBusPlatformMenu::byId(id);
+ if (!menu) {
+ QDBusPlatformMenuItem *item = QDBusPlatformMenuItem::byId(id);
+ if (item)
+ menu = static_cast<const QDBusPlatformMenu *>(item->menu());
}
+ if (depth != 0 && menu)
+ populate(menu, depth, propertyNames);
if (menu)
return menu->revision();
- return 1;
+
+ return 1; // revision
+}
+
+void QDBusMenuLayoutItem::populate(const QDBusPlatformMenu *menu, int depth, const QStringList &propertyNames)
+{
+ Q_FOREACH (QDBusPlatformMenuItem *item, menu->items()) {
+ QDBusMenuLayoutItem child;
+ child.populate(item, depth - 1, propertyNames);
+ m_children << child;
+ }
}
void QDBusMenuLayoutItem::populate(const QDBusPlatformMenuItem *item, int depth, const QStringList &propertyNames)
@@ -116,7 +122,6 @@ void QDBusMenuLayoutItem::populate(const QDBusPlatformMenuItem *item, int depth,
m_id = item->dbusID();
QDBusMenuItem proxy(item);
m_properties = proxy.m_properties;
- // TODO populate m_children
}
const QDBusArgument &operator<<(QDBusArgument &arg, const QDBusMenuLayoutItem &item)
diff --git a/src/platformsupport/dbusmenu/qdbusmenutypes_p.h b/src/platformsupport/dbusmenu/qdbusmenutypes_p.h
index c42aef0b69..28d16b32d5 100644
--- a/src/platformsupport/dbusmenu/qdbusmenutypes_p.h
+++ b/src/platformsupport/dbusmenu/qdbusmenutypes_p.h
@@ -82,6 +82,7 @@ class QDBusMenuLayoutItem
{
public:
uint populate(int id, int depth, const QStringList &propertyNames);
+ void populate(const QDBusPlatformMenu *menu, int depth, const QStringList &propertyNames);
void populate(const QDBusPlatformMenuItem *item, int depth, const QStringList &propertyNames);
int m_id;
diff --git a/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp b/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
index 581daf97ac..93c822cefb 100644
--- a/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
+++ b/src/platformsupport/dbusmenu/qdbusplatformmenu.cpp
@@ -43,6 +43,7 @@ Q_LOGGING_CATEGORY(qLcMenu, "qt.qpa.menu")
static int nextDBusID = 1;
QHash<int, QDBusPlatformMenu *> menusByID;
QHash<int, QDBusPlatformMenuItem *> menuItemsByID;
+QList<QDBusPlatformMenu *> QDBusPlatformMenu::m_topLevelMenus;
QDBusPlatformMenuItem::QDBusPlatformMenuItem(quintptr tag)
: m_tag(tag ? tag : reinterpret_cast<quintptr>(this)) // QMenu will overwrite this later
@@ -144,6 +145,8 @@ QDBusPlatformMenu::QDBusPlatformMenu(quintptr tag)
, m_revision(0)
{
menusByID.insert(m_dbusID, this);
+ // Assume it's top-level until we find out otherwise
+ m_topLevelMenus << this;
}
QDBusPlatformMenu::~QDBusPlatformMenu()
@@ -162,6 +165,9 @@ void QDBusPlatformMenu::insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMen
else
m_items.insert(idx, item);
m_itemsByTag.insert(item->tag(), item);
+ // If a menu is found as a submenu under an item, we know that it's not a top-level menu.
+ if (item->menu())
+ m_topLevelMenus.removeOne(const_cast<QDBusPlatformMenu *>(static_cast<const QDBusPlatformMenu *>(item->menu())));
}
void QDBusPlatformMenu::removeMenuItem(QPlatformMenuItem *menuItem)
@@ -188,12 +194,6 @@ QDBusPlatformMenu *QDBusPlatformMenu::byId(int id)
return menusByID[id];
}
-QList<QDBusPlatformMenu *> QDBusPlatformMenu::topLevelMenus()
-{
- // TODO just the top-level menus, not all menus
- return menusByID.values();
-}
-
void QDBusPlatformMenu::emitUpdated()
{
emit updated(++m_revision, m_dbusID);
diff --git a/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h b/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
index c211a75419..2519533e32 100644
--- a/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
+++ b/src/platformsupport/dbusmenu/qdbusplatformmenu_p.h
@@ -133,6 +133,8 @@ public:
void setFont(const QFont &font) Q_DECL_OVERRIDE { Q_UNUSED(font); }
void setMenuType(MenuType type) Q_DECL_OVERRIDE { Q_UNUSED(type); }
+ int dbusID() const { return m_dbusID; }
+
void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) Q_DECL_OVERRIDE
{
Q_UNUSED(parentWindow);
@@ -152,9 +154,9 @@ public:
bool operator==(const QDBusPlatformMenu& other) { return m_tag == other.m_tag; }
static QDBusPlatformMenu* byId(int id);
- static QList<QDBusPlatformMenu *> topLevelMenus();
+ static QList<QDBusPlatformMenu *> topLevelMenus() { return m_topLevelMenus; }
- uint revision() { return m_revision; }
+ uint revision() const { return m_revision; }
void emitUpdated();
@@ -173,6 +175,7 @@ private:
uint m_revision;
QHash<quintptr, QDBusPlatformMenuItem *> m_itemsByTag;
QList<QDBusPlatformMenuItem *> m_items;
+ static QList<QDBusPlatformMenu *> m_topLevelMenus;
};
QT_END_NAMESPACE
diff --git a/src/platformsupport/dbustray/qdbustrayicon.cpp b/src/platformsupport/dbustray/qdbustrayicon.cpp
index 61849024da..fe58bafedc 100644
--- a/src/platformsupport/dbustray/qdbustrayicon.cpp
+++ b/src/platformsupport/dbustray/qdbustrayicon.cpp
@@ -191,9 +191,10 @@ void QDBusTrayIcon::updateToolTip(const QString &tooltip)
QPlatformMenu *QDBusTrayIcon::createMenu() const
{
qCDebug(qLcTray);
+ QDBusPlatformMenu *ret = new QDBusPlatformMenu();
if (!m_menu)
- const_cast<QDBusTrayIcon *>(this)->m_menu = new QDBusPlatformMenu();
- return m_menu;
+ const_cast<QDBusTrayIcon *>(this)->m_menu = ret;
+ return ret;
}
void QDBusTrayIcon::updateMenu(QPlatformMenu * menu)