summaryrefslogtreecommitdiff
path: root/sway/tree/arrange.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/arrange.c')
-rw-r--r--sway/tree/arrange.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/sway/tree/arrange.c b/sway/tree/arrange.c
index fc5d49ed..dd0a72cd 100644
--- a/sway/tree/arrange.c
+++ b/sway/tree/arrange.c
@@ -18,39 +18,49 @@ static void apply_horiz_layout(list_t *children, struct wlr_box *parent) {
return;
}
- // Count the number of new windows we are resizing
+ // Count the number of new windows we are resizing, and how much space
+ // is currently occupied
int new_children = 0;
+ double current_width_fraction = 0;
for (int i = 0; i < children->length; ++i) {
struct sway_container *child = children->items[i];
- if (child->width <= 0) {
+ current_width_fraction += child->width_fraction;
+ if (child->width_fraction <= 0) {
new_children += 1;
}
}
- // Calculate total width of children
- double total_width = 0;
+ // Calculate each height fraction
+ double total_width_fraction = 0;
for (int i = 0; i < children->length; ++i) {
struct sway_container *child = children->items[i];
- if (child->width <= 0) {
- if (children->length > new_children) {
- child->width = parent->width / (children->length - new_children);
+ if (child->width_fraction <= 0) {
+ if (current_width_fraction <= 0) {
+ child->width_fraction = 1.0;
+ } else if (children->length > new_children) {
+ child->width_fraction = current_width_fraction /
+ (children->length - new_children);
} else {
- child->width = parent->width;
+ child->width_fraction = current_width_fraction;
}
}
- container_remove_gaps(child);
- total_width += child->width;
+ total_width_fraction += child->width_fraction;
+ }
+ // Normalize width fractions so the sum is 1.0
+ for (int i = 0; i < children->length; ++i) {
+ struct sway_container *child = children->items[i];
+ child->width_fraction /= total_width_fraction;
}
- double scale = parent->width / total_width;
// Resize windows
sway_log(SWAY_DEBUG, "Arranging %p horizontally", parent);
double child_x = parent->x;
for (int i = 0; i < children->length; ++i) {
struct sway_container *child = children->items[i];
+ container_remove_gaps(child);
child->x = child_x;
child->y = parent->y;
- child->width = floor(child->width * scale);
+ child->width = floor(child->width_fraction * parent->width);
child->height = parent->height;
child_x += child->width;
@@ -67,40 +77,50 @@ static void apply_vert_layout(list_t *children, struct wlr_box *parent) {
return;
}
- // Count the number of new windows we are resizing
+ // Count the number of new windows we are resizing, and how much space
+ // is currently occupied
int new_children = 0;
+ double current_height_fraction = 0;
for (int i = 0; i < children->length; ++i) {
struct sway_container *child = children->items[i];
- if (child->height <= 0) {
+ current_height_fraction += child->height_fraction;
+ if (child->height_fraction <= 0) {
new_children += 1;
}
}
- // Calculate total height of children
- double total_height = 0;
+ // Calculate each height fraction
+ double total_height_fraction = 0;
for (int i = 0; i < children->length; ++i) {
struct sway_container *child = children->items[i];
- if (child->height <= 0) {
- if (children->length > new_children) {
- child->height = parent->height / (children->length - new_children);
+ if (child->height_fraction <= 0) {
+ if (current_height_fraction <= 0) {
+ child->height_fraction = 1.0;
+ } else if (children->length > new_children) {
+ child->height_fraction = current_height_fraction /
+ (children->length - new_children);
} else {
- child->height = parent->height;
+ child->height_fraction = current_height_fraction;
}
}
- container_remove_gaps(child);
- total_height += child->height;
+ total_height_fraction += child->height_fraction;
+ }
+ // Normalize height fractions so the sum is 1.0
+ for (int i = 0; i < children->length; ++i) {
+ struct sway_container *child = children->items[i];
+ child->height_fraction /= total_height_fraction;
}
- double scale = parent->height / total_height;
// Resize
sway_log(SWAY_DEBUG, "Arranging %p vertically", parent);
double child_y = parent->y;
for (int i = 0; i < children->length; ++i) {
struct sway_container *child = children->items[i];
+ container_remove_gaps(child);
child->x = parent->x;
child->y = child_y;
child->width = parent->width;
- child->height = floor(child->height * scale);
+ child->height = floor(child->height_fraction * parent->height);
child_y += child->height;
// Make last child use remaining height of parent