From 538b36c0e2f9f0bf64ef473789e2598ac7d1629f Mon Sep 17 00:00:00 2001 From: Sebastian Parborg Date: Mon, 8 Jul 2019 22:29:04 +0200 Subject: Make mouse drag in tiled mode swap containers if no edge is selected Now the highlighted center area of containers triggers a swap action instead of moving around the containers. --- include/sway/tree/container.h | 2 ++ sway/commands/swap.c | 3 +-- sway/input/seatop_move_tiling.c | 22 +++++++++++++++------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index 8448d705..adeb85ae 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 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 || -- cgit v1.2.3-54-g00ecf