diff --git a/backends/imgui_impl_emscripten.cpp b/backends/imgui_impl_emscripten.cpp index 05b6de3d8..4aad0717b 100644 --- a/backends/imgui_impl_emscripten.cpp +++ b/backends/imgui_impl_emscripten.cpp @@ -451,16 +451,33 @@ void ImGui_ImplEmscripten_Init() { auto const key{translate_key(key_event->code)}; auto &imgui_io{ImGui::GetIO()}; imgui_io.AddKeyEvent(key, true); - - switch(key) { // special cases for certain key events that need to be consumed to prevent unwanted behaviour + switch(key) { // special cases for certain key events + case ImGuiKey_LeftCtrl: // additional events for modifier keys + case ImGuiKey_RightCtrl: + imgui_io.AddKeyEvent(ImGuiMod_Ctrl, true); + break; + case ImGuiKey_LeftShift: + case ImGuiKey_RightShift: + imgui_io.AddKeyEvent(ImGuiMod_Shift, true); + break; + case ImGuiKey_LeftAlt: + case ImGuiKey_RightAlt: + imgui_io.AddKeyEvent(ImGuiMod_Alt, true); + break; + case ImGuiKey_LeftSuper: + case ImGuiKey_RightSuper: + imgui_io.AddKeyEvent(ImGuiMod_Super, true); + break; + // TODO: case ImGuiKey_Menu: do we want to do anything with this? case ImGuiKey_Tab: // consuming tab prevents the user tabbing to other parts of the browser interface outside the window content return imgui_io.WantCaptureKeyboard; // the event was consumed only if imgui wants to capture the keyboard case ImGuiKey_Enter: // consuming enter prevents the word "Enter" appearing in text input via the keypress callback case ImGuiKey_Delete: // consuming enter prevents the word "Delete" appearing in text input via the keypress callback return imgui_io.WantTextInput; // the event was consumed only if we're currently accepting text input default: - return false; // the event was not consumed + break; } + return false; // if no special handling, the event was not consumed } ); emscripten_set_keyup_callback( @@ -468,7 +485,29 @@ void ImGui_ImplEmscripten_Init() { nullptr, // userData false, // useCapture [](int /*event_type*/, EmscriptenKeyboardEvent const *key_event, void */*data*/){ // callback, event_type == EMSCRIPTEN_EVENT_KEYUP - ImGui::GetIO().AddKeyEvent(translate_key(key_event->code), false); + auto const key{translate_key(key_event->code)}; + auto &imgui_io{ImGui::GetIO()}; + imgui_io.AddKeyEvent(key, false); + switch(key) { // special cases for certain key events + case ImGuiKey_LeftCtrl: // additional events for modifier keys + case ImGuiKey_RightCtrl: + imgui_io.AddKeyEvent(ImGuiMod_Ctrl, false); + break; + case ImGuiKey_LeftShift: + case ImGuiKey_RightShift: + imgui_io.AddKeyEvent(ImGuiMod_Shift, false); + break; + case ImGuiKey_LeftAlt: + case ImGuiKey_RightAlt: + imgui_io.AddKeyEvent(ImGuiMod_Alt, false); + break; + case ImGuiKey_LeftSuper: + case ImGuiKey_RightSuper: + imgui_io.AddKeyEvent(ImGuiMod_Super, false); + break; + default: + break; + } return false; // the event was not consumed } );