summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/drivers/X11/Fl_X11_Screen_Driver.cxx58
1 files changed, 36 insertions, 22 deletions
diff --git a/src/drivers/X11/Fl_X11_Screen_Driver.cxx b/src/drivers/X11/Fl_X11_Screen_Driver.cxx
index f8bf520b1..f9bae70f2 100644
--- a/src/drivers/X11/Fl_X11_Screen_Driver.cxx
+++ b/src/drivers/X11/Fl_X11_Screen_Driver.cxx
@@ -274,13 +274,14 @@ typedef struct {
typedef XRRScreenSize* (*XRRSizes_type)(Display *dpy, int screen, int *nsizes);
#endif // USE_XRANDR
-void Fl_X11_Screen_Driver::init()
-{
+void Fl_X11_Screen_Driver::init() {
if (!fl_display) open_display();
-
+
int dpi_by_randr = 0;
float dpih = 0.0f, dpiv = 0.0f;
+
#if USE_XRANDR
+
static XRRSizes_type XRRSizes_f = NULL;
if (!XRRSizes_f) {
void *libxrandr_addr = dlopen("libXrandr.so.2", RTLD_LAZY);
@@ -293,17 +294,24 @@ void Fl_X11_Screen_Driver::init()
if (XRRSizes_f) {
int nscreens;
XRRScreenSize *ssize = XRRSizes_f(fl_display, fl_screen, &nscreens);
- // for(int i=0;i<nscreens;i++)
- // printf("width=%d height=%d mwidth=%d mheight=%d\n",ssize[i].width,ssize[i].height,ssize[i].mwidth,ssize[i].mheight);
- int mm = ssize[0].mwidth;
- dpih = mm ? ssize[0].width*25.4f/mm : 0.0f;
- mm = ssize[0].mheight;
- dpiv = mm ? ssize[0].height*25.4f/mm : 0.0f;
- dpi_by_randr = 1;
+
+ //for (int i=0; i<nscreens; i++)
+ // printf("width=%d height=%d mwidth=%d mheight=%d\n",
+ // ssize[i].width,ssize[i].height,ssize[i].mwidth,ssize[i].mheight);
+
+ if (nscreens > 0) { // Note: XRRSizes() *may* return nscreens == 0, see docs
+ int mm = ssize[0].mwidth;
+ dpih = mm ? ssize[0].width*25.4f/mm : 0.0f;
+ mm = ssize[0].mheight;
+ dpiv = mm ? ssize[0].height*25.4f/mm : 0.0f;
+ dpi_by_randr = 1;
+ }
}
+
#endif // USE_XRANDR
#if HAVE_XINERAMA
+
if (XineramaIsActive(fl_display)) {
XineramaScreenInfo *xsi = XineramaQueryScreens(fl_display, &num_screens);
if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
@@ -315,8 +323,10 @@ void Fl_X11_Screen_Driver::init()
screens[i].width = xsi[i].width;
screens[i].height = xsi[i].height;
- if (dpi_by_randr) { dpi[i][0] = dpih; dpi[i][1] = dpiv; }
- else {
+ if (dpi_by_randr) {
+ dpi[i][0] = dpih;
+ dpi[i][1] = dpiv;
+ } else {
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);
@@ -325,23 +335,27 @@ void Fl_X11_Screen_Driver::init()
}
if (xsi) XFree(xsi);
} else
-#endif
- { // ! XineramaIsActive()
+
+#endif // HAVE_XINERAMA
+
+ { // ! HAVE_XINERAMA || ! 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);
-
- if (dpi_by_randr) { dpi[i][0] = dpih; dpi[i][1] = dpiv; }
- else {
- 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;
+
+ if (dpi_by_randr) {
+ dpi[i][0] = dpih;
+ dpi[i][1] = dpiv;
+ } else {
+ int mm = DisplayWidthMM(fl_display, i);
+ 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;
}
}
}