Use stored commands for bindings

The preceding commit includes motivation; specifically,
invoking keyboard and mouse bindings should never fail
unless they perform an action which can fail. For instance,
a `bindcode Ctrl+9 exit` should always exit; of course,
`exec` may fail for external reasons.

The core changes are to bind.c and commands.c. As a single
command may actually, on being parsed, generate multiple
commands to be executed (consider `workspace 1; splith`),
the parsing code in execute_command is moved to a separate
function, parse_command, which returns a list_t of stored
commands; leaving execute_command to parse the command,
execute each resulting list element; and then cleanup.

An additional field for the list of parsed stored commands,
is added to struct sway_binding, usurping the name "command".
This is initialized via parse_command, and then
seat_execute_command is adjusted accordingly.

Side effects of this change include:
* Reference counting `struct criteria`, because a criterion
parsed once may apply to multiple stored commands, and
the alternative of duplicating criteria is even more
complicated.
* Adding reading and active arguments to config_handler,
because when bindsyms parse commands, they require handler
lookups to be performed as though it were runtime.
* Reference counting `struct sway_binding`, because the
alternative of updating sway_binding_dup is even more
complicated when allocation failures are be taken into
account.
This commit is contained in:
mstoeckl 2018-08-23 20:04:44 -04:00
parent f8b9c796f4
commit 6a805aace0
13 changed files with 217 additions and 135 deletions

View file

@ -18,6 +18,7 @@ list_t *create_list(void) {
static void list_resize(list_t *list) {
if (list->length == list->capacity) {
list->capacity += 10;
// TODO: safely handle realloc failure
list->items = realloc(list->items, sizeof(void*) * list->capacity);
}
}