criteria: Add. Learn for_window command.

A criteria is a string in the form of `[class="regex.*" title="str"]`.
It is stored in a struct with a list of *tokens* which is a
attribute/value pair (stored as a `crit_token` struct). Most tokens will
also have a precompiled regex stored that will be used during criteria
matching.

for_window command: When a new view is created its metadata is tested
against all stored criteria, and if a match is found the associated
command list is executed.

Unfortunately some metadata is not available in sway at the moment
(specifically `instance`, `window_role` and `urgent`). Any criteria
string that tries to match an unsupported attribute will fail.

(Note that while the criteria code can be used to parse any criteria
string it is currently only used by the `for_window` command.)
This commit is contained in:
S. Christoffer Eliesen 2015-11-17 19:27:01 +01:00
parent 402c9f4bf0
commit a06cb7cd01
7 changed files with 478 additions and 0 deletions

View file

@ -10,6 +10,7 @@
#include "config.h"
#include "layout.h"
#include "input_state.h"
#include "criteria.h"
struct sway_config *config = NULL;
@ -66,6 +67,11 @@ static void free_config(struct sway_config *config) {
}
list_free(config->workspace_outputs);
for (i = 0; i < config->criteria->length; ++i) {
free_criteria(config->criteria->items[i]);
}
list_free(config->criteria);
for (i = 0; i < config->output_configs->length; ++i) {
free_output_config(config->output_configs->items[i]);
}
@ -82,6 +88,7 @@ static void config_defaults(struct sway_config *config) {
config->symbols = create_list();
config->modes = create_list();
config->workspace_outputs = create_list();
config->criteria = create_list();
config->output_configs = create_list();
config->cmd_queue = create_list();