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
This commit is contained in:
parent
5c7800ea61
commit
f309c395fc
@ -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
|
||||
*
|
||||
|
13
configure.in
13
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
|
||||
|
32
src/Fl_x.cxx
32
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);
|
||||
|
Loading…
Reference in New Issue
Block a user