Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/platformsupport/dbusmenu/qdbusmenubar.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||
2 | ** | - | ||||||||||||
3 | ** Copyright (C) 2016 Dmitry Shachnev <mitya57@gmail.com> | - | ||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||
5 | ** | - | ||||||||||||
6 | ** This file is part of the QtGui module of the Qt Toolkit. | - | ||||||||||||
7 | ** | - | ||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||
16 | ** | - | ||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||
24 | ** | - | ||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||
35 | ** | - | ||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||
37 | ** | - | ||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||
39 | - | |||||||||||||
40 | #include "qdbusmenubar_p.h" | - | ||||||||||||
41 | #include "qdbusmenuregistrarproxy_p.h" | - | ||||||||||||
42 | - | |||||||||||||
43 | QT_BEGIN_NAMESPACE | - | ||||||||||||
44 | - | |||||||||||||
45 | /* note: do not change these to QStringLiteral; | - | ||||||||||||
46 | we are unloaded before QtDBus is done using the strings. | - | ||||||||||||
47 | */ | - | ||||||||||||
48 | #define REGISTRAR_SERVICE QLatin1String("com.canonical.AppMenu.Registrar") | - | ||||||||||||
49 | #define REGISTRAR_PATH QLatin1String("/com/canonical/AppMenu/Registrar") | - | ||||||||||||
50 | - | |||||||||||||
51 | QDBusMenuBar::QDBusMenuBar() | - | ||||||||||||
52 | : QPlatformMenuBar() | - | ||||||||||||
53 | , m_menu(new QDBusPlatformMenu()) | - | ||||||||||||
54 | , m_menuAdaptor(new QDBusMenuAdaptor(m_menu)) | - | ||||||||||||
55 | , m_windowId(0) | - | ||||||||||||
56 | { | - | ||||||||||||
57 | QDBusMenuItem::registerDBusTypes(); | - | ||||||||||||
58 | connect(m_menu, &QDBusPlatformMenu::propertiesUpdated, | - | ||||||||||||
59 | m_menuAdaptor, &QDBusMenuAdaptor::ItemsPropertiesUpdated); | - | ||||||||||||
60 | connect(m_menu, &QDBusPlatformMenu::updated, | - | ||||||||||||
61 | m_menuAdaptor, &QDBusMenuAdaptor::LayoutUpdated); | - | ||||||||||||
62 | } never executed: end of block | 0 | ||||||||||||
63 | - | |||||||||||||
64 | QDBusMenuBar::~QDBusMenuBar() | - | ||||||||||||
65 | { | - | ||||||||||||
66 | unregisterMenuBar(); | - | ||||||||||||
67 | delete m_menuAdaptor; | - | ||||||||||||
68 | delete m_menu; | - | ||||||||||||
69 | qDeleteAll(m_menuItems); | - | ||||||||||||
70 | } never executed: end of block | 0 | ||||||||||||
71 | - | |||||||||||||
72 | QDBusPlatformMenuItem *QDBusMenuBar::menuItemForMenu(QPlatformMenu *menu) | - | ||||||||||||
73 | { | - | ||||||||||||
74 | if (!menu)
| 0 | ||||||||||||
75 | return nullptr; never executed: return nullptr; | 0 | ||||||||||||
76 | quintptr tag = menu->tag(); | - | ||||||||||||
77 | const auto it = m_menuItems.constFind(tag); | - | ||||||||||||
78 | if (it != m_menuItems.cend()) {
| 0 | ||||||||||||
79 | return *it; never executed: return *it; | 0 | ||||||||||||
80 | } else { | - | ||||||||||||
81 | QDBusPlatformMenuItem *item = new QDBusPlatformMenuItem; | - | ||||||||||||
82 | updateMenuItem(item, menu); | - | ||||||||||||
83 | m_menuItems.insert(tag, item); | - | ||||||||||||
84 | return item; never executed: return item; | 0 | ||||||||||||
85 | } | - | ||||||||||||
86 | } | - | ||||||||||||
87 | - | |||||||||||||
88 | void QDBusMenuBar::updateMenuItem(QDBusPlatformMenuItem *item, QPlatformMenu *menu) | - | ||||||||||||
89 | { | - | ||||||||||||
90 | const QDBusPlatformMenu *ourMenu = qobject_cast<const QDBusPlatformMenu *>(menu); | - | ||||||||||||
91 | item->setText(ourMenu->text()); | - | ||||||||||||
92 | item->setIcon(ourMenu->icon()); | - | ||||||||||||
93 | item->setEnabled(ourMenu->isEnabled()); | - | ||||||||||||
94 | item->setVisible(ourMenu->isVisible()); | - | ||||||||||||
95 | item->setMenu(menu); | - | ||||||||||||
96 | } never executed: end of block | 0 | ||||||||||||
97 | - | |||||||||||||
98 | void QDBusMenuBar::insertMenu(QPlatformMenu *menu, QPlatformMenu *before) | - | ||||||||||||
99 | { | - | ||||||||||||
100 | QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu); | - | ||||||||||||
101 | QDBusPlatformMenuItem *beforeItem = menuItemForMenu(before); | - | ||||||||||||
102 | m_menu->insertMenuItem(menuItem, beforeItem); | - | ||||||||||||
103 | m_menu->emitUpdated(); | - | ||||||||||||
104 | } never executed: end of block | 0 | ||||||||||||
105 | - | |||||||||||||
106 | void QDBusMenuBar::removeMenu(QPlatformMenu *menu) | - | ||||||||||||
107 | { | - | ||||||||||||
108 | QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu); | - | ||||||||||||
109 | m_menu->removeMenuItem(menuItem); | - | ||||||||||||
110 | m_menu->emitUpdated(); | - | ||||||||||||
111 | } never executed: end of block | 0 | ||||||||||||
112 | - | |||||||||||||
113 | void QDBusMenuBar::syncMenu(QPlatformMenu *menu) | - | ||||||||||||
114 | { | - | ||||||||||||
115 | QDBusPlatformMenuItem *menuItem = menuItemForMenu(menu); | - | ||||||||||||
116 | updateMenuItem(menuItem, menu); | - | ||||||||||||
117 | } never executed: end of block | 0 | ||||||||||||
118 | - | |||||||||||||
119 | void QDBusMenuBar::handleReparent(QWindow *newParentWindow) | - | ||||||||||||
120 | { | - | ||||||||||||
121 | if (newParentWindow && newParentWindow->winId() != m_windowId) {
| 0 | ||||||||||||
122 | unregisterMenuBar(); | - | ||||||||||||
123 | m_windowId = newParentWindow->winId(); | - | ||||||||||||
124 | registerMenuBar(); | - | ||||||||||||
125 | } never executed: end of block | 0 | ||||||||||||
126 | } never executed: end of block | 0 | ||||||||||||
127 | - | |||||||||||||
128 | QPlatformMenu *QDBusMenuBar::menuForTag(quintptr tag) const | - | ||||||||||||
129 | { | - | ||||||||||||
130 | QDBusPlatformMenuItem *menuItem = m_menuItems.value(tag); | - | ||||||||||||
131 | if (menuItem)
| 0 | ||||||||||||
132 | return const_cast<QPlatformMenu *>(menuItem->menu()); never executed: return const_cast<QPlatformMenu *>(menuItem->menu()); | 0 | ||||||||||||
133 | return nullptr; never executed: return nullptr; | 0 | ||||||||||||
134 | } | - | ||||||||||||
135 | - | |||||||||||||
136 | QPlatformMenu *QDBusMenuBar::createMenu() const | - | ||||||||||||
137 | { | - | ||||||||||||
138 | return new QDBusPlatformMenu; never executed: return new QDBusPlatformMenu; | 0 | ||||||||||||
139 | } | - | ||||||||||||
140 | - | |||||||||||||
141 | void QDBusMenuBar::registerMenuBar() | - | ||||||||||||
142 | { | - | ||||||||||||
143 | static uint menuBarId = 0; | - | ||||||||||||
144 | - | |||||||||||||
145 | QDBusConnection connection = QDBusConnection::sessionBus(); | - | ||||||||||||
146 | m_objectPath = QStringLiteral("/MenuBar/%1").arg(++menuBarId); never executed: return qstring_literal_temp; | 0 | ||||||||||||
147 | if (!connection.registerObject(m_objectPath, m_menu))
| 0 | ||||||||||||
148 | return; never executed: return; | 0 | ||||||||||||
149 | - | |||||||||||||
150 | QDBusMenuRegistrarInterface registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, connection, this); | - | ||||||||||||
151 | QDBusPendingReply<> r = registrar.RegisterWindow(m_windowId, QDBusObjectPath(m_objectPath)); | - | ||||||||||||
152 | r.waitForFinished(); | - | ||||||||||||
153 | if (r.isError()) {
| 0 | ||||||||||||
154 | qWarning("Failed to register window menu, reason: %s (\"%s\")", | - | ||||||||||||
155 | qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message())); | - | ||||||||||||
156 | connection.unregisterObject(m_objectPath); | - | ||||||||||||
157 | } never executed: end of block | 0 | ||||||||||||
158 | } never executed: end of block | 0 | ||||||||||||
159 | - | |||||||||||||
160 | void QDBusMenuBar::unregisterMenuBar() | - | ||||||||||||
161 | { | - | ||||||||||||
162 | QDBusConnection connection = QDBusConnection::sessionBus(); | - | ||||||||||||
163 | - | |||||||||||||
164 | if (m_windowId) {
| 0 | ||||||||||||
165 | QDBusMenuRegistrarInterface registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, connection, this); | - | ||||||||||||
166 | QDBusPendingReply<> r = registrar.UnregisterWindow(m_windowId); | - | ||||||||||||
167 | r.waitForFinished(); | - | ||||||||||||
168 | if (r.isError())
| 0 | ||||||||||||
169 | qWarning("Failed to unregister window menu, reason: %s (\"%s\")", never executed: QMessageLogger(__FILE__, 169, __PRETTY_FUNCTION__).warning("Failed to unregister window menu, reason: %s (\"%s\")", QString(r.error().name()).toUtf8().constData(), QString(r.error().message()).toUtf8().constData()); | 0 | ||||||||||||
170 | qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message())); never executed: QMessageLogger(__FILE__, 169, __PRETTY_FUNCTION__).warning("Failed to unregister window menu, reason: %s (\"%s\")", QString(r.error().name()).toUtf8().constData(), QString(r.error().message()).toUtf8().constData()); | 0 | ||||||||||||
171 | } never executed: end of block | 0 | ||||||||||||
172 | - | |||||||||||||
173 | if (!m_objectPath.isEmpty())
| 0 | ||||||||||||
174 | connection.unregisterObject(m_objectPath); never executed: connection.unregisterObject(m_objectPath); | 0 | ||||||||||||
175 | } never executed: end of block | 0 | ||||||||||||
176 | - | |||||||||||||
177 | QT_END_NAMESPACE | - | ||||||||||||
Source code | Switch to Preprocessed file |