aboutsummaryrefslogtreecommitdiff
path: root/sway/container.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/container.c')
-rw-r--r--sway/container.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/sway/container.c b/sway/container.c
index e557f450..cf7d7dda 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -32,6 +32,8 @@ static swayc_t *new_swayc(enum swayc_types type) {
c->layout = L_NONE;
c->workspace_layout = L_NONE;
c->type = type;
+ c->nb_master = 1;
+ c->nb_slave_groups = 1;
if (type != C_VIEW) {
c->children = create_list();
}
@@ -960,11 +962,29 @@ 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;
}