libwnck r1614 - in trunk: . libwnck
- From: vuntz svn gnome org
- To: svn-commits-list gnome org
- Subject: libwnck r1614 - in trunk: . libwnck
- Date: Wed, 19 Mar 2008 14:00:08 +0000 (GMT)
Author: vuntz
Date: Wed Mar 19 14:00:08 2008
New Revision: 1614
URL: http://svn.gnome.org/viewvc/libwnck?rev=1614&view=rev
Log:
2008-03-19 Vincent Untz <vuntz gnome org>
Fix crash on logout because of some race condition.
Fix bug #517750
* libwnck/pager.c: (wnck_pager_connect_window): use g_signal_connect()
instead of g_signal_connect_object() since we'll disconnect the
handlers
(wnck_pager_disconnect_screen): disconnect signal handlers for all
windows
(wnck_pager_disconnect_window): helper function
Modified:
trunk/ChangeLog
trunk/libwnck/pager.c
Modified: trunk/libwnck/pager.c
==============================================================================
--- trunk/libwnck/pager.c (original)
+++ trunk/libwnck/pager.c Wed Mar 19 14:00:08 2008
@@ -174,6 +174,8 @@
static void wnck_pager_connect_window (WnckPager *pager,
WnckWindow *window);
static void wnck_pager_disconnect_screen (WnckPager *pager);
+static void wnck_pager_disconnect_window (WnckPager *pager,
+ WnckWindow *window);
static gboolean wnck_pager_set_layout_hint (WnckPager *pager);
@@ -2415,27 +2417,28 @@
wnck_pager_connect_window (WnckPager *pager,
WnckWindow *window)
{
- g_signal_connect_object (G_OBJECT (window), "name_changed",
- G_CALLBACK (window_name_changed_callback),
- pager, 0);
- g_signal_connect_object (G_OBJECT (window), "state_changed",
- G_CALLBACK (window_state_changed_callback),
- pager, 0);
- g_signal_connect_object (G_OBJECT (window), "workspace_changed",
- G_CALLBACK (window_workspace_changed_callback),
- pager, 0);
- g_signal_connect_object (G_OBJECT (window), "icon_changed",
- G_CALLBACK (window_icon_changed_callback),
- pager, 0);
- g_signal_connect_object (G_OBJECT (window), "geometry_changed",
- G_CALLBACK (window_geometry_changed_callback),
- pager, 0);
+ g_signal_connect (G_OBJECT (window), "name_changed",
+ G_CALLBACK (window_name_changed_callback),
+ pager);
+ g_signal_connect (G_OBJECT (window), "state_changed",
+ G_CALLBACK (window_state_changed_callback),
+ pager);
+ g_signal_connect (G_OBJECT (window), "workspace_changed",
+ G_CALLBACK (window_workspace_changed_callback),
+ pager);
+ g_signal_connect (G_OBJECT (window), "icon_changed",
+ G_CALLBACK (window_icon_changed_callback),
+ pager);
+ g_signal_connect (G_OBJECT (window), "geometry_changed",
+ G_CALLBACK (window_geometry_changed_callback),
+ pager);
}
static void
wnck_pager_disconnect_screen (WnckPager *pager)
{
int i;
+ GList *tmp;
if (pager->priv->screen == NULL)
return;
@@ -2458,6 +2461,32 @@
space = wnck_screen_get_workspace (pager->priv->screen, i);
g_signal_handlers_disconnect_by_func (space, G_CALLBACK (workspace_name_changed_callback), pager);
}
+
+ for (tmp = wnck_screen_get_windows (pager->priv->screen); tmp; tmp = tmp->next)
+ {
+ wnck_pager_disconnect_window (pager, WNCK_WINDOW (tmp->data));
+ }
+}
+
+static void
+wnck_pager_disconnect_window (WnckPager *pager,
+ WnckWindow *window)
+{
+ g_signal_handlers_disconnect_by_func (G_OBJECT (window),
+ G_CALLBACK (window_name_changed_callback),
+ pager);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (window),
+ G_CALLBACK (window_state_changed_callback),
+ pager);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (window),
+ G_CALLBACK (window_workspace_changed_callback),
+ pager);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (window),
+ G_CALLBACK (window_icon_changed_callback),
+ pager);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (window),
+ G_CALLBACK (window_geometry_changed_callback),
+ pager);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]