diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-11-01 08:29:45 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-11-01 08:29:45 +1000 |
commit | bf19f63a79f4d844259800c9415599271438cabd (patch) | |
tree | 3f81a96d7aa72cc4cd8e94c3f656ce27c6b6b34f | |
parent | f841d2ed7421805b4b5bac0433fbb4db8d1d0f20 (diff) |
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.
-rw-r--r-- | common/util.c | 16 | ||||
-rw-r--r-- | include/util.h | 2 | ||||
-rw-r--r-- | sway/commands/focus.c | 11 | ||||
-rw-r--r-- | 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 <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> @@ -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 <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 { |