aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2018-11-01 08:29:45 +1000
committerRyan Dwyer <ryandwyer1@gmail.com>2018-11-01 08:29:45 +1000
commitbf19f63a79f4d844259800c9415599271438cabd (patch)
tree3f81a96d7aa72cc4cd8e94c3f656ce27c6b6b34f
parentf841d2ed7421805b4b5bac0433fbb4db8d1d0f20 (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.c16
-rw-r--r--include/util.h2
-rw-r--r--sway/commands/focus.c11
-rw-r--r--sway/commands/move.c13
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 {