From 5e46672cf44f10fb879f2fb9ab8a5b19384dcd5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 5 Dec 2020 11:21:17 +0100 Subject: [PATCH] =?UTF-8?q?config:=20ignore=20=E2=80=9Cself=E2=80=9D=20whe?= =?UTF-8?q?n=20detecting=20key=20binding=20collisions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, foot would not accept the following: [key-bindings] minimize=Escape minimize=Escape Now it does. I.e. key combos in the action being updated are ignored when detecting collisions. The example above is contrived; a real world example could be to remove certain combos from an action with multiple combos; perhaps to free up a combo for another action. Example: [search-bindings] cancel=Escape This would previously cause an error since `cancel=Control+g Escape` by default. Closes #233 --- CHANGELOG.md | 5 +++++ config.c | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74a8932e..d50a39af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,11 @@ means foot can be PGO:d in e.g. sandboxed build scripts. See ### Deprecated ### Removed ### Fixed + +* Error when re-assigning a default key binding + (https://codeberg.org/dnkl/foot/issues/233). + + ### Security diff --git a/config.c b/config.c index e5411bed..b37d1a25 100644 --- a/config.c +++ b/config.c @@ -1024,10 +1024,14 @@ err: } static bool -has_key_binding_collisions(struct config *conf, const key_combo_list_t *key_combos, +has_key_binding_collisions(struct config *conf, enum bind_action_normal action, + const key_combo_list_t *key_combos, const char *path, unsigned lineno) { tll_foreach(conf->bindings.key, it) { + if (it->item.action == action) + continue; + tll_foreach(*key_combos, it2) { const struct config_key_modifiers *mods1 = &it->item.modifiers; const struct config_key_modifiers *mods2 = &it2->item.modifiers; @@ -1055,10 +1059,14 @@ has_key_binding_collisions(struct config *conf, const key_combo_list_t *key_comb } static bool -has_search_binding_collisions(struct config *conf, const key_combo_list_t *key_combos, +has_search_binding_collisions(struct config *conf, enum bind_action_search action, + const key_combo_list_t *key_combos, const char *path, unsigned lineno) { tll_foreach(conf->bindings.search, it) { + if (it->item.action == action) + continue; + tll_foreach(*key_combos, it2) { const struct config_key_modifiers *mods1 = &it->item.modifiers; const struct config_key_modifiers *mods2 = &it2->item.modifiers; @@ -1245,7 +1253,7 @@ parse_section_key_bindings( key_combo_list_t key_combos = tll_init(); if (!parse_key_combos(conf, value, &key_combos, path, lineno) || - has_key_binding_collisions(conf, &key_combos, path, lineno)) + has_key_binding_collisions(conf, action, &key_combos, path, lineno)) { free(pipe_argv); free(pipe_cmd); @@ -1325,7 +1333,7 @@ parse_section_search_bindings( key_combo_list_t key_combos = tll_init(); if (!parse_key_combos(conf, value, &key_combos, path, lineno) || - has_search_binding_collisions(conf, &key_combos, path, lineno)) + has_search_binding_collisions(conf, action, &key_combos, path, lineno)) { free_key_combo_list(&key_combos); return false;