diff options
author | S. Christoffer Eliesen <christoffer@eliesen.no> | 2015-11-18 19:03:24 +0100 |
---|---|---|
committer | S. Christoffer Eliesen <christoffer@eliesen.no> | 2015-11-24 16:29:28 +0100 |
commit | db92920cf9bcdd0008ba446df4d7249e7902373a (patch) | |
tree | 4f706f14f54c2f250c8bb2d720072b9443ea7777 | |
parent | b7e3d05ace895fce6be87592c9dfee3817436aae (diff) | |
download | sway-db92920cf9bcdd0008ba446df4d7249e7902373a.tar.xz |
handle_command: Skip commands that has a criteria string.
We can't handle them currently (the criteria needs to e.g. be passed to
each command handler which then needs to do the right thing), so it's
better to just do nothing than to create unexpected results (because the
command was executed on the wrong view).
(Before this patch any command list with a criteria string would simply
fail to parse, so this is at least a step in the right direction.)
-rw-r--r-- | sway/commands.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/sway/commands.c b/sway/commands.c index f6d56bb4..42105d5f 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -1401,17 +1401,34 @@ struct cmd_results *handle_command(char *_exec) { head = exec; do { - // Handle criteria + // Extract criteria (valid for this command list only). + criteria = NULL; if (*head == '[') { + ++head; criteria = argsep(&head, "]"); if (head) { ++head; // TODO handle criteria } else { - results = cmd_results_new(CMD_INVALID, NULL, "Unmatched ["); + if (!results) { + results = cmd_results_new(CMD_INVALID, criteria, "Unmatched ["); + } + goto cleanup; } // Skip leading whitespace head += strspn(head, whitespace); + + // TODO: it will yield unexpected results to execute commands + // (on any view) that where meant for certain views only. + if (!results) { + int len = strlen(criteria) + strlen(head) + 4; + char *tmp = malloc(len); + snprintf(tmp, len, "[%s] %s", criteria, head); + results = cmd_results_new(CMD_INVALID, tmp, + "Can't handle criteria string: Refusing to execute command"); + free(tmp); + } + goto cleanup; } // Split command list cmdlist = argsep(&head, ";"); |