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) void GameEventHandler(const SDL_Event &event, uint16_t modState)
{ {
GameAction action; GameAction action;
@ -675,12 +697,33 @@ void GameEventHandler(const SDL_Event &event, uint16_t modState)
} }
switch (event.type) { 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); PressKey(event.key.keysym.sym, modState);
return; return;
}
case SDL_KEYUP: case SDL_KEYUP:
ReleaseKey(event.key.keysym.sym); ReleaseKey(event.key.keysym.sym);
return; 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: case SDL_MOUSEMOTION:
MousePosition = { event.motion.x, event.motion.y }; MousePosition = { event.motion.x, event.motion.y };
gmenu_on_mouse_move(); 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; return true;
switch (e.type) { switch (e.type) {
#ifndef USE_SDL1 #if SDL_VERSION_ATLEAST(2, 0, 0)
case SDL_CONTROLLERAXISMOTION: case SDL_CONTROLLERAXISMOTION:
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONUP:
case SDL_FINGERDOWN: case SDL_FINGERDOWN:
case SDL_FINGERUP: case SDL_FINGERUP:
case SDL_TEXTEDITING:
case SDL_TEXTINPUT:
case SDL_WINDOWEVENT:
#else
case SDL_ACTIVEEVENT:
#endif #endif
case SDL_JOYAXISMOTION: case SDL_JOYAXISMOTION:
case SDL_JOYHATMOTION: case SDL_JOYHATMOTION:
@ -165,24 +170,11 @@ bool FetchMessage_Real(SDL_Event *event, uint16_t *modState)
*event = e; *event = e;
break; break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
case SDL_KEYUP: { 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
if (e.key.keysym.sym == -1) if (e.key.keysym.sym == -1)
return FalseAvail(e.type == SDL_KEYDOWN ? "SDL_KEYDOWN" : "SDL_KEYUP", e.key.keysym.sym); return FalseAvail(e.type == SDL_KEYDOWN ? "SDL_KEYDOWN" : "SDL_KEYUP", e.key.keysym.sym);
*event = e; *event = e;
} break; break;
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
*event = e; *event = e;
if (ControlMode == ControlTypes::KeyboardAndMouse && invflag) if (ControlMode == ControlTypes::KeyboardAndMouse && invflag)
@ -213,31 +205,6 @@ bool FetchMessage_Real(SDL_Event *event, uint16_t *modState)
case SDL_KEYMAPCHANGED: case SDL_KEYMAPCHANGED:
return FalseAvail("SDL_KEYMAPCHANGED", 0); return FalseAvail("SDL_KEYMAPCHANGED", 0);
#endif #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 #endif
default: default:
return FalseAvail("unknown", e.type); return FalseAvail("unknown", e.type);

3
Source/utils/display.cpp

@ -287,9 +287,6 @@ bool SpawnWindow(const char *lpWindowName)
} }
#endif #endif
#ifdef USE_SDL1
SDL_EnableUNICODE(1);
#endif
#ifdef USE_SDL1 #ifdef USE_SDL1
// On SDL 1, there are no ADDED/REMOVED events. // On SDL 1, there are no ADDED/REMOVED events.
// Always try to initialize the first joystick. // 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() inline void SDL_StartTextInput()
{ {
SDL_EnableUNICODE(1);
} }
inline void SDL_StopTextInput() inline void SDL_StopTextInput()
{ {
SDL_EnableUNICODE(0);
} }
inline void SDL_SetTextInputRect(const SDL_Rect *r) inline void SDL_SetTextInputRect(const SDL_Rect *r)

Loading…
Cancel
Save