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
qdbusmenutypes.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
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 "qdbusmenutypes_p.h"
5
6#include <QDBusConnection>
7#include <QDBusMetaType>
8#include <QImage>
9#include <QIcon>
10#include <QImage>
11#include <QPixmap>
12#include <QDebug>
13#include <QtEndian>
14#include <QBuffer>
15#if QT_CONFIG(shortcut)
16# include <private/qkeysequence_p.h>
17#endif
18#include <qpa/qplatformmenu.h>
19#include "qdbusplatformmenu_p.h"
20
22
23using namespace Qt::StringLiterals;
24
34
36{
37 arg.beginStructure();
38 arg << item.m_id << item.m_properties;
39 arg.endStructure();
40 return arg;
41}
42
44{
45 arg.beginStructure();
46 arg >> item.m_id >> item.m_properties;
47 arg.endStructure();
48 return arg;
49}
50
52{
53 arg.beginStructure();
54 arg << keys.id << keys.properties;
55 arg.endStructure();
56 return arg;
57}
58
60{
61 arg.beginStructure();
62 arg >> keys.id >> keys.properties;
63 arg.endStructure();
64 return arg;
65}
66
67uint QDBusMenuLayoutItem::populate(int id, int depth, const QStringList &propertyNames, const QDBusPlatformMenu *topLevelMenu)
68{
69 qCDebug(qLcMenu) << id << "depth" << depth << propertyNames;
70 m_id = id;
71 if (id == 0) {
72 m_properties.insert("children-display"_L1, "submenu"_L1);
73 if (topLevelMenu)
74 populate(topLevelMenu, depth, propertyNames);
75 return 1; // revision
76 }
77
79 if (item) {
80 const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
81
82 if (menu) {
83 if (depth != 0)
84 populate(menu, depth, propertyNames);
85 return menu->revision();
86 }
87 }
88
89 return 1; // revision
90}
91
93{
94 const auto items = menu->items();
97 child.populate(item, depth - 1, propertyNames);
99 }
100}
101
103{
104 m_id = item->dbusID();
106 m_properties = proxy.m_properties;
107
108 const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
109 if (depth != 0 && menu)
110 populate(menu, depth, propertyNames);
111}
112
114{
115 arg.beginStructure();
116 arg << item.m_id << item.m_properties;
117 arg.beginArray(qMetaTypeId<QDBusVariant>());
118 for (const QDBusMenuLayoutItem &child : item.m_children)
119 arg << QDBusVariant(QVariant::fromValue<QDBusMenuLayoutItem>(child));
120 arg.endArray();
121 arg.endStructure();
122 return arg;
123}
124
126{
127 arg.beginStructure();
128 arg >> item.m_id >> item.m_properties;
129 arg.beginArray();
130 while (!arg.atEnd()) {
131 QDBusVariant dbusVariant;
132 arg >> dbusVariant;
133 QDBusArgument childArgument = qvariant_cast<QDBusArgument>(dbusVariant.variant());
134
136 childArgument >> child;
137 item.m_children.append(child);
138 }
139 arg.endArray();
140 arg.endStructure();
141 return arg;
142}
143
145{
146 qDBusRegisterMetaType<QDBusMenuItem>();
147 qDBusRegisterMetaType<QDBusMenuItemList>();
148 qDBusRegisterMetaType<QDBusMenuItemKeys>();
149 qDBusRegisterMetaType<QDBusMenuItemKeysList>();
150 qDBusRegisterMetaType<QDBusMenuLayoutItem>();
151 qDBusRegisterMetaType<QDBusMenuLayoutItemList>();
152 qDBusRegisterMetaType<QDBusMenuEvent>();
153 qDBusRegisterMetaType<QDBusMenuEventList>();
154 qDBusRegisterMetaType<QDBusMenuShortcut>();
155}
156
158 : m_id(item->dbusID())
159{
160 if (item->isSeparator()) {
161 m_properties.insert("type"_L1, "separator"_L1);
162 } else {
163 m_properties.insert("label"_L1, convertMnemonic(item->text()));
164 if (item->menu())
165 m_properties.insert("children-display"_L1, "submenu"_L1);
166 m_properties.insert("enabled"_L1, item->isEnabled());
167 if (item->isCheckable()) {
168 QString toggleType = item->hasExclusiveGroup() ? "radio"_L1 : "checkmark"_L1;
169 m_properties.insert("toggle-type"_L1, toggleType);
170 m_properties.insert("toggle-state"_L1, item->isChecked() ? 1 : 0);
171 }
172#ifndef QT_NO_SHORTCUT
173 const QKeySequence &scut = item->shortcut();
174 if (!scut.isEmpty()) {
177 }
178#endif
179 const QIcon &icon = item->icon();
180 if (!icon.name().isEmpty()) {
181 m_properties.insert("icon-name"_L1, icon.name());
182 } else if (!icon.isNull()) {
183 QBuffer buf;
184 icon.pixmap(16).save(&buf, "PNG");
185 m_properties.insert("icon-data"_L1, buf.data());
186 }
187 }
188 m_properties.insert("visible"_L1, item->isVisible());
189}
190
191QDBusMenuItemList QDBusMenuItem::items(const QList<int> &ids, const QStringList &propertyNames)
192{
193 Q_UNUSED(propertyNames);
195 const QList<const QDBusPlatformMenuItem *> items = QDBusPlatformMenuItem::byIds(ids);
196 ret.reserve(items.size());
197 for (const QDBusPlatformMenuItem *item : items)
199 return ret;
200}
201
203{
204 // convert only the first occurrence of ampersand which is not at the end
205 // dbusmenu uses underscore instead of ampersand
206 int idx = label.indexOf(u'&');
207 if (idx < 0 || idx == label.size() - 1)
208 return label;
210 ret[idx] = u'_';
211 return ret;
212}
213
214#ifndef QT_NO_SHORTCUT
216{
218 for (int i = 0; i < sequence.count(); ++i) {
219 QStringList tokens;
220 auto modifiers = sequence[i].keyboardModifiers();
222 tokens << QStringLiteral("Super");
224 tokens << QStringLiteral("Control");
226 tokens << QStringLiteral("Alt");
228 tokens << QStringLiteral("Shift");
230 tokens << QStringLiteral("Num");
231
233 if (keyName == "+"_L1)
234 tokens << QStringLiteral("plus");
235 else if (keyName == "-"_L1)
236 tokens << QStringLiteral("minus");
237 else
238 tokens << keyName;
239 shortcut << tokens;
240 }
241 return shortcut;
242}
243#endif
244
246{
247 arg.beginStructure();
248 arg << ev.m_id << ev.m_eventId << ev.m_data << ev.m_timestamp;
249 arg.endStructure();
250 return arg;
251}
252
254{
255 arg.beginStructure();
256 arg >> ev.m_id >> ev.m_eventId >> ev.m_data >> ev.m_timestamp;
257 arg.endStructure();
258 return arg;
259}
260
261#ifndef QT_NO_DEBUG_STREAM
263{
264 QDebugStateSaver saver(d);
265 d.nospace();
266 d << "QDBusMenuItem(id=" << item.m_id << ", properties=" << item.m_properties << ')';
267 return d;
268}
269
271{
272 QDebugStateSaver saver(d);
273 d.nospace();
274 d << "QDBusMenuLayoutItem(id=" << item.m_id << ", properties=" << item.m_properties << ", " << item.m_children.size() << " children)";
275 return d;
276}
277#endif
278
\inmodule QtCore \reentrant
Definition qbuffer.h:16
\inmodule QtDBus
static QDBusMenuShortcut convertKeySequence(const QKeySequence &sequence)
static QString convertMnemonic(const QString &label)
static QDBusMenuItemList items(const QList< int > &ids, const QStringList &propertyNames)
QVariantMap m_properties
static void registerDBusTypes()
uint populate(int id, int depth, const QStringList &propertyNames, const QDBusPlatformMenu *topLevelMenu)
QList< QDBusMenuLayoutItem > m_children
static QDBusPlatformMenuItem * byId(int id)
static QList< const QDBusPlatformMenuItem * > byIds(const QList< int > &ids)
\inmodule QtDBus
\inmodule QtCore
\inmodule QtCore
bool isEnabled() const
Returns true if the item is enabled; otherwise, false is returned.
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
The QIcon class provides scalable icons in different modes and states.
Definition qicon.h:20
bool isNull() const
Returns true if the icon is empty; otherwise returns false.
Definition qicon.cpp:1019
QString name() const
Definition qicon.cpp:1161
QPixmap pixmap(const QSize &size, Mode mode=Normal, State state=Off) const
Returns a pixmap with the requested size, mode, and state, generating one if necessary.
Definition qicon.cpp:834
static Q_GUI_EXPORT QString keyName(Qt::Key key, QKeySequence::SequenceFormat format)
The QKeySequence class encapsulates a key sequence as used by shortcuts.
int count() const
Returns the number of keys in the key sequence.
qsizetype size() const noexcept
Definition qlist.h:397
iterator insert(const Key &key, const T &value)
Definition qmap.h:688
bool save(const QString &fileName, const char *format=nullptr, int quality=-1) const
Saves the pixmap to the file with the given fileName using the specified image file format and qualit...
Definition qpixmap.cpp:803
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:536
EGLImageKHR int int EGLuint64KHR * modifiers
Combined button and popup list for selecting options.
@ ShiftModifier
@ ControlModifier
@ MetaModifier
@ KeypadModifier
@ AltModifier
const QDBusArgument & operator>>(const QDBusArgument &arg, QDBusMenuItem &item)
const QDBusArgument & operator<<(QDBusArgument &arg, const QDBusMenuItem &item)
QList< QDBusMenuItemKeys > QDBusMenuItemKeysList
QList< QDBusMenuItem > QDBusMenuItemList
#define qCDebug(category,...)
return ret
#define QT_IMPL_METATYPE_EXTERN(TYPE)
Definition qmetatype.h:1390
GLint GLenum GLsizei GLsizei GLsizei depth
GLuint64 key
GLenum GLenum GLsizei const GLuint * ids
GLenum GLuint id
[7]
GLuint GLsizei const GLchar * label
[43]
GLenum GLuint GLenum GLsizei const GLchar * buf
static QString keyName(const QString &rKey)
SSL_CTX int void * arg
#define QStringLiteral(str)
#define Q_UNUSED(x)
unsigned int uint
Definition qtypes.h:34
QStringList keys
QGraphicsItem * item
QList< QTreeWidgetItem * > items
QLayoutItem * child
[0]
QMenu menu
[5]
QNetworkProxy proxy
[0]