From 745fe829473233e06fc861db1743729b3caae68f Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Tue, 25 Jan 2022 00:11:20 +0100 Subject: [PATCH] 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