diff options
Diffstat (limited to 'sway/commands/assign.c')
-rw-r--r-- | sway/commands/assign.c | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/sway/commands/assign.c b/sway/commands/assign.c index 9d15e166..eb7329aa 100644 --- a/sway/commands/assign.c +++ b/sway/commands/assign.c @@ -5,7 +5,6 @@ #include "sway/criteria.h" #include "list.h" #include "log.h" -#include "stringop.h" struct cmd_results *cmd_assign(int argc, char **argv) { struct cmd_results *error = NULL; @@ -13,39 +12,46 @@ struct cmd_results *cmd_assign(int argc, char **argv) { return error; } - // Create criteria - char *err_str = NULL; - struct criteria *criteria = criteria_parse(argv[0], &err_str); - if (!criteria) { - error = cmd_results_new(CMD_INVALID, "assign", err_str); - free(err_str); - return error; - } - - ++argv; - int target_len = argc - 1; + char *criteria = *argv++; if (strncmp(*argv, "→", strlen("→")) == 0) { if (argc < 3) { return cmd_results_new(CMD_INVALID, "assign", "Missing workspace"); } - ++argv; - --target_len; + argv++; } - if (strcmp(*argv, "output") == 0) { - criteria->type = CT_ASSIGN_OUTPUT; - ++argv; - --target_len; - } else { - criteria->type = CT_ASSIGN_WORKSPACE; + char *movecmd = "move container to workspace "; + size_t arglen = strlen(movecmd) + strlen(*argv) + 1; + char *cmdlist = calloc(1, arglen); + if (!cmdlist) { + return cmd_results_new(CMD_FAILURE, "assign", "Unable to allocate command list"); } + snprintf(cmdlist, arglen, "%s%s", movecmd, *argv); - criteria->target = join_args(argv, target_len); - - list_add(config->criteria, criteria); - wlr_log(L_DEBUG, "assign: '%s' -> '%s' added", criteria->raw, - criteria->target); + struct criteria *crit = malloc(sizeof(struct criteria)); + if (!crit) { + free(cmdlist); + return cmd_results_new(CMD_FAILURE, "assign", "Unable to allocate criteria"); + } + crit->crit_raw = strdup(criteria); + crit->cmdlist = cmdlist; + crit->tokens = create_list(); + char *err_str = extract_crit_tokens(crit->tokens, crit->crit_raw); - return cmd_results_new(CMD_SUCCESS, NULL, NULL); + if (err_str) { + error = cmd_results_new(CMD_INVALID, "assign", err_str); + free(err_str); + free_criteria(crit); + } else if (crit->tokens->length == 0) { + error = cmd_results_new(CMD_INVALID, "assign", "Found no name/value pairs in criteria"); + free_criteria(crit); + } else if (list_seq_find(config->criteria, criteria_cmp, crit) != -1) { + wlr_log(L_DEBUG, "assign: Duplicate, skipping."); + free_criteria(crit); + } else { + wlr_log(L_DEBUG, "assign: '%s' -> '%s' added", crit->crit_raw, crit->cmdlist); + list_add(config->criteria, crit); + } + return error ? error : cmd_results_new(CMD_SUCCESS, NULL, NULL); } |