diff options
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/vo.h | 5 | ||||
-rw-r--r-- | video/out/wayland_common.c | 20 | ||||
-rw-r--r-- | video/out/wayland_common.h | 3 | ||||
-rw-r--r-- | video/out/x11_common.c | 6 |
4 files changed, 33 insertions, 1 deletions
diff --git a/video/out/vo.h b/video/out/vo.h index 1b7a239798..5deb99a6f1 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -48,10 +48,11 @@ enum { // Special thing for encode mode (vo_driver.initially_blocked). // Part of VO_EVENTS_USER to make vo_is_ready_for_frame() work properly. VO_EVENT_INITIAL_UNBLOCK = 1 << 7, + VO_EVENT_FOCUS = 1 << 8, // Set of events the player core may be interested in. VO_EVENTS_USER = VO_EVENT_RESIZE | VO_EVENT_WIN_STATE | VO_EVENT_DPI | - VO_EVENT_INITIAL_UNBLOCK, + VO_EVENT_INITIAL_UNBLOCK | VO_EVENT_FOCUS, }; enum mp_voctrl { @@ -99,6 +100,8 @@ enum mp_voctrl { VOCTRL_GET_UNFS_WINDOW_SIZE, // int[2] (w/h) VOCTRL_SET_UNFS_WINDOW_SIZE, // int[2] (w/h) + VOCTRL_GET_FOCUSED, // bool* + // char *** (NULL terminated array compatible with CONF_TYPE_STRING_LIST) // names for displays the window is on VOCTRL_GET_DISPLAY_NAMES, diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index a79c8aa8ca..c6c0e342c9 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -447,11 +447,15 @@ static void keyboard_handle_enter(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface, struct wl_array *keys) { + struct vo_wayland_state *wl = data; + wl->has_keyboard_input = true; } static void keyboard_handle_leave(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, struct wl_surface *surface) { + struct vo_wayland_state *wl = data; + wl->has_keyboard_input = false; } static bool create_input(struct vo_wayland_state *wl) @@ -951,6 +955,7 @@ static void handle_toplevel_config(void *data, struct xdg_toplevel *toplevel, bool is_maximized = false; bool is_fullscreen = false; + bool is_activated = false; enum xdg_toplevel_state *state; wl_array_for_each(state, states) { switch (*state) { @@ -961,6 +966,7 @@ static void handle_toplevel_config(void *data, struct xdg_toplevel *toplevel, wl->pending_vo_events |= VO_EVENT_LIVE_RESIZING; break; case XDG_TOPLEVEL_STATE_ACTIVATED: + is_activated = true; /* * If we get an ACTIVATED state, we know it cannot be * minimized, but it may not have been minimized @@ -992,6 +998,16 @@ static void handle_toplevel_config(void *data, struct xdg_toplevel *toplevel, m_config_cache_write_opt(wl->vo_opts_cache, &vo_opts->window_maximized); } + if (wl->activated != is_activated) { + wl->activated = is_activated; + if ((!wl->focused && wl->activated && wl->has_keyboard_input) || + (wl->focused && !wl->activated)) + { + wl->focused = !wl->focused; + wl->pending_vo_events |= VO_EVENT_FOCUS; + } + } + if (!(wl->pending_vo_events & VO_EVENT_LIVE_RESIZING)) vo_query_and_reset_events(wl->vo, VO_EVENT_LIVE_RESIZING); @@ -1544,6 +1560,10 @@ int vo_wayland_control(struct vo *vo, int *events, int request, void *arg) } return VO_TRUE; } + case VOCTRL_GET_FOCUSED: { + *(bool *)arg = wl->focused; + return VO_TRUE; + } case VOCTRL_GET_DISPLAY_NAMES: { *(char ***)arg = get_displays_spanned(wl); return VO_TRUE; diff --git a/video/out/wayland_common.h b/video/out/wayland_common.h index 65f7cbf3e5..7eec7be2d5 100644 --- a/video/out/wayland_common.h +++ b/video/out/wayland_common.h @@ -76,6 +76,9 @@ struct vo_wayland_state { bool frame_wait; bool state_change; bool toplevel_configured; + bool activated; + bool has_keyboard_input; + bool focused; int wakeup_pipe[2]; int pending_vo_events; int mouse_x; diff --git a/video/out/x11_common.c b/video/out/x11_common.c index 461ff378d0..92b3539aca 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -1128,11 +1128,13 @@ void vo_x11_check_events(struct vo *vo) case FocusIn: x11->has_focus = true; vo_update_cursor(vo); + x11->pending_vo_events |= VO_EVENT_FOCUS; break; case FocusOut: release_all_keys(vo); x11->has_focus = false; vo_update_cursor(vo); + x11->pending_vo_events |= VO_EVENT_FOCUS; break; case KeyRelease: release_all_keys(vo); @@ -1878,6 +1880,10 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg) } return VO_TRUE; } + case VOCTRL_GET_FOCUSED: { + *(bool *)arg = x11->has_focus; + return VO_TRUE; + } case VOCTRL_GET_DISPLAY_NAMES: { if (!x11->pseudo_mapped) return VO_FALSE; |