aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2023-06-25 17:44:00 -0500
committerDevin J. Pohly <djpohly@gmail.com>2023-06-25 17:44:00 -0500
commiteda0613cc4c657a4d4f0165aa8ccd75108545981 (patch)
tree422f22f2411a6be2d82255039ad4890fe95ffea6
parent68a17f962e05895603d0f409fb8da4493cbe52aa (diff)
Separate drag icon from layers array and Lyr enum
If we treat the drag icon as distinct from other layers (it doesn't have contents that are interactive, focusable, etc.), then we can iterate over layers meaningfully with a simple for loop. ΔSLOC: -8
-rw-r--r--dwl.c69
1 files changed, 32 insertions, 37 deletions
diff --git a/dwl.c b/dwl.c
index da3a516..5a1b1b5 100644
--- a/dwl.c
+++ b/dwl.c
@@ -74,7 +74,7 @@
/* enums */
enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */
enum { XDGShell, LayerShell, X11Managed, X11Unmanaged }; /* client types */
-enum { LyrBg, LyrBottom, LyrTop, LyrOverlay, LyrTile, LyrFloat, LyrFS, LyrDragIcon, LyrBlock, NUM_LAYERS }; /* scene layers */
+enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrFS, LyrTop, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */
#ifdef XWAYLAND
enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar,
NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */
@@ -330,6 +330,8 @@ static struct wl_display *dpy;
static struct wlr_backend *backend;
static struct wlr_scene *scene;
static struct wlr_scene_tree *layers[NUM_LAYERS];
+/* Map from ZWLR_LAYER_SHELL_* constants to Lyr* enum */
+static const int layermap[] = { LyrBg, LyrBottom, LyrTop, LyrOverlay };
static struct wlr_renderer *drw;
static struct wlr_allocator *alloc;
static struct wlr_compositor *compositor;
@@ -736,17 +738,16 @@ commitlayersurfacenotify(struct wl_listener *listener, void *data)
LayerSurface *layersurface = wl_container_of(listener, layersurface, surface_commit);
struct wlr_layer_surface_v1 *wlr_layer_surface = layersurface->layer_surface;
struct wlr_output *wlr_output = wlr_layer_surface->output;
+ struct wlr_scene_tree *layer = layers[layermap[wlr_layer_surface->current.layer]];
/* For some reason this layersurface have no monitor, this can be because
* its monitor has just been destroyed */
if (!wlr_output || !(layersurface->mon = wlr_output->data))
return;
- if (layers[wlr_layer_surface->current.layer] != layersurface->scene->node.parent) {
- wlr_scene_node_reparent(&layersurface->scene->node,
- layers[wlr_layer_surface->current.layer]);
- wlr_scene_node_reparent(&layersurface->popups->node,
- layers[wlr_layer_surface->current.layer]);
+ if (layer != layersurface->scene->node.parent) {
+ wlr_scene_node_reparent(&layersurface->scene->node, layer);
+ wlr_scene_node_reparent(&layersurface->popups->node, layer);
wl_list_remove(&layersurface->link);
wl_list_insert(&layersurface->mon->layers[wlr_layer_surface->current.layer],
&layersurface->link);
@@ -832,6 +833,7 @@ createlayersurface(struct wl_listener *listener, void *data)
struct wlr_layer_surface_v1 *wlr_layer_surface = data;
LayerSurface *layersurface;
struct wlr_layer_surface_v1_state old_state;
+ struct wlr_scene_tree *l = layers[layermap[wlr_layer_surface->pending.layer]];
if (!wlr_layer_surface->output)
wlr_layer_surface->output = selmon ? selmon->wlr_output : NULL;
@@ -856,11 +858,9 @@ createlayersurface(struct wl_listener *listener, void *data)
layersurface->mon = wlr_layer_surface->output->data;
wlr_layer_surface->data = layersurface;
- layersurface->scene_layer = wlr_scene_layer_surface_v1_create(
- layers[wlr_layer_surface->pending.layer], wlr_layer_surface);
+ layersurface->scene_layer = wlr_scene_layer_surface_v1_create(l, wlr_layer_surface);
layersurface->scene = layersurface->scene_layer->tree;
- layersurface->popups = wlr_layer_surface->surface->data =
- wlr_scene_tree_create(layers[wlr_layer_surface->pending.layer]);
+ layersurface->popups = wlr_layer_surface->surface->data = wlr_scene_tree_create(l);
layersurface->scene->node.data = layersurface;
@@ -2127,6 +2127,8 @@ setsel(struct wl_listener *listener, void *data)
void
setup(void)
{
+ int layer;
+
/* Set up signal handlers */
struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = sigchld};
sigemptyset(&sa.sa_mask);
@@ -2153,15 +2155,8 @@ setup(void)
/* Initialize the scene graph used to lay out windows */
scene = wlr_scene_create();
- layers[LyrBg] = wlr_scene_tree_create(&scene->tree);
- layers[LyrBottom] = wlr_scene_tree_create(&scene->tree);
- layers[LyrTile] = wlr_scene_tree_create(&scene->tree);
- layers[LyrFloat] = wlr_scene_tree_create(&scene->tree);
- layers[LyrFS] = wlr_scene_tree_create(&scene->tree);
- layers[LyrTop] = wlr_scene_tree_create(&scene->tree);
- layers[LyrOverlay] = wlr_scene_tree_create(&scene->tree);
- layers[LyrDragIcon] = wlr_scene_tree_create(&scene->tree);
- layers[LyrBlock] = wlr_scene_tree_create(&scene->tree);
+ for (layer = 0; layer < NUM_LAYERS; layer++)
+ layers[layer] = wlr_scene_tree_create(&scene->tree);
/* Create a renderer with the default implementation */
if (!(drw = wlr_renderer_autocreate(backend)))
@@ -2350,11 +2345,13 @@ void
startdrag(struct wl_listener *listener, void *data)
{
struct wlr_drag *drag = data;
+ struct wlr_scene_tree *icon;
if (!drag->icon)
return;
- drag->icon->data = wlr_scene_subsurface_tree_create(layers[LyrDragIcon], drag->icon->surface);
+ drag->icon->data = icon = wlr_scene_subsurface_tree_create(&scene->tree, drag->icon->surface);
+ wlr_scene_node_place_below(&icon->node, &layers[LyrBlock]->node);
motionnotify(0);
wl_signal_add(&drag->icon->events.destroy, &drag_icon_destroy);
}
@@ -2652,24 +2649,22 @@ xytonode(double x, double y, struct wlr_surface **psurface,
struct wlr_surface *surface = NULL;
Client *c = NULL;
LayerSurface *l = NULL;
- const int *layer;
- int focus_order[] = { LyrBlock, LyrOverlay, LyrTop, LyrFS, LyrFloat, LyrTile, LyrBottom, LyrBg };
-
- for (layer = focus_order; layer < END(focus_order); layer++) {
- if ((node = wlr_scene_node_at(&layers[*layer]->node, x, y, nx, ny))) {
- if (node->type == WLR_SCENE_NODE_BUFFER)
- surface = wlr_scene_surface_from_buffer(
- wlr_scene_buffer_from_node(node))->surface;
- /* Walk the tree to find a node that knows the client */
- for (pnode = node; pnode && !c; pnode = &pnode->parent->node)
- c = pnode->data;
- if (c && c->type == LayerShell) {
- c = NULL;
- l = pnode->data;
- }
+ int layer;
+
+ for (layer = NUM_LAYERS - 1; !surface && layer >= 0; layer--) {
+ if (!(node = wlr_scene_node_at(&layers[layer]->node, x, y, nx, ny)))
+ continue;
+
+ if (node->type == WLR_SCENE_NODE_BUFFER)
+ surface = wlr_scene_surface_from_buffer(
+ wlr_scene_buffer_from_node(node))->surface;
+ /* Walk the tree to find a node that knows the client */
+ for (pnode = node; pnode && !c; pnode = &pnode->parent->node)
+ c = pnode->data;
+ if (c && c->type == LayerShell) {
+ c = NULL;
+ l = pnode->data;
}
- if (surface)
- break;
}
if (psurface) *psurface = surface;