From bf19f63a79f4d844259800c9415599271438cabd Mon Sep 17 00:00:00 2001
From: Ryan Dwyer <ryandwyer1@gmail.com>
Date: Thu, 1 Nov 2018 08:29:45 +1000
Subject: Wrap to fartherest output when running focus output

Also moves the `opposite_direction` function into `util.c` as it's used
in two places now.
---
 sway/commands/focus.c | 11 +++++++++++
 sway/commands/move.c  | 13 -------------
 2 files changed, 11 insertions(+), 13 deletions(-)

(limited to 'sway/commands')

diff --git a/sway/commands/focus.c b/sway/commands/focus.c
index 521b2427..cef92144 100644
--- a/sway/commands/focus.c
+++ b/sway/commands/focus.c
@@ -196,6 +196,17 @@ static struct cmd_results *focus_output(struct sway_seat *seat,
 		}
 		struct sway_workspace *ws = seat_get_focused_workspace(seat);
 		output = output_get_in_direction(ws->output, direction);
+
+		if (!output) {
+			int center_lx = ws->output->lx + ws->output->width / 2;
+			int center_ly = ws->output->ly + ws->output->height / 2;
+			struct wlr_output *target = wlr_output_layout_farthest_output(
+					root->output_layout, opposite_direction(direction),
+					ws->output->wlr_output, center_lx, center_ly);
+			if (target) {
+				output = output_from_wlr_output(target);
+			}
+		}
 	}
 
 	free(identifier);
diff --git a/sway/commands/move.c b/sway/commands/move.c
index 30c198e4..9035e3e2 100644
--- a/sway/commands/move.c
+++ b/sway/commands/move.c
@@ -27,19 +27,6 @@ static const char *expected_syntax =
 	"'move <container|window|workspace> [to] output <name|direction>' or "
 	"'move <container|window> [to] mark <mark>'";
 
-enum wlr_direction opposite_direction(enum wlr_direction d) {
-	switch (d) {
-		case WLR_DIRECTION_UP:
-			return WLR_DIRECTION_DOWN;
-		case WLR_DIRECTION_DOWN:
-			return WLR_DIRECTION_UP;
-		case WLR_DIRECTION_RIGHT:
-			return WLR_DIRECTION_LEFT;
-		default:
-			return WLR_DIRECTION_RIGHT;
-	}
-}
-
 static struct sway_output *output_in_direction(const char *direction_string,
 		struct sway_output *reference, int ref_lx, int ref_ly) {
 	struct {
-- 
cgit v1.2.3