summaryrefslogtreecommitdiffstats
path: root/sway/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands.c')
-rw-r--r--sway/commands.c167
1 files changed, 74 insertions, 93 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 3ed0c8db..e79746ae 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -21,35 +21,6 @@
21swayc_t *sp_view; 21swayc_t *sp_view;
22int sp_index = 0; 22int sp_index = 0;
23 23
24// Commands
25static sway_cmd cmd_bindsym;
26static sway_cmd cmd_orientation;
27static sway_cmd cmd_exec;
28static sway_cmd cmd_exec_always;
29static sway_cmd cmd_exit;
30static sway_cmd cmd_floating;
31static sway_cmd cmd_floating_mod;
32static sway_cmd cmd_focus;
33static sway_cmd cmd_focus_follows_mouse;
34static sway_cmd cmd_for_window;
35static sway_cmd cmd_fullscreen;
36static sway_cmd cmd_gaps;
37static sway_cmd cmd_kill;
38static sway_cmd cmd_layout;
39static sway_cmd cmd_log_colors;
40static sway_cmd cmd_mode;
41static sway_cmd cmd_move;
42static sway_cmd cmd_output;
43static sway_cmd cmd_reload;
44static sway_cmd cmd_resize;
45static sway_cmd cmd_scratchpad;
46static sway_cmd cmd_set;
47static sway_cmd cmd_split;
48static sway_cmd cmd_splith;
49static sway_cmd cmd_splitv;
50static sway_cmd cmd_workspace;
51static sway_cmd cmd_ws_auto_back_and_forth;
52
53static struct modifier_key { 24static struct modifier_key {
54 char *name; 25 char *name;
55 uint32_t mod; 26 uint32_t mod;
@@ -123,7 +94,7 @@ static int bindsym_sort(const void *_lbind, const void *_rbind) {
123 return (rbind->keys->length + rmod) - (lbind->keys->length + lmod); 94 return (rbind->keys->length + rmod) - (lbind->keys->length + lmod);
124} 95}
125 96
126enum cmd_status cmd_bindsym(char *criteria, int argc, char **argv) { 97static enum cmd_status cmd_bindsym(int argc, char **argv) {
127 if (!checkarg(argc, "bindsym", EXPECTED_MORE_THAN, 1) 98 if (!checkarg(argc, "bindsym", EXPECTED_MORE_THAN, 1)
128 || !config->reading) { 99 || !config->reading) {
129 return CMD_FAILURE; 100 return CMD_FAILURE;
@@ -132,7 +103,7 @@ enum cmd_status cmd_bindsym(char *criteria, int argc, char **argv) {
132 struct sway_binding *binding = malloc(sizeof(struct sway_binding)); 103 struct sway_binding *binding = malloc(sizeof(struct sway_binding));
133 binding->keys = create_list(); 104 binding->keys = create_list();
134 binding->modifiers = 0; 105 binding->modifiers = 0;
135 binding->command = join_args(argc - 1, argv + 1); 106 binding->command = join_args(argv + 1, argc - 1);
136 107
137 list_t *split = split_string(argv[0], "+"); 108 list_t *split = split_string(argv[0], "+");
138 int i; 109 int i;
@@ -173,7 +144,7 @@ enum cmd_status cmd_bindsym(char *criteria, int argc, char **argv) {
173 return CMD_SUCCESS; 144 return CMD_SUCCESS;
174} 145}
175 146
176enum cmd_status cmd_exec_always(char *criteria, int argc, char **argv) { 147static enum cmd_status cmd_exec_always(int argc, char **argv) {
177 if (!checkarg(argc, "exec_always", EXPECTED_MORE_THAN, 0)) { 148 if (!checkarg(argc, "exec_always", EXPECTED_MORE_THAN, 0)) {
178 return CMD_FAILURE; 149 return CMD_FAILURE;
179 } 150 }
@@ -189,7 +160,7 @@ enum cmd_status cmd_exec_always(char *criteria, int argc, char **argv) {
189 } 160 }
190 /* Child process */ 161 /* Child process */
191 if (pid == 0) { 162 if (pid == 0) {
192 char *args = join_args(argc, argv); 163 char *args = join_args(argv, argc);
193 sway_log(L_DEBUG, "Executing %s", args); 164 sway_log(L_DEBUG, "Executing %s", args);
194 execl("/bin/sh", "sh", "-c", args, (char *)NULL); 165 execl("/bin/sh", "sh", "-c", args, (char *)NULL);
195 /* Execl doesnt return unless failure */ 166 /* Execl doesnt return unless failure */
@@ -201,17 +172,17 @@ enum cmd_status cmd_exec_always(char *criteria, int argc, char **argv) {
201 return CMD_SUCCESS; 172 return CMD_SUCCESS;
202} 173}
203 174
204enum cmd_status cmd_exec(char *criteria, int argc, char **argv) { 175static enum cmd_status cmd_exec(int argc, char **argv) {
205 if (!config->active) { 176 if (!config->active) {
206 return CMD_DEFER; 177 return CMD_DEFER;
207 } 178 }
208 if (config->reloading) { 179 if (config->reloading) {
209 char *args = join_args(argc, argv); 180 char *args = join_args(argv, argc);
210 sway_log(L_DEBUG, "Ignoring 'exec %s' due to reload", args); 181 sway_log(L_DEBUG, "Ignoring 'exec %s' due to reload", args);
211 free(args); 182 free(args);
212 return CMD_SUCCESS; 183 return CMD_SUCCESS;
213 } 184 }
214 return cmd_exec_always(criteria, argc, argv); 185 return cmd_exec_always(argc, argv);
215} 186}
216 187
217static void kill_views(swayc_t *container, void *data) { 188static void kill_views(swayc_t *container, void *data) {
@@ -220,19 +191,18 @@ static void kill_views(swayc_t *container, void *data) {
220 } 191 }
221} 192}
222 193
223enum cmd_status cmd_exit(char *criteria, int argc, char **argv) { 194static enum cmd_status cmd_exit(int argc, char **argv) {
224 (void) argv;
225 if (!checkarg(argc, "exit", EXPECTED_EQUAL_TO, 0) 195 if (!checkarg(argc, "exit", EXPECTED_EQUAL_TO, 0)
226 || config->reading || !config->active) { 196 || config->reading || !config->active) {
227 return CMD_FAILURE; 197 return CMD_FAILURE;
228 } 198 }
229 // Close all views 199 // Close all views
230 swayc_map(kill_views, NULL); 200 container_map(&root_container, kill_views, NULL);
231 sway_terminate(); 201 sway_terminate();
232 return CMD_SUCCESS; 202 return CMD_SUCCESS;
233} 203}
234 204
235enum cmd_status cmd_floating(char *criteria, int argc, char **argv) { 205static enum cmd_status cmd_floating(int argc, char **argv) {
236 if (!checkarg(argc, "floating", EXPECTED_EQUAL_TO, 1) 206 if (!checkarg(argc, "floating", EXPECTED_EQUAL_TO, 1)
237 || config->reading || !config->active) { 207 || config->reading || !config->active) {
238 return CMD_FAILURE; 208 return CMD_FAILURE;
@@ -294,7 +264,7 @@ enum cmd_status cmd_floating(char *criteria, int argc, char **argv) {
294 return CMD_SUCCESS; 264 return CMD_SUCCESS;
295} 265}
296 266
297enum cmd_status cmd_floating_mod(char *criteria, int argc, char **argv) { 267static enum cmd_status cmd_floating_mod(int argc, char **argv) {
298 if (!checkarg(argc, "floating_modifier", EXPECTED_EQUAL_TO, 1) 268 if (!checkarg(argc, "floating_modifier", EXPECTED_EQUAL_TO, 1)
299 || !config->reading) { 269 || !config->reading) {
300 return CMD_FAILURE; 270 return CMD_FAILURE;
@@ -319,7 +289,7 @@ enum cmd_status cmd_floating_mod(char *criteria, int argc, char **argv) {
319 return CMD_SUCCESS; 289 return CMD_SUCCESS;
320} 290}
321 291
322enum cmd_status cmd_focus(char *criteria, int argc, char **argv) { 292static enum cmd_status cmd_focus(int argc, char **argv) {
323 static int floating_toggled_index = 0; 293 static int floating_toggled_index = 0;
324 static int tiled_toggled_index = 0; 294 static int tiled_toggled_index = 0;
325 if (!checkarg(argc, "focus", EXPECTED_EQUAL_TO, 1) 295 if (!checkarg(argc, "focus", EXPECTED_EQUAL_TO, 1)
@@ -377,7 +347,7 @@ enum cmd_status cmd_focus(char *criteria, int argc, char **argv) {
377 return CMD_SUCCESS; 347 return CMD_SUCCESS;
378} 348}
379 349
380enum cmd_status cmd_focus_follows_mouse(char *criteria, int argc, char **argv) { 350static enum cmd_status cmd_focus_follows_mouse(int argc, char **argv) {
381 if (!checkarg(argc, "focus_follows_mouse", EXPECTED_EQUAL_TO, 1)) { 351 if (!checkarg(argc, "focus_follows_mouse", EXPECTED_EQUAL_TO, 1)) {
382 return CMD_FAILURE; 352 return CMD_FAILURE;
383 } 353 }
@@ -386,21 +356,6 @@ enum cmd_status cmd_focus_follows_mouse(char *criteria, int argc, char **argv) {
386 return CMD_SUCCESS; 356 return CMD_SUCCESS;
387} 357}
388 358
389static void debug_for_window(swayc_t *view, void *data) {
390 layout_log(view, 0);
391}
392
393enum cmd_status cmd_for_window(char *criteria, int argc, char **argv) {
394 if (!checkarg(argc, "for_window", EXPECTED_AT_LEAST, 1)) {
395 return CMD_FAILURE;
396 }
397 //TODO
398 void *re = compile_regex(argv[0]);
399 swayc_map_by_test(debug_for_window, test_view_title_regex, NULL, re);
400 free_regex(re);
401 return CMD_FAILURE;
402}
403
404static void hide_view_in_scratchpad(swayc_t *sp_view) { 359static void hide_view_in_scratchpad(swayc_t *sp_view) {
405 if(sp_view == NULL) { 360 if(sp_view == NULL) {
406 return; 361 return;
@@ -417,7 +372,7 @@ static void hide_view_in_scratchpad(swayc_t *sp_view) {
417 set_focused_container(container_under_pointer()); 372 set_focused_container(container_under_pointer());
418} 373}
419 374
420enum cmd_status cmd_mode(char *criteria, int argc, char **argv) { 375static enum cmd_status cmd_mode(int argc, char **argv) {
421 if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1)) { 376 if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1)) {
422 return CMD_FAILURE; 377 return CMD_FAILURE;
423 } 378 }
@@ -426,7 +381,7 @@ enum cmd_status cmd_mode(char *criteria, int argc, char **argv) {
426 return CMD_FAILURE; 381 return CMD_FAILURE;
427 } 382 }
428 383
429 char *mode_name = join_args(argc - mode_make, argv); 384 char *mode_name = join_args(argv, argc - mode_make);
430 struct sway_mode *mode = NULL; 385 struct sway_mode *mode = NULL;
431 // Find mode 386 // Find mode
432 int i, len = config->modes->length; 387 int i, len = config->modes->length;
@@ -456,7 +411,7 @@ enum cmd_status cmd_mode(char *criteria, int argc, char **argv) {
456 return CMD_SUCCESS; 411 return CMD_SUCCESS;
457} 412}
458 413
459enum cmd_status cmd_move(char *criteria, int argc, char **argv) { 414static enum cmd_status cmd_move(int argc, char **argv) {
460 if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1) 415 if (!checkarg(argc, "move", EXPECTED_AT_LEAST, 1)
461 || config->reading || !config->active) { 416 || config->reading || !config->active) {
462 return CMD_FAILURE; 417 return CMD_FAILURE;
@@ -489,7 +444,11 @@ enum cmd_status cmd_move(char *criteria, int argc, char **argv) {
489 // move "container to workspace number x" 444 // move "container to workspace number x"
490 ws_name = argv[4]; 445 ws_name = argv[4];
491 } 446 }
492 swayc_t *ws = new_workspace(NULL, ws_name); 447
448 swayc_t *ws = workspace_by_name(ws_name);
449 if (ws == NULL) {
450 ws = workspace_create(ws_name);
451 }
493 move_container_to(view, get_focused_container(ws)); 452 move_container_to(view, get_focused_container(ws));
494 } else if (strcasecmp(argv[0], "scratchpad") == 0) { 453 } else if (strcasecmp(argv[0], "scratchpad") == 0) {
495 if (view->type != C_CONTAINER && view->type != C_VIEW) { 454 if (view->type != C_CONTAINER && view->type != C_VIEW) {
@@ -523,7 +482,7 @@ enum cmd_status cmd_move(char *criteria, int argc, char **argv) {
523 return CMD_SUCCESS; 482 return CMD_SUCCESS;
524} 483}
525 484
526enum cmd_status cmd_orientation(char *criteria, int argc, char **argv) { 485static enum cmd_status cmd_orientation(int argc, char **argv) {
527 if (!checkarg(argc, "orientation", EXPECTED_EQUAL_TO, 1) 486 if (!checkarg(argc, "orientation", EXPECTED_EQUAL_TO, 1)
528 || !config->reading) { 487 || !config->reading) {
529 return CMD_FAILURE; 488 return CMD_FAILURE;
@@ -540,7 +499,7 @@ enum cmd_status cmd_orientation(char *criteria, int argc, char **argv) {
540 return CMD_SUCCESS; 499 return CMD_SUCCESS;
541} 500}
542 501
543enum cmd_status cmd_output(char *criteria, int argc, char **argv) { 502static enum cmd_status cmd_output(int argc, char **argv) {
544 if (!checkarg(argc, "output", EXPECTED_AT_LEAST, 1)) { 503 if (!checkarg(argc, "output", EXPECTED_AT_LEAST, 1)) {
545 return CMD_FAILURE; 504 return CMD_FAILURE;
546 } 505 }
@@ -605,7 +564,7 @@ enum cmd_status cmd_output(char *criteria, int argc, char **argv) {
605 return CMD_SUCCESS; 564 return CMD_SUCCESS;
606} 565}
607 566
608enum cmd_status cmd_gaps(char *criteria, int argc, char **argv) { 567static enum cmd_status cmd_gaps(int argc, char **argv) {
609 if (!checkarg(argc, "gaps", EXPECTED_AT_LEAST, 1)) { 568 if (!checkarg(argc, "gaps", EXPECTED_AT_LEAST, 1)) {
610 return CMD_FAILURE; 569 return CMD_FAILURE;
611 } 570 }
@@ -739,14 +698,15 @@ enum cmd_status cmd_gaps(char *criteria, int argc, char **argv) {
739 top = &root_container; 698 top = &root_container;
740 } 699 }
741 int top_gap = top->gaps; 700 int top_gap = top->gaps;
742 swayc_map_r(top, method == SET ? set_gaps : add_gaps, &amount); 701 container_map(top, method == SET ? set_gaps : add_gaps, &amount);
743 top->gaps = top_gap; 702 top->gaps = top_gap;
744 arrange_windows(top, -1, -1); 703 arrange_windows(top, -1, -1);
745 } 704 }
705
746 return CMD_SUCCESS; 706 return CMD_SUCCESS;
747} 707}
748 708
749enum cmd_status cmd_kill(char *criteria, int argc, char **argv) { 709static enum cmd_status cmd_kill(int argc, char **argv) {
750 if (config->reading || !config->active) { 710 if (config->reading || !config->active) {
751 return CMD_FAILURE; 711 return CMD_FAILURE;
752 } 712 }
@@ -755,7 +715,7 @@ enum cmd_status cmd_kill(char *criteria, int argc, char **argv) {
755 return CMD_SUCCESS; 715 return CMD_SUCCESS;
756} 716}
757 717
758enum cmd_status cmd_layout(char *criteria, int argc, char **argv) { 718static enum cmd_status cmd_layout(int argc, char **argv) {
759 if (!checkarg(argc, "layout", EXPECTED_MORE_THAN, 0) 719 if (!checkarg(argc, "layout", EXPECTED_MORE_THAN, 0)
760 || config->reading || !config->active) { 720 || config->reading || !config->active) {
761 return CMD_FAILURE; 721 return CMD_FAILURE;
@@ -781,7 +741,7 @@ enum cmd_status cmd_layout(char *criteria, int argc, char **argv) {
781 return CMD_SUCCESS; 741 return CMD_SUCCESS;
782} 742}
783 743
784enum cmd_status cmd_reload(char *criteria, int argc, char **argv) { 744static enum cmd_status cmd_reload(int argc, char **argv) {
785 if (!checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0) 745 if (!checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0)
786 || config->reading 746 || config->reading
787 || !load_config(NULL)) { 747 || !load_config(NULL)) {
@@ -791,7 +751,7 @@ enum cmd_status cmd_reload(char *criteria, int argc, char **argv) {
791 return CMD_SUCCESS; 751 return CMD_SUCCESS;
792} 752}
793 753
794enum cmd_status cmd_resize(char *criteria, int argc, char **argv) { 754static enum cmd_status cmd_resize(int argc, char **argv) {
795 if (!checkarg(argc, "resize", EXPECTED_AT_LEAST, 3) 755 if (!checkarg(argc, "resize", EXPECTED_AT_LEAST, 3)
796 || config->reading || !config->active) { 756 || config->reading || !config->active) {
797 return CMD_FAILURE; 757 return CMD_FAILURE;
@@ -821,7 +781,7 @@ enum cmd_status cmd_resize(char *criteria, int argc, char **argv) {
821 return CMD_SUCCESS; 781 return CMD_SUCCESS;
822} 782}
823 783
824static swayc_t *fetch_view_from_scratchpad(void) { 784static swayc_t *fetch_view_from_scratchpad() {
825 if (sp_index >= scratchpad->length) { 785 if (sp_index >= scratchpad->length) {
826 sp_index = 0; 786 sp_index = 0;
827 } 787 }
@@ -866,7 +826,7 @@ void remove_view_from_scratchpad(swayc_t *view) {
866 } 826 }
867} 827}
868 828
869enum cmd_status cmd_scratchpad(char *criteria, int argc, char **argv) { 829static enum cmd_status cmd_scratchpad(int argc, char **argv) {
870 if (!checkarg(argc, "scratchpad", EXPECTED_EQUAL_TO, 1) 830 if (!checkarg(argc, "scratchpad", EXPECTED_EQUAL_TO, 1)
871 || config->reading || !config->active) { 831 || config->reading || !config->active) {
872 return CMD_FAILURE; 832 return CMD_FAILURE;
@@ -900,7 +860,7 @@ static int compare_set(const void *_l, const void *_r) {
900 return strlen((*r)->name) - strlen((*l)->name); 860 return strlen((*r)->name) - strlen((*l)->name);
901} 861}
902 862
903enum cmd_status cmd_set(char *criteria, int argc, char **argv) { 863static enum cmd_status cmd_set(int argc, char **argv) {
904 if (!checkarg(argc, "set", EXPECTED_AT_LEAST, 2) 864 if (!checkarg(argc, "set", EXPECTED_AT_LEAST, 2)
905 || !config->reading) { 865 || !config->reading) {
906 return CMD_FAILURE; 866 return CMD_FAILURE;
@@ -923,11 +883,11 @@ enum cmd_status cmd_set(char *criteria, int argc, char **argv) {
923 list_add(config->symbols, var); 883 list_add(config->symbols, var);
924 list_sort(config->symbols, compare_set); 884 list_sort(config->symbols, compare_set);
925 } 885 }
926 var->value = join_args(argc - 1, argv + 1); 886 var->value = join_args(argv + 1, argc - 1);
927 return CMD_SUCCESS; 887 return CMD_SUCCESS;
928} 888}
929 889
930static enum cmd_status _do_split(char *criteria, int argc, char **argv, int layout) { 890static enum cmd_status _do_split(int argc, char **argv, int layout) {
931 char *name = layout == L_VERT ? "splitv" : 891 char *name = layout == L_VERT ? "splitv" :
932 layout == L_HORIZ ? "splith" : "split"; 892 layout == L_HORIZ ? "splith" : "split";
933 if (!checkarg(argc, name, EXPECTED_EQUAL_TO, 0) 893 if (!checkarg(argc, name, EXPECTED_EQUAL_TO, 0)
@@ -959,16 +919,16 @@ static enum cmd_status _do_split(char *criteria, int argc, char **argv, int layo
959 return CMD_SUCCESS; 919 return CMD_SUCCESS;
960} 920}
961 921
962enum cmd_status cmd_split(char *criteria, int argc, char **argv) { 922static enum cmd_status cmd_split(int argc, char **argv) {
963 if (!checkarg(argc, "split", EXPECTED_EQUAL_TO, 1) 923 if (!checkarg(argc, "split", EXPECTED_EQUAL_TO, 1)
964 || config->reading || !config->active) { 924 || config->reading || !config->active) {
965 return CMD_FAILURE; 925 return CMD_FAILURE;
966 } 926 }
967 927
968 if (strcasecmp(argv[0], "v") == 0 || strcasecmp(argv[0], "vertical") == 0) { 928 if (strcasecmp(argv[0], "v") == 0 || strcasecmp(argv[0], "vertical") == 0) {
969 _do_split(criteria, argc - 1, argv + 1, L_VERT); 929 _do_split(argc - 1, argv + 1, L_VERT);
970 } else if (strcasecmp(argv[0], "h") == 0 || strcasecmp(argv[0], "horizontal") == 0) { 930 } else if (strcasecmp(argv[0], "h") == 0 || strcasecmp(argv[0], "horizontal") == 0) {
971 _do_split(criteria, argc - 1, argv + 1, L_HORIZ); 931 _do_split(argc - 1, argv + 1, L_HORIZ);
972 } else { 932 } else {
973 sway_log(L_ERROR, "Invalid split command (expected either horiziontal or vertical)."); 933 sway_log(L_ERROR, "Invalid split command (expected either horiziontal or vertical).");
974 return CMD_FAILURE; 934 return CMD_FAILURE;
@@ -976,15 +936,15 @@ enum cmd_status cmd_split(char *criteria, int argc, char **argv) {
976 return CMD_SUCCESS; 936 return CMD_SUCCESS;
977} 937}
978 938
979enum cmd_status cmd_splitv(char *criteria, int argc, char **argv) { 939static enum cmd_status cmd_splitv(int argc, char **argv) {
980 return _do_split(criteria, argc, argv, L_VERT); 940 return _do_split(argc, argv, L_VERT);
981} 941}
982 942
983enum cmd_status cmd_splith(char *criteria, int argc, char **argv) { 943static enum cmd_status cmd_splith(int argc, char **argv) {
984 return _do_split(criteria, argc, argv, L_HORIZ); 944 return _do_split(argc, argv, L_HORIZ);
985} 945}
986 946
987enum cmd_status cmd_log_colors(char *criteria, int argc, char **argv) { 947static enum cmd_status cmd_log_colors(int argc, char **argv) {
988 if (!checkarg(argc, "log_colors", EXPECTED_EQUAL_TO, 1) 948 if (!checkarg(argc, "log_colors", EXPECTED_EQUAL_TO, 1)
989 || !config->reading) { 949 || !config->reading) {
990 return CMD_FAILURE; 950 return CMD_FAILURE;
@@ -1000,7 +960,7 @@ enum cmd_status cmd_log_colors(char *criteria, int argc, char **argv) {
1000 return CMD_SUCCESS; 960 return CMD_SUCCESS;
1001} 961}
1002 962
1003enum cmd_status cmd_fullscreen(char *criteria, int argc, char **argv) { 963static enum cmd_status cmd_fullscreen(int argc, char **argv) {
1004 if (!checkarg(argc, "fullscreen", EXPECTED_AT_LEAST, 0) 964 if (!checkarg(argc, "fullscreen", EXPECTED_AT_LEAST, 0)
1005 || config->reading || !config->active) { 965 || config->reading || !config->active) {
1006 return CMD_FAILURE; 966 return CMD_FAILURE;
@@ -1020,7 +980,7 @@ enum cmd_status cmd_fullscreen(char *criteria, int argc, char **argv) {
1020 return CMD_SUCCESS; 980 return CMD_SUCCESS;
1021} 981}
1022 982
1023enum cmd_status cmd_workspace(char *criteria, int argc, char **argv) { 983static enum cmd_status cmd_workspace(int argc, char **argv) {
1024 if (!checkarg(argc, "workspace", EXPECTED_AT_LEAST, 1)) { 984 if (!checkarg(argc, "workspace", EXPECTED_AT_LEAST, 1)) {
1025 return CMD_FAILURE; 985 return CMD_FAILURE;
1026 } 986 }
@@ -1029,7 +989,28 @@ enum cmd_status cmd_workspace(char *criteria, int argc, char **argv) {
1029 if (config->reading || !config->active) { 989 if (config->reading || !config->active) {
1030 return CMD_DEFER; 990 return CMD_DEFER;
1031 } 991 }
1032 workspace_switch(new_workspace(NULL, argv[0])); 992 // Handle workspace next/prev
993 swayc_t *ws = NULL;
994 if (strcasecmp(argv[0], "next") == 0) {
995 ws = workspace_next();
996 } else if (strcasecmp(argv[0], "prev") == 0) {
997 ws = workspace_prev();
998 } else if (strcasecmp(argv[0], "next_on_output") == 0) {
999 ws = workspace_output_next();
1000 } else if (strcasecmp(argv[0], "prev_on_output") == 0) {
1001 ws = workspace_output_prev();
1002 } else if (strcasecmp(argv[0], "back_and_forth") == 0) {
1003 if (prev_workspace_name) {
1004 if (!(ws = workspace_by_name(prev_workspace_name))) {
1005 ws = workspace_create(prev_workspace_name);
1006 }
1007 }
1008 } else {
1009 if (!(ws= workspace_by_name(argv[0]))) {
1010 ws = workspace_create(argv[0]);
1011 }
1012 }
1013 workspace_switch(ws);
1033 } else { 1014 } else {
1034 if (strcasecmp(argv[1], "output") == 0) { 1015 if (strcasecmp(argv[1], "output") == 0) {
1035 if (!checkarg(argc, "workspace", EXPECTED_EQUAL_TO, 3)) { 1016 if (!checkarg(argc, "workspace", EXPECTED_EQUAL_TO, 3)) {
@@ -1040,12 +1021,15 @@ enum cmd_status cmd_workspace(char *criteria, int argc, char **argv) {
1040 wso->workspace = strdup(argv[0]); 1021 wso->workspace = strdup(argv[0]);
1041 wso->output = strdup(argv[2]); 1022 wso->output = strdup(argv[2]);
1042 list_add(config->workspace_outputs, wso); 1023 list_add(config->workspace_outputs, wso);
1024 if (!config->reading) {
1025 // TODO: Move workspace to output. (dont do so when reloading)
1026 }
1043 } 1027 }
1044 } 1028 }
1045 return CMD_SUCCESS; 1029 return CMD_SUCCESS;
1046} 1030}
1047 1031
1048enum cmd_status cmd_ws_auto_back_and_forth(char *criteria, int argc, char **argv) { 1032static enum cmd_status cmd_ws_auto_back_and_forth(int argc, char **argv) {
1049 if (!checkarg(argc, "workspace_auto_back_and_forth", EXPECTED_EQUAL_TO, 1)) { 1033 if (!checkarg(argc, "workspace_auto_back_and_forth", EXPECTED_EQUAL_TO, 1)) {
1050 return CMD_FAILURE; 1034 return CMD_FAILURE;
1051 } 1035 }
@@ -1060,7 +1044,7 @@ enum cmd_status cmd_ws_auto_back_and_forth(char *criteria, int argc, char **argv
1060} 1044}
1061 1045
1062/* Keep alphabetized */ 1046/* Keep alphabetized */
1063static const struct cmd_handler handlers[] = { 1047static struct cmd_handler handlers[] = {
1064 { "bindsym", cmd_bindsym }, 1048 { "bindsym", cmd_bindsym },
1065 { "default_orientation", cmd_orientation }, 1049 { "default_orientation", cmd_orientation },
1066 { "exec", cmd_exec }, 1050 { "exec", cmd_exec },
@@ -1070,7 +1054,6 @@ static const struct cmd_handler handlers[] = {
1070 { "floating_modifier", cmd_floating_mod }, 1054 { "floating_modifier", cmd_floating_mod },
1071 { "focus", cmd_focus }, 1055 { "focus", cmd_focus },
1072 { "focus_follows_mouse", cmd_focus_follows_mouse }, 1056 { "focus_follows_mouse", cmd_focus_follows_mouse },
1073 { "for_window", cmd_for_window },
1074 { "fullscreen", cmd_fullscreen }, 1057 { "fullscreen", cmd_fullscreen },
1075 { "gaps", cmd_gaps }, 1058 { "gaps", cmd_gaps },
1076 { "kill", cmd_kill }, 1059 { "kill", cmd_kill },
@@ -1107,7 +1090,6 @@ static struct cmd_handler *find_handler(char *line) {
1107enum cmd_status handle_command(char *exec) { 1090enum cmd_status handle_command(char *exec) {
1108 sway_log(L_INFO, "Handling command '%s'", exec); 1091 sway_log(L_INFO, "Handling command '%s'", exec);
1109 int argc; 1092 int argc;
1110 char *criteria = NULL;
1111 char **argv = split_args(exec, &argc); 1093 char **argv = split_args(exec, &argc);
1112 enum cmd_status status = CMD_FAILURE; 1094 enum cmd_status status = CMD_FAILURE;
1113 struct cmd_handler *handler; 1095 struct cmd_handler *handler;
@@ -1115,7 +1097,7 @@ enum cmd_status handle_command(char *exec) {
1115 return status; 1097 return status;
1116 } 1098 }
1117 if ((handler = find_handler(argv[0])) == NULL 1099 if ((handler = find_handler(argv[0])) == NULL
1118 || (status = handler->handle(criteria, argc - 1, argv + 1)) != CMD_SUCCESS) { 1100 || (status = handler->handle(argc - 1, argv + 1)) != CMD_SUCCESS) {
1119 sway_log(L_ERROR, "Command failed: %s", argv[0]); 1101 sway_log(L_ERROR, "Command failed: %s", argv[0]);
1120 } 1102 }
1121 free_argv(argc, argv); 1103 free_argv(argc, argv);
@@ -1126,7 +1108,6 @@ enum cmd_status config_command(char *exec) {
1126 sway_log(L_INFO, "handling config command '%s'", exec); 1108 sway_log(L_INFO, "handling config command '%s'", exec);
1127 int argc; 1109 int argc;
1128 char **argv = split_args(exec, &argc); 1110 char **argv = split_args(exec, &argc);
1129 char *criteria = NULL;
1130 enum cmd_status status = CMD_FAILURE; 1111 enum cmd_status status = CMD_FAILURE;
1131 struct cmd_handler *handler; 1112 struct cmd_handler *handler;
1132 if (!argc) { 1113 if (!argc) {
@@ -1146,7 +1127,7 @@ enum cmd_status config_command(char *exec) {
1146 for (; i < e; ++i) { 1127 for (; i < e; ++i) {
1147 argv[i] = do_var_replacement(argv[i]); 1128 argv[i] = do_var_replacement(argv[i]);
1148 } 1129 }
1149 status = handler->handle(criteria, argc - 1, argv + 1); 1130 status = handler->handle(argc - 1, argv + 1);
1150 if (status == CMD_FAILURE) { 1131 if (status == CMD_FAILURE) {
1151 sway_log(L_ERROR, "Config load failed for line `%s'", exec); 1132 sway_log(L_ERROR, "Config load failed for line `%s'", exec);
1152 } else if (status == CMD_DEFER) { 1133 } else if (status == CMD_DEFER) {