keybinds: fix multikey binds breaking after scroll wheel events (#12638)
This commit is contained in:
parent
33df518f97
commit
d7f26038ee
2 changed files with 46 additions and 10 deletions
|
|
@ -456,6 +456,35 @@ static void testSubmap() {
|
||||||
Tests::killAllWindows();
|
Tests::killAllWindows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void testBindsAfterScroll() {
|
||||||
|
NLog::log("{}Testing binds after scroll", Colors::GREEN);
|
||||||
|
|
||||||
|
clearFlag();
|
||||||
|
OK(getFromSocket("/keyword binds Alt_R,w,exec,touch " + flagFile));
|
||||||
|
|
||||||
|
// press keybind before scroll
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 1,0,108")); // Alt_R press
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 1,4,25")); // w press
|
||||||
|
EXPECT(attemptCheckFlag(20, 50), true);
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 0,4,25")); // w release
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 0,0,108")); // Alt_R release
|
||||||
|
|
||||||
|
// scroll
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:scroll 120"));
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:scroll -120"));
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:scroll 120"));
|
||||||
|
|
||||||
|
// press keybind after scroll
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 1,0,108")); // Alt_R press
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 1,4,25")); // w press
|
||||||
|
EXPECT(attemptCheckFlag(20, 50), true);
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 0,4,25")); // w release
|
||||||
|
OK(getFromSocket("/dispatch plugin:test:keybind 0,0,108")); // Alt_R release
|
||||||
|
|
||||||
|
clearFlag();
|
||||||
|
OK(getFromSocket("/keyword unbind Alt_R,w"));
|
||||||
|
}
|
||||||
|
|
||||||
static void testSubmapUniversal() {
|
static void testSubmapUniversal() {
|
||||||
NLog::log("{}Testing submap universal", Colors::GREEN);
|
NLog::log("{}Testing submap universal", Colors::GREEN);
|
||||||
|
|
||||||
|
|
@ -507,6 +536,7 @@ static bool test() {
|
||||||
testShortcutRepeatKeyRelease();
|
testShortcutRepeatKeyRelease();
|
||||||
testSubmap();
|
testSubmap();
|
||||||
testSubmapUniversal();
|
testSubmapUniversal();
|
||||||
|
testBindsAfterScroll();
|
||||||
|
|
||||||
clearFlag();
|
clearFlag();
|
||||||
return !ret;
|
return !ret;
|
||||||
|
|
|
||||||
|
|
@ -647,16 +647,22 @@ SDispatchResult CKeybindManager::handleKeybinds(const uint32_t modmask, const SP
|
||||||
bool found = false;
|
bool found = false;
|
||||||
SDispatchResult res;
|
SDispatchResult res;
|
||||||
|
|
||||||
if (pressed) {
|
// Skip keysym tracking for events with no keysym (e.g., scroll wheel events).
|
||||||
if (keycodeToModifier(key.keycode))
|
// Scroll events have keysym=0 and are always "pressed" (never released),
|
||||||
m_mkMods.insert(key.keysym);
|
// so without this check, 0 gets inserted into m_mkKeys and never removed,
|
||||||
else
|
// breaking multi-key binds (binds flag 's'). See issue #8699.
|
||||||
m_mkKeys.insert(key.keysym);
|
if (key.keysym != 0) {
|
||||||
} else {
|
if (pressed) {
|
||||||
if (keycodeToModifier(key.keycode))
|
if (keycodeToModifier(key.keycode))
|
||||||
m_mkMods.erase(key.keysym);
|
m_mkMods.insert(key.keysym);
|
||||||
else
|
else
|
||||||
m_mkKeys.erase(key.keysym);
|
m_mkKeys.insert(key.keysym);
|
||||||
|
} else {
|
||||||
|
if (keycodeToModifier(key.keycode))
|
||||||
|
m_mkMods.erase(key.keysym);
|
||||||
|
else
|
||||||
|
m_mkKeys.erase(key.keysym);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& k : m_keybinds) {
|
for (auto& k : m_keybinds) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue