diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index 8448d7059..adeb85ae5 100644 --- a/include/sway/tree/container.h +++ b/include/sway/tree/container.h @@ -326,6 +326,8 @@ void container_detach(struct sway_container *child); void container_replace(struct sway_container *container, struct sway_container *replacement); +void container_swap(struct sway_container *con1, struct sway_container *con2); + struct sway_container *container_split(struct sway_container *child, enum sway_container_layout layout); diff --git a/sway/commands/swap.c b/sway/commands/swap.c index b978af162..f27aa7ed3 100644 --- a/sway/commands/swap.c +++ b/sway/commands/swap.c @@ -84,8 +84,7 @@ static void swap_focus(struct sway_container *con1, } } -static void container_swap(struct sway_container *con1, - struct sway_container *con2) { +void container_swap(struct sway_container *con1, struct sway_container *con2) { if (!sway_assert(con1 && con2, "Cannot swap with nothing")) { return; } diff --git a/sway/input/seatop_move_tiling.c b/sway/input/seatop_move_tiling.c index 7c31e695a..e1506175f 100644 --- a/sway/input/seatop_move_tiling.c +++ b/sway/input/seatop_move_tiling.c @@ -245,8 +245,12 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec, target_node->sway_workspace : target_node->sway_container->workspace; enum wlr_edges edge = e->target_edge; int after = edge != WLR_EDGE_TOP && edge != WLR_EDGE_LEFT; + bool swap = edge == WLR_EDGE_NONE && target_node->type == N_CONTAINER; + + if (!swap) { + container_detach(con); + } - container_detach(con); // Moving container into empty workspace if (target_node->type == N_WORKSPACE && edge == WLR_EDGE_NONE) { @@ -254,13 +258,17 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec, } else if (target_node->type == N_CONTAINER) { // Moving container before/after another struct sway_container *target = target_node->sway_container; - enum sway_container_layout layout = container_parent_layout(target); - if (edge && !is_parallel(layout, edge)) { - enum sway_container_layout new_layout = edge == WLR_EDGE_TOP || - edge == WLR_EDGE_BOTTOM ? L_VERT : L_HORIZ; - container_split(target, new_layout); + if (swap) { + container_swap(target_node->sway_container, con); + } else { + enum sway_container_layout layout = container_parent_layout(target); + if (edge && !is_parallel(layout, edge)) { + enum sway_container_layout new_layout = edge == WLR_EDGE_TOP || + edge == WLR_EDGE_BOTTOM ? L_VERT : L_HORIZ; + container_split(target, new_layout); + } + container_add_sibling(target, con, after); } - container_add_sibling(target, con, after); } else { // Target is a workspace which requires splitting enum sway_container_layout new_layout = edge == WLR_EDGE_TOP ||