From f0f5de9a9e87ca1f0d74e7cbf82ffceba51ffbe6 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Wed, 5 Jun 2019 01:31:50 -0400 Subject: [PATCH] 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. --- sway/commands.c | 41 ++++++++++++++++++++++------------------- sway/sway.5.scd | 7 +++++-- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/sway/commands.c b/sway/commands.c index 237bfc28..377f2d01 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -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) { diff --git a/sway/sway.5.scd b/sway/sway.5.scd index 6d098d94..db6dda0d 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd @@ -45,7 +45,8 @@ the bindsym command. Commands are split into several arguments using spaces. You can enclose arguments with quotation marks (*"..."* or *'...'*) to add spaces to a single argument. You may also run several commands in order by separating each with -*,* or *;*. +*,* or *;*. Criteria is retained across commands separated by *,*, but will be +reset (and allow for new criteria, if desired) for commands separated by a *;*. Throughout the documentation, *|* is used to distinguish between arguments for which you may only select one. *[...]* is used for optional arguments, and @@ -753,7 +754,9 @@ A criteria is a string in the form of, for example: The string contains one or more (space separated) attribute/value pairs. They are used by some commands to choose which views to execute actions on. All -attributes must match for the criteria to match. +attributes must match for the criteria to match. Criteria is retained across +commands separated by a *,*, but will be reset (and allow for new criteria, if +desired) for commands separated by a *;*. Criteria may be used with either the *for_window* or *assign* commands to specify operations to perform on new views. A criteria may also be used to