cleanup in auto layouts

- added L_AUTO_FIRST/LAST instead of using explicit layouts.
- when switching between auto layout that don't share the same major axis, invert the
  width/height of their child views to preserve their relative proportions.
This commit is contained in:
wil 2016-12-29 20:26:35 +01:00
parent 2b0e3c212a
commit a0aa8d9780
6 changed files with 70 additions and 18 deletions

View file

@ -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;
}