diff options
author | Ted Gould <ted@canonical.com> | 2009-05-19 00:45:22 +0200 |
---|---|---|
committer | Ted Gould <ted@canonical.com> | 2009-05-19 00:45:22 +0200 |
commit | 7c4cecd7765939a9f12c77a6a5117d55c1d329c0 (patch) | |
tree | 8e9546b5b20bede18c49e6d9514fd9444a40fca6 /libdbusmenu-glib | |
parent | febdeee323173b3019fc78f5ed0453a99249eb19 (diff) | |
download | libdbusmenu-7c4cecd7765939a9f12c77a6a5117d55c1d329c0.tar.gz libdbusmenu-7c4cecd7765939a9f12c77a6a5117d55c1d329c0.tar.bz2 libdbusmenu-7c4cecd7765939a9f12c77a6a5117d55c1d329c0.zip |
Now we're calling the get_properties function on every menuitem that we build. Fun.
Diffstat (limited to 'libdbusmenu-glib')
-rw-r--r-- | libdbusmenu-glib/client.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 9a73d6e..eb54c12 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -81,7 +81,7 @@ static void id_prop_update (DBusGProxy * proxy, guint id, gchar * property, gcha static void id_update (DBusGProxy * proxy, guint id, DbusmenuClient * client); static void build_proxies (DbusmenuClient * client); static guint parse_node_get_id (xmlNodePtr node); -static DbusmenuMenuitem * parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent); +static DbusmenuMenuitem * parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent, DBusGProxy * proxy); static void parse_layout (DbusmenuClient * client, const gchar * layout); static void update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data); static void update_layout (DbusmenuClient * client); @@ -350,10 +350,32 @@ parse_node_get_id (xmlNodePtr node) return 0; } +/* A small helper that calls _property_set on each hash table + entry in the properties hash. */ +static void +get_properties_helper (gpointer key, gpointer value, gpointer data) +{ + dbusmenu_menuitem_property_set((DbusmenuMenuitem *)data, (gchar *)key, (gchar *)value); + return; +} + +/* This is the callback for the properties on a menu item. There + should be all of them in the Hash, and they we use foreach to + copy them into the menuitem. + This isn't the most efficient way. We can optimize this by + somehow removing the foreach. But that is for later. */ +static void +menuitem_get_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data) +{ + g_hash_table_foreach(properties, get_properties_helper, data); + g_hash_table_destroy(properties); + return; +} + /* Parse recursively through the XML and make it into objects as need be */ static DbusmenuMenuitem * -parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent) +parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent, DBusGProxy * proxy) { guint id = parse_node_get_id(node); g_debug("Looking at node with id: %d", id); @@ -372,6 +394,8 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa /* Build a new item */ item = dbusmenu_menuitem_new_with_id(id); + /* Get the properties queued up for this item */ + org_freedesktop_dbusmenu_get_properties_async(proxy, id, menuitem_get_properties_cb, item); } xmlNodePtr children; @@ -393,7 +417,7 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa } } - childmi = parse_layout_xml(children, childmi, item); + childmi = parse_layout_xml(children, childmi, item, proxy); dbusmenu_menuitem_child_add_position(item, childmi, position); } @@ -420,7 +444,7 @@ parse_layout (DbusmenuClient * client, const gchar * layout) xmlNodePtr root = xmlDocGetRootElement(xmldoc); - priv->root = parse_layout_xml(root, priv->root, NULL); + priv->root = parse_layout_xml(root, priv->root, NULL, priv->menuproxy); if (priv->root == NULL) { g_warning("Unable to parse layout on client %s object %s: %s", priv->dbus_name, priv->dbus_object, layout); } |