Bugfix: correctly compare modifier mask when identifying keybindings

fixes #2002
next
Michael Stapelberg 2015-10-28 21:42:37 +01:00
parent b330050df7
commit 0e5180cae9
1 changed files with 11 additions and 3 deletions

View File

@ -166,15 +166,23 @@ static Binding *get_binding(i3_event_state_mask_t state_filtered, bool is_releas
}
TAILQ_FOREACH(bind, bindings, bindings) {
bool state_matches;
if (bind->event_state_mask == 0) {
/* Verify no modifiers are pressed. A bitwise AND would lead to
* false positives, see issue #2002. */
state_matches = (state_filtered == 0);
} else {
state_matches = ((state_filtered & bind->event_state_mask) == bind->event_state_mask);
}
DLOG("binding with event_state_mask 0x%x, state_filtered 0x%x, match: %s\n",
bind->event_state_mask, state_filtered,
((state_filtered & bind->event_state_mask) == bind->event_state_mask) ? "yes" : "no");
bind->event_state_mask, state_filtered, (state_matches ? "yes" : "no"));
/* First compare the state_filtered (unless this is a
* B_UPON_KEYRELEASE_IGNORE_MODS binding and this is a KeyRelease
* event) */
if (bind->input_type != input_type)
continue;
if ((state_filtered & bind->event_state_mask) != bind->event_state_mask &&
if (!state_matches &&
(bind->release != B_UPON_KEYRELEASE_IGNORE_MODS ||
!is_release))
continue;