T65KVJWUY3RYRWBFG5DP4V4NID4VO3MM6IOFYPM2IJKR6NCD7YDQC GBPNNVSTRYC5VBC46GLT5YXUTF5BVIBHORH2EIJFZJ7E6D6SUDDAC BIABSVJA7ZGBDUCM4PK6IHZTGWOI5MSXJ26IQILXJBQGUF4HC5KQC YQNDQLKXXWYAW3BNXERQZZTVI3G6H4ADTIW5ZHKUEZLCCZHIG3MAC D5RCS7JWGBICNVGAAWBYQNU35PVNWI3P5VJACH2FJ4FDD2CF5EWAC 24ZMBWYLMODPBAVLT4XNOSETHQXVLXNASYXUIGG2435IT7WIZC5AC VCNLR5X75OAXVKPZQHF5RUZ7BONBUC6RPGO2NZEUD3FZ7TEVL66AC 7B74AT3BXYB7PVW4F6SGQNPMHOU5TEV5TZ54CG6VSQI46XSEKWXQC DADSQJFKYX6U5JOHSHJWWDSUFC7ZWSZVHFMEKPZEXKPELMEQBL2QC BFWKVWAIUKHCZVRA62GW6QZUEUKQLW365HUWIVKTEIPJNJSOZBAQC 52ME2RULOPZQLH3ZKDKNRIR6FZK2BUOHRULMVN7EN5TO4APCKAOAC US4HQXVWZEPU6HZ7Q733QB5QXOD32HJBYHUAQTT3DZGVXBMPNNOAC 2JGWKS7AC3SNETNLVD2PSRESRAHXTY533E5GYJ5DHNJTBZF65SJAC 7ATQKTE47BQ5QI66Z5VS2BSPGBQFUN3ZJUDC6NLMH7WCZAH437HAC YINR2KRWQMLQZV77MYMMFG3PLLNQ7B3JARYURYNXXRTIYJC2R3KQC OOK6V7XAN2JATIPAI4YNE7PUSA5NTJYEYFTAVQ5Q2BBDBTHE6UCQC 65GPTMYLVOQPVAKNBCN5RHHZEL7USZYSJ4VJQO7LYBCS7BZM7BYAC KN2FTHNJ7ZYCYGWLINFCVW4AFTZ7SNKMTCCGZZURPHAEQRUBZHHAC }voidapplyexclusive(struct wlr_box *usable_area,uint32_t anchor, int32_t exclusive,int32_t margin_top, int32_t margin_right,int32_t margin_bottom, int32_t margin_left) {Edge edges[] = {{ // Top.singular_anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP,.anchor_triplet = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT |ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP,.positive_axis = &usable_area->y,.negative_axis = &usable_area->height,.margin = margin_top,},{ // Bottom.singular_anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM,.anchor_triplet = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT |ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM,.positive_axis = NULL,.negative_axis = &usable_area->height,.margin = margin_bottom,},{ // Left.singular_anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT,.anchor_triplet = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM,.positive_axis = &usable_area->x,.negative_axis = &usable_area->width,.margin = margin_left,},{ // Right.singular_anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT,.anchor_triplet = ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT |ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM,.positive_axis = NULL,.negative_axis = &usable_area->width,.margin = margin_right,}};for (size_t i = 0; i < LENGTH(edges); i++) {if ((anchor == edges[i].singular_anchor || anchor == edges[i].anchor_triplet)&& exclusive + edges[i].margin > 0) {if (edges[i].positive_axis)*edges[i].positive_axis += exclusive + edges[i].margin;if (edges[i].negative_axis)*edges[i].negative_axis -= exclusive + edges[i].margin;break;}}
struct wlr_box bounds;struct wlr_box box = {.width = state->desired_width,.height = state->desired_height};const uint32_t both_horiz = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT| ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;const uint32_t both_vert = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP| ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
bounds = state->exclusive_zone == -1 ? full_area : *usable_area;// Horizontal axisif ((state->anchor & both_horiz) && box.width == 0) {box.x = bounds.x;box.width = bounds.width;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT)) {box.x = bounds.x;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT)) {box.x = bounds.x + (bounds.width - box.width);} else {box.x = bounds.x + ((bounds.width / 2) - (box.width / 2));}// Vertical axisif ((state->anchor & both_vert) && box.height == 0) {box.y = bounds.y;box.height = bounds.height;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)) {box.y = bounds.y;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM)) {box.y = bounds.y + (bounds.height - box.height);} else {box.y = bounds.y + ((bounds.height / 2) - (box.height / 2));}// Marginif ((state->anchor & both_horiz) == both_horiz) {box.x += state->margin.left;box.width -= state->margin.left + state->margin.right;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT)) {box.x += state->margin.left;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT)) {box.x -= state->margin.right;}if ((state->anchor & both_vert) == both_vert) {box.y += state->margin.top;box.height -= state->margin.top + state->margin.bottom;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP)) {box.y += state->margin.top;} else if ((state->anchor & ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM)) {box.y -= state->margin.bottom;}if (box.width < 0 || box.height < 0) {wlr_layer_surface_v1_destroy(wlr_layer_surface);continue;}layersurface->geo = box;if (state->exclusive_zone > 0)applyexclusive(usable_area, state->anchor, state->exclusive_zone,state->margin.top, state->margin.right,state->margin.bottom, state->margin.left);wlr_scene_node_set_position(layersurface->scene, box.x, box.y);wlr_layer_surface_v1_configure(wlr_layer_surface, box.width, box.height);
wlr_scene_layer_surface_v1_configure(layersurface->scene_layer, &full_area, usable_area);
layersurface->scene = wlr_scene_subsurface_tree_create(layers[wlr_layer_surface->pending.layer],wlr_layer_surface->surface);
layersurface->scene_layer = wlr_scene_layer_surface_v1_create(layers[wlr_layer_surface->pending.layer], wlr_layer_surface);layersurface->scene = layersurface->scene_layer->node;