Browse Source

Fix gold withdrawal in SDL1

1. Unifies SDL1 and SDL2 text input handling.
2. Moves game-specific text input handling out of misc_msg.
3. Disables Unicode processing when not inputting text in SDL1.

This fixes gold withdrawal in SDL1.
pull/5544/head
Gleb Mazovetskiy 3 years ago
parent
commit
4e9bb0e704
  1. 45
      Source/diablo.cpp
  2. 49
      Source/miniwin/misc_msg.cpp
  3. 3
      Source/utils/display.cpp
  4. 2
      Source/utils/sdl2_to_1_2_backports.h

45
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();

49
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);

3
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.

2
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)

Loading…
Cancel
Save