1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt 2012-02-27 14:27:17 +0000
+++ src/CMakeLists.txt 2013-01-04 10:33:53 +0000
@@ -15,6 +15,10 @@
${QT_QTXML_INCLUDE_DIR}
)
+qt4_add_dbus_interface(appmenu_qt_SRCS com.canonical.AppMenu.Registrar.xml
+ registrar)
+
+
qt4_automoc(${appmenu_qt_SRCS})
link_directories(
=== modified file 'src/appmenuplatformmenubar.cpp'
--- src/appmenuplatformmenubar.cpp 2012-04-04 16:06:06 +0000
+++ src/appmenuplatformmenubar.cpp 2013-01-04 10:36:25 +0000
@@ -15,6 +15,7 @@
along with appmenu-qt. If not, see <http://www.gnu.org/licenses/>.
*/
#include "appmenuplatformmenubar.h"
+#include "registrar.h"
// dbusmenu-qt
#include <dbusmenuexporter.h>
@@ -393,6 +394,8 @@
bool MenuBarAdapter::registerWindow()
{
+ static com::canonical::AppMenu::Registrar *registrar = 0;
+
if (!m_menuBar->window()) {
WARN << "No parent for this menubar";
return false;
@@ -403,9 +406,8 @@
return true;
}
- QDBusInterface host(REGISTRAR_SERVICE, REGISTRAR_PATH, REGISTRAR_IFACE);
- if (!host.isValid()) {
- return false;
+ if (!registrar) {
+ registrar = new com::canonical::AppMenu::Registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, QDBusConnection::sessionBus(), 0);
}
Q_FOREACH(QAction *action, m_menuBar->actions()) {
@@ -428,8 +430,9 @@
}
m_registeredWinId = winId;
- QVariant path = QVariant::fromValue<QDBusObjectPath>(QDBusObjectPath(m_objectPath));
- host.asyncCall(QLatin1String("RegisterWindow"), QVariant(winId), path);
+ if (registrar) {
+ registrar->RegisterWindow(winId, QDBusObjectPath(m_objectPath));
+ }
return true;
}
=== added file 'src/com.canonical.AppMenu.Registrar.xml'
--- src/com.canonical.AppMenu.Registrar.xml 1970-01-01 00:00:00 +0000
+++ src/com.canonical.AppMenu.Registrar.xml 2013-01-04 10:04:35 +0000
@@ -0,0 +1,56 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
+ <dox:d><![CDATA[
+ @mainpage
+
+ An interface to register menus that are associated with a window in an application. The
+ main interface is docuemented here: @ref com::canonical::AppMenu::Registrar.
+
+ The actual menus are transported using the dbusmenu protocol which is available
+ here: @ref com::canonical::dbusmenu.
+ ]]></dox:d>
+ <interface name="com.canonical.AppMenu.Registrar" xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
+ <dox:d>
+ An interface to register a menu from an application's window to be displayed in another
+ window. This manages that association between XWindow Window IDs and the dbus
+ address and object that provides the menu using the dbusmenu dbus interface.
+ </dox:d>
+ <method name="RegisterWindow">
+ <dox:d><![CDATA[
+ Associates a dbusmenu with a window
+
+ /note this method assumes that the connection from the caller is the DBus connection
+ to use for the object. Applications that use multiple DBus connections will need to
+ ensure this method is called with the same connection that implmenets the object.
+ ]]></dox:d>
+ <arg name="windowId" type="u" direction="in">
+ <dox:d>The XWindow ID of the window</dox:d>
+ </arg>
+ <arg name="menuObjectPath" type="o" direction="in">
+ <dox:d>The object on the dbus interface implementing the dbusmenu interface</dox:d>
+ </arg>
+ </method>
+ <method name="UnregisterWindow">
+ <dox:d>
+ A method to allow removing a window from the database. Windows will also be removed
+ when the client drops off DBus so this is not required. It is polite though. And
+ important for testing.
+ </dox:d>
+ <arg name="windowId" type="u" direction="in">
+ <dox:d>The XWindow ID of the window</dox:d>
+ </arg>
+ </method>
+ <method name="GetMenuForWindow">
+ <dox:d>Gets the registered menu for a given window ID.</dox:d>
+ <arg name="windowId" type="u" direction="in">
+ <dox:d>The XWindow ID of the window to get</dox:d>
+ </arg>
+ <arg name="service" type="s" direction="out">
+ <dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
+ </arg>
+ <arg name="menuObjectPath" type="o" direction="out">
+ <dox:d>The path to the object which implements the com.canonical.dbusmenu interface.</dox:d>
+ </arg>
+ </method>
+ </interface>
+</node>
=== modified file 'src/appmenuplatformmenubar.cpp'
--- src/appmenuplatformmenubar.cpp 2013-01-11 15:05:38 +0000
+++ src/appmenuplatformmenubar.cpp 2013-01-14 16:01:25 +0000
@@ -410,6 +410,10 @@
registrar = new com::canonical::AppMenu::Registrar(REGISTRAR_SERVICE, REGISTRAR_PATH, QDBusConnection::sessionBus(), 0);
}
+ if (!registrar || !registrar->isValid()) {
+ return false;
+ }
+
Q_FOREACH(QAction *action, m_menuBar->actions()) {
if (!action->isSeparator()) {
m_rootMenu->addAction(action);
@@ -430,9 +434,9 @@
}
m_registeredWinId = winId;
- if (registrar) {
- registrar->RegisterWindow(winId, QDBusObjectPath(m_objectPath));
- }
+
+ registrar->RegisterWindow(winId, QDBusObjectPath(m_objectPath));
+
return true;
}
|