git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitf8482a88c8fcb508256f02fe7fa3011539311eb6
parentfb173bc172
authorIsaac Freund <[email protected]>
date2022-01-25 00:11
layer-shell: center when opposing anchors are set

Currently river will place the surface at the top or left edge if
opposing anchors are set without a 0 width/height. Instead, center
the surface between the anchors.

 river/Output.zig | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/river/Output.zig b/river/Output.zig
index c0bcae0..97311c9 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -319,19 +319,20 @@ fn arrangeLayer(
             layer_surface.wlr_layer_surface.destroy();
             return;
         } else if (current_state.desired_width == 0) {
-            std.debug.assert(current_state.anchor.right and current_state.anchor.left);
+            assert(current_state.anchor.right and current_state.anchor.left);
             new_box.x = bounds.x + @intCast(i32, current_state.margin.left);
             new_box.width = bounds.width - (current_state.margin.left + current_state.margin.right);
+        } else if (current_state.anchor.left == current_state.anchor.right) {
+            new_box.x = bounds.x + @intCast(i32, bounds.width / 2 - current_state.desired_width / 2);
+            new_box.width = current_state.desired_width;
         } else if (current_state.anchor.left) {
             new_box.x = bounds.x + @intCast(i32, current_state.margin.left);
             new_box.width = current_state.desired_width;
-        } else if (current_state.anchor.right) {
+        } else {
+            assert(current_state.anchor.right);
             new_box.x = bounds.x + @intCast(i32, bounds.width - current_state.desired_width -
                 current_state.margin.right);
             new_box.width = current_state.desired_width;
-        } else {
-            new_box.x = bounds.x + @intCast(i32, bounds.width / 2 - current_state.desired_width / 2);
-            new_box.width = current_state.desired_width;
         }
 
         // Vertical alignment
@@ -346,19 +347,20 @@ fn arrangeLayer(
             // stop this attempt early.
             return;
         } else if (current_state.desired_height == 0) {
-            std.debug.assert(current_state.anchor.top and current_state.anchor.bottom);
+            assert(current_state.anchor.top and current_state.anchor.bottom);
             new_box.y = bounds.y + @intCast(i32, current_state.margin.top);
             new_box.height = bounds.height - (current_state.margin.top + current_state.margin.bottom);
+        } else if (current_state.anchor.top == current_state.anchor.bottom) {
+            new_box.y = bounds.y + @intCast(i32, bounds.height / 2 - current_state.desired_height / 2);
+            new_box.height = current_state.desired_height;
         } else if (current_state.anchor.top) {
             new_box.y = bounds.y + @intCast(i32, current_state.margin.top);
             new_box.height = current_state.desired_height;
-        } else if (current_state.anchor.bottom) {
+        } else {
+            assert(current_state.anchor.bottom);
             new_box.y = bounds.y + @intCast(i32, bounds.height - current_state.desired_height -
                 current_state.margin.bottom);
             new_box.height = current_state.desired_height;
-        } else {
-            new_box.y = bounds.y + @intCast(i32, bounds.height / 2 - current_state.desired_height / 2);
-            new_box.height = current_state.desired_height;
         }
 
         // Apply the exclusive zone to the current bounds