diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Screen_Driver.cxx | 11 | ||||
| -rw-r--r-- | src/Fl_x.cxx | 52 |
2 files changed, 51 insertions, 12 deletions
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 |
