diff options
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/assign.c | 58 | ||||
-rw-r--r-- | sway/commands/for_window.c | 35 |
2 files changed, 38 insertions, 55 deletions
diff --git a/sway/commands/assign.c b/sway/commands/assign.c index eb7329aa..9d15e166 100644 --- a/sway/commands/assign.c +++ b/sway/commands/assign.c | |||
@@ -5,6 +5,7 @@ | |||
5 | #include "sway/criteria.h" | 5 | #include "sway/criteria.h" |
6 | #include "list.h" | 6 | #include "list.h" |
7 | #include "log.h" | 7 | #include "log.h" |
8 | #include "stringop.h" | ||
8 | 9 | ||
9 | struct cmd_results *cmd_assign(int argc, char **argv) { | 10 | struct cmd_results *cmd_assign(int argc, char **argv) { |
10 | struct cmd_results *error = NULL; | 11 | struct cmd_results *error = NULL; |
@@ -12,46 +13,39 @@ struct cmd_results *cmd_assign(int argc, char **argv) { | |||
12 | return error; | 13 | return error; |
13 | } | 14 | } |
14 | 15 | ||
15 | char *criteria = *argv++; | 16 | // Create criteria |
17 | char *err_str = NULL; | ||
18 | struct criteria *criteria = criteria_parse(argv[0], &err_str); | ||
19 | if (!criteria) { | ||
20 | error = cmd_results_new(CMD_INVALID, "assign", err_str); | ||
21 | free(err_str); | ||
22 | return error; | ||
23 | } | ||
24 | |||
25 | ++argv; | ||
26 | int target_len = argc - 1; | ||
16 | 27 | ||
17 | if (strncmp(*argv, "→", strlen("→")) == 0) { | 28 | if (strncmp(*argv, "→", strlen("→")) == 0) { |
18 | if (argc < 3) { | 29 | if (argc < 3) { |
19 | return cmd_results_new(CMD_INVALID, "assign", "Missing workspace"); | 30 | return cmd_results_new(CMD_INVALID, "assign", "Missing workspace"); |
20 | } | 31 | } |
21 | argv++; | 32 | ++argv; |
33 | --target_len; | ||
22 | } | 34 | } |
23 | 35 | ||
24 | char *movecmd = "move container to workspace "; | 36 | if (strcmp(*argv, "output") == 0) { |
25 | size_t arglen = strlen(movecmd) + strlen(*argv) + 1; | 37 | criteria->type = CT_ASSIGN_OUTPUT; |
26 | char *cmdlist = calloc(1, arglen); | 38 | ++argv; |
27 | if (!cmdlist) { | 39 | --target_len; |
28 | return cmd_results_new(CMD_FAILURE, "assign", "Unable to allocate command list"); | 40 | } else { |
41 | criteria->type = CT_ASSIGN_WORKSPACE; | ||
29 | } | 42 | } |
30 | snprintf(cmdlist, arglen, "%s%s", movecmd, *argv); | ||
31 | 43 | ||
32 | struct criteria *crit = malloc(sizeof(struct criteria)); | 44 | criteria->target = join_args(argv, target_len); |
33 | if (!crit) { | ||
34 | free(cmdlist); | ||
35 | return cmd_results_new(CMD_FAILURE, "assign", "Unable to allocate criteria"); | ||
36 | } | ||
37 | crit->crit_raw = strdup(criteria); | ||
38 | crit->cmdlist = cmdlist; | ||
39 | crit->tokens = create_list(); | ||
40 | char *err_str = extract_crit_tokens(crit->tokens, crit->crit_raw); | ||
41 | 45 | ||
42 | if (err_str) { | 46 | list_add(config->criteria, criteria); |
43 | error = cmd_results_new(CMD_INVALID, "assign", err_str); | 47 | wlr_log(L_DEBUG, "assign: '%s' -> '%s' added", criteria->raw, |
44 | free(err_str); | 48 | criteria->target); |
45 | free_criteria(crit); | 49 | |
46 | } else if (crit->tokens->length == 0) { | 50 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
47 | error = cmd_results_new(CMD_INVALID, "assign", "Found no name/value pairs in criteria"); | ||
48 | free_criteria(crit); | ||
49 | } else if (list_seq_find(config->criteria, criteria_cmp, crit) != -1) { | ||
50 | wlr_log(L_DEBUG, "assign: Duplicate, skipping."); | ||
51 | free_criteria(crit); | ||
52 | } else { | ||
53 | wlr_log(L_DEBUG, "assign: '%s' -> '%s' added", crit->crit_raw, crit->cmdlist); | ||
54 | list_add(config->criteria, crit); | ||
55 | } | ||
56 | return error ? error : cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
57 | } | 51 | } |
diff --git a/sway/commands/for_window.c b/sway/commands/for_window.c index dd5461f0..8c425a1d 100644 --- a/sway/commands/for_window.c +++ b/sway/commands/for_window.c | |||
@@ -11,31 +11,20 @@ struct cmd_results *cmd_for_window(int argc, char **argv) { | |||
11 | if ((error = checkarg(argc, "for_window", EXPECTED_AT_LEAST, 2))) { | 11 | if ((error = checkarg(argc, "for_window", EXPECTED_AT_LEAST, 2))) { |
12 | return error; | 12 | return error; |
13 | } | 13 | } |
14 | // add command to a criteria/command pair that is run against views when they appear. | ||
15 | char *criteria = argv[0], *cmdlist = join_args(argv + 1, argc - 1); | ||
16 | 14 | ||
17 | struct criteria *crit = calloc(sizeof(struct criteria), 1); | 15 | char *err_str = NULL; |
18 | if (!crit) { | 16 | struct criteria *criteria = criteria_parse(argv[0], &err_str); |
19 | return cmd_results_new(CMD_FAILURE, "for_window", "Unable to allocate criteria"); | 17 | if (!criteria) { |
20 | } | ||
21 | crit->crit_raw = strdup(criteria); | ||
22 | crit->cmdlist = cmdlist; | ||
23 | crit->tokens = create_list(); | ||
24 | char *err_str = extract_crit_tokens(crit->tokens, crit->crit_raw); | ||
25 | |||
26 | if (err_str) { | ||
27 | error = cmd_results_new(CMD_INVALID, "for_window", err_str); | 18 | error = cmd_results_new(CMD_INVALID, "for_window", err_str); |
28 | free(err_str); | 19 | free(err_str); |
29 | free_criteria(crit); | 20 | return error; |
30 | } else if (crit->tokens->length == 0) { | ||
31 | error = cmd_results_new(CMD_INVALID, "for_window", "Found no name/value pairs in criteria"); | ||
32 | free_criteria(crit); | ||
33 | } else if (list_seq_find(config->criteria, criteria_cmp, crit) != -1) { | ||
34 | wlr_log(L_DEBUG, "for_window: Duplicate, skipping."); | ||
35 | free_criteria(crit); | ||
36 | } else { | ||
37 | wlr_log(L_DEBUG, "for_window: '%s' -> '%s' added", crit->crit_raw, crit->cmdlist); | ||
38 | list_add(config->criteria, crit); | ||
39 | } | 21 | } |
40 | return error ? error : cmd_results_new(CMD_SUCCESS, NULL, NULL); | 22 | |
23 | criteria->type = CT_COMMAND; | ||
24 | criteria->cmdlist = join_args(argv + 1, argc - 1); | ||
25 | |||
26 | list_add(config->criteria, criteria); | ||
27 | wlr_log(L_DEBUG, "for_window: '%s' -> '%s' added", criteria->raw, criteria->cmdlist); | ||
28 | |||
29 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
41 | } | 30 | } |