diff --git a/include/node.h b/include/node.h index d5225af9..ab222b8d 100644 --- a/include/node.h +++ b/include/node.h @@ -3,12 +3,16 @@ #define __LABWC_NODE_DESCRIPTOR_H #include +struct view; +struct lab_layer_surface; +struct lab_layer_popup; + enum node_descriptor_type { LAB_NODE_DESC_NODE = 0, - LAB_NODE_DESC_VIEW, /* *data --> struct view */ - LAB_NODE_DESC_XDG_POPUP, /* *data --> struct view */ - LAB_NODE_DESC_LAYER_SURFACE, /* *data --> struct lab_layer_surface */ - LAB_NODE_DESC_LAYER_POPUP, /* *data --> struct lab_layer_popup */ + LAB_NODE_DESC_VIEW, + LAB_NODE_DESC_XDG_POPUP, + LAB_NODE_DESC_LAYER_SURFACE, + LAB_NODE_DESC_LAYER_POPUP, }; struct node_descriptor { @@ -17,7 +21,37 @@ struct node_descriptor { struct wl_listener destroy; }; -void node_descriptor_create(struct wlr_scene_node *node, +/** + * node_descriptor_create - create node descriptor for wlr_scene_node user_data + * @scene_node: wlr_scene_node to attached node_descriptor to + * @type: node descriptor type + * @data: struct to point to as follows: + * - LAB_NODE_DESC_VIEW struct view + * - LAB_NODE_DESC_XDG_POPUP struct view + * - LAB_NODE_DESC_LAYER_SURFACE struct lab_layer_surface + * - LAB_NODE_DESC_LAYER_POPUP struct lab_layer_popup + */ +void node_descriptor_create(struct wlr_scene_node *scene_node, enum node_descriptor_type type, void *data); +/** + * node_view_from_node - return view struct from node + * @node_descriptor: node_descriptor from which to return data + */ +struct view *node_view_from_node(struct node_descriptor *node_descriptor); + +/** + * node_lab_surface_from_node - return lab_layer_surface struct from node + * @node_descriptor: node_descriptor from which to return data + */ +struct lab_layer_surface *node_layer_surface_from_node( + struct node_descriptor *node_descriptor); + +/** + * node_layer_popup_from_node - return lab_layer_popup struct from node + * @node_descriptor: node_descriptor from which to return data + */ +struct lab_layer_popup *node_layer_popup_from_node( + struct node_descriptor *node_descriptor); + #endif /* __LABWC_NODE_DESCRIPTOR_H */ diff --git a/src/debug.c b/src/debug.c index 0d167fa6..0e68adb0 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-2.0-only -#include #include #include #include "buffer.h" @@ -113,10 +112,7 @@ get_special(struct server *server, struct wlr_scene_node *node, return "server->view_tree"; } if (node->parent == &server->view_tree->node) { - struct node_descriptor *desc = node->data; - assert(desc->type == LAB_NODE_DESC_VIEW - || desc->type == LAB_NODE_DESC_XDG_POPUP); - *last_view = desc->data; + *last_view = node_view_from_node(node->data); } const char *view_part = get_view_part(*last_view, node); if (view_part) { diff --git a/src/node.c b/src/node.c index 8f7095c5..bd656ea4 100644 --- a/src/node.c +++ b/src/node.c @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only +#include #include #include "node.h" @@ -21,7 +22,7 @@ destroy_notify(struct wl_listener *listener, void *data) } void -node_descriptor_create(struct wlr_scene_node *node, +node_descriptor_create(struct wlr_scene_node *scene_node, enum node_descriptor_type type, void *data) { struct node_descriptor *node_descriptor = @@ -32,6 +33,28 @@ node_descriptor_create(struct wlr_scene_node *node, node_descriptor->type = type; node_descriptor->data = data; node_descriptor->destroy.notify = destroy_notify; - wl_signal_add(&node->events.destroy, &node_descriptor->destroy); - node->data = node_descriptor; + wl_signal_add(&scene_node->events.destroy, &node_descriptor->destroy); + scene_node->data = node_descriptor; +} + +struct view * +node_view_from_node(struct node_descriptor *node_descriptor) +{ + assert(node_descriptor->type == LAB_NODE_DESC_VIEW + || node_descriptor->type == LAB_NODE_DESC_XDG_POPUP); + return (struct view *)node_descriptor->data; +} + +struct lab_layer_surface * +node_layer_surface_from_node(struct node_descriptor *node_descriptor) +{ + assert(node_descriptor->type == LAB_NODE_DESC_LAYER_SURFACE); + return (struct lab_layer_surface *)node_descriptor->data; +} + +struct lab_layer_popup * +node_layer_popup_from_node(struct node_descriptor *node_descriptor) +{ + assert(node_descriptor->type == LAB_NODE_DESC_LAYER_POPUP); + return (struct lab_layer_popup *)node_descriptor->data; }