summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-17 15:38:47 +0200
committerwm4 <wm4@nowhere>2014-08-17 15:39:18 +0200
commit1e04c474ab59a61faf8d033bf2b8c0fbaf1ce1a1 (patch)
treed28664b63f43328070e4370840c06e0b42a7af4e
parentb36ed6d9f9d4d70a9099588b7569ebfc68a89b33 (diff)
downloadmpv-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.
-rwxr-xr-xold-configure2
-rw-r--r--video/out/x11_common.c16
-rw-r--r--video/out/x11_common.h2
-rw-r--r--wscript2
4 files changed, 20 insertions, 2 deletions
diff --git a/old-configure b/old-configure
index b4b1f7cf2b..b32c9f0598 100755
--- a/old-configure
+++ b/old-configure
@@ -634,7 +634,7 @@ fi
check_pkg_config "Xinerama" $_xinerama XINERAMA 'xinerama'
-check_pkg_config "Xrandr" $_xrandr XRANDR 'xrandr'
+check_pkg_config "Xrandr" $_xrandr XRANDR 'xrandr >= 1.2.0'
check_pkg_config "CACA" $_caca CACA 'caca >= 0.99.beta18'
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;
}
}
diff --git a/video/out/x11_common.h b/video/out/x11_common.h
index d1ccdd7223..4c11ad1465 100644
--- a/video/out/x11_common.h
+++ b/video/out/x11_common.h
@@ -50,6 +50,8 @@ struct vo_x11_state {
struct xrandr_display displays[MAX_DISPLAYS];
int num_displays;
+ int xrandr_event;
+
bool screensaver_enabled;
bool dpms_touched;
double screensaver_time_last;
diff --git a/wscript b/wscript
index 13b0e31e51..47cda430d4 100644
--- a/wscript
+++ b/wscript
@@ -569,7 +569,7 @@ video_output_features = [
'name': '--xrandr',
'desc': 'Xrandr',
'deps': [ 'x11' ],
- 'func': check_pkg_config('xrandr'),
+ 'func': check_pkg_config('xrandr', '>= 1.2.0'),
} , {
'name': '--gl-cocoa',
'desc': 'OpenGL Cocoa Backend',