diff options
author | Dudemanguy <random342@airmail.cc> | 2023-05-24 16:21:51 -0500 |
---|---|---|
committer | Dudemanguy <random342@airmail.cc> | 2023-07-09 19:22:53 +0000 |
commit | 7beae9ac86e7b501d24e1ee8bd9b2986578d65c7 (patch) | |
tree | d6534a9e09722e34eccca14f965467a3395dcf90 /video/out | |
parent | 589da09e5a9f3bebf0fe3e81f191f988fd85ecc2 (diff) | |
download | mpv-7beae9ac86e7b501d24e1ee8bd9b2986578d65c7.tar.bz2 mpv-7beae9ac86e7b501d24e1ee8bd9b2986578d65c7.tar.xz |
wayland: add support for suspended toplevel state
mpv already guesses when the window is hidden so plugging in a proper
event that actually tells us this is really trivial. Note that there's
some redundancy with setting wl->hidden in a few spots, but nothing can
really be done about that as long as the crappy hack is still in place.
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/wayland_common.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index 8f0e5838ac..9ecef7d00e 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -63,6 +63,10 @@ #define CLOCK_MONOTONIC_RAW 4 #endif +#ifndef XDG_TOPLEVEL_STATE_SUSPENDED +#define XDG_TOPLEVEL_STATE_SUSPENDED 9 +#endif + static const struct mp_keymap keymap[] = { /* Special keys */ @@ -885,6 +889,7 @@ static void handle_toplevel_config(void *data, struct xdg_toplevel *toplevel, bool is_maximized = false; bool is_fullscreen = false; bool is_activated = false; + bool is_suspended = false; enum xdg_toplevel_state *state; wl_array_for_each(state, states) { switch (*state) { @@ -911,9 +916,15 @@ static void handle_toplevel_config(void *data, struct xdg_toplevel *toplevel, case XDG_TOPLEVEL_STATE_MAXIMIZED: is_maximized = true; break; + case XDG_TOPLEVEL_STATE_SUSPENDED: + is_suspended = true; + break; } } + if (wl->hidden != is_suspended) + wl->hidden = is_suspended; + if (vo_opts->fullscreen != is_fullscreen) { wl->state_change = true; vo_opts->fullscreen = is_fullscreen; @@ -1313,7 +1324,7 @@ static void registry_handle_add(void *data, struct wl_registry *reg, uint32_t id } if (!strcmp(interface, xdg_wm_base_interface.name) && found++) { - ver = MPMIN(ver, 4); /* Cap at 4 in case new events are added later. */ + ver = MPMIN(ver, 6); /* Cap at 6 in case new events are added later. */ wl->wm_base = wl_registry_bind(reg, id, &xdg_wm_base_interface, ver); xdg_wm_base_add_listener(wl->wm_base, &xdg_wm_base_listener, wl); } @@ -2532,7 +2543,8 @@ void vo_wayland_wait_frame(struct vo_wayland_state *wl) if (!wl->use_present && !wl_display_get_error(wl->display)) wl_display_roundtrip(wl->display); - if (wl->frame_wait) { + /* Only use this heuristic if the compositor doesn't support the suspended state. */ + if (wl->frame_wait && xdg_toplevel_get_version(wl->xdg_toplevel) < 6) { // Only consider consecutive missed callbacks. if (wl->timeout_count > 1) { wl->hidden = true; |