mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-15 05:33:58 -04:00
config: improve error reporting when selection-override-modifiers conflict with mouse bindings
This commit is contained in:
parent
9e111118d6
commit
a15c6025ec
1 changed files with 54 additions and 7 deletions
61
config.c
61
config.c
|
|
@ -1970,6 +1970,17 @@ static const struct {
|
||||||
{"BTN_TASK", BTN_TASK},
|
{"BTN_TASK", BTN_TASK},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char*
|
||||||
|
mouse_event_code_get_name(int code)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < ALEN(button_map); i++) {
|
||||||
|
if (code == button_map[i].code)
|
||||||
|
return button_map[i].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
value_to_mouse_combos(struct context *ctx, struct key_combo_list *key_combos)
|
value_to_mouse_combos(struct context *ctx, struct key_combo_list *key_combos)
|
||||||
{
|
{
|
||||||
|
|
@ -2093,21 +2104,57 @@ modifiers_to_str(const struct config_key_modifiers *mods)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
mouse_combo_to_str(const struct key_combo *combo)
|
||||||
|
{
|
||||||
|
char *combo_modifiers_str = modifiers_to_str(&combo->modifiers);
|
||||||
|
const char *combo_button_str = mouse_event_code_get_name(combo->m.button);
|
||||||
|
xassert(combo_button_str != NULL);
|
||||||
|
|
||||||
|
char *ret;
|
||||||
|
if (combo->m.count == 1)
|
||||||
|
ret = xasprintf("%s+%s", combo_modifiers_str, combo_button_str);
|
||||||
|
else
|
||||||
|
ret = xasprintf("%s+%s-%d",
|
||||||
|
combo_modifiers_str,
|
||||||
|
combo_button_str,
|
||||||
|
combo->m.count);
|
||||||
|
|
||||||
|
free (combo_modifiers_str);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
selection_override_interferes_with_mouse_binding(struct context *ctx,
|
selection_override_interferes_with_mouse_binding(struct context *ctx,
|
||||||
const struct key_combo_list *key_combos)
|
int action,
|
||||||
|
const struct key_combo_list *key_combos,
|
||||||
|
bool blame_modifiers)
|
||||||
{
|
{
|
||||||
struct config *conf = ctx->conf;
|
struct config *conf = ctx->conf;
|
||||||
|
|
||||||
const struct config_key_modifiers *override_mods = &conf->mouse.selection_override_modifiers;
|
if (action == BIND_ACTION_NONE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const struct config_key_modifiers *override_mods =
|
||||||
|
&conf->mouse.selection_override_modifiers;
|
||||||
for (size_t i = 0; i < key_combos->count; i++) {
|
for (size_t i = 0; i < key_combos->count; i++) {
|
||||||
const struct key_combo *combo = &key_combos->combos[i];
|
const struct key_combo *combo = &key_combos->combos[i];
|
||||||
|
|
||||||
if (!modifiers_disjoint(&combo->modifiers, override_mods)) {
|
if (!modifiers_disjoint(&combo->modifiers, override_mods)) {
|
||||||
char *modifiers_str = modifiers_to_str(override_mods);
|
char *modifiers_str = modifiers_to_str(override_mods);
|
||||||
LOG_CONTEXTUAL_ERR(
|
char *combo_str = mouse_combo_to_str(combo);
|
||||||
"Selection override modifiers (%s) cannot be used in mouse bindings",
|
if (blame_modifiers) {
|
||||||
modifiers_str);
|
LOG_CONTEXTUAL_ERR(
|
||||||
|
"modifiers conflict with existing binding %s=%s",
|
||||||
|
binding_action_map[action],
|
||||||
|
combo_str);
|
||||||
|
} else {
|
||||||
|
LOG_CONTEXTUAL_ERR(
|
||||||
|
"binding conflicts with selection override modifiers (%s)",
|
||||||
|
modifiers_str);
|
||||||
|
}
|
||||||
free (modifiers_str);
|
free (modifiers_str);
|
||||||
|
free (combo_str);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2182,7 +2229,7 @@ parse_section_mouse_bindings(struct context *ctx)
|
||||||
.combos = &combo,
|
.combos = &combo,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (selection_override_interferes_with_mouse_binding(ctx, &key_combos)) {
|
if (selection_override_interferes_with_mouse_binding(ctx, binding->action, &key_combos, true)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2225,7 +2272,7 @@ parse_section_mouse_bindings(struct context *ctx)
|
||||||
struct key_combo_list key_combos = {0};
|
struct key_combo_list key_combos = {0};
|
||||||
if (!value_to_mouse_combos(ctx, &key_combos) ||
|
if (!value_to_mouse_combos(ctx, &key_combos) ||
|
||||||
has_mouse_binding_collisions(ctx, &key_combos) ||
|
has_mouse_binding_collisions(ctx, &key_combos) ||
|
||||||
selection_override_interferes_with_mouse_binding(ctx, &key_combos))
|
selection_override_interferes_with_mouse_binding(ctx, action, &key_combos, false))
|
||||||
{
|
{
|
||||||
free_argv(&pipe_argv);
|
free_argv(&pipe_argv);
|
||||||
free_key_combo_list(&key_combos);
|
free_key_combo_list(&key_combos);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue