diff options
| author | Manolo Gouy <Manolo> | 2018-06-08 11:31:30 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2018-06-08 11:31:30 +0000 |
| commit | bfac49015c9b51be50c4a563c42fb25b6af4208f (patch) | |
| tree | c18b14ea60e014b7e4bd2c30ecdb9929e008c1ed /src/Fl_x.cxx | |
| parent | f3971319b9de0c52eaf8055e18bf02321440de1d (diff) | |
Fix for STR#3475: X11 platform, re-use current screen scaling factor when processing a screen reconfiguration event.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12939 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_x.cxx')
| -rw-r--r-- | src/Fl_x.cxx | 52 |
1 files changed, 46 insertions, 6 deletions
diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 752924593..f911793cc 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -1220,6 +1220,51 @@ static KeySym fl_KeycodeToKeysym(Display *d, KeyCode k, unsigned i) { return XKeycodeToKeysym(d, k, i); } +#if USE_XRANDR +static void react_to_screen_reconfiguration() { +#if USE_XFT + // memorize previous screen sizes and scales + int old_count = Fl::screen_count(); + int (*sizes)[4] = new int[old_count][4]; + float *scales = new float[old_count]; + for (int screen = 0; screen < old_count; screen++) { + Fl::screen_xywh(sizes[screen][0], sizes[screen][1], sizes[screen][2], sizes[screen][3], screen); + scales[screen] = Fl::screen_scale(screen); + } +#endif // USE_XFT + Fl::call_screen_init(); // compute new screen sizes +#if USE_XFT + // detect whether screen sizes were unchanged + bool nochange = (old_count == Fl::screen_count()); + if (nochange) { + for (int screen = 0; screen < old_count; screen++) { + int X,Y,W,H; + Fl::screen_xywh(X,Y,W,H, screen); + X /= scales[screen]; + Y /= scales[screen]; + W /= scales[screen]; + H /= scales[screen]; + if (X != sizes[screen][0] || Y != sizes[screen][1] || W != sizes[screen][2] || H != sizes[screen][3]) { + nochange = false; + break; + } + } + } + delete[] sizes; + if (nochange) { // screen sizes did not change: re-use previous screen scale values + for (int screen = 0; screen < old_count; screen++) + Fl::screen_driver()->scale(screen, scales[screen]); + } else { + float factor = Fl::screen_driver()->use_startup_scale_factor(); + for (int screen = 0; screen < Fl::screen_count(); screen++) + Fl::screen_driver()->rescale_all_windows_from_screen(screen, factor); + } + delete[] scales; +#endif // USE_XFT +} +#endif // USE_XRANDR + + int fl_handle(const XEvent& thisevent) { XEvent xevent = thisevent; @@ -1251,12 +1296,7 @@ int fl_handle(const XEvent& thisevent) #if USE_XRANDR if( XRRUpdateConfiguration_f && xevent.type == randrEventBase + RRScreenChangeNotify) { XRRUpdateConfiguration_f(&xevent); - Fl::call_screen_init(); -#if USE_XFT - float factor = Fl::screen_driver()->desktop_scale_factor(); - for (int screen = 0; screen <= Fl::screen_count(); screen++) - Fl::screen_driver()->rescale_all_windows_from_screen(screen, factor); -#endif // USE_XFT + react_to_screen_reconfiguration(); Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL); } #endif // USE_XRANDR |
