diff options
author | emersion <contact@emersion.fr> | 2018-07-08 22:56:25 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-07-09 22:22:17 +0100 |
commit | 48c98b676f73f5e588c2a8d724a8fc5d411162a2 (patch) | |
tree | 65fd3d54272595613f609f0942a8f2b785388630 | |
parent | Merge pull request #2223 from RyanDwyer/floating-move (diff) | |
download | sway-48c98b676f73f5e588c2a8d724a8fc5d411162a2.tar.gz sway-48c98b676f73f5e588c2a8d724a8fc5d411162a2.tar.zst sway-48c98b676f73f5e588c2a8d724a8fc5d411162a2.zip |
Implement `focus mode_toggle`
-rw-r--r-- | sway/commands/focus.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/sway/commands/focus.c b/sway/commands/focus.c index 74d9d535..b24d5007 100644 --- a/sway/commands/focus.c +++ b/sway/commands/focus.c | |||
@@ -1,10 +1,12 @@ | |||
1 | #include <strings.h> | 1 | #include <strings.h> |
2 | #include <wlr/util/log.h> | 2 | #include <wlr/util/log.h> |
3 | #include "log.h" | 3 | #include "log.h" |
4 | #include "sway/commands.h" | ||
4 | #include "sway/input/input-manager.h" | 5 | #include "sway/input/input-manager.h" |
5 | #include "sway/input/seat.h" | 6 | #include "sway/input/seat.h" |
7 | #include "sway/tree/arrange.h" | ||
6 | #include "sway/tree/view.h" | 8 | #include "sway/tree/view.h" |
7 | #include "sway/commands.h" | 9 | #include "sway/tree/workspace.h" |
8 | 10 | ||
9 | static bool parse_movement_direction(const char *name, | 11 | static bool parse_movement_direction(const char *name, |
10 | enum movement_direction *out) { | 12 | enum movement_direction *out) { |
@@ -27,6 +29,21 @@ static bool parse_movement_direction(const char *name, | |||
27 | return true; | 29 | return true; |
28 | } | 30 | } |
29 | 31 | ||
32 | static struct cmd_results *focus_mode(struct sway_container *con, | ||
33 | struct sway_seat *seat, bool floating) { | ||
34 | struct sway_container *ws = con->type == C_WORKSPACE ? | ||
35 | con : container_parent(con, C_WORKSPACE); | ||
36 | struct sway_container *new_focus = ws; | ||
37 | if (floating) { | ||
38 | new_focus = ws->sway_workspace->floating; | ||
39 | if (new_focus->children->length == 0) { | ||
40 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
41 | } | ||
42 | } | ||
43 | seat_set_focus(seat, seat_get_active_child(seat, new_focus)); | ||
44 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
45 | } | ||
46 | |||
30 | struct cmd_results *cmd_focus(int argc, char **argv) { | 47 | struct cmd_results *cmd_focus(int argc, char **argv) { |
31 | struct sway_container *con = config->handler_context.current_container; | 48 | struct sway_container *con = config->handler_context.current_container; |
32 | struct sway_seat *seat = config->handler_context.seat; | 49 | struct sway_seat *seat = config->handler_context.seat; |
@@ -40,11 +57,20 @@ struct cmd_results *cmd_focus(int argc, char **argv) { | |||
40 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 57 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
41 | } | 58 | } |
42 | 59 | ||
43 | // TODO mode_toggle | 60 | if (strcmp(argv[0], "floating") == 0) { |
61 | return focus_mode(con, seat, true); | ||
62 | } else if (strcmp(argv[0], "tiling") == 0) { | ||
63 | return focus_mode(con, seat, false); | ||
64 | } else if (strcmp(argv[0], "mode_toggle") == 0) { | ||
65 | return focus_mode(con, seat, !container_is_floating(con)); | ||
66 | } | ||
67 | |||
68 | // TODO: focus output <direction|name> | ||
44 | enum movement_direction direction = 0; | 69 | enum movement_direction direction = 0; |
45 | if (!parse_movement_direction(argv[0], &direction)) { | 70 | if (!parse_movement_direction(argv[0], &direction)) { |
46 | return cmd_results_new(CMD_INVALID, "focus", | 71 | return cmd_results_new(CMD_INVALID, "focus", |
47 | "Expected 'focus <direction|parent|child|mode_toggle>' or 'focus output <direction|name>'"); | 72 | "Expected 'focus <direction|parent|child|mode_toggle|floating|tiling>' " |
73 | "or 'focus output <direction|name>'"); | ||
48 | } | 74 | } |
49 | 75 | ||
50 | struct sway_container *next_focus = container_get_in_direction( | 76 | struct sway_container *next_focus = container_get_in_direction( |