diff options
| author | Berke Güzel <wenekar1@gmail.com> | 2026-10-13 15:05:06 +0300 |
|---|---|---|
| committer | Berke Güzel <wenekar1@gmail.com> | 2026-10-13 15:05:06 +0300 |
| commit | 98f0d51157fa2a2b8ccaae54ed4850a88d223d01 (patch) | |
| tree | 90b03d0930986620d95eb0f45c07b96e1331783c /src/platform/wayland/shell.c | |
| parent | 339e1ad7adb8340732ee856d0f6f0d2c7f1455d1 (diff) | |
Simplify surface state, examples, and library installation
Diffstat (limited to 'src/platform/wayland/shell.c')
| -rw-r--r-- | src/platform/wayland/shell.c | 56 |
1 files changed, 27 insertions, 29 deletions
diff --git a/src/platform/wayland/shell.c b/src/platform/wayland/shell.c index 4c1caad..92c89d1 100644 --- a/src/platform/wayland/shell.c +++ b/src/platform/wayland/shell.c @@ -265,10 +265,12 @@ static const struct xdg_wm_base_listener wm_base_listener = { .ping = wm_base_ping, }; -static void notify_state(struct wayland_surface *w) +static void set_state(struct wayland_surface *w, uint32_t state) { + if (state == w->base.state) return; + w->base.state = state; if (w->cbs && w->cbs->state) - w->cbs->state(&w->base, wayland_surface_state(w), w->ud); + w->cbs->state(&w->base, state, w->ud); } static void toplevel_configure(void *data, struct xdg_toplevel *toplevel, @@ -277,35 +279,29 @@ static void toplevel_configure(void *data, struct xdg_toplevel *toplevel, (void)toplevel; struct wayland_surface *w = data; - uint32_t state_mask = 0; + uint32_t state = w->base.state & ~(YASL_STATE_FULLSCREEN | + YASL_STATE_MAXIMIZED | YASL_STATE_ACTIVATED | + YASL_STATE_SUSPENDED | YASL_STATE_TILED); uint32_t *s; wl_array_for_each(s, states) { - if (*s < 32) - state_mask |= (1u << *s); + switch (*s) { + case XDG_TOPLEVEL_STATE_FULLSCREEN: state |= YASL_STATE_FULLSCREEN; break; + case XDG_TOPLEVEL_STATE_MAXIMIZED: state |= YASL_STATE_MAXIMIZED; break; + case XDG_TOPLEVEL_STATE_ACTIVATED: state |= YASL_STATE_ACTIVATED; break; + case XDG_TOPLEVEL_STATE_SUSPENDED: state |= YASL_STATE_SUSPENDED; 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: + state |= YASL_STATE_TILED; + break; + default: break; + } } - 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; - w->suspended = susp; - notify_state(w); - } - - w->tiled = tiled; w->req_width = width; w->req_height = height; + set_state(w, state); } static void toplevel_close(void *data, struct xdg_toplevel *toplevel) @@ -363,10 +359,12 @@ static void toplevel_decoration_configure(void *data, { (void)toplevel_decor; struct wayland_surface *w = data; - bool was_server = w->server_decorated; - w->server_decorated = (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); - if (was_server != w->server_decorated) - notify_state(w); + uint32_t state = w->base.state; + if (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE) + state &= ~YASL_STATE_CSD; + else + state |= YASL_STATE_CSD; + set_state(w, state); } static const struct zxdg_toplevel_decoration_v1_listener toplevel_decoration_listener = { |
