diff --git a/ChangeLog b/ChangeLog index 7e2df8dc91..69fd9b8ca2 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 3b9a8455f1..e6478006bf 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);