summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2007-05-28 11:11:17 +0000
committerVincent Untz <vuntz@src.gnome.org>2007-05-28 11:11:17 +0000
commitaf5fd1dca9753dcdb9e41e31fc7364ac714bad29 (patch)
tree9fe0be6f522d92146e4a3741e40e8a04b6495741
parentab126bdf9c52fd1ee7fb243cde495e625733bc73 (diff)
downloadlibwnck-af5fd1dca9753dcdb9e41e31fc7364ac714bad29.tar.gz
Backport from HEAD.
2007-05-28 Vincent Untz <vuntz@gnome.org> Backport from HEAD. * libwnck/window-action-menu.c: (window_weak_notify): destroy the menu when the window is getting finalized (set_data): kill (get_data): walk up in the parent tree to get the widget which knows about "wnck-action-data" (item_activated_callback): updated (make_radio_menu_item): don't call set_data since it's now useless (make_menu_item): ditto Should fix bug #410133 svn path=/branches/gnome-2-18/; revision=1261
-rw-r--r--ChangeLog14
-rw-r--r--libwnck/window-action-menu.c39
2 files changed, 34 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index db19735..2559820 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2007-05-28 Vincent Untz <vuntz@gnome.org>
+
+ Backport from HEAD.
+
+ * libwnck/window-action-menu.c: (window_weak_notify): destroy the menu
+ when the window is getting finalized
+ (set_data): kill
+ (get_data): walk up in the parent tree to get the widget which knows
+ about "wnck-action-data"
+ (item_activated_callback): updated
+ (make_radio_menu_item): don't call set_data since it's now useless
+ (make_menu_item): ditto
+ Should fix bug #410133
+
2007-04-29 Vincent Untz <vuntz@gnome.org>
* libwnck/window.h:
diff --git a/libwnck/window-action-menu.c b/libwnck/window-action-menu.c
index b6e9343..5a8080e 100644
--- a/libwnck/window-action-menu.c
+++ b/libwnck/window-action-menu.c
@@ -79,6 +79,8 @@ window_weak_notify (gpointer data,
g_object_weak_unref (G_OBJECT (data),
object_weak_notify,
window);
+
+ gtk_widget_destroy (GTK_WIDGET (data));
}
@@ -91,29 +93,32 @@ object_weak_notify (gpointer data,
obj);
}
-static void
-set_data (GObject *obj,
- ActionMenuData *amd)
-{
- g_object_set_data (obj, "wnck-action-data", amd);
- if (amd && amd->window)
- {
- g_object_weak_ref (G_OBJECT (amd->window), window_weak_notify, obj);
- g_object_weak_ref (obj, object_weak_notify, amd->window);
- }
-}
-
static ActionMenuData*
-get_data (GObject *obj)
+get_data (GtkWidget *widget)
{
- return g_object_get_data (obj, "wnck-action-data");
+ ActionMenuData *retval;
+
+ while (widget) {
+ if (GTK_IS_MENU_ITEM (widget))
+ widget = widget->parent;
+
+ retval = g_object_get_data (G_OBJECT (widget), "wnck-action-data");
+ if (retval)
+ return retval;
+
+ widget = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ if (widget == NULL)
+ break;
+ }
+
+ return NULL;
}
static void
item_activated_callback (GtkWidget *menu_item,
gpointer data)
{
- ActionMenuData *amd = get_data (G_OBJECT (menu_item));
+ ActionMenuData *amd = get_data (menu_item);
WindowAction action = GPOINTER_TO_INT (data);
if (amd == NULL)
@@ -403,8 +408,6 @@ make_check_menu_item (ActionMenuData *amd,
mi = gtk_check_menu_item_new_with_mnemonic (mnemonic_text);
- set_data (G_OBJECT (mi), amd);
-
g_signal_connect (G_OBJECT (mi), "activate",
G_CALLBACK (item_activated_callback),
GINT_TO_POINTER (action));
@@ -422,8 +425,6 @@ make_menu_item (ActionMenuData *amd,
mi = gtk_image_menu_item_new_with_label ("");
- set_data (G_OBJECT (mi), amd);
-
g_signal_connect (G_OBJECT (mi), "activate",
G_CALLBACK (item_activated_callback),
GINT_TO_POINTER (action));