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.
wilder-5.14
Kai Uwe Broulik 8 years ago
parent e1ce3d4cac
commit 093da790ba
  1. 79
      gmenu-dbusmenu-proxy/menu.cpp
  2. 23
      gmenu-dbusmenu-proxy/menu.h
  3. 9
      gmenu-dbusmenu-proxy/menuproxy.cpp

@ -39,24 +39,23 @@
static const QString s_orgGtkActions = QStringLiteral("org.gtk.Actions"); static const QString s_orgGtkActions = QStringLiteral("org.gtk.Actions");
static const QString s_orgGtkMenus = QStringLiteral("org.gtk.Menus"); static const QString s_orgGtkMenus = QStringLiteral("org.gtk.Menus");
Menu::Menu(WId winId, Menu::Menu(const QString &serviceName)
const QString &serviceName,
const QString &applicationObjectPath,
const QString &unityObjectPath,
const QString &windowObjectPath,
const QString &menuObjectPath)
: QObject() : QObject()
, m_winId(winId)
, m_serviceName(serviceName) , 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(); GDBusMenuTypes_register();
DBusMenuTypes_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, if (!QDBusConnection::sessionBus().connect(m_serviceName,
m_menuObjectPath, m_menuObjectPath,
@ -99,11 +98,11 @@ Menu::Menu(WId winId,
getActions(m_applicationObjectPath, [this](const GMenuActionMap &actions, bool ok) { getActions(m_applicationObjectPath, [this](const GMenuActionMap &actions, bool ok) {
if (ok) { if (ok) {
// TODO just do all of this in getActions instead of copying it thrice // TODO just do all of this in getActions instead of copying it thrice
if (m_inited) { if (m_menuInited) {
onApplicationActionsChanged({}, {}, {}, actions); onApplicationActionsChanged({}, {}, {}, actions);
} else { } else {
m_applicationActions = actions; m_applicationActions = actions;
init(); initMenu();
} }
} }
}); });
@ -112,11 +111,11 @@ Menu::Menu(WId winId,
if (!m_unityObjectPath.isEmpty()) { if (!m_unityObjectPath.isEmpty()) {
getActions(m_unityObjectPath, [this](const GMenuActionMap &actions, bool ok) { getActions(m_unityObjectPath, [this](const GMenuActionMap &actions, bool ok) {
if (ok) { if (ok) {
if (m_inited) { if (m_menuInited) {
onUnityActionsChanged({}, {}, {}, actions); onUnityActionsChanged({}, {}, {}, actions);
} else { } else {
m_unityActions = actions; m_unityActions = actions;
init(); initMenu();
} }
} }
}); });
@ -125,19 +124,17 @@ Menu::Menu(WId winId,
if (!m_windowObjectPath.isEmpty()) { if (!m_windowObjectPath.isEmpty()) {
getActions(m_windowObjectPath, [this](const GMenuActionMap &actions, bool ok) { getActions(m_windowObjectPath, [this](const GMenuActionMap &actions, bool ok) {
if (ok) { if (ok) {
if (m_inited) { if (m_menuInited) {
onWindowActionsChanged({}, {}, {}, actions); onWindowActionsChanged({}, {}, {}, actions);
} else { } else {
m_windowActions = actions; m_windowActions = actions;
init(); initMenu();
} }
} }
}); });
} }
} }
Menu::~Menu() = default;
void Menu::cleanup() void Menu::cleanup()
{ {
stop(m_subscriptions); stop(m_subscriptions);
@ -150,6 +147,11 @@ WId Menu::winId() const
return m_winId; return m_winId;
} }
void Menu::setWinId(WId winId)
{
m_winId = winId;
}
QString Menu::serviceName() const QString Menu::serviceName() const
{ {
return m_serviceName; return m_serviceName;
@ -160,24 +162,49 @@ QString Menu::applicationObjectPath() const
return m_applicationObjectPath; 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 QString Menu::windowObjectPath() const
{ {
return m_windowObjectPath; return m_windowObjectPath;
} }
void Menu::setWindowObjectPath(const QString &windowObjectPath)
{
m_windowObjectPath = windowObjectPath;
}
QString Menu::menuObjectPath() const QString Menu::menuObjectPath() const
{ {
return m_menuObjectPath; return m_menuObjectPath;
} }
void Menu::setMenuObjectPath(const QString &menuObjectPath)
{
m_menuObjectPath = menuObjectPath;
}
QString Menu::proxyObjectPath() const QString Menu::proxyObjectPath() const
{ {
return m_proxyObjectPath; return m_proxyObjectPath;
} }
void Menu::init() void Menu::initMenu()
{ {
if (m_inited) { if (m_menuInited) {
return; return;
} }
@ -186,7 +213,7 @@ void Menu::init()
} }
emit requestWriteWindowProperties(); emit requestWriteWindowProperties();
m_inited = true; m_menuInited = true;
} }
void Menu::start(uint id) 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) void Menu::onApplicationActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added)
{ {
if (!m_inited) { if (!m_menuInited) {
return; return;
} }
actionsChanged(removed, enabledChanges, stateChanges, added, m_applicationActions, QStringLiteral("app.")); 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) void Menu::onUnityActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added)
{ {
if (!m_inited) { if (!m_menuInited) {
return; return;
} }
actionsChanged(removed, enabledChanges, stateChanges, added, m_unityActions, QStringLiteral("unity.")); 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) void Menu::onWindowActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added)
{ {
if (!m_inited) { if (!m_menuInited) {
return; return;
} }
actionsChanged(removed, enabledChanges, stateChanges, added, m_windowActions, QStringLiteral("win.")); actionsChanged(removed, enabledChanges, stateChanges, added, m_windowActions, QStringLiteral("win."));

@ -41,23 +41,28 @@ class Menu : public QObject, protected QDBusContext
Q_PROPERTY(uint Version READ version) Q_PROPERTY(uint Version READ version)
public: public:
Menu(WId winId, Menu(const QString &serviceName);
const QString &serviceName,
const QString &applicationObjectPath,
const QString &unityObjectPath,
const QString &windowObjectPath,
const QString &menuObjectPath);
~Menu(); ~Menu();
void init();
void cleanup(); void cleanup();
WId winId() const; WId winId() const;
void setWinId(WId winId);
QString serviceName() const; QString serviceName() const;
QString applicationObjectPath() const; QString applicationObjectPath() const;
void setApplicationObjectPath(const QString &applicationObjectPath);
QString unityObjectPath() const; QString unityObjectPath() const;
void setUnityObjectPath(const QString &unityObjectPath);
QString windowObjectPath() const; QString windowObjectPath() const;
void setWindowObjectPath(const QString &windowObjectPath);
QString menuObjectPath() const; QString menuObjectPath() const;
void setMenuObjectPath(const QString &menuObjectPath);
QString proxyObjectPath() const; QString proxyObjectPath() const;
@ -88,7 +93,7 @@ private slots:
void onWindowActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added); void onWindowActionsChanged(const QStringList &removed, const StringBoolMap &enabledChanges, const QVariantMap &stateChanges, const GMenuActionMap &added);
private: private:
void init(); void initMenu();
void start(uint id); void start(uint id);
void stop(const QList<uint> &id); void stop(const QList<uint> &id);
@ -110,7 +115,7 @@ private:
QVariantMap gMenuToDBusMenuProperties(const QVariantMap &source) const; QVariantMap gMenuToDBusMenuProperties(const QVariantMap &source) const;
WId m_winId; WId m_winId = 0;
QString m_serviceName; // original GMenu service (the gtk app) QString m_serviceName; // original GMenu service (the gtk app)
QString m_applicationObjectPath; QString m_applicationObjectPath;
@ -131,6 +136,6 @@ private:
GMenuActionMap m_windowActions; GMenuActionMap m_windowActions;
GMenuActionMap m_unityActions; GMenuActionMap m_unityActions;
bool m_inited = false; bool m_menuInited = false;
}; };

@ -185,7 +185,12 @@ void MenuProxy::onWindowAdded(WId id)
return; 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); m_menus.insert(id, menu);
connect(menu, &Menu::requestWriteWindowProperties, this, [this, 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_kdeNetWmAppMenuServiceName, QByteArray());
writeWindowProperty(menu->winId(), s_kdeNetWmAppMenuObjectPath, QByteArray()); writeWindowProperty(menu->winId(), s_kdeNetWmAppMenuObjectPath, QByteArray());
}); });
menu->init();
} }
void MenuProxy::onWindowRemoved(WId id) void MenuProxy::onWindowRemoved(WId id)

Loading…
Cancel
Save