Updated bundled fltk with latest set of patches for
following fltk str: 2660, 2636, 2599, 2641...
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4675 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/fltk/src/screen_xywh.cxx b/common/fltk/src/screen_xywh.cxx
index 5cf3759..9873634 100644
--- a/common/fltk/src/screen_xywh.cxx
+++ b/common/fltk/src/screen_xywh.cxx
@@ -30,6 +30,7 @@
#include <FL/x.H>
#include <config.h>
+#define MAX_SCREENS 16
// Number of screens returned by multi monitor aware API; -1 before init
static int num_screens = -1;
@@ -96,7 +97,7 @@
if (fl_edm) {
// We do have EnumDisplayMonitors, so lets find out how many monitors...
- num_screens = GetSystemMetrics(SM_CMONITORS);
+ //num_screens = GetSystemMetrics(SM_CMONITORS);
// if (num_screens > 1) {
// If there is more than 1 monitor, enumerate them...
@@ -142,47 +143,62 @@
}
num_screens = count;
}
-#elif HAVE_XINERAMA
-# include <X11/extensions/Xinerama.h>
+#else
-// Screen data...
-static XineramaScreenInfo *screens;
-static float dpi[16][2];
+#if HAVE_XINERAMA
+# include <X11/extensions/Xinerama.h>
+#endif
+typedef struct {
+ short x_org;
+ short y_org;
+ short width;
+ short height;
+} FLScreenInfo;
+static FLScreenInfo screens[MAX_SCREENS];
+static float dpi[MAX_SCREENS][2];
static void screen_init() {
if (!fl_display) fl_open_display();
+ // FIXME: Rewrite using randr instead
+#if HAVE_XINERAMA
if (XineramaIsActive(fl_display)) {
- screens = XineramaQueryScreens(fl_display, &num_screens);
- int i;
- // Xlib and Xinerama may disagree on the screen count. Sigh...
- // Use the minimum of the reported counts.
- // Use the previous screen's info for non-existent ones.
- int sc = ScreenCount(fl_display); // Xlib screen count
- for (i=0; i<num_screens; i++) {
- int mm = (i < sc) ? DisplayWidthMM(fl_display, i) : 0;
- dpi[i][0] = mm ? screens[i].width*25.4f/mm : (i > 0) ? dpi[i-1][0] : 0.0f;
- mm = (i < sc) ? DisplayHeightMM(fl_display, i) : 0;
- dpi[i][1] = mm ? screens[i].height*25.4f/mm : (i > 0) ? dpi[i-1][1] : 0.0f;
+ static XineramaScreenInfo *xsi = XineramaQueryScreens(fl_display, &num_screens);
+ if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
+
+ /* There's no way to use different DPI for different Xinerama
+ screens. */
+ for (int i=0; i<num_screens; i++) {
+ screens[i].x_org = xsi[i].x_org;
+ screens[i].y_org = xsi[i].y_org;
+ screens[i].width = xsi[i].width;
+ screens[i].height = xsi[i].height;
+
+ int mm = DisplayWidthMM(fl_display, fl_screen);
+ dpi[i][0] = mm ? screens[i].width*25.4f/mm : 0.0f;
+ mm = DisplayHeightMM(fl_display, fl_screen);
+ dpi[i][1] = mm ? screens[i].height*25.4f/mm : 0.0f;
}
- } else { // ! XineramaIsActive()
- num_screens = 1;
- int mm = DisplayWidthMM(fl_display, fl_screen);
- dpi[0][0] = mm ? Fl::w()*25.4f/mm : 0.0f;
- mm = DisplayHeightMM(fl_display, fl_screen);
- dpi[0][1] = mm ? Fl::h()*25.4f/mm : dpi[0][0];
+ } else
+#endif
+ { // ! XineramaIsActive()
+ num_screens = ScreenCount(fl_display);
+ if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
+
+ for (int i=0; i<num_screens; i++) {
+ screens[i].x_org = 0;
+ screens[i].y_org = 0;
+ screens[i].width = DisplayWidth(fl_display, i);
+ screens[i].height = DisplayHeight(fl_display, i);
+
+ int mm = DisplayWidthMM(fl_display, i);
+ dpi[i][0] = mm ? DisplayWidth(fl_display, i)*25.4f/mm : 0.0f;
+ mm = DisplayHeightMM(fl_display, i);
+ dpi[i][1] = mm ? DisplayHeight(fl_display, i)*25.4f/mm : 0.0f;
+ }
}
}
-#else
-static float dpi[2];
-static void screen_init() {
- num_screens = 1;
- if (!fl_display) fl_open_display();
- int mm = DisplayWidthMM(fl_display, fl_screen);
- dpi[0] = mm ? Fl::w()*25.4f/mm : 0.0f;
- mm = DisplayHeightMM(fl_display, fl_screen);
- dpi[1] = mm ? Fl::h()*25.4f/mm : dpi[0];
-}
+
#endif // WIN32
@@ -258,20 +274,11 @@
H = Fl::h();
}
#else
-#if HAVE_XINERAMA
- if (num_screens > 0 && screens) {
+ if (num_screens > 0) {
X = screens[n].x_org;
Y = screens[n].y_org;
W = screens[n].width;
H = screens[n].height;
- } else
-#endif // HAVE_XINERAMA
- {
- /* Fallback if something is broken (or no Xinerama)... */
- X = 0;
- Y = 0;
- W = DisplayWidth(fl_display, fl_screen);
- H = DisplayHeight(fl_display, fl_screen);
}
#endif // WIN32
}
@@ -333,16 +340,11 @@
h = dpi_h[n];
v = dpi_v[n];
}
-#elif HAVE_XINERAMA
+#else
if (n >= 0 && n < num_screens) {
h = dpi[n][0];
v = dpi[n][1];
}
-#else
- if (n >= 0 && n < num_screens) {
- h = dpi[0];
- v = dpi[1];
- }
#endif // WIN32
}