diff options
| -rw-r--r-- | configh.in | 8 | ||||
| -rw-r--r-- | configure.in | 13 | ||||
| -rw-r--r-- | src/Fl_x.cxx | 32 |
3 files changed, 21 insertions, 32 deletions
diff --git a/configh.in b/configh.in index 1521f46ba..4a806e475 100644 --- a/configh.in +++ b/configh.in @@ -84,14 +84,6 @@ #define HAVE_XINERAMA 0 /* - * HAVE_XRANDR - * - * Do we have the Xrandr library to support runtime update of multi-head displays? - */ - -#define HAVE_XRANDR 0 - -/* * USE_XFT * * Use the new Xft library to draw anti-aliased text. diff --git a/configure.in b/configure.in index e233d2e2a..565561fef 100644 --- a/configure.in +++ b/configure.in @@ -997,16 +997,6 @@ case $uname_GUI in LIBS="-lXext $LIBS") fi - dnl Check for the XRandR extension unless disabled... - AC_ARG_ENABLE(xrandr, [ --enable-xrandr turn on XRandR support [default=yes]]) - - if test x$enable_xrandr != xno; then - AC_CHECK_HEADER(X11/extensions/Xrandr.h, AC_DEFINE(HAVE_XRANDR),, - [#include <X11/Xlib.h>]) - AC_CHECK_LIB(Xrandr, XRRQueryExtension, - LIBS="-lXrandr $LIBS") - fi - dnl Check for overlay visuals... AC_PATH_PROG(XPROP, xprop) AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay, @@ -1340,9 +1330,6 @@ case $uname_GUI in if test x$enable_xdbe != xno; then graphics="$graphics+Xdbe" fi - if test x$enable_xrandr != xno; then - graphics="$graphics+Xrandr" - fi if test x$enable_xinerama != xno; then graphics="$graphics+Xinerama" fi diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 5b58a8ca3..3e3e24517 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -43,9 +43,13 @@ # include <X11/Xlocale.h> # include <X11/Xlib.h> # include <X11/keysym.h> -#if HAVE_XRANDR -#include <X11/extensions/Xrandr.h> -static int randrEventBase = -1; +#define USE_XRANDR 1 // means attempt to dynamically load libXrandr.so +#if USE_XRANDR +#include <dlfcn.h> +#define RRScreenChangeNotifyMask (1L << 0) // from X11/extensions/Xrandr.h +#define RRScreenChangeNotify 0 // from X11/extensions/Xrandr.h +static void *libxrandr_addr; // run-time address of libXrandr.so +static int randrEventBase; // base of RandR-defined events #endif static Fl_Xlib_Graphics_Driver fl_xlib_driver; @@ -642,11 +646,18 @@ void fl_open_display(Display* d) { #if !USE_COLORMAP Fl::visual(FL_RGB); #endif -#if HAVE_XRANDR - int error_base; - if (XRRQueryExtension(d, &randrEventBase, &error_base)) - XRRSelectInput(d, RootWindow(d, fl_screen), RRScreenChangeNotifyMask); - else randrEventBase = -1; +#if USE_XRANDR + libxrandr_addr = dlopen("libXrandr.so", RTLD_LAZY); + if (libxrandr_addr) { + int error_base; + typedef Bool (*XRRQueryExtension_type)(Display*, int*, int*); + typedef void (*XRRSelectInput_type)(Display*, Window, int); + XRRQueryExtension_type XRRQueryExtension_f = (XRRQueryExtension_type)dlsym(libxrandr_addr, "XRRQueryExtension"); + XRRSelectInput_type XRRSelectInput_f = (XRRSelectInput_type)dlsym(libxrandr_addr, "XRRSelectInput"); + if (XRRQueryExtension_f && XRRSelectInput_f && XRRQueryExtension_f(d, &randrEventBase, &error_base)) + XRRSelectInput_f(d, RootWindow(d, fl_screen), RRScreenChangeNotifyMask); + else libxrandr_addr = NULL; + } #endif } @@ -932,9 +943,8 @@ int fl_handle(const XEvent& thisevent) if ( XFilterEvent((XEvent *)&xevent, 0) ) return(1); -#if HAVE_XRANDR - if( randrEventBase >= 0 && xevent.type == randrEventBase + RRScreenChangeNotify) { - XRRUpdateConfiguration (&xevent); +#if USE_XRANDR + if( libxrandr_addr && xevent.type == randrEventBase + RRScreenChangeNotify) { Fl::call_screen_init(); fl_init_workarea(); Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL); |
