mirror of https://github.com/fltk/fltk
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:
parent
70a9c4d407
commit
f8380476c2
28
src/Fl_x.cxx
28
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue