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 };