diff options
author | wm4 <wm4@nowhere> | 2014-08-17 15:38:47 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-08-17 15:39:18 +0200 |
commit | 1e04c474ab59a61faf8d033bf2b8c0fbaf1ce1a1 (patch) | |
tree | d28664b63f43328070e4370840c06e0b42a7af4e /video/out/x11_common.c | |
parent | b36ed6d9f9d4d70a9099588b7569ebfc68a89b33 (diff) | |
download | mpv-1e04c474ab59a61faf8d033bf2b8c0fbaf1ce1a1.tar.bz2 mpv-1e04c474ab59a61faf8d033bf2b8c0fbaf1ce1a1.tar.xz |
x11: listen to xrandr events
If the Xrandr configuration changes, re-read it. So if you change
display modes or screen configuration, it will update the framedrop
refresh rate accordingly.
This passes the rootwin to XRRSelectInput(), which may or may not be
allowed. But it works, and the documentation (which is worse than used
toilet paper, great job Xorg) doesn't forbid it, or in fact say anything
about what the window parameter is even used for.
Diffstat (limited to 'video/out/x11_common.c')
-rw-r--r-- | video/out/x11_common.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/video/out/x11_common.c b/video/out/x11_common.c index f1b69e4f55..6d5485edf2 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -327,6 +327,17 @@ static void xrandr_read(struct vo_x11_state *x11) #if HAVE_XRANDR x11->num_displays = 0; + if (x11->xrandr_event < 0) { + int event_base, error_base; + if (!XRRQueryExtension(x11->display, &event_base, &error_base)) { + MP_VERBOSE(x11, "Couldn't init Xrandr.\n"); + return; + } + x11->xrandr_event = event_base + RRNotify; + XRRSelectInput(x11->display, x11->rootwin, RRScreenChangeNotifyMask | + RRCrtcChangeNotifyMask | RROutputChangeNotifyMask); + } + XRRScreenResources *r = XRRGetScreenResources(x11->display, x11->rootwin); if (!r) { MP_VERBOSE(x11, "Xrandr doesn't work.\n"); @@ -452,6 +463,7 @@ int vo_x11_init(struct vo *vo) *x11 = (struct vo_x11_state){ .log = mp_log_new(x11, vo->log, "x11"), .screensaver_enabled = true, + .xrandr_event = -1, }; vo->x11 = x11; @@ -932,6 +944,10 @@ int vo_x11_check_events(struct vo *vo) if (x11->ShmCompletionWaitCount > 0) x11->ShmCompletionWaitCount--; } + if (Event.type == x11->xrandr_event) { + xrandr_read(x11); + vo_x11_update_geometry(vo); + } break; } } |