diff --git a/src/applets/close.c b/src/applets/close.c index 226d768..520f687 100644 --- a/src/applets/close.c +++ b/src/applets/close.c @@ -33,6 +33,7 @@ typedef struct _PanelApplet { PanelAppletHelper * helper; GtkWidget * widget; + gulong source; GdkDisplay * display; GdkScreen * screen; @@ -94,10 +95,10 @@ static Close * _close_init(PanelAppletHelper * helper, GtkWidget ** widget) #endif image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, helper->icon_size); gtk_button_set_image(GTK_BUTTON(close->widget), image); - g_signal_connect_swapped(G_OBJECT(close->widget), "clicked", G_CALLBACK( + g_signal_connect_swapped(close->widget, "clicked", G_CALLBACK( _on_close), close); - g_signal_connect(G_OBJECT(close->widget), "screen-changed", G_CALLBACK( - _on_screen_changed), close); + close->source = g_signal_connect(close->widget, "screen-changed", + G_CALLBACK(_on_screen_changed), close); close->display = NULL; close->screen = NULL; close->root = NULL; @@ -114,6 +115,9 @@ static Close * _close_init(PanelAppletHelper * helper, GtkWidget ** widget) /* close_destroy */ static void _close_destroy(Close * close) { + if(close->source != 0) + g_signal_handler_disconnect(close->widget, close->source); + close->source = 0; gtk_widget_destroy(close->widget); free(close); } diff --git a/src/applets/pager.c b/src/applets/pager.c index 3a93845..7ed2e48 100644 --- a/src/applets/pager.c +++ b/src/applets/pager.c @@ -40,6 +40,7 @@ typedef struct _PanelApplet PanelAppletHelper * helper; GtkWidget * box; + gulong source; GtkWidget ** widgets; size_t widgets_cnt; @@ -118,8 +119,8 @@ static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget) pager->box = (helper->orientation == GTK_ORIENTATION_HORIZONTAL) ? gtk_hbox_new(TRUE, 0) : gtk_vbox_new(TRUE, 0); #endif - g_signal_connect(pager->box, "screen-changed", G_CALLBACK( - _on_screen_changed), pager); + pager->source = g_signal_connect(pager->box, "screen-changed", + G_CALLBACK(_on_screen_changed), pager); pager->widgets = NULL; pager->widgets_cnt = 0; pager->screen = NULL; @@ -133,6 +134,9 @@ static Pager * _pager_init(PanelAppletHelper * helper, GtkWidget ** widget) /* pager_destroy */ static void _pager_destroy(Pager * pager) { + if(pager->source != 0) + g_signal_handler_disconnect(pager->box, pager->source); + pager->source = 0; if(pager->root != NULL) gdk_window_remove_filter(pager->root, _on_filter, pager); gtk_widget_destroy(pager->box); diff --git a/src/applets/phone.c b/src/applets/phone.c index 135f65c..648d580 100644 --- a/src/applets/phone.c +++ b/src/applets/phone.c @@ -31,6 +31,7 @@ typedef struct _PanelApplet { PanelAppletHelper * helper; GtkWidget * widget; + gulong source; } Phone; @@ -83,8 +84,8 @@ static Phone * _phone_init(PanelAppletHelper * helper, GtkWidget ** widget) _on_plug_added), NULL); g_signal_connect(phone->widget, "plug-removed", G_CALLBACK( _on_plug_removed), NULL); - g_signal_connect(phone->widget, "screen-changed", G_CALLBACK( - _on_screen_changed), NULL); + phone->source = g_signal_connect(phone->widget, "screen-changed", + G_CALLBACK(_on_screen_changed), NULL); *widget = phone->widget; return phone; } @@ -93,6 +94,9 @@ static Phone * _phone_init(PanelAppletHelper * helper, GtkWidget ** widget) /* phone_destroy */ static void _phone_destroy(Phone * phone) { + if(phone->source != 0) + g_signal_handler_disconnect(phone->widget, phone->source); + phone->source = 0; desktop_message_unregister(NULL, _on_message, phone->widget); gtk_widget_destroy(phone->widget); free(phone); diff --git a/src/applets/systray.c b/src/applets/systray.c index a052612..67de299 100644 --- a/src/applets/systray.c +++ b/src/applets/systray.c @@ -35,6 +35,7 @@ typedef struct _PanelApplet PanelAppletHelper * helper; GtkWidget * hbox; GtkWidget * owner; + gulong source; } Systray; @@ -93,8 +94,8 @@ static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget) gtk_icon_size_lookup(helper->icon_size, NULL, &height); gtk_widget_set_size_request(systray->hbox, -1, height); systray->owner = NULL; - g_signal_connect(systray->hbox, "screen-changed", G_CALLBACK( - _on_screen_changed), systray); + systray->source = g_signal_connect(systray->hbox, "screen-changed", + G_CALLBACK(_on_screen_changed), systray); gtk_widget_show(systray->hbox); *widget = systray->hbox; return systray; @@ -104,11 +105,12 @@ static Systray * _systray_init(PanelAppletHelper * helper, GtkWidget ** widget) /* systray_destroy */ static void _systray_destroy(Systray * systray) { -#if 0 /* FIXME crashes */ + if(systray->source != 0) + g_signal_handler_disconnect(systray->hbox, systray->source); + systray->source = 0; if(systray->owner != NULL) gtk_widget_destroy(systray->owner); gtk_widget_destroy(systray->hbox); -#endif free(systray); } diff --git a/src/applets/tasks.c b/src/applets/tasks.c index 251a3bc..0f4f080 100644 --- a/src/applets/tasks.c +++ b/src/applets/tasks.c @@ -64,6 +64,7 @@ struct _PanelApplet GtkIconSize icon_size; int icon_width; int icon_height; + gulong source; Atom atom[TASKS_ATOM_COUNT]; GdkDisplay * display; @@ -281,8 +282,8 @@ static Tasks * _tasks_init(PanelAppletHelper * helper, GtkWidget ** widget) #else tasks->hbox = gtk_hbox_new(TRUE, 0); #endif - g_signal_connect(tasks->hbox, "screen-changed", G_CALLBACK( - _on_screen_changed), tasks); + tasks->source = g_signal_connect(tasks->hbox, "screen-changed", + G_CALLBACK(_on_screen_changed), tasks); tasks->icon_size = helper->icon_size; tasks->icon_width = 48; tasks->icon_height = 48; @@ -315,6 +316,9 @@ static void _tasks_destroy(Tasks * tasks) { size_t i; + if(tasks->source != 0) + g_signal_handler_disconnect(tasks->widget, tasks->source); + tasks->source = 0; if(tasks->root != NULL) gdk_window_remove_filter(tasks->root, _on_filter, tasks); for(i = 0; i < tasks->tasks_cnt; i++) diff --git a/src/applets/title.c b/src/applets/title.c index 783320b..0fe5dd2 100644 --- a/src/applets/title.c +++ b/src/applets/title.c @@ -34,6 +34,7 @@ typedef struct _PanelApplet { PanelAppletHelper * helper; GtkWidget * widget; + gulong source; GdkDisplay * display; GdkScreen * screen; @@ -96,8 +97,8 @@ static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget) title->widget = gtk_label_new(""); gtk_widget_modify_font(title->widget, bold); pango_font_description_free(bold); - g_signal_connect(title->widget, "screen-changed", G_CALLBACK( - _on_screen_changed), title); + title->source = g_signal_connect(title->widget, "screen-changed", + G_CALLBACK(_on_screen_changed), title); title->display = NULL; title->screen = NULL; title->root = NULL; @@ -113,6 +114,9 @@ static Title * _title_init(PanelAppletHelper * helper, GtkWidget ** widget) /* title_destroy */ static void _title_destroy(Title * title) { + if(title->source != 0) + g_signal_handler_disconnect(title->widget, title->source); + title->source = 0; if(title->root != NULL) gdk_window_remove_filter(title->root, _on_filter, title); gtk_widget_destroy(title->widget);