14#include <appmenu_interface.h>
16#include <QDBusObjectPath>
17#include <QDBusServiceWatcher>
20#include <KDecoration2/DecorationSettings>
25static const QString s_viewService(QStringLiteral(
"org.kde.kappmenuview"));
28 : m_appmenuInterface(new OrgKdeKappmenuInterface(QStringLiteral(
"org.kde.kappmenu"), QStringLiteral(
"/KAppMenu"), QDBusConnection::sessionBus(), this))
30 connect(m_appmenuInterface, &OrgKdeKappmenuInterface::showRequest,
this, &ApplicationMenu::slotShowRequest);
31 connect(m_appmenuInterface, &OrgKdeKappmenuInterface::menuShown,
this, &ApplicationMenu::slotMenuShown);
32 connect(m_appmenuInterface, &OrgKdeKappmenuInterface::menuHidden,
this, &ApplicationMenu::slotMenuHidden);
34 m_kappMenuWatcher =
new QDBusServiceWatcher(QStringLiteral(
"org.kde.kappmenu"), QDBusConnection::sessionBus(),
35 QDBusServiceWatcher::WatchForRegistration | QDBusServiceWatcher::WatchForUnregistration,
this);
37 connect(m_kappMenuWatcher, &QDBusServiceWatcher::serviceRegistered,
this, [
this]() {
38 m_applicationMenuEnabled =
true;
41 connect(m_kappMenuWatcher, &QDBusServiceWatcher::serviceUnregistered,
this, [
this]() {
42 m_applicationMenuEnabled =
false;
46 m_applicationMenuEnabled = QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral(
"org.kde.kappmenu"));
51 return m_applicationMenuEnabled;
57 QDBusConnection::sessionBus().interface()->registerService(s_viewService,
58 QDBusConnectionInterface::QueueService,
59 QDBusConnectionInterface::DontAllowReplacement);
61 QDBusConnection::sessionBus().interface()->unregisterService(s_viewService);
65void ApplicationMenu::slotShowRequest(
const QString &serviceName,
const QDBusObjectPath &menuObjectPath,
int actionId)
69 if (decorationSettings && !decorationSettings->decorationButtonsLeft().contains(KDecoration2::DecorationButtonType::ApplicationMenu)
70 && !decorationSettings->decorationButtonsRight().contains(KDecoration2::DecorationButtonType::ApplicationMenu)) {
74 if (
Window *window = findWindowWithApplicationMenu(serviceName, menuObjectPath)) {
75 window->showApplicationMenu(actionId);
79void ApplicationMenu::slotMenuShown(
const QString &serviceName,
const QDBusObjectPath &menuObjectPath)
81 if (
Window *window = findWindowWithApplicationMenu(serviceName, menuObjectPath)) {
82 window->setApplicationMenuActive(
true);
86void ApplicationMenu::slotMenuHidden(
const QString &serviceName,
const QDBusObjectPath &menuObjectPath)
88 if (
Window *window = findWindowWithApplicationMenu(serviceName, menuObjectPath)) {
89 window->setApplicationMenuActive(
false);
101Window *ApplicationMenu::findWindowWithApplicationMenu(
const QString &serviceName,
const QDBusObjectPath &menuObjectPath)
103 if (serviceName.isEmpty() || menuObjectPath.path().isEmpty()) {
108 return window->applicationMenuServiceName() == serviceName
109 && window->applicationMenuObjectPath() == menuObjectPath.path();
115#include "moc_appmenu.cpp"
std::unique_ptr< KDecoration2::DecorationSettingsPrivate > settings(KDecoration2::DecorationSettings *parent) override
QString applicationMenuObjectPath() const
QString applicationMenuServiceName() const
Window * findWindow(const QUuid &internalId) const
Decoration::DecorationBridge * decorationBridge() const
static Workspace * self()