Check for Xrandr 1.3
* configure.in: Check for Xrandr 1.3 * gdk/x11/gdkdisplay-x11.[ch]: Rename have_randr12 to have_randr13 and set if if we have randr 1.3 * gdk/x11/gdkscreen-x11.c: Go back to using randr for monitor information, if we have XRRGetScreenResourcesCurrent. svn path=/trunk/; revision=22327
This commit is contained in:
parent
26971eaaff
commit
2e67143e3b
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2009-02-13 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
* configure.in: Check for Xrandr 1.3
|
||||||
|
|
||||||
|
* gdk/x11/gdkdisplay-x11.[ch]: Rename have_randr12 to have_randr13
|
||||||
|
and set if if we have randr 1.3
|
||||||
|
|
||||||
|
* gdk/x11/gdkscreen-x11.c: Go back to using randr for monitor
|
||||||
|
information, if we have XRRGetScreenResourcesCurrent.
|
||||||
|
:
|
||||||
2009-02-12 Cody Russell <bratsche@gnome.org>
|
2009-02-12 Cody Russell <bratsche@gnome.org>
|
||||||
|
|
||||||
Bug 571576 – gdk_pixbuf_save_to_stream() broken
|
Bug 571576 – gdk_pixbuf_save_to_stream() broken
|
||||||
|
@ -1541,7 +1541,7 @@ if test "x$gdktarget" = "xx11"; then
|
|||||||
AM_CONDITIONAL(XINPUT_XFREE, test x$with_xinput = xxfree || test x$with_xinput = xyes)
|
AM_CONDITIONAL(XINPUT_XFREE, test x$with_xinput = xxfree || test x$with_xinput = xyes)
|
||||||
|
|
||||||
# Check for the RANDR extension
|
# Check for the RANDR extension
|
||||||
if $PKG_CONFIG --exists "xrandr >= 1.2" ; then
|
if $PKG_CONFIG --exists "xrandr >= 1.2.99" ; then
|
||||||
AC_DEFINE(HAVE_RANDR, 1, [Have the Xrandr extension library])
|
AC_DEFINE(HAVE_RANDR, 1, [Have the Xrandr extension library])
|
||||||
|
|
||||||
X_PACKAGES="$X_PACKAGES xrandr"
|
X_PACKAGES="$X_PACKAGES xrandr"
|
||||||
|
@ -184,7 +184,7 @@ gdk_display_open (const gchar *display_name)
|
|||||||
_gdk_x11_precache_atoms (display, precache_atoms, G_N_ELEMENTS (precache_atoms));
|
_gdk_x11_precache_atoms (display, precache_atoms, G_N_ELEMENTS (precache_atoms));
|
||||||
|
|
||||||
/* RandR must be initialized before we initialize the screens */
|
/* RandR must be initialized before we initialize the screens */
|
||||||
display_x11->have_randr12 = FALSE;
|
display_x11->have_randr13 = FALSE;
|
||||||
#ifdef HAVE_RANDR
|
#ifdef HAVE_RANDR
|
||||||
if (XRRQueryExtension (display_x11->xdisplay,
|
if (XRRQueryExtension (display_x11->xdisplay,
|
||||||
&display_x11->xrandr_event_base, &ignore))
|
&display_x11->xrandr_event_base, &ignore))
|
||||||
@ -193,8 +193,8 @@ gdk_display_open (const gchar *display_name)
|
|||||||
|
|
||||||
XRRQueryVersion (display_x11->xdisplay, &major, &minor);
|
XRRQueryVersion (display_x11->xdisplay, &major, &minor);
|
||||||
|
|
||||||
if ((major == 1 && minor >= 2) || major > 1)
|
if ((major == 1 && minor >= 3) || major > 1)
|
||||||
display_x11->have_randr12 = TRUE;
|
display_x11->have_randr13 = TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ struct _GdkDisplayX11
|
|||||||
gboolean have_xdamage;
|
gboolean have_xdamage;
|
||||||
gint xdamage_event_base;
|
gint xdamage_event_base;
|
||||||
|
|
||||||
gboolean have_randr12;
|
gboolean have_randr13;
|
||||||
gint xrandr_event_base;
|
gint xrandr_event_base;
|
||||||
|
|
||||||
/* If the SECURITY extension is in place, whether this client holds
|
/* If the SECURITY extension is in place, whether this client holds
|
||||||
|
@ -663,6 +663,81 @@ init_fake_xinerama (GdkScreen *screen)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
init_randr13 (GdkScreen *screen)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_RANDR
|
||||||
|
GdkDisplay *display = gdk_screen_get_display (screen);
|
||||||
|
GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
|
||||||
|
GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
|
||||||
|
Display *dpy = GDK_SCREEN_XDISPLAY (screen);
|
||||||
|
XRRScreenResources *resources;
|
||||||
|
int i;
|
||||||
|
GArray *monitors;
|
||||||
|
gboolean randr12_compat = FALSE;
|
||||||
|
|
||||||
|
if (!display_x11->have_randr13)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
resources = XRRGetScreenResourcesCurrent (screen_x11->xdisplay,
|
||||||
|
screen_x11->xroot_window);
|
||||||
|
if (!resources)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
monitors = g_array_sized_new (FALSE, TRUE, sizeof (GdkX11Monitor),
|
||||||
|
resources->noutput);
|
||||||
|
|
||||||
|
for (i = 0; i < resources->noutput; ++i)
|
||||||
|
{
|
||||||
|
XRROutputInfo *output =
|
||||||
|
XRRGetOutputInfo (dpy, resources, resources->outputs[i]);
|
||||||
|
|
||||||
|
/* Non RandR1.2 X driver have output name "default" */
|
||||||
|
randr12_compat |= !g_strcmp0(output->name, "default");
|
||||||
|
|
||||||
|
if (output->crtc)
|
||||||
|
{
|
||||||
|
GdkX11Monitor monitor;
|
||||||
|
XRRCrtcInfo *crtc = XRRGetCrtcInfo (dpy, resources, output->crtc);
|
||||||
|
|
||||||
|
monitor.geometry.x = crtc->x;
|
||||||
|
monitor.geometry.y = crtc->y;
|
||||||
|
monitor.geometry.width = crtc->width;
|
||||||
|
monitor.geometry.height = crtc->height;
|
||||||
|
|
||||||
|
/* FIXME: fill this out properly - need EDID parser */
|
||||||
|
monitor.output = resources->outputs[i];
|
||||||
|
monitor.width_mm = -1;
|
||||||
|
monitor.height_mm = -1;
|
||||||
|
monitor.output_name = NULL;
|
||||||
|
monitor.manufacturer = NULL;
|
||||||
|
|
||||||
|
g_array_append_val (monitors, monitor);
|
||||||
|
|
||||||
|
XRRFreeCrtcInfo (crtc);
|
||||||
|
}
|
||||||
|
|
||||||
|
XRRFreeOutputInfo (output);
|
||||||
|
}
|
||||||
|
|
||||||
|
XRRFreeScreenResources (resources);
|
||||||
|
|
||||||
|
/* non RandR 1.2 X driver doesn't return any usable multihead data */
|
||||||
|
if (randr12_compat)
|
||||||
|
{
|
||||||
|
g_array_free (monitors, TRUE);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_x11->n_monitors = monitors->len;
|
||||||
|
screen_x11->monitors = (GdkX11Monitor *)g_array_free (monitors, FALSE);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
init_solaris_xinerama (GdkScreen *screen)
|
init_solaris_xinerama (GdkScreen *screen)
|
||||||
{
|
{
|
||||||
@ -786,14 +861,14 @@ init_multihead (GdkScreen *screen)
|
|||||||
* 3. Solaris Xinerama
|
* 3. Solaris Xinerama
|
||||||
* 4. XFree86/Xorg Xinerama
|
* 4. XFree86/Xorg Xinerama
|
||||||
*
|
*
|
||||||
* However, there are performance issues with calling
|
* We use them in that order.
|
||||||
* XRRGetScreenResources() every time an application starts,
|
|
||||||
* so in the RandR case we simply rely on the information being
|
|
||||||
* exported through Xinerama as well.
|
|
||||||
*/
|
*/
|
||||||
if (init_fake_xinerama (screen))
|
if (init_fake_xinerama (screen))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (init_randr13 (screen))
|
||||||
|
return;
|
||||||
|
|
||||||
if (XQueryExtension (GDK_SCREEN_XDISPLAY (screen), "XINERAMA",
|
if (XQueryExtension (GDK_SCREEN_XDISPLAY (screen), "XINERAMA",
|
||||||
&opcode, &firstevent, &firsterror))
|
&opcode, &firstevent, &firsterror))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user