From df3e188b1debf4002f88d4a3e9f5a5b9be2b28a8 Mon Sep 17 00:00:00 2001 From: speckitor Date: Sun, 19 Apr 2026 02:12:51 +0700 Subject: [PATCH] update geometry --- src/absinthe-toplevel.c | 24 ++++++++++++++++++++++-- src/layout.c | 1 + src/xdg-decoration.c | 2 +- src/xdg-toplevel.c | 14 +++++++++----- src/xwayland.c | 4 ++-- 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/absinthe-toplevel.c b/src/absinthe-toplevel.c index e3e66c9..66be46e 100644 --- a/src/absinthe-toplevel.c +++ b/src/absinthe-toplevel.c @@ -25,6 +25,21 @@ bool absinthe_toplevel_is_unmanaged(struct absinthe_toplevel *toplevel) return false; } +void absinthe_toplevel_update_geometry(struct absinthe_toplevel *toplevel) +{ +#ifdef XWAYLAND + if (absinthe_toplevel_is_x11(toplevel)) { + 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; + } else +#endif + { + toplevel->geometry = toplevel->toplevel.xdg->base->geometry; + } +} + struct wlr_surface *absinthe_toplevel_surface(struct absinthe_toplevel *toplevel) { #ifdef XWAYLAND @@ -40,6 +55,7 @@ void absinthe_toplevel_map(struct wl_listener *listener, void *data) toplevel->scene_tree = wlr_scene_tree_create(&toplevel->server->scene->tree); toplevel->scene_tree->node.data = toplevel; + wlr_scene_node_set_enabled(&toplevel->scene_tree->node, false); toplevel->border_width = absinthe_toplevel_is_unmanaged(toplevel) ? 0 @@ -55,13 +71,17 @@ void absinthe_toplevel_map(struct wl_listener *listener, void *data) } toplevel->scene_surface->node.data = toplevel; + absinthe_toplevel_update_geometry(toplevel); + toplevel->border_width = ABSINTHE_TOPLEVEL_BORDER_WIDTH; + int32_t borders_width = ABSINTHE_TOPLEVEL_BORDER_WIDTH * 2; + toplevel->geometry.width += borders_width; + toplevel->geometry.height += borders_width; + for (int i = 0; i < 4; ++i) { toplevel->border[i] = wlr_scene_rect_create(toplevel->scene_tree, 0, 0, unfocused_border_color); toplevel->border[i]->node.data = toplevel; } - toplevel->border_width = ABSINTHE_TOPLEVEL_BORDER_WIDTH; - update_focused_output(toplevel->server); toplevel->output = toplevel->server->focused_output; toplevel->fullscreen = false; diff --git a/src/layout.c b/src/layout.c index 7c20bee..eb21420 100644 --- a/src/layout.c +++ b/src/layout.c @@ -10,6 +10,7 @@ void layout_arrange(struct absinthe_output *output) size_t toplevels_count = 0; wl_list_for_each(toplevel, &output->server->toplevels, link) { if (toplevel->output == output) + wlr_scene_node_set_enabled(&toplevel->scene_tree->node, true); toplevels_count++; } diff --git a/src/xdg-decoration.c b/src/xdg-decoration.c index 9b8f1a8..10a3d6a 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) { struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, decoration_request_mode); if (toplevel->toplevel.xdg->base->initialized) - wlr_xdg_toplevel_decoration_v1_set_mode(toplevel->decoration, WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); + wlr_xdg_toplevel_decoration_v1_set_mode(toplevel->decoration, WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); } void xdg_decoration_destroy(struct wl_listener *listener, void *data) diff --git a/src/xdg-toplevel.c b/src/xdg-toplevel.c index 25dc135..e6185dd 100644 --- a/src/xdg-toplevel.c +++ b/src/xdg-toplevel.c @@ -14,19 +14,23 @@ void xdg_toplevel_commit(struct wl_listener *listener, void *data) { struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, commit); + int32_t borders_width = 2 * toplevel->border_width; + if (toplevel->toplevel.xdg->base->initial_commit) { - // Forse server side decoration mode + /* Forse server side decoration mode */ if (toplevel->decoration) xdg_decoration_request_mode(&toplevel->decoration_request_mode, toplevel->decoration); - // Let toplevel set preferred size - // wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0); + /* Let toplevel set preferred size */ + wlr_xdg_toplevel_set_size(toplevel->toplevel.xdg, 0, 0); + toplevel->geometry.width = toplevel->toplevel.xdg->base->geometry.width + borders_width; + toplevel->geometry.height = toplevel->toplevel.xdg->base->geometry.height + borders_width; } else { - // Check for size because we did't set it on initial commit - int32_t borders_width = 2 * toplevel->border_width; + /* Check for size because we did't set it on initial commit */ toplevel->geometry.width = toplevel->toplevel.xdg->base->geometry.width + borders_width; toplevel->geometry.height = toplevel->toplevel.xdg->base->geometry.height + borders_width; + /* Update borders and position only after client prepared new buffer */ absinthe_toplevel_set_position(toplevel, toplevel->geometry.x, toplevel->geometry.y); absinthe_toplevel_update_borders_geometry(toplevel); toplevel->performing_resize = false; diff --git a/src/xwayland.c b/src/xwayland.c index 3e3b822..6661502 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -26,8 +26,8 @@ void xwayland_dissociate(struct wl_listener *listener, void *data) { struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, xwayland_dissociate); - wl_list_remove(&toplevel->map.link); - wl_list_remove(&toplevel->unmap.link); + // wl_list_remove(&toplevel->map.link); + // wl_list_remove(&toplevel->unmap.link); } void xwayland_configure(struct wl_listener *listener, void *data)