diff options
Diffstat (limited to 'sway/tree')
-rw-r--r-- | sway/tree/arrange.c | 68 | ||||
-rw-r--r-- | sway/tree/container.c | 8 |
2 files changed, 50 insertions, 26 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) { | |||
18 | return; | 18 | return; |
19 | } | 19 | } |
20 | 20 | ||
21 | // Count the number of new windows we are resizing | 21 | // Count the number of new windows we are resizing, and how much space |
22 | // is currently occupied | ||
22 | int new_children = 0; | 23 | int new_children = 0; |
24 | double current_width_fraction = 0; | ||
23 | for (int i = 0; i < children->length; ++i) { | 25 | for (int i = 0; i < children->length; ++i) { |
24 | struct sway_container *child = children->items[i]; | 26 | struct sway_container *child = children->items[i]; |
25 | if (child->width <= 0) { | 27 | current_width_fraction += child->width_fraction; |
28 | if (child->width_fraction <= 0) { | ||
26 | new_children += 1; | 29 | new_children += 1; |
27 | } | 30 | } |
28 | } | 31 | } |
29 | 32 | ||
30 | // Calculate total width of children | 33 | // Calculate each height fraction |
31 | double total_width = 0; | 34 | double total_width_fraction = 0; |
32 | for (int i = 0; i < children->length; ++i) { | 35 | for (int i = 0; i < children->length; ++i) { |
33 | struct sway_container *child = children->items[i]; | 36 | struct sway_container *child = children->items[i]; |
34 | if (child->width <= 0) { | 37 | if (child->width_fraction <= 0) { |
35 | if (children->length > new_children) { | 38 | if (current_width_fraction <= 0) { |
36 | child->width = parent->width / (children->length - new_children); | 39 | child->width_fraction = 1.0; |
40 | } else if (children->length > new_children) { | ||
41 | child->width_fraction = current_width_fraction / | ||
42 | (children->length - new_children); | ||
37 | } else { | 43 | } else { |
38 | child->width = parent->width; | 44 | child->width_fraction = current_width_fraction; |
39 | } | 45 | } |
40 | } | 46 | } |
41 | container_remove_gaps(child); | 47 | total_width_fraction += child->width_fraction; |
42 | total_width += child->width; | 48 | } |
49 | // Normalize width fractions so the sum is 1.0 | ||
50 | for (int i = 0; i < children->length; ++i) { | ||
51 | struct sway_container *child = children->items[i]; | ||
52 | child->width_fraction /= total_width_fraction; | ||
43 | } | 53 | } |
44 | double scale = parent->width / total_width; | ||
45 | 54 | ||
46 | // Resize windows | 55 | // Resize windows |
47 | sway_log(SWAY_DEBUG, "Arranging %p horizontally", parent); | 56 | sway_log(SWAY_DEBUG, "Arranging %p horizontally", parent); |
48 | double child_x = parent->x; | 57 | double child_x = parent->x; |
49 | for (int i = 0; i < children->length; ++i) { | 58 | for (int i = 0; i < children->length; ++i) { |
50 | struct sway_container *child = children->items[i]; | 59 | struct sway_container *child = children->items[i]; |
60 | container_remove_gaps(child); | ||
51 | child->x = child_x; | 61 | child->x = child_x; |
52 | child->y = parent->y; | 62 | child->y = parent->y; |
53 | child->width = floor(child->width * scale); | 63 | child->width = floor(child->width_fraction * parent->width); |
54 | child->height = parent->height; | 64 | child->height = parent->height; |
55 | child_x += child->width; | 65 | child_x += child->width; |
56 | 66 | ||
@@ -67,40 +77,50 @@ static void apply_vert_layout(list_t *children, struct wlr_box *parent) { | |||
67 | return; | 77 | return; |
68 | } | 78 | } |
69 | 79 | ||
70 | // Count the number of new windows we are resizing | 80 | // Count the number of new windows we are resizing, and how much space |
81 | // is currently occupied | ||
71 | int new_children = 0; | 82 | int new_children = 0; |
83 | double current_height_fraction = 0; | ||
72 | for (int i = 0; i < children->length; ++i) { | 84 | for (int i = 0; i < children->length; ++i) { |
73 | struct sway_container *child = children->items[i]; | 85 | struct sway_container *child = children->items[i]; |
74 | if (child->height <= 0) { | 86 | current_height_fraction += child->height_fraction; |
87 | if (child->height_fraction <= 0) { | ||
75 | new_children += 1; | 88 | new_children += 1; |
76 | } | 89 | } |
77 | } | 90 | } |
78 | 91 | ||
79 | // Calculate total height of children | 92 | // Calculate each height fraction |
80 | double total_height = 0; | 93 | double total_height_fraction = 0; |
81 | for (int i = 0; i < children->length; ++i) { | 94 | for (int i = 0; i < children->length; ++i) { |
82 | struct sway_container *child = children->items[i]; | 95 | struct sway_container *child = children->items[i]; |
83 | if (child->height <= 0) { | 96 | if (child->height_fraction <= 0) { |
84 | if (children->length > new_children) { | 97 | if (current_height_fraction <= 0) { |
85 | child->height = parent->height / (children->length - new_children); | 98 | child->height_fraction = 1.0; |
99 | } else if (children->length > new_children) { | ||
100 | child->height_fraction = current_height_fraction / | ||
101 | (children->length - new_children); | ||
86 | } else { | 102 | } else { |
87 | child->height = parent->height; | 103 | child->height_fraction = current_height_fraction; |
88 | } | 104 | } |
89 | } | 105 | } |
90 | container_remove_gaps(child); | 106 | total_height_fraction += child->height_fraction; |
91 | total_height += child->height; | 107 | } |
108 | // Normalize height fractions so the sum is 1.0 | ||
109 | for (int i = 0; i < children->length; ++i) { | ||
110 | struct sway_container *child = children->items[i]; | ||
111 | child->height_fraction /= total_height_fraction; | ||
92 | } | 112 | } |
93 | double scale = parent->height / total_height; | ||
94 | 113 | ||
95 | // Resize | 114 | // Resize |
96 | sway_log(SWAY_DEBUG, "Arranging %p vertically", parent); | 115 | sway_log(SWAY_DEBUG, "Arranging %p vertically", parent); |
97 | double child_y = parent->y; | 116 | double child_y = parent->y; |
98 | for (int i = 0; i < children->length; ++i) { | 117 | for (int i = 0; i < children->length; ++i) { |
99 | struct sway_container *child = children->items[i]; | 118 | struct sway_container *child = children->items[i]; |
119 | container_remove_gaps(child); | ||
100 | child->x = parent->x; | 120 | child->x = parent->x; |
101 | child->y = child_y; | 121 | child->y = child_y; |
102 | child->width = parent->width; | 122 | child->width = parent->width; |
103 | child->height = floor(child->height * scale); | 123 | child->height = floor(child->height_fraction * parent->height); |
104 | child_y += child->height; | 124 | child_y += child->height; |
105 | 125 | ||
106 | // Make last child use remaining height of parent | 126 | // Make last child use remaining height of parent |
diff --git a/sway/tree/container.c b/sway/tree/container.c index 9046ae27..068dbb88 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c | |||
@@ -789,6 +789,8 @@ void container_set_floating(struct sway_container *container, bool enable) { | |||
789 | container->border = container->saved_border; | 789 | container->border = container->saved_border; |
790 | } | 790 | } |
791 | } | 791 | } |
792 | container->width_fraction = 0; | ||
793 | container->height_fraction = 0; | ||
792 | } | 794 | } |
793 | 795 | ||
794 | container_end_mouse_operation(container); | 796 | container_end_mouse_operation(container); |
@@ -1022,9 +1024,9 @@ void container_fullscreen_disable(struct sway_container *con) { | |||
1022 | if (container_is_floating(con)) { | 1024 | if (container_is_floating(con)) { |
1023 | con->x = con->saved_x; | 1025 | con->x = con->saved_x; |
1024 | con->y = con->saved_y; | 1026 | con->y = con->saved_y; |
1027 | con->width = con->saved_width; | ||
1028 | con->height = con->saved_height; | ||
1025 | } | 1029 | } |
1026 | con->width = con->saved_width; | ||
1027 | con->height = con->saved_height; | ||
1028 | 1030 | ||
1029 | if (con->fullscreen_mode == FULLSCREEN_WORKSPACE) { | 1031 | if (con->fullscreen_mode == FULLSCREEN_WORKSPACE) { |
1030 | if (con->workspace) { | 1032 | if (con->workspace) { |
@@ -1415,6 +1417,8 @@ struct sway_container *container_split(struct sway_container *child, | |||
1415 | struct sway_container *cont = container_create(NULL); | 1417 | struct sway_container *cont = container_create(NULL); |
1416 | cont->width = child->width; | 1418 | cont->width = child->width; |
1417 | cont->height = child->height; | 1419 | cont->height = child->height; |
1420 | cont->width_fraction = child->width_fraction; | ||
1421 | cont->height_fraction = child->height_fraction; | ||
1418 | cont->x = child->x; | 1422 | cont->x = child->x; |
1419 | cont->y = child->y; | 1423 | cont->y = child->y; |
1420 | cont->current_gaps = child->current_gaps; | 1424 | cont->current_gaps = child->current_gaps; |