From: Michael Stapelberg Date: Wed, 28 Oct 2015 20:42:37 +0000 (+0100) Subject: Bugfix: correctly compare modifier mask when identifying keybindings X-Git-Tag: 4.14.1~80 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=82806f3857ef7eb7752c5e54711200ebba265cdf;p=i3%2Fi3 Bugfix: correctly compare modifier mask when identifying keybindings fixes #2002 --- diff --git a/src/bindings.c b/src/bindings.c index 84998af1..a3ea7cf6 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -165,15 +165,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;