diff options
-rw-r--r-- | sway/container.c | 1 | ||||
-rw-r--r-- | sway/layout.c | 76 |
2 files changed, 68 insertions, 9 deletions
diff --git a/sway/container.c b/sway/container.c index 41d21c3b..67a34551 100644 --- a/sway/container.c +++ b/sway/container.c | |||
@@ -86,6 +86,7 @@ swayc_t *new_output(wlc_handle handle) { | |||
86 | 86 | ||
87 | // Find position for it | 87 | // Find position for it |
88 | if (oc && oc->x != -1 && oc->y != -1) { | 88 | if (oc && oc->x != -1 && oc->y != -1) { |
89 | sway_log(L_DEBUG, "Set %s position to %d, %d", name, oc->x, oc->y); | ||
89 | output->x = oc->x; | 90 | output->x = oc->x; |
90 | output->y = oc->y; | 91 | output->y = oc->y; |
91 | } else { | 92 | } else { |
diff --git a/sway/layout.c b/sway/layout.c index 7f3adc31..7a7ccc0e 100644 --- a/sway/layout.c +++ b/sway/layout.c | |||
@@ -169,8 +169,6 @@ void arrange_windows(swayc_t *container, double width, double height) { | |||
169 | for (i = 0; i < container->children->length; ++i) { | 169 | for (i = 0; i < container->children->length; ++i) { |
170 | swayc_t *child = container->children->items[i]; | 170 | swayc_t *child = container->children->items[i]; |
171 | sway_log(L_DEBUG, "Arranging output at %d", x); | 171 | sway_log(L_DEBUG, "Arranging output at %d", x); |
172 | child->x = x; | ||
173 | child->y = y; | ||
174 | arrange_windows(child, -1, -1); | 172 | arrange_windows(child, -1, -1); |
175 | x += child->width; | 173 | x += child->width; |
176 | } | 174 | } |
@@ -340,19 +338,79 @@ swayc_t *get_swayc_in_direction(swayc_t *container, enum movement_direction dir) | |||
340 | // Test if we can even make a difference here | 338 | // Test if we can even make a difference here |
341 | bool can_move = false; | 339 | bool can_move = false; |
342 | int diff = 0; | 340 | int diff = 0; |
343 | if (dir == MOVE_LEFT || dir == MOVE_RIGHT) { | 341 | int i; |
344 | if (parent->layout == L_HORIZ || parent->type == C_ROOT) { | 342 | if (parent->type == C_ROOT) { |
343 | // Find the next output | ||
344 | int target = -1, max_x = 0, max_y = 0, self = -1; | ||
345 | sway_log(L_DEBUG, "Moving between outputs"); | ||
346 | |||
347 | for (i = 0; i < parent->children->length; ++i) { | ||
348 | swayc_t *next = parent->children->items[i]; | ||
349 | if (next == container) { | ||
350 | self = i; | ||
351 | sway_log(L_DEBUG, "self is %p %d", next, self); | ||
352 | continue; | ||
353 | } | ||
354 | if (next->type == C_OUTPUT) { | ||
355 | sway_log(L_DEBUG, "Testing with %p %d (dir %d)", next, i, dir); | ||
356 | // Check if it's more extreme | ||
357 | if (dir == MOVE_RIGHT) { | ||
358 | if (container->x + container->width <= next->x) { | ||
359 | if (target == -1 || next->x < max_x) { | ||
360 | target = i; | ||
361 | max_x = next->x; | ||
362 | } | ||
363 | } | ||
364 | } else if (dir == MOVE_LEFT) { | ||
365 | sway_log(L_DEBUG, "next->x: %d, next->width: %d, container->x: %d", | ||
366 | (int)next->x, (int)next->width, (int)container->x); | ||
367 | if (container->x > next->x + next->width) { | ||
368 | sway_log(L_DEBUG, "match"); | ||
369 | if (target == -1 || max_x < next->x) { | ||
370 | sway_log(L_DEBUG, "hit"); | ||
371 | target = i; | ||
372 | max_x = next->x; | ||
373 | } | ||
374 | } | ||
375 | } else if (dir == MOVE_DOWN) { | ||
376 | if (container->y + container->height <= next->y) { | ||
377 | if (target == -1 || next->y < max_y) { | ||
378 | target = i; | ||
379 | max_y = next->y; | ||
380 | } | ||
381 | } | ||
382 | } else if (dir == MOVE_UP) { | ||
383 | if (container->y > next->y + next->height) { | ||
384 | if (target == -1 || max_y < next->y) { | ||
385 | target = i; | ||
386 | max_y = next->y; | ||
387 | } | ||
388 | } | ||
389 | } | ||
390 | } | ||
391 | } | ||
392 | |||
393 | if (target == -1) { | ||
394 | can_move = false; | ||
395 | } else { | ||
345 | can_move = true; | 396 | can_move = true; |
346 | diff = dir == MOVE_LEFT ? -1 : 1; | 397 | diff = target - self; |
347 | } | 398 | } |
348 | } else { | 399 | } else { |
349 | if (parent->layout == L_VERT) { | 400 | if (dir == MOVE_LEFT || dir == MOVE_RIGHT) { |
350 | can_move = true; | 401 | if (parent->layout == L_HORIZ) { |
351 | diff = dir == MOVE_UP ? -1 : 1; | 402 | can_move = true; |
403 | diff = dir == MOVE_LEFT ? -1 : 1; | ||
404 | } | ||
405 | } else { | ||
406 | if (parent->layout == L_VERT) { | ||
407 | can_move = true; | ||
408 | diff = dir == MOVE_UP ? -1 : 1; | ||
409 | } | ||
352 | } | 410 | } |
353 | } | 411 | } |
412 | |||
354 | if (can_move) { | 413 | if (can_move) { |
355 | int i; | ||
356 | for (i = 0; i < parent->children->length; ++i) { | 414 | for (i = 0; i < parent->children->length; ++i) { |
357 | swayc_t *child = parent->children->items[i]; | 415 | swayc_t *child = parent->children->items[i]; |
358 | if (child == container) { | 416 | if (child == container) { |