aboutsummaryrefslogtreecommitdiff
path: root/libdbusmenu-gtk/menu.c
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-05-24 20:24:34 +0200
committerTed Gould <ted@canonical.com>2009-05-24 20:24:34 +0200
commit6c7818f652ef2f56b48e87da059593e340063047 (patch)
tree48df7fe1cfd0c387cbbdbae03b5ed2451f3fcbb7 /libdbusmenu-gtk/menu.c
parentbd52d2d670eb6881fda44ca1ae4e0c85c44d59fc (diff)
downloadlibdbusmenu-6c7818f652ef2f56b48e87da059593e340063047.tar.gz
libdbusmenu-6c7818f652ef2f56b48e87da059593e340063047.tar.bz2
libdbusmenu-6c7818f652ef2f56b48e87da059593e340063047.zip
Using a weak ref to handle the deletion stuff.
Diffstat (limited to 'libdbusmenu-gtk/menu.c')
-rw-r--r--libdbusmenu-gtk/menu.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/libdbusmenu-gtk/menu.c b/libdbusmenu-gtk/menu.c
index 90cf2e2..9bb23a8 100644
--- a/libdbusmenu-gtk/menu.c
+++ b/libdbusmenu-gtk/menu.c
@@ -156,7 +156,7 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec)
/* Internal Functions */
static const gchar * data_menuitem = "dbusmenugtk-data-gtkmenuitem";
-static const gchar * data_menu = "dbusmenugtk-data-gtkmenu";
+static const gchar * data_menu = "dbusmenugtk-data-gtkmenu";
static gboolean
menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi)
@@ -168,9 +168,19 @@ menu_pressed_cb (GtkMenuItem * gmi, DbusmenuMenuitem * mi)
static void
menu_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, gchar * value, GtkMenuItem * gmi)
{
+ if (g_strcmp0(prop, "label")) {
+ gtk_menu_item_set_label(gmi, value);
+ gtk_widget_show(GTK_WIDGET(gmi));
+ }
+ return;
+}
-
+static void
+destoryed_dbusmenuitem_cb (gpointer udata, GObject * dbusmenuitem)
+{
+ g_object_destory(G_OBJECT(udata));
+ return;
}
static void
@@ -179,9 +189,11 @@ connect_menuitem (DbusmenuMenuitem * mi, GtkMenuItem * gmi)
g_object_ref(gmi);
g_object_set_data_full(G_OBJECT(mi), data_menuitem, gmi, g_object_unref);
- g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi);
+ g_signal_connect(G_OBJECT(mi), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(menu_prop_change_cb), gmi);
g_signal_connect(G_OBJECT(gmi), "activate", G_CALLBACK(menu_pressed_cb), mi);
+ g_object_weak_ref(G_OBJECT(mi), destoryed_dbusmenuitem_cb, gmi);
+
return;
}
@@ -218,11 +230,13 @@ process_dbusmenu_menuitem (DbusmenuMenuitem * mi, GtkMenu * parentmenu)
/* Phase 1: Add missing children */
GList * child = NULL;
for (child = children; child != NULL; child = g_list_next(child)) {
-
+ process_dbusmenu_menuitem(DBUSMENU_MENUITEM(child->data), GTK_MENU(unknown_menu));
}
/* Phase 2: Delete removed children */
-
+ /* Actually, we don't need to do this because of the weak
+ reference that we've added above. When the DbusmenuMenuitem
+ gets destroyed it takes its GtkMenuItem with it. Bye bye. */
/* Phase 3: Profit! */
return;