aboutsummaryrefslogtreecommitdiff
path: root/libdbusmenu-glib/client.c
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-06-26 14:33:56 -0500
committerTed Gould <ted@canonical.com>2009-06-26 14:33:56 -0500
commit945da10131e3a94bd5b3bedd59602ede7748add4 (patch)
tree44283590861972b54c3d11f8d53e2636b0f3c0f5 /libdbusmenu-glib/client.c
parent9a4f790af45a46e41823bcdb91fde1e87d32af76 (diff)
parent7675f60a41c7a7fe7a4aa9ed853f005798054111 (diff)
downloadlibdbusmenu-945da10131e3a94bd5b3bedd59602ede7748add4.tar.gz
libdbusmenu-945da10131e3a94bd5b3bedd59602ede7748add4.tar.bz2
libdbusmenu-945da10131e3a94bd5b3bedd59602ede7748add4.zip
Merging in the glibresignaling branch to change how
signals move themselves up the stack.
Diffstat (limited to 'libdbusmenu-glib/client.c')
-rw-r--r--libdbusmenu-glib/client.c66
1 files changed, 56 insertions, 10 deletions
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c
index d5e4334..7319a7f 100644
--- a/libdbusmenu-glib/client.c
+++ b/libdbusmenu-glib/client.c
@@ -47,6 +47,8 @@ enum {
/* Signals */
enum {
LAYOUT_UPDATED,
+ ROOT_CHANGED,
+ NEW_MENUITEM,
LAST_SIGNAL
};
@@ -84,7 +86,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, DBusGProxy * proxy);
+static DbusmenuMenuitem * parse_layout_xml(DbusmenuClient * client, 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);
@@ -120,6 +122,39 @@ dbusmenu_client_class_init (DbusmenuClientClass *klass)
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0, G_TYPE_NONE);
+ /**
+ DbusmenuClient::root-changed:
+ @arg0: The #DbusmenuClient object
+ @arg1: The new root #DbusmenuMenuitem
+
+ The layout has changed in a way that can not be
+ represented by the individual items changing as the
+ root of this client has changed.
+ */
+ signals[ROOT_CHANGED] = g_signal_new(DBUSMENU_CLIENT_SIGNAL_ROOT_CHANGED,
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (DbusmenuClientClass, root_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
+ /**
+ DbusmenuClient::new-menuitem:
+ @arg0: The #DbusmenuClient object
+ @arg1: The new #DbusmenuMenuitem created
+
+ Signaled when the client creates a new menuitem. This
+ doesn't mean that it's placed anywhere. The parent that
+ it's applied to will signal #DbusmenuMenuitem::child-added
+ when it gets parented.
+ */
+ signals[NEW_MENUITEM] = g_signal_new(DBUSMENU_CLIENT_SIGNAL_NEW_MENUITEM,
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (DbusmenuClientClass, new_menuitem),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
g_object_class_install_property (object_class, PROP_DBUSOBJECT,
g_param_spec_string(DBUSMENU_CLIENT_PROP_DBUS_OBJECT, "DBus Object we represent",
@@ -352,6 +387,7 @@ proxy_destroyed (GObject * gobj_proxy, gpointer userdata)
if (priv->root != NULL) {
g_object_unref(G_OBJECT(priv->root));
priv->root = NULL;
+ g_signal_emit(G_OBJECT(userdata), signals[ROOT_CHANGED], 0, NULL, TRUE);
g_signal_emit(G_OBJECT(userdata), signals[LAYOUT_UPDATED], 0, TRUE);
}
@@ -388,7 +424,7 @@ build_proxies (DbusmenuClient * client)
DBUS_INTERFACE_PROPERTIES,
&error);
if (error != NULL) {
- g_error("Unable to get property proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message);
+ g_warning("Unable to get property proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message);
g_error_free(error);
return;
}
@@ -401,7 +437,7 @@ build_proxies (DbusmenuClient * client)
"org.freedesktop.dbusmenu",
&error);
if (error != NULL) {
- g_error("Unable to get dbusmenu proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message);
+ g_warning("Unable to get dbusmenu proxy for %s on %s: %s", priv->dbus_name, priv->dbus_object, error->message);
g_error_free(error);
return;
}
@@ -424,6 +460,8 @@ build_proxies (DbusmenuClient * client)
dbus_g_proxy_add_signal(priv->menuproxy, "IdUpdate", G_TYPE_UINT, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(priv->menuproxy, "IdUpdate", G_CALLBACK(id_update), client, NULL);
+ update_layout(client);
+
return;
}
@@ -480,7 +518,7 @@ menuitem_get_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError
/* Parse recursively through the XML and make it into
objects as need be */
static DbusmenuMenuitem *
-parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent, DBusGProxy * proxy)
+parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * parent, DBusGProxy * proxy)
{
guint id = parse_node_get_id(node);
/* g_debug("Looking at node with id: %d", id); */
@@ -500,6 +538,10 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa
/* Build a new item */
item = dbusmenu_menuitem_new_with_id(id);
+ if (parent == NULL) {
+ dbusmenu_menuitem_set_root(item, TRUE);
+ }
+ g_signal_emit(G_OBJECT(client), signals[NEW_MENUITEM], 0, item, TRUE);
/* Get the properties queued up for this item */
org_freedesktop_dbusmenu_get_properties_async(proxy, id, menuitem_get_properties_cb, item);
}
@@ -524,7 +566,7 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa
}
}
- childmi = parse_layout_xml(children, childmi, item, proxy);
+ childmi = parse_layout_xml(client, children, childmi, item, proxy);
dbusmenu_menuitem_child_add_position(item, childmi, position);
}
@@ -553,12 +595,18 @@ parse_layout (DbusmenuClient * client, const gchar * layout)
xmlNodePtr root = xmlDocGetRootElement(xmldoc);
- priv->root = parse_layout_xml(root, priv->root, NULL, priv->menuproxy);
+ DbusmenuMenuitem * oldroot = priv->root;
+ priv->root = parse_layout_xml(client, root, priv->root, NULL, priv->menuproxy);
+ xmlFreeDoc(xmldoc);
+
if (priv->root == NULL) {
g_warning("Unable to parse layout on client %s object %s: %s", priv->dbus_name, priv->dbus_object, layout);
}
- xmlFreeDoc(xmldoc);
+ if (priv->root != oldroot) {
+ g_signal_emit(G_OBJECT(client), signals[ROOT_CHANGED], 0, priv->root, TRUE);
+ }
+
return;
}
@@ -572,9 +620,9 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data)
GError * error = NULL;
GValue value = {0};
+ priv->layoutcall = NULL;
if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) {
g_warning("Getting layout failed on client %s object %s: %s", priv->dbus_name, priv->dbus_object, error->message);
- priv->layoutcall = NULL;
g_error_free(error);
return;
}
@@ -583,7 +631,6 @@ update_layout_cb (DBusGProxy * proxy, DBusGProxyCall * call, void * data)
/* g_debug("Got layout string: %s", xml); */
parse_layout(client, xml);
- priv->layoutcall = NULL;
/* g_debug("Root is now: 0x%X", (unsigned int)priv->root); */
g_signal_emit(G_OBJECT(client), signals[LAYOUT_UPDATED], 0, TRUE);
@@ -638,7 +685,6 @@ dbusmenu_client_new (const gchar * name, const gchar * object)
DBUSMENU_CLIENT_PROP_DBUS_NAME, name,
DBUSMENU_CLIENT_PROP_DBUS_OBJECT, object,
NULL);
- update_layout(self);
return self;
}