1 #include <string.h>
2 #include <strings.h>
3 #include "sway/commands.h"
4 #include "sway/tree/arrange.h"
5 #include "sway/tree/container.h"
6 #include "sway/tree/view.h"
7 #include "sway/tree/workspace.h"
8 #include "sway/input/input-manager.h"
9 #include "sway/input/seat.h"
10 #include "log.h"
11
do_split(int layout)12 static struct cmd_results *do_split(int layout) {
13 struct sway_container *con = config->handler_context.container;
14 struct sway_workspace *ws = config->handler_context.workspace;
15 if (con) {
16 if (container_is_scratchpad_hidden_or_child(con) &&
17 con->fullscreen_mode != FULLSCREEN_GLOBAL) {
18 return cmd_results_new(CMD_FAILURE,
19 "Cannot split a hidden scratchpad container");
20 }
21 container_split(con, layout);
22 } else {
23 workspace_split(ws, layout);
24 }
25
26 if (con && con->parent && con->parent->parent) {
27 container_flatten(con->parent->parent);
28 }
29
30 if (root->fullscreen_global) {
31 arrange_root();
32 } else {
33 arrange_workspace(ws);
34 }
35
36 return cmd_results_new(CMD_SUCCESS, NULL);
37 }
38
cmd_split(int argc,char ** argv)39 struct cmd_results *cmd_split(int argc, char **argv) {
40 struct cmd_results *error = NULL;
41 if ((error = checkarg(argc, "split", EXPECTED_EQUAL_TO, 1))) {
42 return error;
43 }
44 if (!root->outputs->length) {
45 return cmd_results_new(CMD_INVALID,
46 "Can't run this command while there's no outputs connected.");
47 }
48 if (strcasecmp(argv[0], "v") == 0 || strcasecmp(argv[0], "vertical") == 0) {
49 return do_split(L_VERT);
50 } else if (strcasecmp(argv[0], "h") == 0 ||
51 strcasecmp(argv[0], "horizontal") == 0) {
52 return do_split(L_HORIZ);
53 } else if (strcasecmp(argv[0], "t") == 0 ||
54 strcasecmp(argv[0], "toggle") == 0) {
55 struct sway_container *focused = config->handler_context.container;
56
57 if (focused && container_parent_layout(focused) == L_VERT) {
58 return do_split(L_HORIZ);
59 } else {
60 return do_split(L_VERT);
61 }
62 } else {
63 return cmd_results_new(CMD_FAILURE,
64 "Invalid split command (expected either horizontal or vertical).");
65 }
66 return cmd_results_new(CMD_SUCCESS, NULL);
67 }
68
cmd_splitv(int argc,char ** argv)69 struct cmd_results *cmd_splitv(int argc, char **argv) {
70 struct cmd_results *error = NULL;
71 if ((error = checkarg(argc, "splitv", EXPECTED_EQUAL_TO, 0))) {
72 return error;
73 }
74 return do_split(L_VERT);
75 }
76
cmd_splith(int argc,char ** argv)77 struct cmd_results *cmd_splith(int argc, char **argv) {
78 struct cmd_results *error = NULL;
79 if ((error = checkarg(argc, "splith", EXPECTED_EQUAL_TO, 0))) {
80 return error;
81 }
82 return do_split(L_HORIZ);
83 }
84
cmd_splitt(int argc,char ** argv)85 struct cmd_results *cmd_splitt(int argc, char **argv) {
86 struct cmd_results *error = NULL;
87 if ((error = checkarg(argc, "splitt", EXPECTED_EQUAL_TO, 0))) {
88 return error;
89 }
90
91 struct sway_container *con = config->handler_context.container;
92
93 if (con && container_parent_layout(con) == L_VERT) {
94 return do_split(L_HORIZ);
95 } else {
96 return do_split(L_VERT);
97 }
98 }
99