From bf19f63a79f4d844259800c9415599271438cabd Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 1 Nov 2018 08:29:45 +1000 Subject: [PATCH] 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. --- common/util.c | 16 ++++++++++++++++ include/util.h | 2 ++ sway/commands/focus.c | 11 +++++++++++ sway/commands/move.c | 13 ------------- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/common/util.c b/common/util.c index 78d46a2a..f4588b57 100644 --- a/common/util.c +++ b/common/util.c @@ -1,4 +1,5 @@ #define _XOPEN_SOURCE 700 +#include #include #include #include @@ -138,3 +139,18 @@ bool parse_boolean(const char *boolean, bool current) { // All other values are false to match i3 return false; } + +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; + case WLR_DIRECTION_LEFT: + return WLR_DIRECTION_RIGHT; + } + assert(false); + return 0; +} diff --git a/include/util.h b/include/util.h index 56ca2eb8..f143d0c0 100644 --- a/include/util.h +++ b/include/util.h @@ -59,4 +59,6 @@ uint32_t parse_color(const char *color); */ bool parse_boolean(const char *boolean, bool current); +enum wlr_direction opposite_direction(enum wlr_direction d); + #endif 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 [to] output ' or " "'move [to] 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 {