Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions core/input/input_event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,22 @@ bool InputEventKey::action_match(const Ref<InputEvent> &p_event, bool p_exact_ma
Key key_mask = (Key)(int64_t)key->get_modifiers_mask();
if (key->is_pressed()) {
match &= (action_mask & key_mask) == action_mask;
} else if (!match) {
// released and mismatch keycode
BitField<KeyModifierMask> mask = {};
if (key->get_keycode() == Key::CTRL) {
mask.set_flag(KeyModifierMask::CTRL);
} else if (key->get_keycode() == Key::SHIFT) {
mask.set_flag(KeyModifierMask::SHIFT);
} else if (key->get_keycode() == Key::ALT) {
mask.set_flag(KeyModifierMask::ALT);
} else if (key->get_keycode() == Key::META) {
mask.set_flag(KeyModifierMask::META);
}
Key functional_key_mask = (Key)(int64_t)mask;

// exactly matches functional key
match |= functional_key_mask != Key::NONE && (action_mask & functional_key_mask) == functional_key_mask;
}
if (p_exact_match) {
match &= action_mask == key_mask;
Expand Down
41 changes: 41 additions & 0 deletions tests/core/input/test_input_event_key.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,47 @@ TEST_CASE("[InputEventKey] Key correctly stores and retrieves keycode with modif
CHECK(key.get_physical_keycode_with_modifiers() != Key::SPACE);
}

TEST_CASE("[InputEventKey] keycode and modifier matches") {
InputEventKey spaceKeyAction;
InputEventKey shiftKeyAction;
InputEventKey shiftSpaceKeyAction;

spaceKeyAction.set_keycode(Key::SPACE);
shiftKeyAction.set_keycode(Key::SHIFT);
shiftKeyAction.set_shift_pressed(true);
shiftSpaceKeyAction.set_keycode(Key::SPACE);
shiftSpaceKeyAction.set_shift_pressed(true);

InputEventKey key;
bool p_exact_match = false;
float deadzone = 0.5;
bool r_pressed = false;
float r_strength = 0.0;
float r_raw_strength = 0.0;

Ref<InputEventKey> p_event;

p_event = key.create_reference(Key::SPACE);
p_event->set_pressed(true);
CHECK(spaceKeyAction.action_match(p_event, p_exact_match, deadzone, &r_pressed, &r_strength, &r_raw_strength) == true);

p_event = key.create_reference(Key::SHIFT | KeyModifierMask::SHIFT);
p_event->set_pressed(true);
CHECK(shiftKeyAction.action_match(p_event, p_exact_match, deadzone, &r_pressed, &r_strength, &r_raw_strength) == true);

p_event = key.create_reference(Key::SPACE | KeyModifierMask::SHIFT);
p_event->set_pressed(true);
CHECK(shiftSpaceKeyAction.action_match(p_event, p_exact_match, deadzone, &r_pressed, &r_strength, &r_raw_strength) == true);

p_event = key.create_reference(Key::SHIFT | KeyModifierMask::SHIFT);
p_event->set_pressed(false);
CHECK(shiftKeyAction.action_match(p_event, p_exact_match, deadzone, &r_pressed, &r_strength, &r_raw_strength) == true);

p_event = key.create_reference(Key::SPACE);
p_event->set_pressed(false);
CHECK(spaceKeyAction.action_match(p_event, p_exact_match, deadzone, &r_pressed, &r_strength, &r_raw_strength) == true);
}

TEST_CASE("[InputEventKey] Key correctly stores and retrieves unicode") {
InputEventKey key;

Expand Down