summaryrefslogtreecommitdiffstats
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) {
962} 962}
963 963
964swayc_t *swayc_change_layout(swayc_t *container, enum swayc_layouts layout) { 964swayc_t *swayc_change_layout(swayc_t *container, enum swayc_layouts layout) {
965 // if layout change modifies the auto layout's major axis, swap width and height
966 // to preserve current ratios.
967 if (is_auto_layout(layout) && is_auto_layout(container->layout)) {
968 enum swayc_layouts prev_major = (container->layout == L_AUTO_LEFT ||
969 container->layout == L_AUTO_RIGHT)
970 ? L_HORIZ : L_VERT;
971 enum swayc_layouts new_major = (layout == L_AUTO_LEFT || layout == L_AUTO_RIGHT)
972 ? L_HORIZ : L_VERT;
973 if (new_major != prev_major) {
974 for (int i = 0; i < container->children->length; ++i) {
975 swayc_t *child = container->children->items[i];
976 double h = child->height;
977 child->height = child->width;
978 child->width = h;
979 }
980 }
981 }
965 if (container->type == C_WORKSPACE) { 982 if (container->type == C_WORKSPACE) {
966 container->workspace_layout = layout; 983 container->workspace_layout = layout;
967 if (layout == L_HORIZ || layout == L_VERT) { 984 if (layout == L_HORIZ || layout == L_VERT || is_auto_layout(layout)) {
968 container->layout = layout; 985 container->layout = layout;
969 } 986 }
970 } else { 987 } else {
971 container->layout = layout; 988 container->layout = layout;
972 } 989 }