diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-13 08:16:36 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-05-14 11:38:09 +1000 |
commit | 1e9aaa54a85e98d6b46ca594b4f50770f71047ea (patch) | |
tree | cb6a2748d1c53dfc80f9faa5da7052790e668400 /sway/commands/assign.c | |
parent | Actually fix swayidle (diff) | |
download | sway-1e9aaa54a85e98d6b46ca594b4f50770f71047ea.tar.gz sway-1e9aaa54a85e98d6b46ca594b4f50770f71047ea.tar.zst sway-1e9aaa54a85e98d6b46ca594b4f50770f71047ea.zip |
Revert "Revert "Merge pull request #1943 from RyanDwyer/criteria-improvements""
This reverts commit 32a572cecfd0f6072a78ce0a381a2f8365f9010a.
This reimplements the criteria overhaul in preparation for fixing a
known bug.
Diffstat (limited to 'sway/commands/assign.c')
-rw-r--r-- | sway/commands/assign.c | 58 |
1 files changed, 26 insertions, 32 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 | } |