wlr_scene: Expose wlr_scene_xdg_surface

So that the compositor can access the subsurface tree
This commit is contained in:
Alexander Orzechowski 2024-07-04 13:38:33 -04:00
parent 6cb062aac1
commit 541ee0c45d
3 changed files with 28 additions and 26 deletions

View file

@ -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);
/**

View file

@ -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;

View file

@ -2,16 +2,6 @@
#include <wlr/types/wlr_scene.h>
#include <wlr/types/wlr_xdg_shell.h>
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;
}