diff options
author | Aurelien Gateau <aurelien.gateau@canonical.com> | 2009-12-24 11:31:16 +0100 |
---|---|---|
committer | Aurelien Gateau <aurelien.gateau@canonical.com> | 2009-12-24 11:31:16 +0100 |
commit | 313ad876a25afef5766d9a9c560891e8bc6fa79b (patch) | |
tree | 8813af6f7aa6525a9b5f370d3cdf7062dbca0b43 | |
parent | 082554bfbf246c4fb4609ecae63d3bf01c85dda9 (diff) | |
download | libdbusmenu-313ad876a25afef5766d9a9c560891e8bc6fa79b.tar.gz libdbusmenu-313ad876a25afef5766d9a9c560891e8bc6fa79b.tar.bz2 libdbusmenu-313ad876a25afef5766d9a9c560891e8bc6fa79b.zip |
Implememented GetChildren
-rw-r--r-- | libdbusmenu-glib/dbus-menu.xml | 6 | ||||
-rw-r--r-- | libdbusmenu-glib/server.c | 63 |
2 files changed, 69 insertions, 0 deletions
diff --git a/libdbusmenu-glib/dbus-menu.xml b/libdbusmenu-glib/dbus-menu.xml index e2d872b..d2df400 100644 --- a/libdbusmenu-glib/dbus-menu.xml +++ b/libdbusmenu-glib/dbus-menu.xml @@ -88,6 +88,12 @@ An item is represented as a struct following this format: <arg type="a(ua{sv})" name="properties" direction="out" /> </method> + <method name="GetChildren"> + <arg type="u" name="id" direction="in" /> + <arg type="as" name="propertyNames" direction="in" /> + <arg type="a(ua{sv})" name="properties" direction="out" /> + </method> + <!-- Each menu item has a set of properties. Property keys are in menuitem.h: diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index 0825997..0971162 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -40,6 +40,7 @@ static gboolean _dbusmenu_server_get_property (DbusmenuServer * server, guint id static gboolean _dbusmenu_server_get_properties (DbusmenuServer * server, guint id, GPtrArray * properties, GHashTable ** dict, GError ** error); static gboolean _dbusmenu_server_get_group_properties (DbusmenuServer * server, GArray * ids, GArray * properties, GHashTable ** values, GError ** error); static gboolean _dbusmenu_server_event (DbusmenuServer * server, guint id, gchar * eventid, GValue * data, GError ** error); +static gboolean _dbusmenu_server_get_children (DbusmenuServer * server, guint id, GPtrArray * properties, GPtrArray ** output, GError ** error); #include "dbusmenu-server.h" @@ -473,6 +474,68 @@ _dbusmenu_server_get_group_properties (DbusmenuServer * server, GArray * ids, GA return FALSE; } +static void +_gvalue_array_append_uint(GValueArray *array, guint i) +{ + GValue value = {0}; + + g_value_init(&value, G_TYPE_UINT); + g_value_set_uint(&value, i); + g_value_array_append(array, &value); + g_value_unset(&value); +} + +static void +_gvalue_array_append_hashtable(GValueArray *array, GHashTable * dict) +{ + GValue value = {0}; + + g_value_init(&value, dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)); + g_value_set_boxed(&value, dict); + g_value_array_append(array, &value); + g_value_unset(&value); +} + +static void +serialize_menuitem(gpointer data, gpointer user_data) +{ + DbusmenuMenuitem * mi = DBUSMENU_MENUITEM(data); + GPtrArray * output = (GPtrArray *)(user_data); + + guint id = dbusmenu_menuitem_get_id(mi); + GHashTable * dict = dbusmenu_menuitem_properties_copy(mi); + + GValueArray * item = g_value_array_new(1); + _gvalue_array_append_uint(item, id); + _gvalue_array_append_hashtable(item, dict); + + g_ptr_array_add(output, item); +} + +static gboolean +_dbusmenu_server_get_children (DbusmenuServer * server, guint id, GPtrArray * properties, GPtrArray ** output, GError ** error) +{ + DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server); + DbusmenuMenuitem * mi = id == 0 ? priv->root : dbusmenu_menuitem_find_id(priv->root, id); + + if (mi == NULL) { + if (error != NULL) { + g_set_error(error, + error_quark(), + INVALID_MENUITEM_ID, + "The ID supplied %d does not refer to a menu item we have", + id); + } + return FALSE; + } + + *output = g_ptr_array_new(); + GList * children = dbusmenu_menuitem_get_children(mi); + g_list_foreach(children, serialize_menuitem, *output); + + return TRUE; +} + static gboolean _dbusmenu_server_event (DbusmenuServer * server, guint id, gchar * eventid, GValue * data, GError ** error) { |