After using randr to get a list of monitors, sort the list such that the

2009-02-19  Ray Strode  <rstrode@redhat.com>

	* 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
This commit is contained in:
Ray Strode 2009-02-20 04:42:33 +00:00 committed by Ray Strode
parent 92c30df34d
commit e822462333
2 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,14 @@
2009-02-19 Ray Strode <rstrode@redhat.com>
* 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 <sven@gimp.org>
* gdk/directfb/gdkwindow-directfb.c

View File

@ -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);