summaryrefslogtreecommitdiffstats
path: root/sway/commands/split.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/split.c')
-rw-r--r--sway/commands/split.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/sway/commands/split.c b/sway/commands/split.c
new file mode 100644
index 00000000..ab8565a9
--- /dev/null
+++ b/sway/commands/split.c
@@ -0,0 +1,76 @@
1#include <string.h>
2#include <strings.h>
3#include "sway/commands.h"
4#include "sway/tree/container.h"
5#include "sway/tree/layout.h"
6#include "sway/tree/view.h"
7#include "sway/input/input-manager.h"
8#include "sway/input/seat.h"
9#include "log.h"
10
11static struct cmd_results *do_split(int layout) {
12 struct sway_container *con = config->handler_context.current_container;
13 struct sway_container *parent = container_split(con, layout);
14 arrange_windows(parent, -1, -1);
15
16 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
17}
18
19struct cmd_results *cmd_split(int argc, char **argv) {
20 struct cmd_results *error = NULL;
21 if ((error = checkarg(argc, "split", EXPECTED_EQUAL_TO, 1))) {
22 return error;
23 }
24 if (strcasecmp(argv[0], "v") == 0 || strcasecmp(argv[0], "vertical") == 0) {
25 do_split(L_VERT);
26 } else if (strcasecmp(argv[0], "h") == 0 ||
27 strcasecmp(argv[0], "horizontal") == 0) {
28 do_split(L_HORIZ);
29 } else if (strcasecmp(argv[0], "t") == 0 ||
30 strcasecmp(argv[0], "toggle") == 0) {
31 struct sway_container *focused =
32 config->handler_context.current_container;
33
34 if (focused->parent->layout == L_VERT) {
35 do_split(L_HORIZ);
36 } else {
37 do_split(L_VERT);
38 }
39 } else {
40 error = cmd_results_new(CMD_FAILURE, "split",
41 "Invalid split command (expected either horizontal or vertical).");
42 return error;
43 }
44 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
45}
46
47struct cmd_results *cmd_splitv(int argc, char **argv) {
48 struct cmd_results *error = NULL;
49 if ((error = checkarg(argc, "splitv", EXPECTED_EQUAL_TO, 0))) {
50 return error;
51 }
52 return do_split(L_VERT);
53}
54
55struct cmd_results *cmd_splith(int argc, char **argv) {
56 struct cmd_results *error = NULL;
57 if ((error = checkarg(argc, "splitv", EXPECTED_EQUAL_TO, 0))) {
58 return error;
59 }
60 return do_split(L_HORIZ);
61}
62
63struct cmd_results *cmd_splitt(int argc, char **argv) {
64 struct cmd_results *error = NULL;
65 if ((error = checkarg(argc, "splitv", EXPECTED_EQUAL_TO, 0))) {
66 return error;
67 }
68
69 struct sway_container *con = config->handler_context.current_container;
70
71 if (con->parent->layout == L_VERT) {
72 return do_split(L_HORIZ);
73 } else {
74 return do_split(L_VERT);
75 }
76}