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()