scene/layer_shell_v1.c: set exclusive zone correctly

...when only one edge is anchored.

The layer-shell protocol specifies that a positive exclusive-zone value is
'meaningful' if the surface is anchored to either:

1. one edge
2. one edge and both perpendicular edges.

For example, if you wish to position a layer-shell client along the top
edge and make it exclusive, you should be able to either set anchor=TOP or
anchor=TOP|LEFT|RIGHT. It appears that many panels/bars use the latter
approach (anchor to an edge and also both perpendicular edges) which is
probably why this has not been reported previously.

This patch adds support for the first case and thereby makes exclusive
zone behaviour consistent with the protocol and also with sway's extant
layer-shell implementation.
This commit is contained in:
Johan Malm 2022-11-26 17:18:33 +00:00 committed by Kirill Primak
parent 32d00984e1
commit 8e80432a72

View file

@ -39,6 +39,7 @@ static void layer_surface_exclusive_zone(
struct wlr_layer_surface_v1_state *state, struct wlr_layer_surface_v1_state *state,
struct wlr_box *usable_area) { struct wlr_box *usable_area) {
switch (state->anchor) { switch (state->anchor) {
case ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP:
case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |
ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT):
@ -46,12 +47,14 @@ static void layer_surface_exclusive_zone(
usable_area->y += state->exclusive_zone + state->margin.top; usable_area->y += state->exclusive_zone + state->margin.top;
usable_area->height -= state->exclusive_zone + state->margin.top; usable_area->height -= state->exclusive_zone + state->margin.top;
break; break;
case ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM:
case (ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | case (ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM |
ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT |
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT):
// Anchor bottom // Anchor bottom
usable_area->height -= state->exclusive_zone + state->margin.bottom; usable_area->height -= state->exclusive_zone + state->margin.bottom;
break; break;
case ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT:
case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |
ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM |
ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT): ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT):
@ -59,6 +62,7 @@ static void layer_surface_exclusive_zone(
usable_area->x += state->exclusive_zone + state->margin.left; usable_area->x += state->exclusive_zone + state->margin.left;
usable_area->width -= state->exclusive_zone + state->margin.left; usable_area->width -= state->exclusive_zone + state->margin.left;
break; break;
case ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT:
case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | case (ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP |
ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM |
ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): // Anchor right ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT): // Anchor right