diff --git a/src/absinthe-toplevel.c b/src/absinthe-toplevel.c index b6524cd..8327bf4 100644 --- a/src/absinthe-toplevel.c +++ b/src/absinthe-toplevel.c @@ -7,22 +7,31 @@ struct absinthe_toplevel *absinthe_toplevel_at(struct absinthe_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy) { struct wlr_scene_node *node = wlr_scene_node_at(&server->scene->tree.node, lx, ly, sx, sy); - if (!node || node->type != WLR_SCENE_NODE_BUFFER) { + if (!node) { return NULL; } - struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_from_node(node); - struct wlr_scene_surface *scene_surface = wlr_scene_surface_try_from_buffer(scene_buffer); - if (!scene_surface) { + switch (node->type) { + case WLR_SCENE_NODE_BUFFER: + struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_from_node(node); + struct wlr_scene_surface *scene_surface = wlr_scene_surface_try_from_buffer(scene_buffer); + if (!scene_surface) { + return NULL; + } + + *surface = scene_surface->surface; + struct wlr_scene_tree *tree = node->parent; + while (tree != NULL && tree->node.data == NULL) { + tree = tree->node.parent; + } + return tree->node.data; + break; + case WLR_SCENE_NODE_RECT: + return node->data; + break; + default: return NULL; } - - *surface = scene_surface->surface; - struct wlr_scene_tree *tree = node->parent; - while (tree != NULL && tree->node.data == NULL) { - tree = tree->node.parent; - } - return tree->node.data; } void absinthe_toplevel_set_position(struct absinthe_toplevel *toplevel, int32_t x, int32_t y)