From 093da790ba02fa222e4bce61c310d483490656c4 Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Mon, 19 Feb 2018 10:23:14 +0100 Subject: [PATCH] Split constructor with tons of arguments into separate setters Also init after having connected to signals, this might fix issues where the menu won't show up the first time an application window shows as the menu might have requested setting the window properties before we connected to that (unlikely, but who knows). This is in preparation for being able to fall back from window menu to application menu should the former be empty. --- gmenu-dbusmenu-proxy/menu.cpp | 79 ++++++++++++++++++++---------- gmenu-dbusmenu-proxy/menu.h | 23 +++++---- gmenu-dbusmenu-proxy/menuproxy.cpp | 9 +++- 3 files changed, 75 insertions(+), 36 deletions(-) diff --git a/gmenu-dbusmenu-proxy/menu.cpp b/gmenu-dbusmenu-proxy/menu.cpp index 95e194ddf..61c74aa47 100644 --- a/gmenu-dbusmenu-proxy/menu.cpp +++ b/gmenu-dbusmenu-proxy/menu.cpp @@ -39,24 +39,23 @@ static const QString s_orgGtkActions = QStringLiteral("org.gtk.Actions"); static const QString s_orgGtkMenus = QStringLiteral("org.gtk.Menus"); -Menu::Menu(WId winId, - const QString &serviceName, - const QString &applicationObjectPath, - const QString &unityObjectPath, - const QString &windowObjectPath, - const QString &menuObjectPath) +Menu::Menu(const QString &serviceName) : QObject() - , m_winId(winId) , m_serviceName(serviceName) - , m_applicationObjectPath(applicationObjectPath) - , m_unityObjectPath(unityObjectPath) - , m_windowObjectPath(windowObjectPath) - , m_menuObjectPath(menuObjectPath) { - qCDebug(DBUSMENUPROXY) << "Created menu for" << m_winId << "on" << m_serviceName << "at app" << m_applicationObjectPath << "win" << m_windowObjectPath << "unity" << m_unityObjectPath << "menu" << m_menuObjectPath; + qCDebug(DBUSMENUPROXY) << "Created menu on" << serviceName; + + Q_ASSERT(!serviceName.isEmpty()); GDBusMenuTypes_register(); DBusMenuTypes_register(); +} + +Menu::~Menu() = default; + +void Menu::init() +{ + qCDebug(DBUSMENUPROXY) << "Inited menu for" << m_winId << "on" << m_serviceName << "at app" << m_applicationObjectPath << "win" << m_windowObjectPath << "unity" << m_unityObjectPath << "menu" << m_menuObjectPath; if (!QDBusConnection::sessionBus().connect(m_serviceName, m_menuObjectPath, @@ -99,11 +98,11 @@ Menu::Menu(WId winId, getActions(m_applicationObjectPath, [this](const GMenuActionMap &actions, bool ok) { if (ok) { // TODO just do all of this in getActions instead of copying it thrice - if (m_inited) { + if (m_menuInited) { onApplicationActionsChanged({}, {}, {}, actions); } else { m_applicationActions = actions; - init(); + initMenu(); } } }); @@ -112,11 +111,11 @@ Menu::Menu(WId winId, if (!m_unityObjectPath.isEmpty()) { getActions(m_unityObjectPath, [this](const GMenuActionMap &actions, bool ok) { if (ok) { - if (m_inited) { + if (m_menuInited) { onUnityActionsChanged({}, {}, {}, actions); } else { m_unityActions = actions; - init(); + initMenu(); } } }); @@ -125,19 +124,17 @@ Menu::Menu(WId winId, if (!m_windowObjectPath.isEmpty()) { getActions(m_windowObjectPath, [this](const GMenuActionMap &actions, bool ok) { if (ok) { - if (m_inited) { + if (m_menuInited) { onWindowActionsChanged({}, {}, {}, actions); } else { m_windowActions = actions; - init(); + initMenu(); } } }); } } -Menu::~Menu() = default; - void Menu::cleanup() { stop(m_subscriptions); @@ -150,6 +147,11 @@ WId Menu::winId() const return m_winId; } +void Menu::setWinId(WId winId) +{ + m_winId = winId; +} + QString Menu::serviceName() const { return m_serviceName; @@ -160,24 +162,49 @@ QString Menu::applicationObjectPath() const return m_applicationObjectPath; } +void Menu::setApplicationObjectPath(const QString &applicationObjectPath) +{ + m_applicationObjectPath = applicationObjectPath; +} + +QString Menu::unityObjectPath() const +{ + return m_unityObjectPath; +} + +void Menu::setUnityObjectPath(const QString &unityObjectPath) +{ + m_unityObjectPath = unityObjectPath; +} + QString Menu::windowObjectPath() const { return m_windowObjectPath; } +void Menu::setWindowObjectPath(const QString &windowObjectPath) +{ + m_windowObjectPath = windowObjectPath; +} + QString Menu::menuObjectPath() const { return m_menuObjectPath; } +void Menu::setMenuObjectPath(const QString &menuObjectPath) +{ + m_menuObjectPath = menuObjectPath; +} + QString Menu::proxyObjectPath() const { return m_proxyObjectPath; } -void Menu::init() +void Menu::initMenu() { - if (m_inited) { + if (m_menuInited) { return; } @@ -186,7 +213,7 @@ void Menu::init() } emit requestWriteWindowProperties(); - m_inited = true; + m_menuInited = true; } void Menu::start(uint id) @@ -392,7 +419,7 @@ void Menu::onMenuChanged(const GMenuChangeList &changes) void Menu::onApplicationActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added) { - if (!m_inited) { + if (!m_menuInited) { return; } actionsChanged(removed, enabledChanges, stateChanges, added, m_applicationActions, QStringLiteral("app.")); @@ -400,7 +427,7 @@ void Menu::onApplicationActionsChanged(const QStringList &removed, const StringB void Menu::onUnityActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added) { - if (!m_inited) { + if (!m_menuInited) { return; } actionsChanged(removed, enabledChanges, stateChanges, added, m_unityActions, QStringLiteral("unity.")); @@ -408,7 +435,7 @@ void Menu::onUnityActionsChanged(const QStringList &removed, const StringBoolMap void Menu::onWindowActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added) { - if (!m_inited) { + if (!m_menuInited) { return; } actionsChanged(removed, enabledChanges, stateChanges, added, m_windowActions, QStringLiteral("win.")); diff --git a/gmenu-dbusmenu-proxy/menu.h b/gmenu-dbusmenu-proxy/menu.h index 0124b77f7..6a75fff98 100644 --- a/gmenu-dbusmenu-proxy/menu.h +++ b/gmenu-dbusmenu-proxy/menu.h @@ -41,23 +41,28 @@ class Menu : public QObject, protected QDBusContext Q_PROPERTY(uint Version READ version) public: - Menu(WId winId, - const QString &serviceName, - const QString &applicationObjectPath, - const QString &unityObjectPath, - const QString &windowObjectPath, - const QString &menuObjectPath); + Menu(const QString &serviceName); ~Menu(); + void init(); void cleanup(); WId winId() const; + void setWinId(WId winId); + QString serviceName() const; QString applicationObjectPath() const; + void setApplicationObjectPath(const QString &applicationObjectPath); + QString unityObjectPath() const; + void setUnityObjectPath(const QString &unityObjectPath); + QString windowObjectPath() const; + void setWindowObjectPath(const QString &windowObjectPath); + QString menuObjectPath() const; + void setMenuObjectPath(const QString &menuObjectPath); QString proxyObjectPath() const; @@ -88,7 +93,7 @@ private slots: void onWindowActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added); private: - void init(); + void initMenu(); void start(uint id); void stop(const QList &id); @@ -110,7 +115,7 @@ private: QVariantMap gMenuToDBusMenuProperties(const QVariantMap &source) const; - WId m_winId; + WId m_winId = 0; QString m_serviceName; // original GMenu service (the gtk app) QString m_applicationObjectPath; @@ -131,6 +136,6 @@ private: GMenuActionMap m_windowActions; GMenuActionMap m_unityActions; - bool m_inited = false; + bool m_menuInited = false; }; diff --git a/gmenu-dbusmenu-proxy/menuproxy.cpp b/gmenu-dbusmenu-proxy/menuproxy.cpp index ec85985d3..99862abd6 100644 --- a/gmenu-dbusmenu-proxy/menuproxy.cpp +++ b/gmenu-dbusmenu-proxy/menuproxy.cpp @@ -185,7 +185,12 @@ void MenuProxy::onWindowAdded(WId id) return; } - Menu *menu = new Menu(id, serviceName, applicationObjectPath, unityObjectPath, windowObjectPath, menuObjectPath); + Menu *menu = new Menu(serviceName); + menu->setWinId(id); + menu->setApplicationObjectPath(applicationObjectPath); + menu->setUnityObjectPath(unityObjectPath); + menu->setWindowObjectPath(windowObjectPath); + menu->setMenuObjectPath(menuObjectPath); m_menus.insert(id, menu); connect(menu, &Menu::requestWriteWindowProperties, this, [this, menu] { @@ -198,6 +203,8 @@ void MenuProxy::onWindowAdded(WId id) writeWindowProperty(menu->winId(), s_kdeNetWmAppMenuServiceName, QByteArray()); writeWindowProperty(menu->winId(), s_kdeNetWmAppMenuObjectPath, QByteArray()); }); + + menu->init(); } void MenuProxy::onWindowRemoved(WId id)