summaryrefslogtreecommitdiff
path: root/sway/container.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/container.c')
-rw-r--r--sway/container.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/sway/container.c b/sway/container.c
index d034115f..3bdc8b6c 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -962,11 +962,28 @@ swayc_t *swayc_tabbed_stacked_parent(swayc_t *con) {
}
swayc_t *swayc_change_layout(swayc_t *container, enum swayc_layouts layout) {
+ // if layout change modifies the auto layout's major axis, swap width and height
+ // to preserve current ratios.
+ if (is_auto_layout(layout) && is_auto_layout(container->layout)) {
+ enum swayc_layouts prev_major = (container->layout == L_AUTO_LEFT ||
+ container->layout == L_AUTO_RIGHT)
+ ? L_HORIZ : L_VERT;
+ enum swayc_layouts new_major = (layout == L_AUTO_LEFT || layout == L_AUTO_RIGHT)
+ ? L_HORIZ : L_VERT;
+ if (new_major != prev_major) {
+ for (int i = 0; i < container->children->length; ++i) {
+ swayc_t *child = container->children->items[i];
+ double h = child->height;
+ child->height = child->width;
+ child->width = h;
+ }
+ }
+ }
if (container->type == C_WORKSPACE) {
container->workspace_layout = layout;
- if (layout == L_HORIZ || layout == L_VERT) {
- container->layout = layout;
- }
+ if (layout == L_HORIZ || layout == L_VERT || is_auto_layout(layout)) {
+ container->layout = layout;
+ }
} else {
container->layout = layout;
}