From 5af4ca8015d8a8a64e93ff38e77278e5bc6f9f29 Mon Sep 17 00:00:00 2001 From: speckitor Date: Wed, 29 Apr 2026 17:32:57 +0700 Subject: [PATCH] bounds and anonymus union in absinthe_toplevel --- include/output.h | 2 ++ include/types.h | 6 ++--- src/absinthe-toplevel-handlers.c | 24 ++++++++--------- src/absinthe-toplevel.c | 44 +++++++++++++++++--------------- src/cursor.c | 10 ++++---- src/focus.c | 6 ++--- src/server.c | 12 ++++----- src/xdg-decoration.c | 2 +- src/xdg-toplevel.c | 8 +++--- src/xwayland.c | 14 +++++----- 10 files changed, 68 insertions(+), 60 deletions(-) diff --git a/include/output.h b/include/output.h index a357051..128ac60 100644 --- a/include/output.h +++ b/include/output.h @@ -2,6 +2,8 @@ #include +#include "types.h" + void output_frame(struct wl_listener *listener, void *data); void output_request_state(struct wl_listener *listener, void *data); void output_destroy(struct wl_listener *listener, void *data); diff --git a/include/types.h b/include/types.h index 9cab68a..add5fb5 100644 --- a/include/types.h +++ b/include/types.h @@ -148,9 +148,9 @@ struct absinthe_toplevel { struct wlr_box prev_geometry; union { - struct wlr_xdg_toplevel *xdg; - struct wlr_xwayland_surface *x11; - } toplevel; + struct wlr_xdg_toplevel *xdg_toplevel; + struct wlr_xwayland_surface *xwayland_surface; + }; struct wl_listener map; struct wl_listener unmap; struct wl_listener commit; diff --git a/src/absinthe-toplevel-handlers.c b/src/absinthe-toplevel-handlers.c index 874f53f..b59c16c 100644 --- a/src/absinthe-toplevel-handlers.c +++ b/src/absinthe-toplevel-handlers.c @@ -17,11 +17,11 @@ void absinthe_toplevel_map(struct wl_listener *listener, void *data) toplevel->tiled = true; if (toplevel->type != ABSINTHE_TOPLEVEL_X11 && - wl_resource_get_version(toplevel->toplevel.xdg->resource) >= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) { - wlr_xdg_toplevel_set_tiled(toplevel->toplevel.xdg, + wl_resource_get_version(toplevel->xdg_toplevel->resource) >= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) { + wlr_xdg_toplevel_set_tiled(toplevel->xdg_toplevel, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); } else { - wlr_xdg_toplevel_set_maximized(toplevel->toplevel.xdg, true); + wlr_xdg_toplevel_set_maximized(toplevel->xdg_toplevel, true); } toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) ? 0 : ABSINTHE_TOPLEVEL_BORDER_WIDTH; @@ -29,12 +29,12 @@ void absinthe_toplevel_map(struct wl_listener *listener, void *data) #ifdef XWAYLAND if (toplevel->type == ABSINTHE_TOPLEVEL_X11) { toplevel->scene_surface = - wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->toplevel.x11->surface); + wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xwayland_surface->surface); } else #endif { toplevel->scene_surface = - wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->toplevel.xdg->base->surface); + wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xdg_toplevel->base->surface); } toplevel->scene_surface->node.data = toplevel; @@ -109,29 +109,29 @@ void absinthe_toplevel_request_move(struct wl_listener *listener, void *data) { UNUSED(data); struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize); - if (toplevel->toplevel.xdg->base->initialized) - wlr_xdg_surface_schedule_configure(toplevel->toplevel.xdg->base); + if (toplevel->xdg_toplevel->base->initialized) + wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base); } void absinthe_toplevel_request_resize(struct wl_listener *listener, void *data) { UNUSED(data); struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize); - if (toplevel->toplevel.xdg->base->initialized) - wlr_xdg_surface_schedule_configure(toplevel->toplevel.xdg->base); + if (toplevel->xdg_toplevel->base->initialized) + wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base); } void absinthe_toplevel_request_maximize(struct wl_listener *listener, void *data) { UNUSED(data); struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize); - if (toplevel->toplevel.xdg->base->initialized) - wlr_xdg_surface_schedule_configure(toplevel->toplevel.xdg->base); + if (toplevel->xdg_toplevel->base->initialized) + wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base); } void absinthe_toplevel_request_fullscreen(struct wl_listener *listener, void *data) { UNUSED(data); struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_fullscreen); - absinthe_toplevel_set_fullscreen(toplevel, toplevel->toplevel.xdg->requested.fullscreen); + absinthe_toplevel_set_fullscreen(toplevel, toplevel->xdg_toplevel->requested.fullscreen); } diff --git a/src/absinthe-toplevel.c b/src/absinthe-toplevel.c index fb37a6e..faf0d8a 100644 --- a/src/absinthe-toplevel.c +++ b/src/absinthe-toplevel.c @@ -7,6 +7,7 @@ #include "layout.h" #include "output.h" #include "types.h" +#include "xdg-shell-protocol.h" struct absinthe_toplevel *absinthe_toplevel_at(struct absinthe_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy) @@ -43,7 +44,7 @@ bool absinthe_toplevel_is_unmanaged(struct absinthe_toplevel *toplevel) { #ifdef XWAYLAND if (toplevel->type == ABSINTHE_TOPLEVEL_X11) - return toplevel->toplevel.x11->override_redirect; + return toplevel->xwayland_surface->override_redirect; #endif return false; } @@ -52,14 +53,14 @@ void absinthe_toplevel_update_geometry(struct absinthe_toplevel *toplevel) { #ifdef XWAYLAND if (toplevel->type == ABSINTHE_TOPLEVEL_X11) { - toplevel->geometry.x = toplevel->toplevel.x11->x; - toplevel->geometry.y = toplevel->toplevel.x11->y; - toplevel->geometry.width = toplevel->toplevel.x11->width; - toplevel->geometry.height = toplevel->toplevel.x11->height; + toplevel->geometry.x = toplevel->xwayland_surface->x; + toplevel->geometry.y = toplevel->xwayland_surface->y; + toplevel->geometry.width = toplevel->xwayland_surface->width; + toplevel->geometry.height = toplevel->xwayland_surface->height; } else #endif { - toplevel->geometry = toplevel->toplevel.xdg->base->geometry; + toplevel->geometry = toplevel->xdg_toplevel->base->geometry; } } @@ -100,6 +101,22 @@ void absinthe_toplevel_set_size(struct absinthe_toplevel *toplevel, int32_t widt toplevel->geometry.width = width; toplevel->geometry.height = height; + if (toplevel->type == ABSINTHE_TOPLEVEL_XDG) { + if (wl_resource_get_version(toplevel->xdg_toplevel->resource) >= + XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION) + wlr_xdg_toplevel_set_bounds(toplevel->xdg_toplevel, width, height); + toplevel->resizing = wlr_xdg_toplevel_set_size( + toplevel->xdg_toplevel, width - 2 * toplevel->border_width, height - 2 * toplevel->border_width); + } +#ifdef XWAYLAND + else if (toplevel->type == ABSINTHE_TOPLEVEL_X11) { + wlr_xwayland_surface_configure(toplevel->xwayland_surface, toplevel->geometry.x, toplevel->geometry.y, + width - 2 * toplevel->border_width, height - 2 * toplevel->border_width); + absinthe_toplevel_set_position(toplevel, toplevel->geometry.x + toplevel->border_width, + toplevel->geometry.y + toplevel->border_width); + } +#endif + struct wlr_box clip = { .x = 0, .y = 0, @@ -108,19 +125,6 @@ void absinthe_toplevel_set_size(struct absinthe_toplevel *toplevel, int32_t widt }; wlr_scene_subsurface_tree_set_clip(&toplevel->scene_surface->node, &clip); - if (toplevel->type == ABSINTHE_TOPLEVEL_XDG) { - toplevel->resizing = wlr_xdg_toplevel_set_size( - toplevel->toplevel.xdg, width - 2 * toplevel->border_width, height - 2 * toplevel->border_width); - } -#ifdef XWAYLAND - else if (toplevel->type == ABSINTHE_TOPLEVEL_X11) { - wlr_xwayland_surface_configure(toplevel->toplevel.x11, toplevel->geometry.x, toplevel->geometry.y, - width - 2 * toplevel->border_width, height - 2 * toplevel->border_width); - absinthe_toplevel_set_position(toplevel, toplevel->geometry.x + toplevel->border_width, - toplevel->geometry.y + toplevel->border_width); - } -#endif - absinthe_toplevel_update_borders_geometry(toplevel); } @@ -131,7 +135,7 @@ void absinthe_toplevel_set_fullscreen(struct absinthe_toplevel *toplevel, bool f struct absinthe_output *output = toplevel->server->focused_output; toplevel->fullscreen = fullscreen; - wlr_xdg_toplevel_set_fullscreen(toplevel->toplevel.xdg, fullscreen); + wlr_xdg_toplevel_set_fullscreen(toplevel->xdg_toplevel, fullscreen); if (fullscreen) { toplevel->prev_geometry = toplevel->geometry; diff --git a/src/cursor.c b/src/cursor.c index 7eebc45..6a998c5 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -10,7 +10,7 @@ void reset_cursor_mode(struct absinthe_server *server) server->cursor_mode = ABSINTHE_CURSOR_PASSTHROUGH; wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "default"); if (server->focused_toplevel) { - wlr_xdg_toplevel_set_resizing(server->focused_toplevel->toplevel.xdg, false); + wlr_xdg_toplevel_set_resizing(server->focused_toplevel->xdg_toplevel, false); } } @@ -41,11 +41,11 @@ static void process_cursor_move(struct absinthe_server *server) static void apply_resize(struct absinthe_toplevel *toplevel, struct wlr_box *new_geometry) { - int32_t min_width = toplevel->toplevel.xdg->current.min_width; - int32_t min_height = toplevel->toplevel.xdg->current.min_height; + int32_t min_width = toplevel->xdg_toplevel->current.min_width; + int32_t min_height = toplevel->xdg_toplevel->current.min_height; - int32_t max_width = toplevel->toplevel.xdg->current.max_width; - int32_t max_height = toplevel->toplevel.xdg->current.max_height; + int32_t max_width = toplevel->xdg_toplevel->current.max_width; + int32_t max_height = toplevel->xdg_toplevel->current.max_height; if (max_width == 0) max_width = 10000; diff --git a/src/focus.c b/src/focus.c index 5b16b3e..7897d16 100644 --- a/src/focus.c +++ b/src/focus.c @@ -16,10 +16,10 @@ void focus_toplevel(struct absinthe_toplevel *toplevel) struct wlr_surface *surface; #ifdef XWAYLAND if (toplevel->type == ABSINTHE_TOPLEVEL_X11) - surface = toplevel->toplevel.x11->surface; + surface = toplevel->xwayland_surface->surface; else #endif - surface = toplevel->toplevel.xdg->base->surface; + surface = toplevel->xdg_toplevel->base->surface; if (surface == prev_surface) return; @@ -44,7 +44,7 @@ void focus_toplevel(struct absinthe_toplevel *toplevel) wl_list_remove(&toplevel->flink); wl_list_insert(&server->focus_stack, &toplevel->flink); if (toplevel->type != ABSINTHE_TOPLEVEL_X11) - wlr_xdg_toplevel_set_activated(toplevel->toplevel.xdg, true); + wlr_xdg_toplevel_set_activated(toplevel->xdg_toplevel, true); absinthe_toplevel_set_border_color(toplevel, focused_border_color); if (keyboard) diff --git a/src/server.c b/src/server.c index 3d6ad13..99791cd 100644 --- a/src/server.c +++ b/src/server.c @@ -72,8 +72,8 @@ void server_new_xdg_toplevel(struct wl_listener *listener, void *data) struct absinthe_toplevel *toplevel = calloc(1, sizeof(*toplevel)); toplevel->type = ABSINTHE_TOPLEVEL_XDG; toplevel->server = server; - toplevel->toplevel.xdg = xdg_toplevel; - toplevel->toplevel.xdg->base->data = toplevel; + toplevel->xdg_toplevel = xdg_toplevel; + toplevel->xdg_toplevel->base->data = toplevel; toplevel->commit.notify = xdg_toplevel_commit; wl_signal_add(&xdg_toplevel->base->surface->events.commit, &toplevel->commit); @@ -156,7 +156,7 @@ void server_xwayland_new_surface(struct wl_listener *listener, void *data) toplevel->type = ABSINTHE_TOPLEVEL_X11; toplevel->server = server; - toplevel->toplevel.x11 = surface; + toplevel->xwayland_surface = surface; toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) ? 0 : ABSINTHE_TOPLEVEL_BORDER_WIDTH; toplevel->destroy.notify = absinthe_toplevel_destroy; @@ -241,8 +241,8 @@ void server_cursor_button(struct wl_listener *listener, void *data) if (server->cursor_mode != ABSINTHE_CURSOR_RESIZE) goto handle; - int32_t width = toplevel->toplevel.xdg->base->geometry.width; - int32_t height = toplevel->toplevel.xdg->base->geometry.height; + int32_t width = toplevel->xdg_toplevel->base->geometry.width; + int32_t height = toplevel->xdg_toplevel->base->geometry.height; if (server->grab_x > (lx + width / 2) && server->grab_y > (ly + height / 2)) { server->cursor_resize_corner = ABSINTHE_CURSOR_RESIZE_CORNER_BOTTOM_RIGHT; @@ -258,7 +258,7 @@ void server_cursor_button(struct wl_listener *listener, void *data) wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "nw-resize"); } - wlr_xdg_toplevel_set_resizing(toplevel->toplevel.xdg, true); + wlr_xdg_toplevel_set_resizing(toplevel->xdg_toplevel, true); } handle: diff --git a/src/xdg-decoration.c b/src/xdg-decoration.c index 2cf8e1f..5d6caad 100644 --- a/src/xdg-decoration.c +++ b/src/xdg-decoration.c @@ -6,7 +6,7 @@ void xdg_decoration_request_mode(struct wl_listener *listener, void *data) { UNUSED(data); struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, decoration_request_mode); - if (toplevel->toplevel.xdg->base->initialized) + if (toplevel->xdg_toplevel->base->initialized) wlr_xdg_toplevel_decoration_v1_set_mode(toplevel->decoration, WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); } diff --git a/src/xdg-toplevel.c b/src/xdg-toplevel.c index 751eae3..e988698 100644 --- a/src/xdg-toplevel.c +++ b/src/xdg-toplevel.c @@ -14,16 +14,16 @@ void xdg_toplevel_commit(struct wl_listener *listener, void *data) UNUSED(data); struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, commit); - if (toplevel->toplevel.xdg->base->initial_commit) { - wlr_xdg_toplevel_set_activated(toplevel->toplevel.xdg, false); + if (toplevel->xdg_toplevel->base->initial_commit) { + wlr_xdg_toplevel_set_activated(toplevel->xdg_toplevel, false); /* Forse server side decoration mode */ if (toplevel->decoration) xdg_decoration_request_mode(&toplevel->decoration_request_mode, toplevel->decoration); - toplevel->resizing = wlr_xdg_toplevel_set_size(toplevel->toplevel.xdg, 0, 0); + toplevel->resizing = wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0); return; } - if (toplevel->resizing && toplevel->resizing <= toplevel->toplevel.xdg->base->current.configure_serial) + if (toplevel->resizing && toplevel->resizing <= toplevel->xdg_toplevel->base->current.configure_serial) toplevel->resizing = 0; } diff --git a/src/xwayland.c b/src/xwayland.c index f94969a..07e6608 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -12,7 +12,7 @@ void xwayland_activate(struct wl_listener *listener, void *data) struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_activate); if (!absinthe_toplevel_is_unmanaged(toplevel)) - wlr_xwayland_surface_activate(toplevel->toplevel.x11, 1); + wlr_xwayland_surface_activate(toplevel->xwayland_surface, 1); } void xwayland_associate(struct wl_listener *listener, void *data) @@ -21,9 +21,9 @@ void xwayland_associate(struct wl_listener *listener, void *data) struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_associate); toplevel->map.notify = absinthe_toplevel_map; - wl_signal_add(&toplevel->toplevel.x11->surface->events.map, &toplevel->map); + wl_signal_add(&toplevel->xwayland_surface->surface->events.map, &toplevel->map); toplevel->unmap.notify = absinthe_toplevel_unmap; - wl_signal_add(&toplevel->toplevel.x11->surface->events.unmap, &toplevel->unmap); + wl_signal_add(&toplevel->xwayland_surface->surface->events.unmap, &toplevel->unmap); } void xwayland_dissociate(struct wl_listener *listener, void *data) @@ -41,14 +41,16 @@ void xwayland_configure(struct wl_listener *listener, void *data) struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_configure); struct wlr_xwayland_surface_configure_event *event = data; - if (!toplevel->toplevel.x11->surface || !toplevel->toplevel.x11->surface->mapped) { - wlr_xwayland_surface_configure(toplevel->toplevel.x11, event->x, event->y, event->width, event->height); + if (!toplevel->xwayland_surface->surface || !toplevel->xwayland_surface->surface->mapped) { + wlr_xwayland_surface_configure(toplevel->xwayland_surface, event->x, event->y, event->width, + event->height); return; } if (absinthe_toplevel_is_unmanaged(toplevel)) { wlr_scene_node_set_position(&toplevel->scene_tree->node, event->x, event->y); - wlr_xwayland_surface_configure(toplevel->toplevel.x11, event->x, event->y, event->width, event->height); + wlr_xwayland_surface_configure(toplevel->xwayland_surface, event->x, event->y, event->width, + event->height); return; } }