--- /dev/null
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __LABWC_NODE_DESCRIPTOR_H
+#define __LABWC_NODE_DESCRIPTOR_H
+#include <wlr/types/wlr_scene.h>
+
+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 */
+};
+
+struct node_descriptor {
+ enum node_descriptor_type type;
+ void *data;
+ struct wl_listener destroy;
+};
+
+void node_descriptor_create(struct wlr_scene_node *node,
+ enum node_descriptor_type type, void *data);
+
+#endif /* __LABWC_NODE_DESCRIPTOR_H */
#include <assert.h>
#include "labwc.h"
#include "layers.h"
+#include "node-descriptor.h"
#include "ssd.h"
static void
}
struct wlr_scene_node *osd = &server->osd_tree->node;
struct wlr_scene_node *menu = &server->menu_tree->node;
- while (node && !node->data) {
+ while (node) {
+ struct node_descriptor *desc = node->data;
+ if (desc) {
+ if (desc->type == LAB_NODE_DESC_VIEW) {
+ goto has_view_data;
+ }
+ if (desc->type == LAB_NODE_DESC_XDG_POPUP) {
+ goto has_view_data;
+ }
+ if (desc->type == LAB_NODE_DESC_LAYER_POPUP) {
+ /* FIXME: we shouldn't have to set *view_area */
+ *view_area = LAB_SSD_LAYER_SURFACE;
+ return NULL;
+ }
+ }
if (node == osd) {
*view_area = LAB_SSD_OSD;
return NULL;
}
if (!node) {
wlr_log(WLR_ERROR, "Unknown node detected");
- *view_area = LAB_SSD_NONE;
- return NULL;
}
- struct view *view = node->data;
+ *view_area = LAB_SSD_NONE;
+ return NULL;
+
+has_view_data:
+ struct node_descriptor *desc = node->data;
+ struct view *view = desc->data;
*view_area = ssd_get_part_type(view, *scene_node);
return view;
}
'key-state.c',
'layers.c',
'main.c',
+ 'node-descriptor.c',
'osd.c',
'output.c',
'resistance.c',
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0-only
+#include <stdlib.h>
+#include "node-descriptor.h"
+
+static void
+descriptor_destroy(struct node_descriptor *node_descriptor)
+{
+ if (!node_descriptor) {
+ return;
+ }
+ wl_list_remove(&node_descriptor->destroy.link);
+ free(node_descriptor);
+}
+
+static void
+destroy_notify(struct wl_listener *listener, void *data)
+{
+ struct node_descriptor *node_descriptor =
+ wl_container_of(listener, node_descriptor, destroy);
+ descriptor_destroy(node_descriptor);
+}
+
+void
+node_descriptor_create(struct wlr_scene_node *node,
+ enum node_descriptor_type type, void *data)
+{
+ struct node_descriptor *node_descriptor =
+ calloc(1, sizeof(struct node_descriptor));
+ if (!node_descriptor) {
+ return;
+ }
+ 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;
+}
*/
#include "labwc.h"
+#include "node-descriptor.h"
struct view_child {
struct wlr_surface *surface;
struct wlr_scene_node *parent_node = parent->surface->data;
wlr_popup->base->surface->data =
wlr_scene_xdg_surface_create(parent_node, wlr_popup->base);
+ node_descriptor_create(wlr_popup->base->surface->data,
+ LAB_NODE_DESC_XDG_POPUP, view);
popup_unconstrain(view, wlr_popup);
}
// SPDX-License-Identifier: GPL-2.0-only
#include <assert.h>
#include "labwc.h"
+#include "node-descriptor.h"
#include "ssd.h"
static void
wl_resource_post_no_memory(view->surface->resource);
return;
}
- view->scene_tree->node.data = view;
+ node_descriptor_create(&view->scene_tree->node,
+ LAB_NODE_DESC_VIEW, view);
/* In support of xdg_toplevel_decoration */
xdg_surface->data = view;
// SPDX-License-Identifier: GPL-2.0-only
#include <assert.h>
#include "labwc.h"
+#include "node-descriptor.h"
#include "ssd.h"
static void
view->xwayland_surface = xsurface;
view->scene_tree = wlr_scene_tree_create(&view->server->view_tree->node);
- view->scene_tree->node.data = view;
+ node_descriptor_create(&view->scene_tree->node,
+ LAB_NODE_DESC_VIEW, view);
xsurface->data = view;
view->map.notify = handle_map;