From 541ee0c45d42266262286763f10a4e97ac180f65 Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Thu, 4 Jul 2024 13:38:33 -0400 Subject: [PATCH] wlr_scene: Expose wlr_scene_xdg_surface So that the compositor can access the subsurface tree --- include/wlr/types/wlr_scene.h | 14 +++++++++++++- tinywl/tinywl.c | 26 +++++++++++++------------- types/scene/xdg_shell.c | 14 ++------------ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h index acd28771c..8866e11bf 100644 --- a/include/wlr/types/wlr_scene.h +++ b/include/wlr/types/wlr_scene.h @@ -261,6 +261,18 @@ struct wlr_scene_layer_surface_v1 { struct wl_listener layer_surface_unmap; }; +struct wlr_scene_xdg_surface { + struct wlr_scene_tree *tree; + struct wlr_xdg_surface *xdg_surface; + struct wlr_scene_subsurface_tree *surface_tree; + + // private state + + struct wl_listener tree_destroy; + struct wl_listener xdg_surface_destroy; + struct wl_listener xdg_surface_commit; +}; + /** * Immediately destroy the scene-graph node. */ @@ -584,7 +596,7 @@ void wlr_scene_subsurface_tree_set_clip(struct wlr_scene_subsurface_tree *tree, * The origin of the returned scene-graph node will match the top-left corner * of the xdg_surface window geometry. */ -struct wlr_scene_tree *wlr_scene_xdg_surface_create( +struct wlr_scene_xdg_surface *wlr_scene_xdg_surface_create( struct wlr_scene_tree *parent, struct wlr_xdg_surface *xdg_surface); /** diff --git a/tinywl/tinywl.c b/tinywl/tinywl.c index 6c043ed51..640373b74 100644 --- a/tinywl/tinywl.c +++ b/tinywl/tinywl.c @@ -82,7 +82,7 @@ struct tinywl_toplevel { struct wl_list link; struct tinywl_server *server; struct wlr_xdg_toplevel *xdg_toplevel; - struct wlr_scene_tree *scene_tree; + struct wlr_scene_xdg_surface *scene; struct wl_listener map; struct wl_listener unmap; struct wl_listener commit; @@ -135,7 +135,7 @@ static void focus_toplevel(struct tinywl_toplevel *toplevel, struct wlr_surface } struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat); /* Move the toplevel to the front */ - wlr_scene_node_raise_to_top(&toplevel->scene_tree->node); + wlr_scene_node_raise_to_top(&toplevel->scene->tree->node); wl_list_remove(&toplevel->link); wl_list_insert(&server->toplevels, &toplevel->link); /* Activate the new surface */ @@ -380,7 +380,7 @@ static void reset_cursor_mode(struct tinywl_server *server) { static void process_cursor_move(struct tinywl_server *server, uint32_t time) { /* Move the grabbed toplevel to the new position. */ struct tinywl_toplevel *toplevel = server->grabbed_toplevel; - wlr_scene_node_set_position(&toplevel->scene_tree->node, + wlr_scene_node_set_position(&toplevel->scene->tree->node, server->cursor->x - server->grab_x, server->cursor->y - server->grab_y); } @@ -429,7 +429,7 @@ static void process_cursor_resize(struct tinywl_server *server, uint32_t time) { struct wlr_box geo_box; wlr_xdg_surface_get_geometry(toplevel->xdg_toplevel->base, &geo_box); - wlr_scene_node_set_position(&toplevel->scene_tree->node, + wlr_scene_node_set_position(&toplevel->scene->tree->node, new_left - geo_box.x, new_top - geo_box.y); int new_width = new_right - new_left; @@ -724,22 +724,22 @@ static void begin_interactive(struct tinywl_toplevel *toplevel, server->cursor_mode = mode; if (mode == TINYWL_CURSOR_MOVE) { - server->grab_x = server->cursor->x - toplevel->scene_tree->node.x; - server->grab_y = server->cursor->y - toplevel->scene_tree->node.y; + server->grab_x = server->cursor->x - toplevel->scene->tree->node.x; + server->grab_y = server->cursor->y - toplevel->scene->tree->node.y; } else { struct wlr_box geo_box; wlr_xdg_surface_get_geometry(toplevel->xdg_toplevel->base, &geo_box); - double border_x = (toplevel->scene_tree->node.x + geo_box.x) + + double border_x = (toplevel->scene->tree->node.x + geo_box.x) + ((edges & WLR_EDGE_RIGHT) ? geo_box.width : 0); - double border_y = (toplevel->scene_tree->node.y + geo_box.y) + + double border_y = (toplevel->scene->tree->node.y + geo_box.y) + ((edges & WLR_EDGE_BOTTOM) ? geo_box.height : 0); server->grab_x = server->cursor->x - border_x; server->grab_y = server->cursor->y - border_y; server->grab_geobox = geo_box; - server->grab_geobox.x += toplevel->scene_tree->node.x; - server->grab_geobox.y += toplevel->scene_tree->node.y; + server->grab_geobox.x += toplevel->scene->tree->node.x; + server->grab_geobox.y += toplevel->scene->tree->node.y; server->resize_edges = edges; } @@ -803,10 +803,10 @@ static void server_new_xdg_toplevel(struct wl_listener *listener, void *data) { struct tinywl_toplevel *toplevel = calloc(1, sizeof(*toplevel)); toplevel->server = server; toplevel->xdg_toplevel = xdg_toplevel; - toplevel->scene_tree = + toplevel->scene = wlr_scene_xdg_surface_create(&toplevel->server->scene->tree, xdg_toplevel->base); - toplevel->scene_tree->node.data = toplevel; - xdg_toplevel->base->data = toplevel->scene_tree; + toplevel->scene->tree->node.data = toplevel; + xdg_toplevel->base->data = toplevel->scene->tree; /* Listen to the various events it can emit */ toplevel->map.notify = xdg_toplevel_map; diff --git a/types/scene/xdg_shell.c b/types/scene/xdg_shell.c index f9668f933..0d84b07ee 100644 --- a/types/scene/xdg_shell.c +++ b/types/scene/xdg_shell.c @@ -2,16 +2,6 @@ #include #include -struct wlr_scene_xdg_surface { - struct wlr_scene_tree *tree; - struct wlr_xdg_surface *xdg_surface; - struct wlr_scene_subsurface_tree *surface_tree; - - struct wl_listener tree_destroy; - struct wl_listener xdg_surface_destroy; - struct wl_listener xdg_surface_commit; -}; - static void scene_xdg_surface_handle_tree_destroy(struct wl_listener *listener, void *data) { struct wlr_scene_xdg_surface *scene_xdg_surface = @@ -55,7 +45,7 @@ static void scene_xdg_surface_handle_xdg_surface_commit(struct wl_listener *list scene_xdg_surface_update_position(scene_xdg_surface); } -struct wlr_scene_tree *wlr_scene_xdg_surface_create( +struct wlr_scene_xdg_surface *wlr_scene_xdg_surface_create( struct wlr_scene_tree *parent, struct wlr_xdg_surface *xdg_surface) { struct wlr_scene_xdg_surface *scene_xdg_surface = calloc(1, sizeof(*scene_xdg_surface)); @@ -95,5 +85,5 @@ struct wlr_scene_tree *wlr_scene_xdg_surface_create( scene_xdg_surface_update_position(scene_xdg_surface); - return scene_xdg_surface->tree; + return scene_xdg_surface; }