summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Raeburn <raeburn@raeburn.org>2016-03-08 22:17:16 -0500
committerKen Raeburn <raeburn@raeburn.org>2016-03-08 22:17:16 -0500
commit5d0241498d8347f96a16f0694bf87815dec63f50 (patch)
treeee912928a559bf9d80975b036b08acf6c6f20646
parent02bf7cc4632dae6bd679f34307fc83ccc8510471 (diff)
downloademacs-scratch/raeburn/xrandr.tar.gz
Don't use XRANDR 1.3 extensions if the server doesn't support them.scratch/raeburn/xrandr
* src/xterm.h (struct x_display_info): Add fields to save XRANDR version number. * src/xfns.c (x_get_monitor_attributes): Save the version numbers after querying the X server. (x_get_monitor_attributes_xrandr): Don't use XRRGetOutputPrimary or XRRGetScreenResourcesCurrent if the server doesn't support at least RANDR version 1.3. Conditionalize the code blocks on compiling against library version 1.3 or better, rather than feature tests for each function. * configure.ac: Stop testing for those two functions.
-rw-r--r--configure.ac8
-rw-r--r--src/xfns.c28
-rw-r--r--src/xterm.h5
3 files changed, 26 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac
index d42b42e0cae..afb0a7f8797 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3594,14 +3594,6 @@ if test "${HAVE_X11}" = "yes"; then
fi
fi
if test $HAVE_XRANDR = yes; then
- SAVE_CFLAGS="$CFLAGS"
- SAVE_LIBS="$LIBS"
- CFLAGS="$XRANDR_CFLAGS $CFLAGS"
- LIBS="$XRANDR_LIBS $LIBS"
- AC_CHECK_FUNCS(XRRGetOutputPrimary XRRGetScreenResourcesCurrent)
- CFLAGS="$SAVE_CFLAGS"
- LIBS="$SAVE_LIBS"
-
AC_DEFINE(HAVE_XRANDR, 1, [Define to 1 if you have the XRandr extension.])
fi
fi
diff --git a/src/xfns.c b/src/xfns.c
index 20ac6271715..07bd3e9993e 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -4262,8 +4262,19 @@ x_get_monitor_attributes_xrandr (struct x_display_info *dpyinfo)
RROutput pxid = None;
struct MonitorInfo *monitors;
-#ifdef HAVE_XRRGETSCREENRESOURCESCURRENT
- resources = XRRGetScreenResourcesCurrent (dpy, dpyinfo->root_window);
+#define RANDR13_LIBRARY \
+ (RANDR_MAJOR > 1 || (RANDR_MAJOR == 1 && RANDR_MINOR >= 3))
+
+#if RANDR13_LIBRARY
+ /* Check if the display supports 1.3 too. */
+ bool randr13_avail = (dpyinfo->xrandr_major_version > 1
+ || (dpyinfo->xrandr_major_version == 1
+ && dpyinfo->xrandr_minor_version >= 3));
+
+ if (randr13_avail)
+ resources = XRRGetScreenResourcesCurrent (dpy, dpyinfo->root_window);
+ else
+ resources = XRRGetScreenResources (dpy, dpyinfo->root_window);
#else
resources = XRRGetScreenResources (dpy, dpyinfo->root_window);
#endif
@@ -4276,8 +4287,9 @@ x_get_monitor_attributes_xrandr (struct x_display_info *dpyinfo)
n_monitors = resources->noutput;
monitors = xzalloc (n_monitors * sizeof *monitors);
-#ifdef HAVE_XRRGETOUTPUTPRIMARY
- pxid = XRRGetOutputPrimary (dpy, dpyinfo->root_window);
+#ifdef RANDR13_LIBRARY
+ if (randr13_avail)
+ pxid = XRRGetOutputPrimary (dpy, dpyinfo->root_window);
#endif
for (i = 0; i < n_monitors; ++i)
@@ -4360,9 +4372,11 @@ x_get_monitor_attributes (struct x_display_info *dpyinfo)
xrr_ok = XRRQueryExtension (dpy, &xrr_event_base, &xrr_error_base);
if (xrr_ok)
{
- int xrr_major, xrr_minor;
- XRRQueryVersion (dpy, &xrr_major, &xrr_minor);
- xrr_ok = (xrr_major == 1 && xrr_minor >= 2) || xrr_major > 1;
+ XRRQueryVersion (dpy, &dpyinfo->xrandr_major_version,
+ &dpyinfo->xrandr_minor_version);
+ xrr_ok = ((dpyinfo->xrandr_major_version == 1
+ && dpyinfo->xrandr_minor_version >= 2)
+ || dpyinfo->xrandr_major_version > 1);
}
if (xrr_ok)
diff --git a/src/xterm.h b/src/xterm.h
index 3a78292907a..3211b591258 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -459,6 +459,11 @@ struct x_display_info
/* SM */
Atom Xatom_SM_CLIENT_ID;
+#ifdef HAVE_XRANDR
+ int xrandr_major_version;
+ int xrandr_minor_version;
+#endif
+
#ifdef USE_CAIRO
XExtCodes *ext_codes;
#endif