From 81889dcd5f8e79f159e376634df9ed3c07fe6b91 Mon Sep 17 00:00:00 2001 From: Alistair Buxton Date: Wed, 25 Feb 2015 19:18:04 +0000 Subject: [PATCH] Fix task list race condition when monitors change. The approach here is not to listen for monitor changes in two places. Instead let the panel handle the monitor change and have the tasklist listen for the resulting configure-event (ie the move/resize that happens after the monitor change.) Signed-off-by: Alistair Buxton --- plugins/tasklist/tasklist-widget.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c index 2d42488..f48589f 100644 --- a/plugins/tasklist/tasklist-widget.c +++ b/plugins/tasklist/tasklist-widget.c @@ -284,6 +284,9 @@ static void xfce_tasklist_connect_screen (XfceTa static void xfce_tasklist_disconnect_screen (XfceTasklist *tasklist); static void xfce_tasklist_gdk_screen_changed (GdkScreen *gdk_screen, XfceTasklist *tasklist); +static gboolean xfce_tasklist_configure_event (GtkWidget *widget, + GdkEvent *event, + XfceTasklist *tasklist); static void xfce_tasklist_active_window_changed (WnckScreen *screen, WnckWindow *previous_window, XfceTasklist *tasklist); @@ -1458,11 +1461,10 @@ xfce_tasklist_connect_screen (XfceTasklist *tasklist) for (li = windows; li != NULL; li = li->next) xfce_tasklist_window_added (tasklist->screen, li->data, tasklist); - /* monitor gdk changes */ - g_signal_connect (G_OBJECT (tasklist->gdk_screen), "monitors-changed", - G_CALLBACK (xfce_tasklist_gdk_screen_changed), tasklist); - g_signal_connect (G_OBJECT (tasklist->gdk_screen), "size-changed", - G_CALLBACK (xfce_tasklist_gdk_screen_changed), tasklist); + /* monitor window movement */ + g_signal_connect (G_OBJECT (gtk_widget_get_toplevel (GTK_WIDGET (tasklist))), + "configure-event", + G_CALLBACK (xfce_tasklist_configure_event), tasklist); /* monitor screen changes */ g_signal_connect (G_OBJECT (tasklist->screen), "active-window-changed", @@ -1552,6 +1554,23 @@ xfce_tasklist_gdk_screen_changed (GdkScreen *gdk_screen, +static gboolean +xfce_tasklist_configure_event (GtkWidget *widget, + GdkEvent *event, + XfceTasklist *tasklist) +{ + panel_return_if_fail (XFCE_IS_TASKLIST (tasklist)); + + if (!tasklist->all_monitors) + { + /* update the monitor geometry */ + xfce_tasklist_update_monitor_geometry (tasklist); + } + return FALSE; +} + + + static void xfce_tasklist_active_window_changed (WnckScreen *screen, WnckWindow *previous_window, -- 1.9.1