From f8380476c29d6b9b91c8ef3a61d85899e6d0fd4a Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:40:45 +0100 Subject: 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. --- src/Fl_x.cxx | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'src') 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 -- cgit v1.2.3