diff options
author | Ted Gould <ted@canonical.com> | 2009-08-27 09:42:59 -0500 |
---|---|---|
committer | Ted Gould <ted@canonical.com> | 2009-08-27 09:42:59 -0500 |
commit | 01b023c84f8762d501716d15b3aceec047466627 (patch) | |
tree | eb3c3c8d427f1d8d804046290c58d7f79d410566 /libdbusmenu-gtk/menu.c | |
parent | f5c8526e3bb73345242ea37c337562182351020b (diff) | |
parent | 9e5b9b3ce66ff01c8395ea28bc227bb34cb50f8e (diff) | |
download | libdbusmenu-01b023c84f8762d501716d15b3aceec047466627.tar.gz libdbusmenu-01b023c84f8762d501716d15b3aceec047466627.tar.bz2 libdbusmenu-01b023c84f8762d501716d15b3aceec047466627.zip |
Merging in the branch to add a simple type system to dbusmenu and use it to make a better GTK library, including showing and hiding items.
Diffstat (limited to 'libdbusmenu-gtk/menu.c')
-rw-r--r-- | libdbusmenu-gtk/menu.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c index bc7458c..74e1bec 100644 --- a/libdbusmenu-gtk/menu.c +++ b/libdbusmenu-gtk/menu.c @@ -64,6 +64,7 @@ static void set_property (GObject * obj, guint id, const GValue * value, GParamS static void get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec); /* Internal */ static void build_client (DbusmenuGtkMenu * self); +static void child_realized (DbusmenuMenuitem * child, gpointer userdata); /* GObject Stuff */ G_DEFINE_TYPE (DbusmenuGtkMenu, dbusmenu_gtkmenu, GTK_TYPE_MENU); @@ -188,9 +189,7 @@ static void root_child_added (DbusmenuMenuitem * root, DbusmenuMenuitem * child, guint position, DbusmenuGtkMenu * menu) { g_debug("Root new child"); - DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); - gtk_menu_shell_insert(GTK_MENU_SHELL(menu), GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(priv->client, child)), position); - gtk_widget_show(GTK_WIDGET(menu)); + g_signal_connect(G_OBJECT(child), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(child_realized), menu); return; } @@ -214,6 +213,18 @@ root_child_delete (DbusmenuMenuitem * root, DbusmenuMenuitem * child, DbusmenuGt } static void +child_realized (DbusmenuMenuitem * child, gpointer userdata) +{ + g_return_if_fail(DBUSMENU_IS_GTKMENU(userdata)); + + DbusmenuGtkMenu * menu = DBUSMENU_GTKMENU(userdata); + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); + + gtk_menu_append(menu, GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(priv->client, child))); + return; +} + +static void root_changed (DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, DbusmenuGtkMenu * menu) { if (newroot == NULL) { gtk_widget_hide(GTK_WIDGET(menu)); @@ -227,7 +238,8 @@ root_changed (DbusmenuGtkClient * client, DbusmenuMenuitem * newroot, DbusmenuGt GList * child = NULL; guint count = 0; for (child = dbusmenu_menuitem_get_children(newroot); child != NULL; child = g_list_next(child)) { - gtk_menu_append(menu, GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(client, child->data))); + /* gtk_menu_append(menu, GTK_WIDGET(dbusmenu_gtkclient_menuitem_get(client, child->data))); */ + g_signal_connect(G_OBJECT(child->data), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(child_realized), menu); count++; } @@ -279,3 +291,19 @@ dbusmenu_gtkmenu_new (gchar * dbus_name, gchar * dbus_object) NULL); } +/** + dbusmenu_gtkmenu_get_client: + @menu: The #DbusmenuGtkMenu to get the client from + + An accessor for the client that this menu is using to + communicate with the server. + + Return value: A valid #DbusmenuGtkClient or NULL on error. +*/ +DbusmenuGtkClient * +dbusmenu_gtkmenu_get_client (DbusmenuGtkMenu * menu) +{ + g_return_val_if_fail(DBUSMENU_IS_GTKMENU(menu), NULL); + DbusmenuGtkMenuPrivate * priv = DBUSMENU_GTKMENU_GET_PRIVATE(menu); + return priv->client; +} |