diff --git a/src/platformtheme/kdeplatformtheme.cpp b/src/platformtheme/kdeplatformtheme.cpp --- a/src/platformtheme/kdeplatformtheme.cpp +++ b/src/platformtheme/kdeplatformtheme.cpp @@ -60,9 +60,6 @@ static const QByteArray s_x11AppMenuServiceNamePropertyName = QByteArrayLiteral("_KDE_NET_WM_APPMENU_SERVICE_NAME"); static const QByteArray s_x11AppMenuObjectPathPropertyName = QByteArrayLiteral("_KDE_NET_WM_APPMENU_OBJECT_PATH"); -static const QByteArray s_waylandAppMenuServiceNamePropertyName = QByteArrayLiteral("KDE_APPMENU_SERVICE_NAME"); -static const QByteArray s_waylandAppMenuObjectPathPropertyName = QByteArrayLiteral("KDE_APPMENU_OBJECT_PATH"); - static bool checkDBusGlobalMenuAvailable() { if (qEnvironmentVariableIsSet("KDE_NO_GLOBAL_MENU")) { @@ -374,13 +371,11 @@ if (m_kwaylandIntegration) { if (oldWindow) { - m_kwaylandIntegration->setWindowProperty(oldWindow, s_waylandAppMenuServiceNamePropertyName, {}); - m_kwaylandIntegration->setWindowProperty(oldWindow, s_waylandAppMenuObjectPathPropertyName, {}); + m_kwaylandIntegration->setAppMenu(QString(), QString()); } if (newWindow) { - m_kwaylandIntegration->setWindowProperty(newWindow, s_waylandAppMenuServiceNamePropertyName, serviceName.toUtf8()); - m_kwaylandIntegration->setWindowProperty(newWindow, s_waylandAppMenuObjectPathPropertyName, objectPath.toUtf8()); + m_kwaylandIntegration->setAppMenu(serviceName, objectPath); } } }); diff --git a/src/platformtheme/kwaylandintegration.h b/src/platformtheme/kwaylandintegration.h --- a/src/platformtheme/kwaylandintegration.h +++ b/src/platformtheme/kwaylandintegration.h @@ -29,6 +29,7 @@ namespace Client { class ServerSideDecorationManager; +class AppMenuManager; } } @@ -41,15 +42,20 @@ void init(); void setWindowProperty(QWindow *window, const QByteArray &name, const QByteArray &value); + void setAppMenu(const QString &serviceName, const QString &objectPath); bool eventFilter(QObject *watched, QEvent *event) override; private: void shellSurfaceCreated(QWindow *w); void shellSurfaceDestroyed(QWindow *w); void installColorScheme(QWindow *w); - KWayland::Client::ServerSideDecorationManager *m_decoration; + KWayland::Client::ServerSideDecorationManager *m_decoration = nullptr; + KWayland::Client::AppMenuManager *m_appMenuManager = nullptr; + + QString m_appMenuServiceName; + QString m_appMenuObjectPath; }; #endif diff --git a/src/platformtheme/kwaylandintegration.cpp b/src/platformtheme/kwaylandintegration.cpp --- a/src/platformtheme/kwaylandintegration.cpp +++ b/src/platformtheme/kwaylandintegration.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include using namespace KWayland::Client; @@ -59,6 +60,11 @@ m_decoration = registry->createServerSideDecorationManager(interface.name, interface.version, this); qputenv("QT_WAYLAND_DISABLE_WINDOWDECORATION", "1"); QCoreApplication::instance()->installEventFilter(this); + + } + const auto menuInterface = registry->interface(Registry::Interface::AppMenu); + if (menuInterface.name != 0) { + m_appMenuManager = registry->createAppMenuManager(menuInterface.name, menuInterface.version, this); } } ); @@ -130,12 +136,21 @@ deco->requestMode(ourMode); } w->setProperty("org.kde.plasma.integration.waylandserverdecoration", QVariant::fromValue(deco)); + + if (m_appMenuManager) { + auto menu = m_appMenuManager->create(s, w); + w->setProperty("org.kde.plasma.integration.appmenu", QVariant::fromValue(menu)); + menu->setAddress(m_appMenuServiceName, m_appMenuObjectPath); + } } void KWaylandIntegration::shellSurfaceDestroyed(QWindow *w) { delete w->property("org.kde.plasma.integration.waylandserverdecoration").value(); w->setProperty("org.kde.plasma.integration.waylandserverdecoration", QVariant()); + + delete w->property("org.kde.plasma.integration.appmenu").value(); + w->setProperty("org.kde.plasma.integration.appmenu", QVariant()); } void KWaylandIntegration::installColorScheme(QWindow *w) @@ -156,4 +171,14 @@ } } +void KWaylandIntegration::setAppMenu(const QString &serviceName, const QString &objectPath) +{ + m_appMenuServiceName = serviceName; + m_appMenuObjectPath = objectPath; + auto menu = property("org.kde.plasma.integration.appmenu").value(); + if (menu) { + menu->setAddress(serviceName, objectPath); + } +} + #include "kwaylandintegration.moc"