summaryrefslogtreecommitdiff
path: root/src/Fl_x.cxx
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2018-06-08 11:31:30 +0000
committerManolo Gouy <Manolo>2018-06-08 11:31:30 +0000
commitbfac49015c9b51be50c4a563c42fb25b6af4208f (patch)
treec18b14ea60e014b7e4bd2c30ecdb9929e008c1ed /src/Fl_x.cxx
parentf3971319b9de0c52eaf8055e18bf02321440de1d (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.cxx52
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