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 | |
| 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
| -rw-r--r-- | FL/Fl_Screen_Driver.H | 2 | ||||
| -rw-r--r-- | src/Fl_Screen_Driver.cxx | 11 | ||||
| -rw-r--r-- | src/Fl_x.cxx | 52 |
3 files changed, 52 insertions, 13 deletions
diff --git a/FL/Fl_Screen_Driver.H b/FL/Fl_Screen_Driver.H index a26dfc81d..ff9dfa32d 100644 --- a/FL/Fl_Screen_Driver.H +++ b/FL/Fl_Screen_Driver.H @@ -170,7 +170,7 @@ public: static int scale_handler(int event); virtual void init_workarea() {} virtual float desktop_scale_factor() {return 1;} - void use_startup_scale_factor(); + float use_startup_scale_factor(); enum APP_SCALING_CAPABILITY { NO_APP_SCALING = 0, ///< The platform does not support rescaling. SYSTEMWIDE_APP_SCALING, ///< The platform supports rescaling with the same factor for all screens. diff --git a/src/Fl_Screen_Driver.cxx b/src/Fl_Screen_Driver.cxx index bbc354bb1..2c26c853e 100644 --- a/src/Fl_Screen_Driver.cxx +++ b/src/Fl_Screen_Driver.cxx @@ -295,7 +295,7 @@ int Fl_Screen_Driver::input_widget_handle_key(int key, unsigned mods, unsigned s void Fl_Screen_Driver::rescale_all_windows_from_screen(int screen, float f) { float old_f = this->scale(screen); - if (f == old_f) return; + //if (f == old_f) return; this->scale(screen, f); Fl_Graphics_Driver *d = Fl_Display_Device::display_device()->driver(); d->scale(f); @@ -428,7 +428,7 @@ int Fl_Screen_Driver::scale_handler(int event) // use the startup time scaling value -void Fl_Screen_Driver::use_startup_scale_factor() +float Fl_Screen_Driver::use_startup_scale_factor() { float factor; char *p = 0; @@ -441,9 +441,7 @@ void Fl_Screen_Driver::use_startup_scale_factor() else { factor = desktop_scale_factor(); } - if (factor) { - for (int i = 0; i < screen_count(); i++) scale(i, factor); - } + return factor; } @@ -455,7 +453,8 @@ void Fl_Screen_Driver::open_display() been_here = true; screen_count(); // initialize, but ignore return value if (rescalable()) { - use_startup_scale_factor(); + float factor = use_startup_scale_factor(); + for (int i = 0; i < screen_count(); i++) scale(i, factor); Fl::add_handler(Fl_Screen_Driver::scale_handler); int mx, my; int ns = Fl::screen_driver()->get_mouse(mx, my); 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 |
