summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
Diffstat (limited to 'video/out')
-rw-r--r--video/out/vo.h5
-rw-r--r--video/out/wayland_common.c20
-rw-r--r--video/out/wayland_common.h3
-rw-r--r--video/out/x11_common.c6
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;