From: Michael Stapelberg Date: Sun, 15 Nov 2015 17:00:48 +0000 (+0100) Subject: Revert "Bugfix: set group mask 1 by default, correctly compare modifiers" X-Git-Tag: 4.12~105 X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=commitdiff_plain;h=e48c4cd25700fac9bf1eb85c3ffec5f43348a90d Revert "Bugfix: set group mask 1 by default, correctly compare modifiers" This reverts commit 9692c1498bcde3489f80b484dbd847a75dfd0405. That commit accidentally defaulted to group mask 1, but the default should be to match any group mask, so that having multiple layouts loaded at the same time works. fixes #2062 --- diff --git a/src/bindings.c b/src/bindings.c index 7ea087e6..49f61590 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -165,18 +165,28 @@ static Binding *get_binding(i3_event_state_mask_t state_filtered, bool is_releas } } + const uint32_t xkb_group_state = (state_filtered & 0xFFFF0000); + const uint32_t modifiers_state = (state_filtered & 0x0000FFFF); TAILQ_FOREACH(bind, bindings, bindings) { - bool state_matches; - if ((bind->event_state_mask & 0xFFFF) == 0) { + const uint32_t xkb_group_mask = (bind->event_state_mask & 0xFFFF0000); + /* modifiers_mask is a special case: a value of 0 does not mean “match all”, + * but rather “match exactly when no modifiers are present”. */ + const uint32_t modifiers_mask = (bind->event_state_mask & 0x0000FFFF); + const bool groups_match = ((xkb_group_state & xkb_group_mask) == xkb_group_mask); + bool mods_match; + if (modifiers_mask == 0) { /* Verify no modifiers are pressed. A bitwise AND would lead to * false positives, see issue #2002. */ - state_matches = (state_filtered == bind->event_state_mask); + mods_match = (modifiers_state == 0); } else { - state_matches = ((state_filtered & bind->event_state_mask) == bind->event_state_mask); + mods_match = ((modifiers_state & modifiers_mask) == modifiers_mask); } + const bool state_matches = (groups_match && mods_match); - DLOG("binding with event_state_mask 0x%x, state_filtered 0x%x, match: %s\n", - bind->event_state_mask, state_filtered, (state_matches ? "yes" : "no")); + DLOG("binding groups_match = %s, mods_match = %s, state_matches = %s\n", + (groups_match ? "yes" : "no"), + (mods_match ? "yes" : "no"), + (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) */ diff --git a/src/config_directives.c b/src/config_directives.c index 419d663a..ba267427 100644 --- a/src/config_directives.c +++ b/src/config_directives.c @@ -67,9 +67,8 @@ i3_event_state_mask_t event_state_from_str(const char *str) { /* It might be better to use strtok() here, but the simpler strstr() should * do for now. */ i3_event_state_mask_t result = 0; - int group_bits_set = 0; if (str == NULL) - return (I3_XKB_GROUP_MASK_1 << 16); + return result; if (strstr(str, "Mod1") != NULL) result |= XCB_KEY_BUT_MASK_MOD_1; if (strstr(str, "Mod2") != NULL) @@ -86,26 +85,15 @@ i3_event_state_mask_t event_state_from_str(const char *str) { if (strstr(str, "Shift") != NULL) result |= XCB_KEY_BUT_MASK_SHIFT; - if (strstr(str, "Group1") != NULL) { + if (strstr(str, "Group1") != NULL) result |= (I3_XKB_GROUP_MASK_1 << 16); - group_bits_set++; - } if (strstr(str, "Group2") != NULL || - strstr(str, "Mode_switch") != NULL) { + strstr(str, "Mode_switch") != NULL) result |= (I3_XKB_GROUP_MASK_2 << 16); - group_bits_set++; - } - if (strstr(str, "Group3") != NULL) { + if (strstr(str, "Group3") != NULL) result |= (I3_XKB_GROUP_MASK_3 << 16); - group_bits_set++; - } - if (strstr(str, "Group4") != NULL) { + if (strstr(str, "Group4") != NULL) result |= (I3_XKB_GROUP_MASK_4 << 16); - group_bits_set++; - } - if (group_bits_set == 0) { - result |= (I3_XKB_GROUP_MASK_1 << 16); - } return result; }