Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qdbusmenubar.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 Dmitry Shachnev <mitya57@gmail.com>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qdbusmenubar_p.h"
6
8
9using namespace Qt::StringLiterals;
10
11/* note: do not change these to QStringLiteral;
12 we are unloaded before QtDBus is done using the strings.
13 */
14#define REGISTRAR_SERVICE "com.canonical.AppMenu.Registrar"_L1
15#define REGISTRAR_PATH "/com/canonical/AppMenu/Registrar"_L1
16
19 , m_menu(new QDBusPlatformMenu())
20 , m_menuAdaptor(new QDBusMenuAdaptor(m_menu))
21 , m_windowId(0)
22{
27 m_menuAdaptor, &QDBusMenuAdaptor::LayoutUpdated);
30}
31
33{
34 unregisterMenuBar();
35 delete m_menuAdaptor;
36 delete m_menu;
37 qDeleteAll(m_menuItems);
38}
39
40QDBusPlatformMenuItem *QDBusMenuBar::menuItemForMenu(QPlatformMenu *menu)
41{
42 if (!menu)
43 return nullptr;
44 quintptr tag = menu->tag();
45 const auto it = m_menuItems.constFind(tag);
46 if (it != m_menuItems.cend()) {
47 return *it;
48 } else {
50 updateMenuItem(item, menu);
51 m_menuItems.insert(tag, item);
52 return item;
53 }
54}
55
56void QDBusMenuBar::updateMenuItem(QDBusPlatformMenuItem *item, QPlatformMenu *menu)
57{
58 const QDBusPlatformMenu *ourMenu = qobject_cast<const QDBusPlatformMenu *>(menu);
59 item->setText(ourMenu->text());
60 item->setIcon(ourMenu->icon());
61 item->setEnabled(ourMenu->isEnabled());
62 item->setVisible(ourMenu->isVisible());
63 item->setMenu(menu);
64}
65
67{
68 QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu);
69 QDBusPlatformMenuItem *beforeItem = menuItemForMenu(before);
70 m_menu->insertMenuItem(menuItem, beforeItem);
71 m_menu->emitUpdated();
72}
73
75{
76 QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu);
77 m_menu->removeMenuItem(menuItem);
78 m_menu->emitUpdated();
79}
80
82{
83 QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu);
84 updateMenuItem(menuItem, menu);
85}
86
88{
89 if (newParentWindow) {
90 unregisterMenuBar();
91 m_windowId = newParentWindow->winId();
92 registerMenuBar();
93 }
94}
95
97{
98 QDBusPlatformMenuItem *menuItem = m_menuItems.value(tag);
99 if (menuItem)
100 return const_cast<QPlatformMenu *>(menuItem->menu());
101 return nullptr;
102}
103
105{
106 return new QDBusPlatformMenu;
107}
108
109void QDBusMenuBar::registerMenuBar()
110{
111 static uint menuBarId = 0;
112
114 m_objectPath = QStringLiteral("/MenuBar/%1").arg(++menuBarId);
115 if (!connection.registerObject(m_objectPath, m_menu))
116 return;
117
119 QDBusPendingReply<> r = registrar.RegisterWindow(m_windowId, QDBusObjectPath(m_objectPath));
121 if (r.isError()) {
122 qWarning("Failed to register window menu, reason: %s (\"%s\")",
123 qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message()));
124 connection.unregisterObject(m_objectPath);
125 }
126}
127
128void QDBusMenuBar::unregisterMenuBar()
129{
131
132 if (m_windowId) {
134 QDBusPendingReply<> r = registrar.UnregisterWindow(m_windowId);
136 if (r.isError())
137 qWarning("Failed to unregister window menu, reason: %s (\"%s\")",
138 qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message()));
139 }
140
141 if (!m_objectPath.isEmpty())
142 connection.unregisterObject(m_objectPath);
143}
144
146
147#include "moc_qdbusmenubar_p.cpp"
\inmodule QtDBus
static QDBusConnection sessionBus()
Returns a QDBusConnection object opened with the session bus.
void ItemsPropertiesUpdated(const QDBusMenuItemList &updatedProps, const QDBusMenuItemKeysList &removedProps)
void ItemActivationRequested(int id, uint timestamp)
void LayoutUpdated(uint revision, int parent)
void insertMenu(QPlatformMenu *menu, QPlatformMenu *before) override
virtual ~QDBusMenuBar()
QPlatformMenu * createMenu() const override
QPlatformMenu * menuForTag(quintptr tag) const override
void handleReparent(QWindow *newParentWindow) override
void syncMenu(QPlatformMenu *menu) override
void removeMenu(QPlatformMenu *menu) override
static void registerDBusTypes()
\inmodule QtDBus
const QPlatformMenu * menu() const
void popupRequested(int id, uint timestamp)
bool isEnabled() const override
void removeMenuItem(QPlatformMenuItem *menuItem) override
void updated(uint revision, int dbusId)
void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) override
void propertiesUpdated(QDBusMenuItemList updatedProps, QDBusMenuItemKeysList removedProps)
const QString text() const
void setEnabled(bool enabled)
If enabled is true, the item is enabled; otherwise, it is disabled.
void setVisible(bool visible)
If visible is true, the item is made visible.
const_iterator constFind(const Key &key) const noexcept
Definition qhash.h:1279
T value(const Key &key) const noexcept
Definition qhash.h:1044
const_iterator cend() const noexcept
Definition qhash.h:1208
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1283
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
\inmodule QtGui
Definition qwindow.h:63
qDeleteAll(list.begin(), list.end())
QSet< QString >::iterator it
Combined button and popup list for selecting options.
AudioChannelLayoutTag tag
DBusConnection * connection
#define REGISTRAR_PATH
#define REGISTRAR_SERVICE
#define qWarning
Definition qlogging.h:162
GLboolean r
[2]
#define qUtf8Printable(string)
Definition qstring.h:1395
#define QStringLiteral(str)
size_t quintptr
Definition qtypes.h:72
unsigned int uint
Definition qtypes.h:29
QGraphicsItem * item
QMenu menu
[5]