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.
This commit is contained in:
ManoloFLTK 2024-03-12 15:40:45 +01:00
parent 70a9c4d407
commit f8380476c2
1 changed files with 12 additions and 16 deletions

View File

@ -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