summaryrefslogtreecommitdiffstats
path: root/video/out/x11_common.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-01-19 16:30:38 +0100
committerwm4 <wm4@nowhere>2017-01-19 16:31:54 +0100
commita35a5bb5f3c67f867ac6a21cad479657085f0230 (patch)
tree5d61617c9be2994edfbfeabf1926e689e4df9b2b /video/out/x11_common.c
parent4adfde5dd1e67775228a345cea00ea03ba6bc68f (diff)
downloadmpv-a35a5bb5f3c67f867ac6a21cad479657085f0230.tar.bz2
mpv-a35a5bb5f3c67f867ac6a21cad479657085f0230.tar.xz
x11: pseudo HiDPI scaling
Scale the window by the assumed DPI scaling factor, using 96 DPI as base. For example, a screen that reports 192 DPI is assumed to have a DPI scale factor 2. The window will then be created with twice the size. For robustness reasons, we accept only integer DPI scales between 1 and 9. We also error out if the X and Y scales are very different, as this most likely indicates a multiscreen system with botched size reporting. I'm not sure if reading the X server's DPI is such a good idea - maybe the Xrdb "Xft.dpi" value should be used instead. The current method follows what xdpyinfo does. This can be disabled with --hidpi-window-scale=no.
Diffstat (limited to 'video/out/x11_common.c')
-rw-r--r--video/out/x11_common.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index d42eb70dde..6f3cc41637 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -544,6 +544,7 @@ int vo_x11_init(struct vo *vo)
.screensaver_enabled = true,
.xrandr_event = -1,
.wakeup_pipe = {-1, -1},
+ .dpi_scale = 1,
};
vo->x11 = x11;
@@ -595,6 +596,22 @@ int vo_x11_init(struct vo *vo)
x11->ws_width, x11->ws_height, dispName,
x11->display_is_local ? "local" : "remote");
+ int w_mm = DisplayWidthMM(x11->display, x11->screen);
+ int h_mm = DisplayHeightMM(x11->display, x11->screen);
+ double dpi_x = x11->ws_width * 25.4 / w_mm;
+ double dpi_y = x11->ws_height * 25.4 / h_mm;
+ double base_dpi = 96;
+ if (isfinite(dpi_x) && isfinite(dpi_y)) {
+ int s_x = lrint(MPCLAMP(dpi_x / base_dpi, 0, 10));
+ int s_y = lrint(MPCLAMP(dpi_y / base_dpi, 0, 10));
+ if (s_x == s_y && s_x > 1 && s_x < 10) {
+ x11->dpi_scale = s_x;
+ MP_VERBOSE(x11, "Assuming DPI scale %d for prescaling. This can "
+ "be disabled with --hidpi-window-scale=no.\n",
+ x11->dpi_scale);
+ }
+ }
+
x11->wm_type = vo_wm_detect(vo);
x11->event_fd = ConnectionNumber(x11->display);
@@ -1604,7 +1621,7 @@ void vo_x11_config_vo_window(struct vo *vo)
vo_x11_update_screeninfo(vo);
struct vo_win_geometry geo;
- vo_calc_window_geometry(vo, &x11->screenrc, &geo);
+ vo_calc_window_geometry2(vo, &x11->screenrc, x11->dpi_scale, &geo);
vo_apply_window_geometry(vo, &geo);
struct mp_rect rc = geo.win;