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