34
34
#include "server-marshal.h"
36
36
/* DBus Prototypes */
37
static gboolean _dbusmenu_server_get_property (void);
38
static gboolean _dbusmenu_server_get_properties (void);
39
static gboolean _dbusmenu_server_call (void);
40
static gboolean _dbusmenu_server_list_properties (void);
37
static gboolean _dbusmenu_server_get_property (DbusmenuServer * server, guint id, gchar * property, gchar ** value, GError ** error);
38
static gboolean _dbusmenu_server_get_properties (DbusmenuServer * server, guint id, GHashTable ** dict, GError ** error);
39
static gboolean _dbusmenu_server_call (DbusmenuServer * server, guint id, GError ** error);
42
41
#include "dbusmenu-server.h"
78
85
static void dbusmenu_server_finalize (GObject *object);
79
86
static void set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec);
80
87
static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec);
88
static void menuitem_property_changed (DbusmenuMenuitem * mi, gchar * property, gchar * value, DbusmenuServer * server);
89
static void menuitem_child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server);
90
static void menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server);
91
static void menuitem_signals_create (DbusmenuMenuitem * mi, gpointer data);
92
static void menuitem_signals_remove (DbusmenuMenuitem * mi, gpointer data);
93
static GQuark error_quark (void);
82
95
G_DEFINE_TYPE (DbusmenuServer, dbusmenu_server, G_TYPE_OBJECT);
101
124
_dbusmenu_server_marshal_VOID__UINT_STRING_STRING,
102
125
G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
127
DbusmenuServer::id-update:
128
@arg0: The #DbusmenuServer emitting the signal.
129
@arg1: ID of the #DbusmenuMenuitem changing.
131
The purpose of this signal is to show major change in
132
a menuitem to the point that #DbusmenuServer::id-prop-update
133
seems a little insubstantive.
103
135
signals[ID_UPDATE] = g_signal_new(DBUSMENU_SERVER_SIGNAL_ID_UPDATE,
104
136
G_TYPE_FROM_CLASS(class),
105
137
G_SIGNAL_RUN_LAST,
302
menuitem_property_changed (DbusmenuMenuitem * mi, gchar * property, gchar * value, DbusmenuServer * server)
304
g_signal_emit(G_OBJECT(server), signals[ID_PROP_UPDATE], 0, dbusmenu_menuitem_get_id(mi), property, value, TRUE);
309
menuitem_child_added (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server)
311
menuitem_signals_create(child, server);
312
/* TODO: We probably need to group the layout update signals to make the number more reasonble. */
313
g_signal_emit(G_OBJECT(server), signals[LAYOUT_UPDATE], 0, TRUE);
318
menuitem_child_removed (DbusmenuMenuitem * parent, DbusmenuMenuitem * child, DbusmenuServer * server)
320
menuitem_signals_remove(child, server);
321
/* TODO: We probably need to group the layout update signals to make the number more reasonble. */
322
g_signal_emit(G_OBJECT(server), signals[LAYOUT_UPDATE], 0, TRUE);
326
/* Connects all the signals that we're interested in
327
coming from a menuitem */
329
menuitem_signals_create (DbusmenuMenuitem * mi, gpointer data)
331
g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_ADDED, G_CALLBACK(menuitem_child_added), data);
332
g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_CHILD_REMOVED, G_CALLBACK(menuitem_child_removed), data);
333
g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menuitem_property_changed), data);
337
/* Removes all the signals that we're interested in
338
coming from a menuitem */
340
menuitem_signals_remove (DbusmenuMenuitem * mi, gpointer data)
342
g_signal_handlers_disconnect_by_func(G_OBJECT(mi), G_CALLBACK(menuitem_child_added), data);
343
g_signal_handlers_disconnect_by_func(G_OBJECT(mi), G_CALLBACK(menuitem_child_removed), data);
344
g_signal_handlers_disconnect_by_func(G_OBJECT(mi), G_CALLBACK(menuitem_property_changed), data);
351
static GQuark quark = 0;
353
quark = g_quark_from_static_string (G_LOG_DOMAIN);
253
358
/* DBus interface */
255
_dbusmenu_server_get_property (void)
262
_dbusmenu_server_get_properties (void)
269
_dbusmenu_server_call (void)
276
_dbusmenu_server_list_properties (void)
360
_dbusmenu_server_get_property (DbusmenuServer * server, guint id, gchar * property, gchar ** value, GError ** error)
362
DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
363
DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
370
"The ID supplied %d does not refer to a menu item we have",
376
const gchar * prop = dbusmenu_menuitem_property_get(mi, property);
381
INVALID_PROPERTY_NAME,
382
"The property '%s' does not exist on menuitem with ID of %d",
394
"Uhm, yeah. We didn't get anywhere to put the value, that's really weird. Seems impossible really.");
399
*value = g_strdup(prop);
405
_dbusmenu_server_get_properties (DbusmenuServer * server, guint id, GHashTable ** dict, GError ** error)
407
DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
408
DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
415
"The ID supplied %d does not refer to a menu item we have",
421
*dict = dbusmenu_menuitem_properties_copy(mi);
427
_dbusmenu_server_call (DbusmenuServer * server, guint id, GError ** error)
429
DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
430
DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
437
"The ID supplied %d does not refer to a menu item we have",
443
dbusmenu_menuitem_activate(mi);