summaryrefslogtreecommitdiff
path: root/src/platform/wayland/shell.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/wayland/shell.c')
-rw-r--r--src/platform/wayland/shell.c56
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 = {