diff --git a/core/input_map.cpp b/core/input_map.cpp index 8473bce8068..dcce13ba1b7 100644 --- a/core/input_map.cpp +++ b/core/input_map.cpp @@ -107,7 +107,7 @@ List InputMap::get_actions() const { return actions; } -List::Element *InputMap::_find_event(List &p_list,const InputEvent& p_event, bool p_mod_ignore=false) const { +List::Element *InputMap::_find_event(List &p_list,const InputEvent& p_event, bool p_action_test) const { for (List::Element *E=p_list.front();E;E=E->next()) { @@ -123,7 +123,13 @@ List::Element *InputMap::_find_event(List &p_list,const case InputEvent::KEY: { - same=(e.key.scancode==p_event.key.scancode && (p_mod_ignore || e.key.mod == p_event.key.mod)); + if(p_action_test) { + uint32_t code = e.key.get_scancode_with_modifiers(); + uint32_t event_code = p_event.key.get_scancode_with_modifiers(); + same=(e.key.scancode==p_event.key.scancode && (!p_event.key.pressed || ((code & event_code) == code))); + } else { + same=(e.key.scancode==p_event.key.scancode && e.key.mod == p_event.key.mod); + } } break; case InputEvent::JOYPAD_BUTTON: { @@ -230,7 +236,7 @@ bool InputMap::event_is_action(const InputEvent& p_event, const StringName& p_ac return p_event.action.action==E->get().id; } - return _find_event(E->get().inputs,p_event,!p_event.is_pressed())!=NULL; + return _find_event(E->get().inputs,p_event,true)!=NULL; } const Map& InputMap::get_action_map() const { diff --git a/core/input_map.h b/core/input_map.h index 306845fc89c..6ccd24f29c1 100644 --- a/core/input_map.h +++ b/core/input_map.h @@ -46,7 +46,7 @@ private: mutable Map input_map; mutable Map input_id_map; - List::Element *_find_event(List &p_list,const InputEvent& p_event, bool p_mod_ignore) const; + List::Element *_find_event(List &p_list,const InputEvent& p_event, bool p_action_test=false) const; Array _get_action_list(const StringName& p_action); Array _get_actions(); diff --git a/main/input_default.cpp b/main/input_default.cpp index 82dec860672..0561f2bb349 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -381,15 +381,12 @@ void InputDefault::parse_input_event(const InputEvent& p_event) { if (!p_event.is_echo()) { for (const Map::Element *E=InputMap::get_singleton()->get_action_map().front();E;E=E->next()) { - if (InputMap::get_singleton()->event_is_action(p_event,E->key())) { - - if(is_action_pressed(E->key()) != p_event.is_pressed()) { - Action action; - action.fixed_frame=Engine::get_singleton()->get_fixed_frames(); - action.idle_frame=Engine::get_singleton()->get_idle_frames(); - action.pressed=p_event.is_pressed(); - action_state[E->key()]=action; - } + if (InputMap::get_singleton()->event_is_action(p_event,E->key()) && is_action_pressed(E->key()) != p_event.is_pressed()) { + Action action; + action.fixed_frame=Engine::get_singleton()->get_fixed_frames(); + action.idle_frame=Engine::get_singleton()->get_idle_frames(); + action.pressed=p_event.is_pressed(); + action_state[E->key()]=action; } } }