Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
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
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)
void removeMenuItem(QPlatformMenuItem *menuItem) override
void updated(uint revision, int dbusId)
void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) override
void propertiesUpdated(QDBusMenuItemList updatedProps, QDBusMenuItemKeysList removedProps)
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:1299
T value(const Key &key) const noexcept
Definition qhash.h:1054
const_iterator cend() const noexcept
Definition qhash.h:1218
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1303
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
\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:166
GLboolean r
[2]
#define qUtf8Printable(string)
Definition qstring.h:1535
#define QStringLiteral(str)
size_t quintptr
Definition qtypes.h:167
unsigned int uint
Definition qtypes.h:34
QGraphicsItem * item
QMenu menu
[5]