summaryrefslogtreecommitdiff
path: root/src/wayland/shell.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wayland/shell.c')
-rw-r--r--src/wayland/shell.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/wayland/shell.c b/src/wayland/shell.c
index ef72512..bc8083a 100644
--- a/src/wayland/shell.c
+++ b/src/wayland/shell.c
@@ -277,24 +277,25 @@ static void toplevel_configure(void *data, struct xdg_toplevel *toplevel,
(void)toplevel;
struct yasl_surface *w = data;
- bool fs = false, max = false, act = false, susp = false, tiled = false;
+ uint32_t state_mask = 0;
uint32_t *s;
wl_array_for_each(s, states) {
- switch (*s) {
- case XDG_TOPLEVEL_STATE_FULLSCREEN: fs = true; break;
- case XDG_TOPLEVEL_STATE_MAXIMIZED: max = true; break;
- case XDG_TOPLEVEL_STATE_ACTIVATED: act = true; break;
- case XDG_TOPLEVEL_STATE_SUSPENDED: susp = true; break;
- case XDG_TOPLEVEL_STATE_TILED_LEFT:
- case XDG_TOPLEVEL_STATE_TILED_RIGHT:
- case XDG_TOPLEVEL_STATE_TILED_TOP:
- case XDG_TOPLEVEL_STATE_TILED_BOTTOM: tiled = true; break;
- default: break;
- }
+ if (*s < 32)
+ state_mask |= (1u << *s);
}
- if (fs != w->fullscreen || max != w->maximized ||
- act != w->activated || susp != w->suspended) {
+ bool max = (state_mask & (1u << XDG_TOPLEVEL_STATE_MAXIMIZED)) != 0;
+ bool fs = (state_mask & (1u << XDG_TOPLEVEL_STATE_FULLSCREEN)) != 0;
+ bool act = (state_mask & (1u << XDG_TOPLEVEL_STATE_ACTIVATED)) != 0;
+ bool susp = (state_mask & (1u << XDG_TOPLEVEL_STATE_SUSPENDED)) != 0;
+ bool tiled = (state_mask & (
+ (1u << XDG_TOPLEVEL_STATE_TILED_LEFT) |
+ (1u << XDG_TOPLEVEL_STATE_TILED_RIGHT) |
+ (1u << XDG_TOPLEVEL_STATE_TILED_TOP) |
+ (1u << XDG_TOPLEVEL_STATE_TILED_BOTTOM))) != 0;
+
+ if ((fs ^ w->fullscreen) | (max ^ w->maximized) |
+ (act ^ w->activated) | (susp ^ w->suspended)) {
w->fullscreen = fs;
w->maximized = max;
w->activated = act;