File indexing completed on 2024-05-05 17:43:54

0001 /*
0002     SPDX-FileCopyrightText: 2018 Kai Uwe Broulik <kde@privat.broulik.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QDBusContext>
0010 #include <QMultiHash>
0011 #include <QObject>
0012 #include <QString>
0013 #include <QVector>
0014 #include <QWindow> // for WId
0015 
0016 #include <functional>
0017 
0018 #include "../libdbusmenuqt/dbusmenutypes_p.h"
0019 #include "gdbusmenutypes_p.h"
0020 
0021 class QDBusVariant;
0022 
0023 class Actions;
0024 class Menu;
0025 
0026 class Window : public QObject, protected QDBusContext
0027 {
0028     Q_OBJECT
0029 
0030     // DBus
0031     Q_PROPERTY(QString Status READ status)
0032     Q_PROPERTY(uint Version READ version)
0033 
0034 public:
0035     Window(const QString &serviceName);
0036     ~Window() override;
0037 
0038     void init();
0039 
0040     WId winId() const;
0041     void setWinId(WId winId);
0042 
0043     QString serviceName() const;
0044 
0045     QString applicationObjectPath() const;
0046     void setApplicationObjectPath(const QString &applicationObjectPath);
0047 
0048     QString unityObjectPath() const;
0049     void setUnityObjectPath(const QString &unityObjectPath);
0050 
0051     QString windowObjectPath() const;
0052     void setWindowObjectPath(const QString &windowObjectPath);
0053 
0054     QString applicationMenuObjectPath() const;
0055     void setApplicationMenuObjectPath(const QString &applicationMenuObjectPath);
0056 
0057     QString menuBarObjectPath() const;
0058     void setMenuBarObjectPath(const QString &menuBarObjectPath);
0059 
0060     QString currentMenuObjectPath() const;
0061 
0062     QString proxyObjectPath() const;
0063 
0064     // DBus
0065     bool AboutToShow(int id);
0066     void Event(int id, const QString &eventId, const QDBusVariant &data, uint timestamp);
0067     DBusMenuItemList GetGroupProperties(const QList<int> &ids, const QStringList &propertyNames);
0068     uint GetLayout(int parentId, int recursionDepth, const QStringList &propertyNames, DBusMenuLayoutItem &dbusItem);
0069     QDBusVariant GetProperty(int id, const QString &property);
0070 
0071     QString status() const;
0072     uint version() const;
0073 
0074 Q_SIGNALS:
0075     // don't want to pollute X stuff into Menu, let all of that be in MenuProxy
0076     void requestWriteWindowProperties();
0077     void requestRemoveWindowProperties();
0078 
0079     // DBus
0080     void ItemActivationRequested(int id, uint timestamp);
0081     void ItemsPropertiesUpdated(const DBusMenuItemList &updatedProps, const DBusMenuItemKeysList &removedProps);
0082     void LayoutUpdated(uint revision, int parent);
0083 
0084 private:
0085     void initMenu();
0086 
0087     bool registerDBusObject();
0088     void updateWindowProperties();
0089 
0090     bool getAction(const QString &name, GMenuAction &action) const;
0091     void triggerAction(const QString &name, const QVariant &target, uint timestamp = 0);
0092     Actions *getActionsForAction(const QString &name, QString &lookupName) const;
0093 
0094     void menuChanged(const QVector<uint> &menuIds);
0095     void menuItemsChanged(const QVector<uint> &itemIds);
0096 
0097     void onActionsChanged(const QStringList &dirty, const QString &prefix);
0098     void onMenuSubscribed(uint id);
0099 
0100     QVariantMap gMenuToDBusMenuProperties(const QVariantMap &source) const;
0101 
0102     WId m_winId = 0;
0103     QString m_serviceName; // original GMenu service (the gtk app)
0104 
0105     QString m_applicationObjectPath;
0106     QString m_unityObjectPath;
0107     QString m_windowObjectPath;
0108     QString m_applicationMenuObjectPath;
0109     QString m_menuBarObjectPath;
0110 
0111     QString m_currentMenuObjectPath;
0112 
0113     QString m_proxyObjectPath; // our object path on this proxy app
0114 
0115     QMultiHash<int, QDBusMessage> m_pendingGetLayouts;
0116 
0117     Menu *m_applicationMenu = nullptr;
0118     Menu *m_menuBar = nullptr;
0119 
0120     Menu *m_currentMenu = nullptr;
0121 
0122     Actions *m_applicationActions = nullptr;
0123     Actions *m_unityActions = nullptr;
0124     Actions *m_windowActions = nullptr;
0125 
0126     bool m_menuInited = false;
0127 };