criteria: reset on semicolon separation

This matches i3's behavior of only retaining criteria across comma
separated commands. When separating commands with a semicolon, the
criteria is reset and allows for new criteria to be set, if desired.
This commit is contained in:
Brian Ashworth 2019-06-05 01:31:50 -04:00 committed by Drew DeVault
parent 190546fd31
commit f0f5de9a9e
2 changed files with 27 additions and 21 deletions

View file

@ -227,28 +227,31 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
head = exec;
do {
// Extract criteria (valid for this command list only).
config->handler_context.using_criteria = false;
if (*head == '[') {
char *error = NULL;
struct criteria *criteria = criteria_parse(head, &error);
if (!criteria) {
list_add(res_list, cmd_results_new(CMD_INVALID, "%s", error));
free(error);
goto cleanup;
}
views = criteria_get_views(criteria);
head += strlen(criteria->raw);
criteria_destroy(criteria);
config->handler_context.using_criteria = true;
// Skip leading whitespace
for (; isspace(*head); ++head) {}
}
// Split command list
cmdlist = argsep(&head, ";");
for (; isspace(*cmdlist); ++cmdlist) {}
do {
// Split commands
// Skip leading whitespace
for (; isspace(*cmdlist); ++cmdlist) {}
// Extract criteria (valid for this command chain only).
config->handler_context.using_criteria = false;
if (*cmdlist == '[') {
char *error = NULL;
struct criteria *criteria = criteria_parse(cmdlist, &error);
if (!criteria) {
list_add(res_list,
cmd_results_new(CMD_INVALID, "%s", error));
free(error);
goto cleanup;
}
list_free(views);
views = criteria_get_views(criteria);
cmdlist += strlen(criteria->raw);
criteria_destroy(criteria);
config->handler_context.using_criteria = true;
// Skip leading whitespace
for (; isspace(*cmdlist); ++cmdlist) {}
}
// Split command chain into commands
cmd = argsep(&cmdlist, ",");
for (; isspace(*cmd); ++cmd) {}
if (strcmp(cmd, "") == 0) {