diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/drivers/X11/Fl_X11_Screen_Driver.cxx | 58 |
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; } } } |
