diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-03-12 15:40:45 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2024-03-12 15:40:45 +0100 |
| commit | f8380476c29d6b9b91c8ef3a61d85899e6d0fd4a (patch) | |
| tree | 5f8f9c6e297281f165fcff405ab0d75457ee1233 | |
| parent | 70a9c4d40768a1221dcc8fd9614aec55f0496394 (diff) | |
using xlib to query the new DPI (old #910) (PR #913)
Thanks to Mike Qin for finding how to query the possibly changed DPI value
of an X11 display while an FLTK app keeps running without running
an external command in a pipe.
| -rw-r--r-- | src/Fl_x.cxx | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 67ed872dc..9f22b0847 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -1215,24 +1215,20 @@ static void react_to_screen_reconfiguration() { #if USE_XFT static void after_display_rescale(float *p_current_xft_dpi) { - FILE *pipe = popen("xrdb -query", "r"); - if (!pipe) return; - char line[100]; - while (fgets(line, sizeof(line), pipe) != NULL) { - if (memcmp(line, "Xft.dpi:", 8)) continue; - float dpi; - if (sscanf(line+8, "%f", &dpi) == 1) { - //fprintf(stderr," previous=%g dpi=%g \n", *p_current_xft_dpi, dpi); - if (fabs(dpi - *p_current_xft_dpi) > 0.01) { - *p_current_xft_dpi = dpi; - float f = dpi/96.; - for (int i = 0; i < Fl::screen_count(); i++) - Fl::screen_driver()->rescale_all_windows_from_screen(i, f, f); - } + Display *new_dpy = XOpenDisplay(XDisplayString(fl_display)); + if (!new_dpy) return; + char *s = XGetDefault(new_dpy, "Xft", "dpi"); + float dpi; + if (s && sscanf(s, "%f", &dpi) == 1) { + //printf("%s previous=%g dpi=%g \n", s, *p_current_xft_dpi, dpi); + if (fabs(dpi - *p_current_xft_dpi) > 0.1) { + *p_current_xft_dpi = dpi; + float f = dpi / 96.; + for (int i = 0; i < Fl::screen_count(); i++) + Fl::screen_driver()->rescale_all_windows_from_screen(i, f, f); } - break; } - pclose(pipe); + XCloseDisplay(new_dpy); } #endif // USE_XFT |
