From e8d545a9770a2473db32e0a0bfa757b05d2af4f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= Date: Sun, 23 Jul 2023 20:30:43 -0600 Subject: [PATCH] xdg-shell: add support for v6 This adds the suspended toplevel state --- include/wlr/types/wlr_xdg_shell.h | 11 +++++++++-- types/xdg_shell/wlr_xdg_shell.c | 2 +- types/xdg_shell/wlr_xdg_toplevel.c | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/include/wlr/types/wlr_xdg_shell.h b/include/wlr/types/wlr_xdg_shell.h index ac2e097dc..9cae226cf 100644 --- a/include/wlr/types/wlr_xdg_shell.h +++ b/include/wlr/types/wlr_xdg_shell.h @@ -127,7 +127,7 @@ enum wlr_xdg_surface_role { }; struct wlr_xdg_toplevel_state { - bool maximized, fullscreen, resizing, activated; + bool maximized, fullscreen, resizing, activated, suspended; uint32_t tiled; // enum wlr_edges int32_t width, height; int32_t max_width, max_height; @@ -148,7 +148,7 @@ enum wlr_xdg_toplevel_configure_field { struct wlr_xdg_toplevel_configure { uint32_t fields; // enum wlr_xdg_toplevel_configure_field - bool maximized, fullscreen, resizing, activated; + bool maximized, fullscreen, resizing, activated, suspended; uint32_t tiled; // enum wlr_edges int32_t width, height; struct { @@ -383,6 +383,13 @@ uint32_t wlr_xdg_toplevel_set_bounds(struct wlr_xdg_toplevel *toplevel, uint32_t wlr_xdg_toplevel_set_wm_capabilities(struct wlr_xdg_toplevel *toplevel, uint32_t caps); +/** + * Request that this toplevel consider itself suspended or not + * suspended. Returns the associated configure serial. + */ +uint32_t wlr_xdg_toplevel_set_suspended(struct wlr_xdg_toplevel *toplevel, + bool suspended); + /** * Request that this toplevel closes. */ diff --git a/types/xdg_shell/wlr_xdg_shell.c b/types/xdg_shell/wlr_xdg_shell.c index 70b777dd9..3e8985d36 100644 --- a/types/xdg_shell/wlr_xdg_shell.c +++ b/types/xdg_shell/wlr_xdg_shell.c @@ -2,7 +2,7 @@ #include #include "types/wlr_xdg_shell.h" -#define WM_BASE_VERSION 5 +#define WM_BASE_VERSION 6 static const struct xdg_wm_base_interface xdg_shell_impl; diff --git a/types/xdg_shell/wlr_xdg_toplevel.c b/types/xdg_shell/wlr_xdg_toplevel.c index cc3a31c3c..1e5617a7d 100644 --- a/types/xdg_shell/wlr_xdg_toplevel.c +++ b/types/xdg_shell/wlr_xdg_toplevel.c @@ -14,6 +14,7 @@ void handle_xdg_toplevel_ack_configure( toplevel->pending.resizing = configure->resizing; toplevel->pending.activated = configure->activated; toplevel->pending.tiled = configure->tiled; + toplevel->pending.suspended = configure->suspended; toplevel->pending.width = configure->width; toplevel->pending.height = configure->height; @@ -99,6 +100,11 @@ struct wlr_xdg_toplevel_configure *send_xdg_toplevel_configure( states[nstates++] = XDG_TOPLEVEL_STATE_MAXIMIZED; } } + + if (configure->suspended && + version >= XDG_TOPLEVEL_STATE_SUSPENDED_SINCE_VERSION) { + states[nstates++] = XDG_TOPLEVEL_STATE_SUSPENDED; + } assert(nstates <= sizeof(states) / sizeof(states[0])); int32_t width = configure->width; @@ -617,3 +623,11 @@ uint32_t wlr_xdg_toplevel_set_wm_capabilities(struct wlr_xdg_toplevel *toplevel, toplevel->scheduled.wm_capabilities = caps; return wlr_xdg_surface_schedule_configure(toplevel->base); } + +uint32_t wlr_xdg_toplevel_set_suspended(struct wlr_xdg_toplevel *toplevel, + bool suspended) { + assert(toplevel->base->client->shell->version >= + XDG_TOPLEVEL_STATE_SUSPENDED_SINCE_VERSION); + toplevel->scheduled.suspended = suspended; + return wlr_xdg_surface_schedule_configure(toplevel->base); +}