@@ -157,22 +157,23 @@ bool ImGuiHelper::ProcessEvent(InputHandler& inputHandler) {
157157 if (inputStates.getInputEvents (InputActions::TEXT_INPUT )) {
158158 io.AddInputCharactersUTF8 (inputStates.getText ());
159159 }
160- if (inputStates.getInputEvents (InputActions::KEY_SHIFT )) {
161- io.KeyShift = ((SDL_GetModState () & SDL_KMOD_SHIFT ) != 0 );
162- }
163- if (inputStates.getInputEvents (InputActions::KEY_SUPER )) {
164- io.KeySuper = ((SDL_GetModState () & SDL_KMOD_GUI ) != 0 );
165- }
166- if (inputStates.getInputEvents (InputActions::KEY_CTRL )) {
167- io.KeyCtrl = ((SDL_GetModState () & SDL_KMOD_CTRL ) != 0 );
168- }
169- if (inputStates.getInputEvents (InputActions::KEY_ALT )) {
170- io.KeyAlt = ((SDL_GetModState () & SDL_KMOD_ALT ) != 0 );
171- }
160+ // ImGui 1.91.5+ removed the legacy io.KeyCtrl propagation path. io.KeyMods is now
161+ // derived from ImGuiKey_ModCtrl etc. (ImGuiKey_ReservedForModCtrl), NOT from
162+ // ImGuiKey_LeftCtrl, so we must deliver the virtual modifier keys explicitly.
163+ SDL_Keymod sdlMods = SDL_GetModState ();
164+ io.AddKeyEvent (ImGuiMod_Ctrl, (sdlMods & SDL_KMOD_CTRL ) != 0 );
165+ io.AddKeyEvent (ImGuiMod_Shift, (sdlMods & SDL_KMOD_SHIFT ) != 0 );
166+ io.AddKeyEvent (ImGuiMod_Alt, (sdlMods & SDL_KMOD_ALT ) != 0 );
167+ io.AddKeyEvent (ImGuiMod_Super, (sdlMods & SDL_KMOD_GUI ) != 0 );
172168 int numKeys;
173169 const bool * sdlKeyStates = SDL_GetKeyboardState (&numKeys);
174170 for (int i = 0 ; i < numKeys; i++) {
175- ImGuiKey key = SDL2KeyEventToImGuiKey (SDL_SCANCODE_TO_KEYCODE (i));
171+ // SDL3 keycodes for "legacy" keys (Backspace=0x08, Delete=0x7F, letters='a'-'z', etc.)
172+ // are plain ASCII values — NOT scancode-masked. SDL_SCANCODE_TO_KEYCODE() always sets
173+ // bit 30, so it produces wrong values for those keys. SDL_GetKeyFromScancode() returns
174+ // the correct keycode in both cases.
175+ SDL_Keycode sdlKeycode = SDL_GetKeyFromScancode (static_cast <SDL_Scancode>(i), SDL_KMOD_NONE , false );
176+ ImGuiKey key = SDL2KeyEventToImGuiKey (static_cast <uint32_t >(sdlKeycode));
176177 if (key != ImGuiKey_None) {
177178 io.AddKeyEvent (key, sdlKeyStates[i] != 0 );
178179 }
0 commit comments