diff options
-rw-r--r-- | DOCS/client-api-changes.rst | 5 | ||||
-rw-r--r-- | DOCS/client_api_examples/qtexample.cpp | 4 | ||||
-rw-r--r-- | DOCS/client_api_examples/simple.c | 1 | ||||
-rw-r--r-- | DOCS/man/options.rst | 18 | ||||
-rw-r--r-- | input/input.c | 11 | ||||
-rw-r--r-- | input/input.h | 2 | ||||
-rw-r--r-- | libmpv/client.h | 2 | ||||
-rw-r--r-- | player/client.c | 1 | ||||
-rw-r--r-- | video/out/x11_common.c | 18 |
9 files changed, 49 insertions, 13 deletions
diff --git a/DOCS/client-api-changes.rst b/DOCS/client-api-changes.rst index b689921e48..be6d86cd46 100644 --- a/DOCS/client-api-changes.rst +++ b/DOCS/client-api-changes.rst @@ -25,7 +25,12 @@ API changes :: + 1.5 - change in X11 and "--wid" behavior again. The previous change didn't + work as expected, and now the behavior can be explicitly controlled + with the "input-x11-keyboard" option. This is only a temporary + measure until XEmbed is implemented and confirmed working. 1.4 - subtle change in X11 and "--wid" behavior + (this change was added to 0.5.2, and broke some things, see #1090) --- mpv 0.5.0 is released --- 1.3 - add MPV_MAKE_VERSION() 1.2 - remove "stream-time-pos" property (no replacement) diff --git a/DOCS/client_api_examples/qtexample.cpp b/DOCS/client_api_examples/qtexample.cpp index 39dc1fd1d4..84b1102055 100644 --- a/DOCS/client_api_examples/qtexample.cpp +++ b/DOCS/client_api_examples/qtexample.cpp @@ -53,6 +53,10 @@ MainWindow::MainWindow(QWidget *parent) : // mpv as backend would implement its own key bindings. mpv_set_option_string(mpv, "input-default-bindings", "yes"); + // Enable keyboard input on the X11 window. For the messy details, see + // --input-x11-keyboard on the manpage. + mpv_set_option_string(mpv, "input-x11-keyboard", "yes"); + // Let us receive property change events with MPV_EVENT_PROPERTY_CHANGE if // this property changes. mpv_observe_property(mpv, 0, "time-pos", MPV_FORMAT_DOUBLE); diff --git a/DOCS/client_api_examples/simple.c b/DOCS/client_api_examples/simple.c index d3a4c78c26..6dbc40506a 100644 --- a/DOCS/client_api_examples/simple.c +++ b/DOCS/client_api_examples/simple.c @@ -21,6 +21,7 @@ int main(int argc, char *argv[]) // Enable default key bindings, so the user can actually interact with // the player (and e.g. close the window). check_error(mpv_set_option_string(ctx, "input-default-bindings", "yes")); + mpv_set_option_string(ctx, "input-x11-keyboard", "yes"); int val = 1; check_error(mpv_set_option(ctx, "osc", MPV_FORMAT_FLAG, &val)); diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index b61484ccfe..b0292ae90c 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -2163,6 +2163,24 @@ Input Use the right Alt key as Alt Gr to produce special characters. If disabled, count the right Alt as an Alt modifier key. Enabled by default. +``--input-x11-keyboard=<yes|no>`` + Disable all keyboard input on the X11 VO window. Generally useful for + embedding only. + + On X11, a sub-window with input enabled grabs all keyboard input as long + as it is 1. a child of a focused window, and 2. the mouse is inside of + the sub-window. The can steal away all keyboard input from the + application embedding the mpv window, and on the other hand, the mpv + window will receive no input if the mouse is outside of the mpv window, + even though mpv has focus. Modern toolkits work around this weird X11 + behavior, but naively embedding foreign windows breaks it. + + The only way to handle this reasonably is using the XEmbed protocol, which + was designed to solve these problems. But Qt has questionable support, and + mpv doesn't implement it yet. + + As a workaround, this option is disabled by default in libmpv. (Note that + ``input-default-bindings`` is disabled by default in libmpv as well.) OSD --- diff --git a/input/input.c b/input/input.c index c0c5b57cd8..dd3e0b33c4 100644 --- a/input/input.c +++ b/input/input.c @@ -175,6 +175,7 @@ struct input_opts { int use_media_keys; int default_bindings; int enable_mouse_movements; + int x11_key_input; int test; }; @@ -195,6 +196,7 @@ const struct m_sub_options input_config = { OPT_FLAG("right-alt-gr", use_alt_gr, CONF_GLOBAL), OPT_INTRANGE("key-fifo-size", key_fifo_size, CONF_GLOBAL, 2, 65000), OPT_FLAG("cursor", enable_mouse_movements, CONF_GLOBAL), + OPT_FLAG("x11-keyboard", x11_key_input, CONF_GLOBAL), #if HAVE_LIRC OPT_STRING("lirc-conf", lirc_configfile, CONF_GLOBAL), #endif @@ -218,6 +220,7 @@ const struct m_sub_options input_config = { .use_media_keys = 1, #endif .default_bindings = 1, + .x11_key_input = 1, }, }; @@ -706,6 +709,14 @@ bool mp_input_mouse_enabled(struct input_ctx *ictx) return r; } +bool mp_input_x11_keyboard_enabled(struct input_ctx *ictx) +{ + input_lock(ictx); + bool r = ictx->opts->x11_key_input; + input_unlock(ictx); + return r; +} + void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y) { input_lock(ictx); diff --git a/input/input.h b/input/input.h index 9a6596d3d2..39489fff75 100644 --- a/input/input.h +++ b/input/input.h @@ -156,6 +156,8 @@ void mp_input_get_mouse_pos(struct input_ctx *ictx, int *x, int *y); // Return whether we want/accept mouse input. bool mp_input_mouse_enabled(struct input_ctx *ictx); +bool mp_input_x11_keyboard_enabled(struct input_ctx *ictx); + /* Make mp_input_set_mouse_pos() mangle the mouse coordinates. Hack for certain * VOs. dst=NULL, src=NULL reset it. src can be NULL. */ diff --git a/libmpv/client.h b/libmpv/client.h index 1b41a43361..9e8909ec56 100644 --- a/libmpv/client.h +++ b/libmpv/client.h @@ -162,7 +162,7 @@ extern "C" { * relational operators (<, >, <=, >=). */ #define MPV_MAKE_VERSION(major, minor) (((major) << 16) | (minor) | 0UL) -#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 4) +#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 5) /** * Return the MPV_CLIENT_API_VERSION the mpv source has been compiled with. diff --git a/player/client.c b/player/client.c index b9ad7d47c4..a7700fbd1c 100644 --- a/player/client.c +++ b/player/client.c @@ -403,6 +403,7 @@ mpv_handle *mpv_create(void) mpv_set_option_string(ctx, "terminal", "no"); mpv_set_option_string(ctx, "osc", "no"); mpv_set_option_string(ctx, "input-default-bindings", "no"); + mpv_set_option_string(ctx, "input-x11-keyboard", "no"); mpv_set_option_string(ctx, "input-lirc", "no"); } else { mp_destroy(mpctx); diff --git a/video/out/x11_common.c b/video/out/x11_common.c index ab700be5e0..390d40a024 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -1254,15 +1254,12 @@ static void vo_x11_map_window(struct vo *vo, struct mp_rect rc) } // map window - int events = StructureNotifyMask | ExposureMask | PropertyChangeMask; - if (vo->opts->WinID > 0) { - XWindowAttributes attribs; - if (XGetWindowAttributes(x11->display, vo->opts->WinID, &attribs)) - events |= attribs.your_event_mask; - } else { - events |= KeyPressMask | KeyReleaseMask | ButtonPressMask | - ButtonReleaseMask | PointerMotionMask | LeaveWindowMask; - } + int events = StructureNotifyMask | ExposureMask | PropertyChangeMask | + LeaveWindowMask; + if (mp_input_mouse_enabled(vo->input_ctx)) + events |= PointerMotionMask | ButtonPressMask | ButtonReleaseMask; + if (mp_input_x11_keyboard_enabled(vo->input_ctx)) + events |= KeyPressMask | KeyReleaseMask; vo_x11_selectinput_witherr(vo, x11->display, x11->window, events); XMapWindow(x11->display, x11->window); } @@ -1667,9 +1664,6 @@ static void vo_x11_selectinput_witherr(struct vo *vo, Window w, long event_mask) { - if (!mp_input_mouse_enabled(vo->input_ctx)) - event_mask &= ~(PointerMotionMask | ButtonPressMask | ButtonReleaseMask); - XSelectInput(display, w, NoEventMask); // NOTE: this can raise BadAccess, which should be ignored by the X error |