aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/swap.c3
-rw-r--r--sway/input/seatop_move_tiling.c22
2 files changed, 16 insertions, 9 deletions
diff --git a/sway/commands/swap.c b/sway/commands/swap.c
index b978af16..f27aa7ed 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 7c31e695..e1506175 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 ||