KWin
Loading...
Searching...
No Matches
appmenu.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2011 Lionel Chauvin <megabigbug@yahoo.fr>
6 SPDX-FileCopyrightText: 2011, 2012 Cédric Bellegarde <gnumdk@gmail.com>
7 SPDX-FileCopyrightText: 2013 Martin Gräßlin <mgraesslin@kde.org>
8
9 SPDX-License-Identifier: GPL-2.0-or-later
10*/
11#include "appmenu.h"
12#include "workspace.h"
13#include "x11window.h"
14#include <appmenu_interface.h>
15
16#include <QDBusObjectPath>
17#include <QDBusServiceWatcher>
18
20#include <KDecoration2/DecorationSettings>
21
22namespace KWin
23{
24
25static const QString s_viewService(QStringLiteral("org.kde.kappmenuview"));
26
28 : m_appmenuInterface(new OrgKdeKappmenuInterface(QStringLiteral("org.kde.kappmenu"), QStringLiteral("/KAppMenu"), QDBusConnection::sessionBus(), this))
29{
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);
33
34 m_kappMenuWatcher = new QDBusServiceWatcher(QStringLiteral("org.kde.kappmenu"), QDBusConnection::sessionBus(),
35 QDBusServiceWatcher::WatchForRegistration | QDBusServiceWatcher::WatchForUnregistration, this);
36
37 connect(m_kappMenuWatcher, &QDBusServiceWatcher::serviceRegistered, this, [this]() {
38 m_applicationMenuEnabled = true;
40 });
41 connect(m_kappMenuWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this]() {
42 m_applicationMenuEnabled = false;
44 });
45
46 m_applicationMenuEnabled = QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.kappmenu"));
47}
48
50{
51 return m_applicationMenuEnabled;
52}
53
55{
56 if (enabled) {
57 QDBusConnection::sessionBus().interface()->registerService(s_viewService,
58 QDBusConnectionInterface::QueueService,
59 QDBusConnectionInterface::DontAllowReplacement);
60 } else {
61 QDBusConnection::sessionBus().interface()->unregisterService(s_viewService);
62 }
63}
64
65void ApplicationMenu::slotShowRequest(const QString &serviceName, const QDBusObjectPath &menuObjectPath, int actionId)
66{
67 // Ignore show request when user has not configured the application menu title bar button
68 auto decorationSettings = Workspace::self()->decorationBridge()->settings();
69 if (decorationSettings && !decorationSettings->decorationButtonsLeft().contains(KDecoration2::DecorationButtonType::ApplicationMenu)
70 && !decorationSettings->decorationButtonsRight().contains(KDecoration2::DecorationButtonType::ApplicationMenu)) {
71 return;
72 }
73
74 if (Window *window = findWindowWithApplicationMenu(serviceName, menuObjectPath)) {
75 window->showApplicationMenu(actionId);
76 }
77}
78
79void ApplicationMenu::slotMenuShown(const QString &serviceName, const QDBusObjectPath &menuObjectPath)
80{
81 if (Window *window = findWindowWithApplicationMenu(serviceName, menuObjectPath)) {
82 window->setApplicationMenuActive(true);
83 }
84}
85
86void ApplicationMenu::slotMenuHidden(const QString &serviceName, const QDBusObjectPath &menuObjectPath)
87{
88 if (Window *window = findWindowWithApplicationMenu(serviceName, menuObjectPath)) {
89 window->setApplicationMenuActive(false);
90 }
91}
92
93void ApplicationMenu::showApplicationMenu(const QPoint &p, Window *c, int actionId)
94{
95 if (!c->hasApplicationMenu()) {
96 return;
97 }
98 m_appmenuInterface->showMenu(p.x(), p.y(), c->applicationMenuServiceName(), QDBusObjectPath(c->applicationMenuObjectPath()), actionId);
99}
100
101Window *ApplicationMenu::findWindowWithApplicationMenu(const QString &serviceName, const QDBusObjectPath &menuObjectPath)
102{
103 if (serviceName.isEmpty() || menuObjectPath.path().isEmpty()) {
104 return nullptr;
105 }
106
107 return Workspace::self()->findWindow([&](const Window *window) {
108 return window->applicationMenuServiceName() == serviceName
109 && window->applicationMenuObjectPath() == menuObjectPath.path();
110 });
111}
112
113} // namespace KWin
114
115#include "moc_appmenu.cpp"
void showApplicationMenu(const QPoint &pos, Window *c, int actionId)
Definition appmenu.cpp:93
void applicationMenuEnabledChanged(bool enabled)
void setViewEnabled(bool enabled)
Definition appmenu.cpp:54
bool applicationMenuEnabled() const
Definition appmenu.cpp:49
std::unique_ptr< KDecoration2::DecorationSettingsPrivate > settings(KDecoration2::DecorationSettings *parent) override
QString applicationMenuObjectPath() const
Definition window.h:1262
QString applicationMenuServiceName() const
Definition window.h:1258
bool hasApplicationMenu
Definition window.h:506
Window * findWindow(const QUuid &internalId) const
Decoration::DecorationBridge * decorationBridge() const
static Workspace * self()
Definition workspace.h:91