From 8e864c3aae12b3985319ebc33b3e8ab72fe92f60 Mon Sep 17 00:00:00 2001 From: Alistair Buxton Date: Fri, 2 May 2014 21:43:19 +0100 Subject: [PATCH] Refactor the multimonitor tasklist code again. This time, just directly use the Gdk functions for finding monitors. Nothing is stored except the number of monitors, so this literally can't ever go wrong unless Gdk supplies wrong information. --- plugins/tasklist/tasklist-widget.c | 46 +++++++++----------------------------- 1 file changed, 11 insertions(+), 35 deletions(-) diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c index 1a1755b..a0f4f28 100644 --- a/plugins/tasklist/tasklist-widget.c +++ b/plugins/tasklist/tasklist-widget.c @@ -163,8 +163,6 @@ struct _XfceTasklist * the monitor the tasklist is on */ guint all_monitors : 1; guint n_monitors; - guint my_monitor; - GdkRectangle *all_monitors_geometry; /* whether we show wireframes when hovering a button in * the tasklist */ @@ -558,7 +556,6 @@ xfce_tasklist_init (XfceTasklist *tasklist) tasklist->show_handle = TRUE; tasklist->all_monitors = TRUE; tasklist->n_monitors = 0; - tasklist->all_monitors_geometry = NULL; tasklist->window_scrolling = TRUE; tasklist->all_blinking = TRUE; tasklist->middle_click = XFCE_TASKLIST_MIDDLE_CLICK_DEFAULT; @@ -1902,8 +1899,6 @@ xfce_tasklist_update_monitor_geometry_idle (gpointer data) XfceTasklist *tasklist = XFCE_TASKLIST (data); GdkScreen *screen; gboolean geometry_set = FALSE; - GdkWindow *window; - guint tmp; panel_return_val_if_fail (XFCE_IS_TASKLIST (tasklist), FALSE); @@ -1912,23 +1907,10 @@ xfce_tasklist_update_monitor_geometry_idle (gpointer data) if (!tasklist->all_monitors) { screen = gtk_widget_get_screen (GTK_WIDGET (tasklist)); - window = gtk_widget_get_window (GTK_WIDGET (tasklist)); - if (G_LIKELY (screen != NULL - && window != NULL - && (tasklist->n_monitors = gdk_screen_get_n_monitors (screen)) > 1)) + if (G_LIKELY (screen != NULL)) { - /* set the monitor geometry */ - tasklist->my_monitor = gdk_screen_get_monitor_at_window (screen, window); - - if (tasklist->all_monitors_geometry) - tasklist->all_monitors_geometry = g_renew (GdkRectangle, tasklist->all_monitors_geometry, tasklist->n_monitors); - else - tasklist->all_monitors_geometry = g_new (GdkRectangle, tasklist->n_monitors); - - for(tmp = 0; tmp < tasklist->n_monitors; tmp++) - gdk_screen_get_monitor_geometry (screen, tmp, &tasklist->all_monitors_geometry[tmp]); - + tasklist->n_monitors = gdk_screen_get_n_monitors (screen); geometry_set = TRUE; } } @@ -2248,8 +2230,9 @@ xfce_tasklist_button_visible (XfceTasklistChild *child, WnckWorkspace *active_ws) { XfceTasklist *tasklist = XFCE_TASKLIST (child->tasklist); - GdkRectangle window, intersection; - guint best_size = 0, best_monitor = 0, size, tmp; + gint x, y, w, h; + GdkScreen *screen; + GdkWindow *window; panel_return_val_if_fail (active_ws == NULL || WNCK_IS_WORKSPACE (active_ws), FALSE); panel_return_val_if_fail (XFCE_IS_TASKLIST (tasklist), FALSE); @@ -2257,20 +2240,13 @@ xfce_tasklist_button_visible (XfceTasklistChild *child, if (xfce_tasklist_filter_monitors (tasklist)) { - /* center of the window must be on this screen */ - wnck_window_get_geometry (child->window, &window.x, &window.y, &window.width, &window.height); + screen = gtk_widget_get_screen (GTK_WIDGET (tasklist)); + window = gtk_widget_get_window (GTK_WIDGET (tasklist)); + /* center of the window must be on or nearest this monitor */ + wnck_window_get_geometry (child->window, &x, &y, &w, &h); - for (tmp = 0; tmp < tasklist->n_monitors; tmp++) - { - gdk_rectangle_intersect(&tasklist->all_monitors_geometry[tmp], &window, &intersection); - size = intersection.width * intersection.height; - if (size > best_size) - { - best_size = size; - best_monitor = tmp; - } - } - if (best_monitor != tasklist->my_monitor) + if (gdk_screen_get_monitor_at_window(screen, window) != + gdk_screen_get_monitor_at_point(screen, x+(w/2), y+(h/2)) ) return FALSE; } -- 1.9.1