Skip to content

Commit

Permalink
Don't trigger a key event if a key with the same associated char was …
Browse files Browse the repository at this point in the history
…pressed (minetest#13773)
  • Loading branch information
savilli committed Sep 22, 2023
1 parent 9f47e12 commit d57c936
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/client/keycode.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ class KeyPress

bool operator==(const KeyPress &o) const
{
return (Char > 0 && Char == o.Char) || (valid_kcode(Key) && Key == o.Key);
if (valid_kcode(Key) && valid_kcode(o.Key))
return Key == o.Key;
return Char > 0 && Char == o.Char;
}

const char *sym() const;
Expand Down
9 changes: 8 additions & 1 deletion src/unittest/test_keycode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ void TestKeycode::testCompare()
{
// Basic comparison
UASSERT(KeyPress("5") == KeyPress("KEY_KEY_5"));
UASSERT(!(KeyPress("5") == KeyPress("KEY_NUMPAD_5")));
UASSERT(!(KeyPress("5") == KeyPress("KEY_NUMPAD5")));

// Matching char suffices
// note: This is a real-world example, Irrlicht maps XK_equal to irr::KEY_PLUS on Linux
Expand All @@ -126,4 +126,11 @@ void TestKeycode::testCompare()
in.Char = L'\0';
in2.Char = L';';
UASSERT(KeyPress(in) == KeyPress(in2));

// Irrlicht sets chars to the according digit for numpad keys.
// We need to distinguish them in order to bind numpad keys.
irr::SEvent::SKeyInput in3;
in3.Key = irr::KEY_NUMPAD5;
in3.Char = L'5';
UASSERT(!(KeyPress("5") == KeyPress(in3)));
}

0 comments on commit d57c936

Please sign in to comment.