summaryrefslogtreecommitdiffstats
path: root/src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp
diff options
context:
space:
mode:
authorDavid Edmundson <davidedmundson@kde.org>2023-06-02 13:10:47 +0100
committerDavid Edmundson <davidedmundson@kde.org>2024-10-10 21:14:40 +0000
commitefdb5d16df6f7f400b30596f5ec70f1c5a39fb2d (patch)
tree78fe0072bdf3dd88722f9b849f32d50e3eb13458 /src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp
parent9ef4c123c39c642357c9e8530d59f32f220a7824 (diff)
xcb: Report location of DBus menubar on window properties
KDE extended the DBus menubar protocol to report the DBus service and path on the window itself, this makes looking it up easier than going through a broker. On Qt5 this worked because we handled the entire DBus menu from scratch in KDE's own platformtheme, but given Qt now has direct dbusmenu bar support it makes sense to have the remaining reporting side all in one place. Change-Id: I78044992fa1840c40a66384033ed790ce0cd7f96 Task-number: QTBUG-116352 Reviewed-by: Liang Qi <liang.qi@qt.io>
Diffstat (limited to 'src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp')
-rw-r--r--src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp b/src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp
index 2c006366cb4..862b60f12d0 100644
--- a/src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp
+++ b/src/gui/platform/unix/dbusmenu/qdbusmenubar.cpp
@@ -4,6 +4,10 @@
#include "qdbusmenubar_p.h"
#include "qdbusmenuregistrarproxy_p.h"
+#include <private/qguiapplication_p.h>
+#include <private/qgenericunixservices_p.h>
+#include <qpa/qplatformintegration.h>
+
QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
@@ -18,7 +22,6 @@ QDBusMenuBar::QDBusMenuBar()
: QPlatformMenuBar()
, m_menu(new QDBusPlatformMenu())
, m_menuAdaptor(new QDBusMenuAdaptor(m_menu))
- , m_windowId(0)
{
QDBusMenuItem::registerDBusTypes();
connect(m_menu, &QDBusPlatformMenu::propertiesUpdated,
@@ -88,7 +91,7 @@ void QDBusMenuBar::handleReparent(QWindow *newParentWindow)
{
if (newParentWindow) {
unregisterMenuBar();
- m_windowId = newParentWindow->winId();
+ m_window = newParentWindow;
registerMenuBar();
}
}
@@ -116,30 +119,39 @@ void QDBusMenuBar::registerMenuBar()
return;
QDBusMenuRegistrarInterface registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, connection, this);
- QDBusPendingReply<> r = registrar.RegisterWindow(m_windowId, QDBusObjectPath(m_objectPath));
+ QDBusPendingReply<> r = registrar.RegisterWindow(m_window->winId(), QDBusObjectPath(m_objectPath));
r.waitForFinished();
if (r.isError()) {
qWarning("Failed to register window menu, reason: %s (\"%s\")",
qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message()));
connection.unregisterObject(m_objectPath);
+ return;
}
+ const auto unixServices = dynamic_cast<QGenericUnixServices *>(
+ QGuiApplicationPrivate::platformIntegration()->services());
+ unixServices->registerDBusMenuForWindow(m_window, connection.baseService(), m_objectPath);
}
void QDBusMenuBar::unregisterMenuBar()
{
QDBusConnection connection = QDBusConnection::sessionBus();
- if (m_windowId) {
+ if (m_window) {
QDBusMenuRegistrarInterface registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, connection, this);
- QDBusPendingReply<> r = registrar.UnregisterWindow(m_windowId);
+ QDBusPendingReply<> r = registrar.UnregisterWindow(m_window->winId());
r.waitForFinished();
if (r.isError())
qWarning("Failed to unregister window menu, reason: %s (\"%s\")",
qUtf8Printable(r.error().name()), qUtf8Printable(r.error().message()));
+
+ const auto unixServices = dynamic_cast<QGenericUnixServices *>(
+ QGuiApplicationPrivate::platformIntegration()->services());
+ unixServices->unregisterDBusMenuForWindow(m_window);
}
- if (!m_objectPath.isEmpty())
+ if (!m_objectPath.isEmpty()) {
connection.unregisterObject(m_objectPath);
+ }
}
QT_END_NAMESPACE