diff --git a/backends/imgui_impl_emscripten.cpp b/backends/imgui_impl_emscripten.cpp index 127027a26..e1d199e6d 100644 --- a/backends/imgui_impl_emscripten.cpp +++ b/backends/imgui_impl_emscripten.cpp @@ -448,8 +448,18 @@ void ImGui_ImplEmscripten_Init() { nullptr, // userData false, // useCapture [](int /*event_type*/, EmscriptenKeyboardEvent const *key_event, void */*data*/){ // callback, event_type == EMSCRIPTEN_EVENT_KEYDOWN - ImGui::GetIO().AddKeyEvent(translate_key(key_event->code), true); - return false; // the event was not consumed + 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 + 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 + return imgui_io.WantTextInput; // the event was consumed only if we're currently accepting text input + default: + return false; // the event was not consumed + } } ); emscripten_set_keyup_callback( @@ -467,15 +477,15 @@ void ImGui_ImplEmscripten_Init() { false, // useCapture [](int /*event_type*/, EmscriptenKeyboardEvent const *key_event, void */*data*/){ // callback, event_type == EMSCRIPTEN_EVENT_KEYPRESS auto &imgui_io{ImGui::GetIO()}; - ImGui::GetIO().AddInputCharactersUTF8(key_event->key); - return true; // the event was consumed + imgui_io.AddInputCharactersUTF8(key_event->key); + return imgui_io.WantCaptureKeyboard; // the event was consumed only if imgui wants to capture the keyboard } ); emscripten_set_resize_callback( EMSCRIPTEN_EVENT_TARGET_WINDOW, // target nullptr, // userData false, // useCapture - [](int /*event_type*/, EmscriptenUiEvent const *event, void */*data*/) { // event_type == EMSCRIPTEN_EVENT_RESIZE + [](int /*event_type*/, EmscriptenUiEvent const *event, void */*data*/) { // event_type == EMSCRIPTEN_EVENT_RESIZE auto &imgui_io{ImGui::GetIO()}; imgui_io.DisplaySize.x = static_cast(event->windowInnerWidth); imgui_io.DisplaySize.y = static_cast(event->windowInnerHeight);