diff --git a/sway/tree/container.c b/sway/tree/container.c index f36820b3..cd2c083c 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -445,9 +445,6 @@ void container_descendants(struct sway_container *root, func(item, data); } container_descendants(item, type, func, data); - if (i < root->children->length && root->children->items[i] != item) { - --i; - } } } diff --git a/sway/tree/layout.c b/sway/tree/layout.c index fc17d8c3..6d4cd088 100644 --- a/sway/tree/layout.c +++ b/sway/tree/layout.c @@ -184,6 +184,7 @@ void container_move_to(struct sway_container *container, container_sort_workspaces(new_parent); seat_set_focus(seat, new_parent); workspace_output_raise_priority(container, old_parent, new_parent); + ipc_event_workspace(container, NULL, "move"); } container_notify_subtree_changed(old_parent); container_notify_subtree_changed(new_parent); diff --git a/sway/tree/output.c b/sway/tree/output.c index 1ab8bed2..ed7e941e 100644 --- a/sway/tree/output.c +++ b/sway/tree/output.c @@ -8,26 +8,30 @@ #include "sway/tree/workspace.h" #include "log.h" -static void restore_workspace(struct sway_container *ws, void *output) { - if (ws->parent == output) { - return; - } - - struct sway_container *highest = workspace_output_get_highest_available( - ws, NULL); - if (!highest) { - return; - } +static void restore_workspaces(struct sway_container *output) { + for (int i = 0; i < root_container.children->length; i++) { + struct sway_container *other = root_container.children->items[i]; + if (other == output) { + continue; + } - if (highest == output) { - struct sway_container *other = container_remove_child(ws); - container_add_child(output, ws); - ipc_event_workspace(ws, NULL, "move"); + for (int j = 0; j < other->children->length; j++) { + struct sway_container *ws = other->children->items[j]; + struct sway_container *highest = + workspace_output_get_highest_available(ws, NULL); + if (highest == output) { + container_remove_child(ws); + container_add_child(output, ws); + ipc_event_workspace(ws, NULL, "move"); + j--; + } + } - container_sort_workspaces(output); - arrange_output(output); arrange_output(other); } + + container_sort_workspaces(output); + arrange_output(output); } struct sway_container *output_create( @@ -80,8 +84,7 @@ struct sway_container *output_create( output->width = size.width; output->height = size.height; - container_descendants(&root_container, C_WORKSPACE, restore_workspace, - output); + restore_workspaces(output); if (!output->children->length) { // Create workspace