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
|
#include "menu-dbus.h"
GtkWidget *
_dbus_menu_make_menuitem_val (DBusGProxy * proxy, guint id)
{
GError * error = NULL;
gboolean proxyret;
gchar * label;
gchar * tooltip;
gchar * icon;
gchar * indicator;
guint submenu;
/* TODO: switch to begin_call */
proxyret = dbus_g_proxy_call (proxy, "GetItem", &error,
G_TYPE_UINT, id,
G_TYPE_INVALID,
G_TYPE_STRING, &label,
G_TYPE_STRING, &tooltip,
G_TYPE_STRING, &icon,
G_TYPE_STRING, &indicator,
G_TYPE_UINT, &submenu,
G_TYPE_INVALID);
if (!proxyret) {
/* TODO: clear error */
return NULL;
}
}
GtkWidget *
_dbus_menu_make_menuitem_recurse (DBusGProxy * proxy, guint id)
{
GError * error = NULL;
GArray * items = NULL;
gboolean proxyret;
/* TODO: switch to begin_call */
proxyret = dbus_g_proxy_call (proxy, "GetSubmenuItems", &error,
G_TYPE_UINT, id,
G_TYPE_INVALID,
DBUS_TYPE_G_UINT_ARRAY, &items,
G_TYPE_INVALID);
if (!proxyret) {
/* TODO: clear error */
return NULL;
}
GtkWidget * menu = gtk_menu_new();
gint i;
for (i = 0; i < items->len; i++) {
guint id = g_array_index(items, guint, i);
GtkWidget * item = _dbus_menu_make_menuitem_val(proxy, id);
if (item != NULL) {
gtk_menu_append(menu, item);
gtk_widget_show(item);
}
}
return menu;
}
GtkWidget *
dbus_menu_make_menuitem (DBusGConnection * bus, const char * name, const char * object, guint menu_id)
{
DBusGProxy * iface = dbus_g_proxy_new_for_name_owner (bus, name, object, "com.canonical.menu", NULL);
if (iface == NULL) {
return NULL;
}
return _dbus_menu_make_menuitem_recurse(iface, menu_id);
}
|