diff options
| author | Manolo Gouy <Manolo> | 2011-09-30 14:46:08 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2011-09-30 14:46:08 +0000 |
| commit | 9bdc310346077e3fd60371b3d3d0c7db54db10e3 (patch) | |
| tree | 7eec45507ad42f052f792b57ddf8ce0233d5119c | |
| parent | 2df4196d8b29fdb3d4708741c9b76805a9bb6241 (diff) | |
Fix STR#2600 : screens configuration changes are now detected under all platforms.
Requires the RandR X extension.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9102 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | configh.in | 8 | ||||
| -rw-r--r-- | configure.in | 13 | ||||
| -rw-r--r-- | src/Fl.cxx | 2 | ||||
| -rw-r--r-- | src/Fl_x.cxx | 22 |
4 files changed, 43 insertions, 2 deletions
diff --git a/configh.in b/configh.in index 4a806e475..1521f46ba 100644 --- a/configh.in +++ b/configh.in @@ -84,6 +84,14 @@ #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 565561fef..e233d2e2a 100644 --- a/configure.in +++ b/configure.in @@ -997,6 +997,16 @@ 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, @@ -1330,6 +1340,9 @@ 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.cxx b/src/Fl.cxx index 6264c4a30..374847047 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -778,7 +778,7 @@ static handler_link *handlers = 0; - \ref FL_SHORTCUT events that are not recognized by any widget. This lets you provide global shortcut keys. - - \ref FL_SCREEN_CONFIGURATION_CHANGED events (not implemented on the X11 platform). + - \ref FL_SCREEN_CONFIGURATION_CHANGED events. - System events that FLTK does not recognize. See fl_xevent. - \e Some other events when the widget FLTK selected returns zero from its handle() method. Exactly which ones may change diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index bc528aa34..360981ed8 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -43,6 +43,10 @@ # include <X11/Xlocale.h> # include <X11/Xlib.h> # include <X11/keysym.h> +#ifdef HAVE_XRANDR +#include <X11/extensions/Xrandr.h> +static int randrEventBase = -1; +#endif static Fl_Xlib_Graphics_Driver fl_xlib_driver; static Fl_Display_Device fl_xlib_display(&fl_xlib_driver); @@ -587,6 +591,7 @@ void fl_open_display() { fl_open_display(d); } + void fl_open_display(Display* d) { fl_display = d; @@ -637,6 +642,12 @@ void fl_open_display(Display* d) { #if !USE_COLORMAP Fl::visual(FL_RGB); #endif +#ifdef HAVE_XRANDR + int error_base; + if (XRRQueryExtension(d, &randrEventBase, &error_base)) + XRRSelectInput(d, RootWindow(d, fl_screen), RRScreenChangeNotifyMask); + else randrEventBase = -1; +#endif } void fl_close_display() { @@ -920,7 +931,16 @@ int fl_handle(const XEvent& thisevent) if ( XFilterEvent((XEvent *)&xevent, 0) ) return(1); - + +#ifdef HAVE_XRANDR + if( randrEventBase >= 0 && xevent.type == randrEventBase + RRScreenChangeNotify) { + XRRUpdateConfiguration (&xevent); + Fl::call_screen_init(); + fl_init_workarea(); + Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL); + } +#endif + switch (xevent.type) { case KeymapNotify: |
