summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2015-08-08 18:34:33 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2015-08-08 18:34:44 -0400
commit4181c36862904e92c81582f73b2118e380c71d2e (patch)
tree4181a405c6ad0576dc5d7846ee14fa579898ec56
parentDeny window resize requests (diff)
downloadsway-4181c36862904e92c81582f73b2118e380c71d2e.tar.gz
sway-4181c36862904e92c81582f73b2118e380c71d2e.tar.zst
sway-4181c36862904e92c81582f73b2118e380c71d2e.zip
Handle focus changes
And some simple refactoring
-rw-r--r--sway/layout.c60
1 files changed, 48 insertions, 12 deletions
diff --git a/sway/layout.c b/sway/layout.c
index bbdcb844..403ec13a 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -11,22 +11,17 @@ void arrange_windows(swayc_t *container, int width, int height) {
11 int i; 11 int i;
12 if (width == -1 || height == -1) { 12 if (width == -1 || height == -1) {
13 sway_log(L_DEBUG, "Arranging layout for %p", container); 13 sway_log(L_DEBUG, "Arranging layout for %p", container);
14 }
15 if (width == -1) {
16 width = container->width; 14 width = container->width;
17 }
18 if (height == -1) {
19 height = container->height; 15 height = container->height;
20 } 16 }
21 17
22 if (container->type == C_ROOT) { 18 switch (container->type) {
19 case C_ROOT:
23 for (i = 0; i < container->children->length; ++i) { 20 for (i = 0; i < container->children->length; ++i) {
24 arrange_windows(container->children->items[i], -1, -1); 21 arrange_windows(container->children->items[i], -1, -1);
25 } 22 }
26 return; 23 return;
27 } 24 case C_VIEW:
28
29 if (container->type == C_VIEW) {
30 sway_log(L_DEBUG, "Setting view to %d x %d @ %d, %d", width, height, container->x, container->y); 25 sway_log(L_DEBUG, "Setting view to %d x %d @ %d, %d", width, height, container->x, container->y);
31 struct wlc_geometry geometry = { 26 struct wlc_geometry geometry = {
32 .origin = { 27 .origin = {
@@ -39,10 +34,14 @@ void arrange_windows(swayc_t *container, int width, int height) {
39 } 34 }
40 }; 35 };
41 wlc_view_set_geometry(container->handle, &geometry); 36 wlc_view_set_geometry(container->handle, &geometry);
37 container->width = width;
38 container->height = height;
42 return; 39 return;
40 default:
41 container->width = width;
42 container->height = height;
43 break;
43 } 44 }
44 container->width = width;
45 container->height = height;
46 45
47 double total_weight = 0; 46 double total_weight = 0;
48 for (i = 0; i < container->children->length; ++i) { 47 for (i = 0; i < container->children->length; ++i) {
@@ -66,12 +65,25 @@ void arrange_windows(swayc_t *container, int width, int height) {
66 x += w; 65 x += w;
67 } 66 }
68 break; 67 break;
68 case L_VERT:
69 for (i = 0; i < container->children->length; ++i) {
70 swayc_t *child = container->children->items[i];
71 double percent = child->weight / total_weight;
72 sway_log(L_DEBUG, "Calculating arrangement for %p:%d (will receive %.2f of %d)", child, child->type, percent, width);
73 child->x = x + container->x;
74 child->y = y + container->y;
75 int w = width;
76 int h = height * percent;
77 arrange_windows(child, w, h);
78 y += h;
79 }
80 break;
69 } 81 }
70} 82}
71 83
72void init_layout() { 84void init_layout() {
73 root_container.type = C_ROOT; 85 root_container.type = C_ROOT;
74 root_container.layout = L_HORIZ; // TODO: Default layout 86 root_container.layout = L_NONE;
75 root_container.children = create_list(); 87 root_container.children = create_list();
76 root_container.handle = -1; 88 root_container.handle = -1;
77} 89}
@@ -146,12 +158,36 @@ void destroy_view(swayc_t *view) {
146 158
147 free_swayc(view); 159 free_swayc(view);
148 160
149 // TODO: Focus some other window 161 if (parent->children->length != 0) {
162 focus_view(parent->children->items[0]);
163 } else {
164 focus_view(parent);
165 }
150 166
151 arrange_windows(parent, -1, -1); 167 arrange_windows(parent, -1, -1);
152} 168}
153 169
170void unfocus_all(swayc_t *container) {
171 if (container->children == NULL) {
172 return;
173 }
174 int i;
175 for (i = 0; i < container->children->length; ++i) {
176 swayc_t *view = container->children->items[i];
177 if (view->type == C_VIEW) {
178 wlc_view_set_state(view->handle, WLC_BIT_ACTIVATED, false);
179 } else {
180 unfocus_all(view);
181 }
182 }
183}
184
154void focus_view(swayc_t *view) { 185void focus_view(swayc_t *view) {
186 if (view->type == C_VIEW) {
187 unfocus_all(&root_container);
188 wlc_view_set_state(view->handle, WLC_BIT_ACTIVATED, true);
189 wlc_view_focus(view->handle);
190 }
155 if (view == &root_container) { 191 if (view == &root_container) {
156 return; 192 return;
157 } 193 }