summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-05-02 21:21:53 +0200
committerwm4 <wm4@nowhere>2016-05-02 21:21:53 +0200
commit8a26e139af6e1534d63947d2ef0aed920248b051 (patch)
treebe1a9c3d49471b3b3497824eb6dea63a19ac4789
parentf54e555d27ba4e2bf2209002a8f1582cd5837f33 (diff)
downloadmpv-8a26e139af6e1534d63947d2ef0aed920248b051.tar.bz2
mpv-8a26e139af6e1534d63947d2ef0aed920248b051.tar.xz
x11: extend --x11-bypass-compositor with fs-only option
The "fs-only" choice sets the _NET_WM_BYPASS_COMPOSITOR to 1 if the window is fullscreened, and 0 otherwise. (0 is specified to be the implicit default - i.e. no change is requested in windowed mode.) In particular, change the default to "fs-only". Fixes #2582.
-rw-r--r--options/options.c5
-rw-r--r--video/out/x11_common.c28
2 files changed, 25 insertions, 8 deletions
diff --git a/options/options.c b/options/options.c
index 16725e0478..0487986f8f 100644
--- a/options/options.c
+++ b/options/options.c
@@ -460,7 +460,8 @@ const m_option_t mp_opts[] = {
#if HAVE_X11
OPT_CHOICE("x11-netwm", vo.x11_netwm, 0,
({"auto", 0}, {"no", -1}, {"yes", 1})),
- OPT_FLAG("x11-bypass-compositor", vo.x11_bypass_compositor, 0),
+ OPT_CHOICE("x11-bypass-compositor", vo.x11_bypass_compositor, 0,
+ ({"no", 0}, {"yes", 1}, {"fs-only", 2})),
#endif
#if HAVE_WIN32
OPT_STRING("vo-mmcss-profile", vo.mmcss_profile, M_OPT_FIXED),
@@ -712,7 +713,7 @@ const struct MPOpts mp_default_opts = {
.fit_border = 1,
.WinID = -1,
.window_scale = 1.0,
- .x11_bypass_compositor = 0,
+ .x11_bypass_compositor = 2,
.mmcss_profile = "Playback",
},
.allow_win_drag = 1,
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 034f785cbc..c42e78c97b 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -950,6 +950,21 @@ static int get_mods(unsigned int state)
return modifiers;
}
+static void vo_x11_update_composition_hint(struct vo *vo)
+{
+ struct vo_x11_state *x11 = vo->x11;
+
+ long hint = 0;
+ switch (vo->opts->x11_bypass_compositor) {
+ case 0: hint = 0; break; // leave default
+ case 1: hint = 1; break; // always bypass
+ case 2: hint = x11->fs ? 1 : 0; break; // bypass in FS
+ }
+
+ XChangeProperty(x11->display, x11->window, XA(x11,_NET_WM_BYPASS_COMPOSITOR),
+ XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&hint, 1);
+}
+
static void vo_x11_check_net_wm_state_fullscreen_change(struct vo *vo)
{
struct vo_x11_state *x11 = vo->x11;
@@ -986,6 +1001,8 @@ static void vo_x11_check_net_wm_state_fullscreen_change(struct vo *vo)
x11->size_changed_during_fs = false;
x11->pos_changed_during_fs = false;
+
+ vo_x11_update_composition_hint(vo);
}
}
}
@@ -1437,12 +1454,7 @@ static void vo_x11_create_window(struct vo *vo, XVisualInfo *vis,
}
if (!x11->parent) {
- if (vo->opts->x11_bypass_compositor) {
- long v = 1; // request disabling compositor
- XChangeProperty(x11->display, x11->window,
- XA(x11,_NET_WM_BYPASS_COMPOSITOR), XA_CARDINAL, 32,
- PropModeReplace, (unsigned char *)&v, 1);
- }
+ vo_x11_update_composition_hint(vo);
vo_x11_set_wm_icon(x11);
vo_x11_update_window_title(vo);
vo_x11_dnd_init_window(vo);
@@ -1485,6 +1497,8 @@ static void vo_x11_map_window(struct vo *vo, struct mp_rect rc)
XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&v, 1);
}
+ vo_x11_update_composition_hint(vo);
+
// map window
int events = StructureNotifyMask | ExposureMask | PropertyChangeMask |
LeaveWindowMask | EnterWindowMask;
@@ -1731,6 +1745,8 @@ static void vo_x11_fullscreen(struct vo *vo)
x11->size_changed_during_fs = false;
x11->pos_changed_during_fs = false;
+
+ vo_x11_update_composition_hint(vo);
}
int vo_x11_control(struct vo *vo, int *events, int request, void *arg)