diff --git a/Source/diablo.cpp b/Source/diablo.cpp index eef036ff8..b416ec5d9 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -653,6 +653,28 @@ void HandleMouseButtonUp(Uint8 button, uint16_t modState) } } +bool HandleTextInput(string_view text) +{ + if (IsTalkActive()) { + control_new_text(text); + return true; + } + if (dropGoldFlag) { + GoldDropNewText(text); + return true; + } + if (IsWithdrawGoldOpen) { + GoldWithdrawNewText(text); + return true; + } + return false; +} + +[[maybe_unused]] void LogUnhandledEvent(const char *name, int value) +{ + LogVerbose("Unhandled SDL event: {} {}", name, value); +} + void GameEventHandler(const SDL_Event &event, uint16_t modState) { GameAction action; @@ -675,12 +697,33 @@ void GameEventHandler(const SDL_Event &event, uint16_t modState) } switch (event.type) { - case SDL_KEYDOWN: + case SDL_KEYDOWN: { +#ifdef USE_SDL1 + // SDL1 does not support TEXTINPUT events, so we emulate them here. + const Uint16 bmpCodePoint = event.key.keysym.unicode; + if (bmpCodePoint >= ' ') { + std::string utf8; + AppendUtf8(bmpCodePoint, utf8); + if (HandleTextInput(utf8)) { + return; + } + } +#endif PressKey(event.key.keysym.sym, modState); return; + } case SDL_KEYUP: ReleaseKey(event.key.keysym.sym); return; +#if SDL_VERSION_ATLEAST(2, 0, 0) + case SDL_TEXTEDITING: + return; + case SDL_TEXTINPUT: + if (!HandleTextInput(event.text.text)) { + LogUnhandledEvent("SDL_TEXTINPUT", event.text.windowID); + } + return; +#endif case SDL_MOUSEMOTION: MousePosition = { event.motion.x, event.motion.y }; gmenu_on_mouse_move(); diff --git a/Source/miniwin/misc_msg.cpp b/Source/miniwin/misc_msg.cpp index c9d28468d..4a10a3e5c 100644 --- a/Source/miniwin/misc_msg.cpp +++ b/Source/miniwin/misc_msg.cpp @@ -151,12 +151,17 @@ bool FetchMessage_Real(SDL_Event *event, uint16_t *modState) return true; switch (e.type) { -#ifndef USE_SDL1 +#if SDL_VERSION_ATLEAST(2, 0, 0) case SDL_CONTROLLERAXISMOTION: case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: case SDL_FINGERDOWN: case SDL_FINGERUP: + case SDL_TEXTEDITING: + case SDL_TEXTINPUT: + case SDL_WINDOWEVENT: +#else + case SDL_ACTIVEEVENT: #endif case SDL_JOYAXISMOTION: case SDL_JOYHATMOTION: @@ -165,24 +170,11 @@ bool FetchMessage_Real(SDL_Event *event, uint16_t *modState) *event = e; break; case SDL_KEYDOWN: - case SDL_KEYUP: { -#ifdef USE_SDL1 - if (gbRunGame && (IsTalkActive() || dropGoldFlag)) { - Uint16 unicode = e.key.keysym.unicode; - if (unicode >= ' ') { - std::string utf8; - AppendUtf8(unicode, utf8); - if (IsTalkActive()) - control_new_text(utf8); - if (dropGoldFlag) - GoldDropNewText(utf8); - } - } -#endif + case SDL_KEYUP: if (e.key.keysym.sym == -1) return FalseAvail(e.type == SDL_KEYDOWN ? "SDL_KEYDOWN" : "SDL_KEYUP", e.key.keysym.sym); *event = e; - } break; + break; case SDL_MOUSEMOTION: *event = e; if (ControlMode == ControlTypes::KeyboardAndMouse && invflag) @@ -213,31 +205,6 @@ bool FetchMessage_Real(SDL_Event *event, uint16_t *modState) case SDL_KEYMAPCHANGED: return FalseAvail("SDL_KEYMAPCHANGED", 0); #endif - case SDL_TEXTEDITING: - if (gbRunGame) - break; - return FalseAvail("SDL_TEXTEDITING", e.edit.length); - case SDL_TEXTINPUT: - if (gbRunGame && IsTalkActive()) { - control_new_text(e.text.text); - break; - } - if (gbRunGame && dropGoldFlag) { - GoldDropNewText(e.text.text); - break; - } - if (gbRunGame && IsWithdrawGoldOpen) { - GoldWithdrawNewText(e.text.text); - break; - } - return FalseAvail("SDL_TEXTINPUT", e.text.windowID); - case SDL_WINDOWEVENT: - *event = e; - break; -#else - case SDL_ACTIVEEVENT: - *event = e; - break; #endif default: return FalseAvail("unknown", e.type); diff --git a/Source/utils/display.cpp b/Source/utils/display.cpp index 31fc6abe5..3d2d178b3 100644 --- a/Source/utils/display.cpp +++ b/Source/utils/display.cpp @@ -287,9 +287,6 @@ bool SpawnWindow(const char *lpWindowName) } #endif -#ifdef USE_SDL1 - SDL_EnableUNICODE(1); -#endif #ifdef USE_SDL1 // On SDL 1, there are no ADDED/REMOVED events. // Always try to initialize the first joystick. diff --git a/Source/utils/sdl2_to_1_2_backports.h b/Source/utils/sdl2_to_1_2_backports.h index ff1695ff7..0db4b2eec 100644 --- a/Source/utils/sdl2_to_1_2_backports.h +++ b/Source/utils/sdl2_to_1_2_backports.h @@ -97,10 +97,12 @@ SDL_LogPriority SDL_LogGetPriority(int category); inline void SDL_StartTextInput() { + SDL_EnableUNICODE(1); } inline void SDL_StopTextInput() { + SDL_EnableUNICODE(0); } inline void SDL_SetTextInputRect(const SDL_Rect *r)