Remeber last used window and disconnect signals accordingly. Before we were trying to disconnect the signals from the old window, which might be ignored by some checks on earlier executions of on_active_window_changed(), so we could get other windows still reporting icons and title. Now we'll remember the last used window and use it when doing work. Fixes launchpad bug #330321. === modified file 'src/task-title.c' --- src/task-title.c 2009-03-04 16:14:38 +0000 +++ src/task-title.c 2009-04-07 14:46:52 +0000 @@ -40,6 +40,7 @@ struct _TaskTitlePrivate { WnckScreen *screen; + WnckWindow *window; GtkWidget *align; GtkWidget *box; GtkWidget *image; @@ -50,6 +51,8 @@ gboolean show_home_title; }; +static void disconnect_window (TaskTitle *title); + static gboolean on_close_clicked (GtkButton *button, GdkEventButton *event, @@ -74,6 +77,8 @@ } else { + if (priv->window == window) + disconnect_window (title); wnck_window_close (window, GDK_CURRENT_TIME); } gtk_widget_queue_draw (GTK_WIDGET (title)); @@ -84,26 +89,38 @@ static void on_name_changed (WnckWindow *window, TaskTitle *title) { - if (WNCK_IS_WINDOW (window) && TASK_IS_TITLE (title)) - { - gtk_label_set_text (GTK_LABEL (title->priv->label), - wnck_window_get_name (window)); - gtk_widget_set_tooltip_text (GTK_WIDGET (title), - wnck_window_get_name (window)); - gtk_widget_queue_draw (GTK_WIDGET (title)); - } + TaskTitlePrivate *priv; + + g_return_if_fail (TASK_IS_TITLE (title)); + g_return_if_fail (WNCK_IS_WINDOW (window)); + + priv = title->priv; + if (priv->window != window) + return; + + gtk_label_set_text (GTK_LABEL (title->priv->label), + wnck_window_get_name (window)); + gtk_widget_set_tooltip_text (GTK_WIDGET (title), + wnck_window_get_name (window)); + gtk_widget_queue_draw (GTK_WIDGET (title)); } static void on_icon_changed (WnckWindow *window, TaskTitle *title) { - if (WNCK_IS_WINDOW (window) && TASK_IS_TITLE (title)) - { - gtk_image_set_from_pixbuf (GTK_IMAGE (title->priv->image), - wnck_window_get_mini_icon (window)); - gtk_widget_queue_draw (GTK_WIDGET (title)); - } + TaskTitlePrivate *priv; + + g_return_if_fail (TASK_IS_TITLE (title)); + g_return_if_fail (WNCK_IS_WINDOW (window)); + + priv = title->priv; + if (priv->window != window) + return; + + gtk_image_set_from_pixbuf (GTK_IMAGE (title->priv->image), + wnck_window_get_mini_icon (window)); + gtk_widget_queue_draw (GTK_WIDGET (title)); } static void @@ -115,9 +132,10 @@ TaskTitlePrivate *priv; g_return_if_fail (TASK_IS_TITLE (title)); + g_return_if_fail (WNCK_IS_WINDOW (window)); + priv = title->priv; - - if (!WNCK_IS_WINDOW (window)) + if (priv->window != window) return; if (wnck_window_is_maximized (window)) @@ -131,6 +149,19 @@ gtk_widget_hide (priv->box); } } + +static void +disconnect_window (TaskTitle *title) +{ + TaskTitlePrivate *priv = title->priv; + if (!priv->window) + return; + g_signal_handlers_disconnect_by_func (priv->window, on_name_changed, title); + g_signal_handlers_disconnect_by_func (priv->window, on_icon_changed, title); + g_signal_handlers_disconnect_by_func (priv->window, on_state_changed, title); + priv->window = NULL; +} + static void on_active_window_changed (WnckScreen *screen, WnckWindow *old_window, @@ -157,15 +188,7 @@ || type == WNCK_WINDOW_MENU) return; - if (old_window) - { - g_signal_handlers_disconnect_by_func (old_window, - on_name_changed, title); - g_signal_handlers_disconnect_by_func (old_window, - on_icon_changed, title); - g_signal_handlers_disconnect_by_func (old_window, - on_state_changed, title); - } + disconnect_window (title); if (!WNCK_IS_WINDOW (act_window) || wnck_window_get_window_type (act_window) == WNCK_WINDOW_DESKTOP) @@ -212,6 +235,7 @@ g_signal_connect_after (act_window, "state-changed", G_CALLBACK (on_state_changed), title); gtk_widget_show (priv->box); + priv->window = act_window; } if (WNCK_IS_WINDOW (act_window) @@ -303,6 +327,7 @@ TaskTitlePrivate *priv; priv = TASK_TITLE_GET_PRIVATE (object); + disconnect_window (TASK_TITLE (object)); G_OBJECT_CLASS (task_title_parent_class)->finalize (object); } @@ -328,7 +353,8 @@ priv = title->priv = TASK_TITLE_GET_PRIVATE (title); priv->screen = wnck_screen_get_default (); - + priv->window = NULL; + client = gconf_client_get_default (); priv->show_home_title = gconf_client_get_bool (client, SHOW_HOME_TITLE_KEY,