diff options
Diffstat (limited to 'sway/commands.c')
-rw-r--r-- | sway/commands.c | 167 |
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 @@ | |||
21 | swayc_t *sp_view; | 21 | swayc_t *sp_view; |
22 | int sp_index = 0; | 22 | int sp_index = 0; |
23 | 23 | ||
24 | // Commands | ||
25 | static sway_cmd cmd_bindsym; | ||
26 | static sway_cmd cmd_orientation; | ||
27 | static sway_cmd cmd_exec; | ||
28 | static sway_cmd cmd_exec_always; | ||
29 | static sway_cmd cmd_exit; | ||
30 | static sway_cmd cmd_floating; | ||
31 | static sway_cmd cmd_floating_mod; | ||
32 | static sway_cmd cmd_focus; | ||
33 | static sway_cmd cmd_focus_follows_mouse; | ||
34 | static sway_cmd cmd_for_window; | ||
35 | static sway_cmd cmd_fullscreen; | ||
36 | static sway_cmd cmd_gaps; | ||
37 | static sway_cmd cmd_kill; | ||
38 | static sway_cmd cmd_layout; | ||
39 | static sway_cmd cmd_log_colors; | ||
40 | static sway_cmd cmd_mode; | ||
41 | static sway_cmd cmd_move; | ||
42 | static sway_cmd cmd_output; | ||
43 | static sway_cmd cmd_reload; | ||
44 | static sway_cmd cmd_resize; | ||
45 | static sway_cmd cmd_scratchpad; | ||
46 | static sway_cmd cmd_set; | ||
47 | static sway_cmd cmd_split; | ||
48 | static sway_cmd cmd_splith; | ||
49 | static sway_cmd cmd_splitv; | ||
50 | static sway_cmd cmd_workspace; | ||
51 | static sway_cmd cmd_ws_auto_back_and_forth; | ||
52 | |||
24 | static struct modifier_key { | 53 | static 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 | ||
97 | static enum cmd_status cmd_bindsym(int argc, char **argv) { | 126 | enum 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 | ||
147 | static enum cmd_status cmd_exec_always(int argc, char **argv) { | 176 | enum 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 | ||
175 | static enum cmd_status cmd_exec(int argc, char **argv) { | 204 | enum 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 | ||
188 | static void kill_views(swayc_t *container, void *data) { | 217 | static 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 | ||
194 | static enum cmd_status cmd_exit(int argc, char **argv) { | 223 | enum 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 | ||
205 | static enum cmd_status cmd_floating(int argc, char **argv) { | 235 | enum 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 | ||
267 | static enum cmd_status cmd_floating_mod(int argc, char **argv) { | 297 | enum 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 | ||
292 | static enum cmd_status cmd_focus(int argc, char **argv) { | 322 | enum 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 | ||
350 | static enum cmd_status cmd_focus_follows_mouse(int argc, char **argv) { | 380 | enum 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 | ||
389 | static void debug_for_window(swayc_t *view, void *data) { | ||
390 | layout_log(view, 0); | ||
391 | } | ||
392 | |||
393 | enum 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 | |||
359 | static void hide_view_in_scratchpad(swayc_t *sp_view) { | 404 | static 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 | ||
375 | static enum cmd_status cmd_mode(int argc, char **argv) { | 420 | enum 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 | ||
414 | static enum cmd_status cmd_move(int argc, char **argv) { | 459 | enum 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 | ||
485 | static enum cmd_status cmd_orientation(int argc, char **argv) { | 526 | enum 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 | ||
502 | static enum cmd_status cmd_output(int argc, char **argv) { | 543 | enum 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 | ||
567 | static enum cmd_status cmd_gaps(int argc, char **argv) { | 608 | enum 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 | ||
709 | static enum cmd_status cmd_kill(int argc, char **argv) { | 749 | enum 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 | ||
718 | static enum cmd_status cmd_layout(int argc, char **argv) { | 758 | enum 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 | ||
744 | static enum cmd_status cmd_reload(int argc, char **argv) { | 784 | enum 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 | ||
754 | static enum cmd_status cmd_resize(int argc, char **argv) { | 794 | enum 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 | ||
784 | static swayc_t *fetch_view_from_scratchpad() { | 824 | static 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 | ||
829 | static enum cmd_status cmd_scratchpad(int argc, char **argv) { | 869 | enum 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 | ||
863 | static enum cmd_status cmd_set(int argc, char **argv) { | 903 | enum 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 | ||
890 | static enum cmd_status _do_split(int argc, char **argv, int layout) { | 930 | static 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 | ||
922 | static enum cmd_status cmd_split(int argc, char **argv) { | 962 | enum 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 | ||
939 | static enum cmd_status cmd_splitv(int argc, char **argv) { | 979 | enum 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 | ||
943 | static enum cmd_status cmd_splith(int argc, char **argv) { | 983 | enum 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 | ||
947 | static enum cmd_status cmd_log_colors(int argc, char **argv) { | 987 | enum 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 | ||
963 | static enum cmd_status cmd_fullscreen(int argc, char **argv) { | 1003 | enum 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 | ||
983 | static enum cmd_status cmd_workspace(int argc, char **argv) { | 1023 | enum 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 | ||
1032 | static enum cmd_status cmd_ws_auto_back_and_forth(int argc, char **argv) { | 1048 | enum 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 */ |
1047 | static struct cmd_handler handlers[] = { | 1063 | static 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) { | |||
1090 | enum cmd_status handle_command(char *exec) { | 1107 | enum 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) { |