Attempt to de-register "screen-changed" events before destroying applets

This commit is contained in:
Pierre Pronchery 2014-10-23 19:29:19 +02:00
parent 9550532495
commit ab95bffc4f
6 changed files with 37 additions and 15 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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++)

View File

@ -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);