From e822462333364e6f431f3293417b69b4f23c76cf Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 20 Feb 2009 04:42:33 +0000 Subject: [PATCH] After using randr to get a list of monitors, sort the list such that the 2009-02-19 Ray Strode * gdk/x11/gdkscreen-x11.c (monitor_compare_function), (init_randr13): After using randr to get a list of monitors, sort the list such that the biggest output of "cloned" outputs comes first in the list. This helps apps that don't generally handle overlapping outputs to work better in randr clone mode. svn path=/trunk/; revision=22386 --- ChangeLog | 11 +++++++++++ gdk/x11/gdkscreen-x11.c | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/ChangeLog b/ChangeLog index 7e2df8dc9..69fd9b8ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-02-19 Ray Strode + + * gdk/x11/gdkscreen-x11.c + (monitor_compare_function), (init_randr13): + After using randr to get a list of monitors, + sort the list such that the biggest output + of "cloned" outputs comes first in the list. + This helps apps that don't generally handle + overlapping outputs to work better in randr + clone mode. + 2009-02-19 Sven Neumann * gdk/directfb/gdkwindow-directfb.c diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 3b9a8455f..e6478006b 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -663,6 +663,31 @@ init_fake_xinerama (GdkScreen *screen) return FALSE; } +static int +monitor_compare_function (GdkX11Monitor *monitor1, + GdkX11Monitor *monitor2) +{ + /* Sort the leftmost/topmost monitors first. + * For "cloned" monitors, sort the bigger ones first + * (giving preference to taller monitors over wider + * monitors) + */ + + if (monitor1->geometry.x != monitor2->geometry.x) + return monitor1->geometry.x - monitor2->geometry.x; + + if (monitor1->geometry.y != monitor2->geometry.y) + return monitor1->geometry.y - monitor2->geometry.y; + + if (monitor1->geometry.height != monitor2->geometry.height) + return - (monitor1->geometry.height - monitor2->geometry.height); + + if (monitor1->geometry.width != monitor2->geometry.width) + return - (monitor1->geometry.width - monitor2->geometry.width); + + return 0; +} + static gboolean init_randr13 (GdkScreen *screen) { @@ -732,6 +757,8 @@ init_randr13 (GdkScreen *screen) return FALSE; } + g_array_sort (monitors, + (GCompareFunc) monitor_compare_function); screen_x11->n_monitors = monitors->len; screen_x11->monitors = (GdkX11Monitor *)g_array_free (monitors, FALSE);