bounds and anonymus union in absinthe_toplevel

This commit is contained in:
2026-04-29 17:32:57 +07:00
parent f7367395f0
commit 5af4ca8015
10 changed files with 68 additions and 60 deletions
+2
View File
@@ -2,6 +2,8 @@
#include <wayland-server-core.h>
#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);
+3 -3
View File
@@ -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;
+12 -12
View File
@@ -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);
}
+24 -20
View File
@@ -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;
+5 -5
View File
@@ -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;
+3 -3
View File
@@ -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)
+6 -6
View File
@@ -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:
+1 -1
View File
@@ -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);
}
+4 -4
View File
@@ -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;
}
+8 -6
View File
@@ -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;
}
}