diff options
author | Brian Tarricone <brian@tarricone.org> | 2005-01-11 10:57:06 +0000 |
---|---|---|
committer | Brian Tarricone <brian@tarricone.org> | 2005-01-11 10:57:06 +0000 |
commit | 4c2a9422c8641820dee925356d6e3c2bb1a21772 (patch) | |
tree | 8e93a4d1bc96444efc1be4723e689e088733e07a /src/windowlist.c | |
parent | 08e911edab5166f8e6ff4187512aef55002b124b (diff) | |
download | xfdesktop-4c2a9422c8641820dee925356d6e3c2bb1a21772.tar.gz |
fix case where open windowlist -> window is destroyed -> select window in
windowlist -> xfdesktop crash (bug 672)
(Old svn revision: 8067)
Diffstat (limited to 'src/windowlist.c')
-rw-r--r-- | src/windowlist.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/windowlist.c b/src/windowlist.c index 5d8814a9..044096bd 100644 --- a/src/windowlist.c +++ b/src/windowlist.c @@ -89,6 +89,23 @@ activate_window(GtkWidget *w, gpointer user_data) netk_window_activate(netk_window); } +static void +window_destroyed_cb(gpointer data, GObject *where_the_object_was) +{ + GtkWidget *mi = data; + GtkWidget *menu = gtk_widget_get_parent(mi); + + if(mi && menu) + gtk_container_remove(GTK_CONTAINER(menu), mi); +} + +static void +mi_destroyed_cb(GtkObject *object, gpointer user_data) +{ + g_object_weak_unref(G_OBJECT(user_data), + (GWeakNotify)window_destroyed_cb, object); +} + static GtkWidget * menu_item_from_netk_window(NetkWindow *netk_window, gint icon_width, gint icon_height) @@ -230,8 +247,12 @@ windowlist_create(GdkScreen *gscreen) } gtk_widget_show(mi); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); + g_object_weak_ref(G_OBJECT(netk_window), + (GWeakNotify)window_destroyed_cb, mi); g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(activate_window), netk_window); + g_signal_connect(G_OBJECT(mi), "destroy", + G_CALLBACK(mi_destroyed_cb), netk_window); } mi = gtk_separator_menu_item_new(); |