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
NWKV3CJZDJGETIBG7P2QHOQVHSEK5J2YZAYKL4OVWZEIWHK6LINAC ZXE65WLHELSOWDSWI7F32GHW7RJ4H24RZRA3KKP4KIC6BSJ7TKTAC EK6VCEIAKFHDTJOI7PEEIUZ2BO5AYS4FFOOYC3UNLZSHLJBD5W3AC X4Q25YFYZHXT6GTWNT5OCUNT66WM4RWKF6VRVUBD3BSQLQOFEPBQC JTZBFGPCDJDJWECXH2LLXY3SUAQNCP45HLJQKG3V7XGTPLD634WAC 7B74AT3BXYB7PVW4F6SGQNPMHOU5TEV5TZ54CG6VSQI46XSEKWXQC BV5IC2T45XW6YFGPZLF2YDVEUPUH5RGCAX5HIJ3FLGV5PCJ62L6QC 4QDLLONBTF3RRJHEJ5EVCWU5YBKREPHG7NCEA2C7OMHL55K2G7NAC TOFCZFUYVBVEBHMKVG6G5MKCAEF2QCQ4GKMKGQUSJRLGLDZEJF4QC CFF6MYUDSO3VVMMCGJR7RPDBSLKDVR3AROFY5ZE33VG52ER2WYWAC BZ3O64R2O6IPKBT2U3OIJFSNNHG2PEASPL7AFOTBHRIWA57U4E5AC 24ZMBWYLMODPBAVLT4XNOSETHQXVLXNASYXUIGG2435IT7WIZC5AC QKVRBSFOOQUQMZ3P7CMPA7QCVQW5TXAKWH6NDL3K7Q3Z4GMXOVPQC YEHKNAGHE3ETYE5A25SSFTEM565LOM3BX3TN3QDQLLTVQMAJJ5XQC VAB2INZYCWFZNUZFYFTVJAPBORPDF3XS47YVOKZIJA23WDHVAVGQC 3HPB5ODTWGOTRGDML5LCC4AZVICLRBRBTTPUAWMNU5NBMQ76P5QAC EQRGODLKSVSPFSUZU7BV5ER72U4QS4ATSBKV544XXQVKKTOSC7EAC C43R3XRHXHNHHOOKMXISXIXRHGASJUTZ5EBUZ2JR6S4ZXHDIVNTQC 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);
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);
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);
const int *layer;int focus_order[] = { LyrBlock, LyrOverlay, LyrTop, LyrFS, LyrFloat, LyrTile, LyrBottom, LyrBg };
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;
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;}
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;