From f309c395fc564de0e2799fa09e3d829ea1c5366a Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Tue, 4 Oct 2011 09:21:47 +0000 Subject: STR#2600 again: under X11, dynamically load the libXrandr shared library. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9123 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- configh.in | 8 -------- configure.in | 13 ------------- 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 @@ -83,14 +83,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 * 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 ]) - 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 # include # include -#if HAVE_XRANDR -#include -static int randrEventBase = -1; +#define USE_XRANDR 1 // means attempt to dynamically load libXrandr.so +#if USE_XRANDR +#include +#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); -- cgit v1.2.3