aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/debug-tree.c10
-rw-r--r--sway/tree/layout.c96
2 files changed, 57 insertions, 49 deletions
diff --git a/sway/debug-tree.c b/sway/debug-tree.c
index 08ee3585..aea6a8b1 100644
--- a/sway/debug-tree.c
+++ b/sway/debug-tree.c
@@ -34,12 +34,12 @@ static int draw_container(cairo_t *cairo, struct sway_container *container,
struct sway_container *focus, int x, int y) {
int text_width, text_height;
get_text_size(cairo, "monospace", &text_width, &text_height,
- 1, false, "%s '%s' %s %dx%d@%d,%d",
- container_type_to_str(container->type), container->name,
+ 1, false, "%s id:%zd '%s' %s %dx%d@%d,%d",
+ container_type_to_str(container->type), container->id, container->name,
layout_to_str(container->layout),
container->width, container->height, container->x, container->y);
cairo_rectangle(cairo, x, y, text_width, text_height);
- cairo_set_source_u32(cairo, 0xFFFFFFFF);
+ cairo_set_source_u32(cairo, 0xFFFFFFE0);
cairo_fill(cairo);
cairo_move_to(cairo, x, y);
if (focus == container) {
@@ -47,8 +47,8 @@ static int draw_container(cairo_t *cairo, struct sway_container *container,
} else {
cairo_set_source_u32(cairo, 0x000000FF);
}
- pango_printf(cairo, "monospace", 1, false, "%s '%s' %s %dx%d@%d,%d",
- container_type_to_str(container->type), container->name,
+ pango_printf(cairo, "monospace", 1, false, "%s id:%zd '%s' %s %dx%d@%d,%d",
+ container_type_to_str(container->type), container->id, container->name,
layout_to_str(container->layout),
container->width, container->height, container->x, container->y);
int height = text_height;
diff --git a/sway/tree/layout.c b/sway/tree/layout.c
index 1c31b215..a0586f40 100644
--- a/sway/tree/layout.c
+++ b/sway/tree/layout.c
@@ -381,53 +381,61 @@ void container_move(struct sway_container *container,
int index = index_child(container);
struct sway_container *old_parent = container->parent;
- switch (sibling->type) {
- case C_VIEW:
- if (sibling->parent == container->parent) {
- wlr_log(L_DEBUG, "Swapping siblings");
- sibling->parent->children->items[index + offs] = container;
- sibling->parent->children->items[index] = sibling;
- arrange_windows(sibling->parent, -1, -1);
- } else {
- wlr_log(L_DEBUG, "Promoting to sibling of cousin");
- container_insert_child(sibling->parent, container,
- index_child(sibling) + (offs > 0 ? 0 : 1));
- container->width = container->height = 0;
- arrange_windows(sibling->parent, -1, -1);
- arrange_windows(old_parent, -1, -1);
- }
- break;
- case C_WORKSPACE: // Note: only in the case of moving between outputs
- case C_CONTAINER:
- if (is_parallel(sibling->layout, move_dir)) {
- int limit = container_limit(sibling, move_dir);
- wlr_log(L_DEBUG, "Reparenting container (paralell)");
- limit = limit != 0 ? limit + 1 : limit; // Convert to index
- container_insert_child(sibling, container, limit);
- container->width = container->height = 0;
- arrange_windows(sibling, -1, -1);
- arrange_windows(old_parent, -1, -1);
- } else {
- wlr_log(L_DEBUG, "Reparenting container (perpendicular)");
- container_remove_child(container);
- struct sway_container *focus_inactive = seat_get_focus_inactive(
- config->handler_context.seat, sibling);
- if (focus_inactive) {
- container_add_sibling(focus_inactive, container);
- } else if (sibling->children->length) {
- container_add_sibling(sibling->children->items[0], container);
+ while (sibling) {
+ switch (sibling->type) {
+ case C_VIEW:
+ if (sibling->parent == container->parent) {
+ wlr_log(L_DEBUG, "Swapping siblings");
+ sibling->parent->children->items[index + offs] = container;
+ sibling->parent->children->items[index] = sibling;
+ arrange_windows(sibling->parent, -1, -1);
} else {
- container_add_child(sibling, container);
+ wlr_log(L_DEBUG, "Promoting to sibling of cousin");
+ container_insert_child(sibling->parent, container,
+ index_child(sibling) + (offs > 0 ? 0 : 1));
+ container->width = container->height = 0;
+ arrange_windows(sibling->parent, -1, -1);
+ arrange_windows(old_parent, -1, -1);
}
- container->width = container->height = 0;
- arrange_windows(sibling, -1, -1);
- arrange_windows(old_parent, -1, -1);
+ sibling = NULL;
+ break;
+ case C_WORKSPACE: // Note: only in the case of moving between outputs
+ case C_CONTAINER:
+ if (is_parallel(sibling->layout, move_dir)) {
+ int limit = container_limit(sibling, move_dir);
+ wlr_log(L_DEBUG, "Reparenting container (paralell)");
+ limit = limit != 0 ? limit + 1 : limit; // Convert to index
+ container_insert_child(sibling, container, limit);
+ container->width = container->height = 0;
+ arrange_windows(sibling, -1, -1);
+ arrange_windows(old_parent, -1, -1);
+ sibling = NULL;
+ } else {
+ wlr_log(L_DEBUG, "Reparenting container (perpendicular)");
+ container_remove_child(container);
+ struct sway_container *focus_inactive = seat_get_focus_inactive(
+ config->handler_context.seat, sibling);
+ wlr_log(L_DEBUG, "Focus inactive: %zd", focus_inactive ?
+ focus_inactive->id : 0);
+ if (focus_inactive) {
+ sibling = focus_inactive;
+ continue;
+ } else if (sibling->children->length) {
+ container_add_sibling(sibling->children->items[0], container);
+ } else {
+ container_add_child(sibling, container);
+ }
+ container->width = container->height = 0;
+ arrange_windows(sibling, -1, -1);
+ arrange_windows(old_parent, -1, -1);
+ sibling = NULL;
+ }
+ break;
+ default:
+ sway_assert(0, "Not expecting to see container of type %s here",
+ container_type_to_str(sibling->type));
+ return;
}
- break;
- default:
- sway_assert(0, "Not expecting to see container of type %s here",
- container_type_to_str(sibling->type));
- return;
}
if (old_parent) {