diff options
| author | Berke Güzel <wenekar1@gmail.com> | 2026-10-11 23:27:41 +0300 |
|---|---|---|
| committer | Berke Güzel <wenekar1@gmail.com> | 2026-10-11 23:27:41 +0300 |
| commit | 472ed3e4e50a165638acecaf071ec3c2c13c451f (patch) | |
| tree | d1894debde800d8e87d3c242ae6c3f4760c68787 /src/wayland/shell.c | |
| parent | 8d9f7c7cb39359d62bf28ef1775b944a7dddd6fb (diff) | |
core: optimize struct layouts, eliminate branches, and fix event loop dispatch
- Fix Wayland event loop lockout by properly decoupling read arming and adding poll-backed dispatching
- Support standalone display lifecycle without requiring caller to manage a loop
- Eliminate alignment holes across yasl_surface, yasl_display, seat, touch_point, and conn_drag using pahole
- Replace branching state/button decoders with compile-time locked LUTs and branchless bitwise operations
- Accelerate UTF-8 validation with 64-bit word scanning for ASCII runs
Diffstat (limited to 'src/wayland/shell.c')
| -rw-r--r-- | src/wayland/shell.c | 29 |
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; |
