Attempt to de-register "screen-changed" events before destroying applets
This commit is contained in:
parent
9550532495
commit
ab95bffc4f
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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++)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user