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) {

View File

@ -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