From 236ddb030b31aa78842c81fef0cd107a6b615124 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 20 Aug 2009 12:54:53 -0500 Subject: Switching the new signal to be after the properties are gotten and adding a hashtable for type handlers. --- libdbusmenu-glib/client.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-glib/client.h') diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index 35f7122..20156d8 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -90,9 +90,15 @@ struct _DbusmenuClient { GObject parent; }; -GType dbusmenu_client_get_type (void); -DbusmenuClient * dbusmenu_client_new (const gchar * name, const gchar * object); -DbusmenuMenuitem * dbusmenu_client_get_root (DbusmenuClient * client); +typedef void (*DbusmenuClientTypeHandler) (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); + +GType dbusmenu_client_get_type (void); +DbusmenuClient * dbusmenu_client_new (const gchar * name, + const gchar * object); +DbusmenuMenuitem * dbusmenu_client_get_root (DbusmenuClient * client); +gboolean dbusmenu_client_add_type_handler (DbusmenuClient * client, + const gchar * type, + DbusmenuClientTypeHandler newfunc); /** SECTION:client -- cgit v1.2.3 From 69fe6b5ac33dfd64163d5b41f9a0719b23912e40 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Thu, 20 Aug 2009 13:05:24 -0500 Subject: Makin' it so that if we have a type handler we use that, otherwise we pass things up. Also making it so that type handlers can report an error. --- libdbusmenu-glib/client.c | 22 ++++++++++++++++++++-- libdbusmenu-glib/client.h | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'libdbusmenu-glib/client.h') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 9eb8b55..a4e4f72 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -530,10 +530,27 @@ static void menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data) { gpointer * unpackarray = (gpointer *)data; + DbusmenuClientPrivate * priv = DBUSMENU_CLIENT_GET_PRIVATE(unpackarray[0]); menuitem_get_properties_cb (proxy, properties, error, unpackarray[1]); - g_signal_emit(G_OBJECT(unpackarray[0]), signals[NEW_MENUITEM], 0, unpackarray[1], TRUE); + gboolean handled = FALSE; + + const gchar * type; + DbusmenuClientTypeHandler newfunc = NULL; + + type = dbusmenu_menuitem_property_get(DBUSMENU_MENUITEM(unpackarray[1]), "type"); + if (type != NULL) { + newfunc = g_hash_table_lookup(priv->type_handlers, type); + } + + if (newfunc != NULL) { + handled = newfunc(DBUSMENU_MENUITEM(unpackarray[1]), DBUSMENU_MENUITEM(unpackarray[2])); + } + + if (!handled) { + g_signal_emit(G_OBJECT(unpackarray[0]), signals[NEW_MENUITEM], 0, unpackarray[1], TRUE); + } g_free(unpackarray); @@ -590,9 +607,10 @@ parse_layout_xml(DbusmenuClient * client, xmlNodePtr node, DbusmenuMenuitem * it /* Get the properties queued up for this item */ /* Not happy about this, but I need both of these :( */ - gpointer * packarray = g_new0(gpointer, 2); + gpointer * packarray = g_new0(gpointer, 3); packarray[0] = client; packarray[1] = item; + packarray[2] = parent; org_freedesktop_dbusmenu_get_properties_async(proxy, id, menuitem_get_properties_new_cb, packarray); } diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index 20156d8..9298d4e 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -90,7 +90,7 @@ struct _DbusmenuClient { GObject parent; }; -typedef void (*DbusmenuClientTypeHandler) (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); +typedef gboolean (*DbusmenuClientTypeHandler) (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); GType dbusmenu_client_get_type (void); DbusmenuClient * dbusmenu_client_new (const gchar * name, -- cgit v1.2.3 From c25508f253327fa64fc3dd165480b021273834f4 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 25 Aug 2009 12:09:22 -0500 Subject: Okay, building in some type handlers now. --- libdbusmenu-glib/client.h | 4 ++++ libdbusmenu-gtk/client.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'libdbusmenu-glib/client.h') diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index 9298d4e..c30f318 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -50,6 +50,10 @@ G_BEGIN_DECLS #define DBUSMENU_CLIENT_PROP_DBUS_NAME "dbus-name" #define DBUSMENU_CLIENT_PROP_DBUS_OBJECT "dbus-object" +#define DBUSMENU_CLIENT_TYPES_DEFAULT "menuitem" +#define DBUSMENU_CLIENT_TYPES_SEPERATOR "seperator" +#define DBUSMENU_CLIENT_TYPES_IMAGE "imageitem" + /** DbusmenuClientClass: @parent_class: #GObjectClass diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index a236123..b2d19b4 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -44,6 +44,10 @@ static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint po static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient * gtkclient); static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, DbusmenuGtkClient * gtkclient); +static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); +static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); +static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); + /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -62,6 +66,11 @@ static void dbusmenu_gtkclient_init (DbusmenuGtkClient *self) { g_signal_connect(G_OBJECT(self), DBUSMENU_CLIENT_SIGNAL_NEW_MENUITEM, G_CALLBACK(new_menuitem), NULL); + + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(self), DBUSMENU_CLIENT_TYPES_DEFAULT, new_item_normal); + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(self), DBUSMENU_CLIENT_TYPES_SEPERATOR, new_item_seperator); + dbusmenu_client_add_type_handler(DBUSMENU_CLIENT(self), DBUSMENU_CLIENT_TYPES_IMAGE, new_item_image); + return; } @@ -258,3 +267,24 @@ dbusmenu_gtkclient_menuitem_get (DbusmenuGtkClient * client, DbusmenuMenuitem * return mi; } +static gboolean +new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) +{ + + + return TRUE; +} + +static gboolean +new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) +{ + + return TRUE; +} + +static gboolean +new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) +{ + + return TRUE; +} -- cgit v1.2.3 From 0d23ee0ce837c23750bdeef3e01c4f117d1250fc Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 25 Aug 2009 14:13:34 -0500 Subject: Switching the prototype for type handlers so that it passes the client as well. --- libdbusmenu-glib/client.c | 2 +- libdbusmenu-glib/client.h | 2 +- libdbusmenu-gtk/client.c | 15 +++++++-------- 3 files changed, 9 insertions(+), 10 deletions(-) (limited to 'libdbusmenu-glib/client.h') diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c index 4f5922d..9ac880b 100644 --- a/libdbusmenu-glib/client.c +++ b/libdbusmenu-glib/client.c @@ -553,7 +553,7 @@ menuitem_get_properties_new_cb (DBusGProxy * proxy, GHashTable * properties, GEr } if (newfunc != NULL) { - handled = newfunc(propdata->item, propdata->parent); + handled = newfunc(propdata->item, propdata->parent, propdata->client); } g_signal_emit(G_OBJECT(propdata->item), DBUSMENU_MENUITEM_SIGNAL_REALIZED_ID, 0, TRUE); diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index c30f318..b4d214f 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -94,7 +94,7 @@ struct _DbusmenuClient { GObject parent; }; -typedef gboolean (*DbusmenuClientTypeHandler) (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); +typedef gboolean (*DbusmenuClientTypeHandler) (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); GType dbusmenu_client_get_type (void); DbusmenuClient * dbusmenu_client_new (const gchar * name, diff --git a/libdbusmenu-gtk/client.c b/libdbusmenu-gtk/client.c index 0f24c39..bc4a72a 100644 --- a/libdbusmenu-gtk/client.c +++ b/libdbusmenu-gtk/client.c @@ -44,9 +44,9 @@ static void new_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint po static void delete_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, DbusmenuGtkClient * gtkclient); static void move_child (DbusmenuMenuitem * mi, DbusmenuMenuitem * child, guint new, guint old, DbusmenuGtkClient * gtkclient); -static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); -static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); -static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent); +static gboolean new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); +static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); +static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT); @@ -266,7 +266,7 @@ dbusmenu_gtkclient_menuitem_get (DbusmenuGtkClient * client, DbusmenuMenuitem * } static gboolean -new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) +new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { gpointer ann_mi = g_object_get_data(G_OBJECT(newitem), data_menuitem); GtkMenuItem * gmi = GTK_MENU_ITEM(ann_mi); @@ -279,21 +279,20 @@ new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) gmi = GTK_MENU_ITEM(gtk_menu_item_new()); - // Need client - base_new_menuitem(newitem, gmi, NULL); + base_new_menuitem(newitem, gmi, DBUSMENU_GTKCLIENT(client)); return TRUE; } static gboolean -new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) +new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { return TRUE; } static gboolean -new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent) +new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client) { return TRUE; -- cgit v1.2.3 From 780e2c229e24e20c026219ce6e87533092a172b2 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 25 Aug 2009 14:46:54 -0500 Subject: Forgot some signal documentation. --- libdbusmenu-glib/client.h | 1 + 1 file changed, 1 insertion(+) (limited to 'libdbusmenu-glib/client.h') diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index b4d214f..563a2e8 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -58,6 +58,7 @@ G_BEGIN_DECLS DbusmenuClientClass: @parent_class: #GObjectClass @layout_updated: Slot for #DbusmenuClient::layout-updated. + @new_menuitem: Slot for #DbusmenuClient::new-menuitem. @reserved1: Reserved for future use. @reserved2: Reserved for future use. @reserved3: Reserved for future use. -- cgit v1.2.3 From 6e80defeeb473bb6df07644a755dcbae72dbf6e1 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Wed, 26 Aug 2009 15:15:13 -0500 Subject: Spelling fix. --- libdbusmenu-glib/client.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libdbusmenu-glib/client.h') diff --git a/libdbusmenu-glib/client.h b/libdbusmenu-glib/client.h index 563a2e8..fff9a6b 100644 --- a/libdbusmenu-glib/client.h +++ b/libdbusmenu-glib/client.h @@ -51,7 +51,7 @@ G_BEGIN_DECLS #define DBUSMENU_CLIENT_PROP_DBUS_OBJECT "dbus-object" #define DBUSMENU_CLIENT_TYPES_DEFAULT "menuitem" -#define DBUSMENU_CLIENT_TYPES_SEPERATOR "seperator" +#define DBUSMENU_CLIENT_TYPES_SEPARATOR "separator" #define DBUSMENU_CLIENT_TYPES_IMAGE "imageitem" /** -- cgit v1.2.3