From 88b39dc97d7aebb046013a6a5c3bcdf8f8235dc4 Mon Sep 17 00:00:00 2001 From: staphen Date: Sat, 24 May 2025 12:22:21 -0400 Subject: [PATCH] Make use of SDL_UserEvent::code instead of SDL_Event::type --- Source/diablo.cpp | 2 +- Source/engine/demomode.cpp | 6 +++--- Source/interfac.cpp | 26 +++++++++++++------------- Source/interfac.h | 6 ++++-- Source/player.cpp | 6 +++--- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 2fab97a4e..624b138f0 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -811,7 +811,7 @@ void GameEventHandler(const SDL_Event &event, uint16_t modState) nthread_ignore_mutex(true); PaletteFadeOut(8); sound_stop(); - ShowProgress(GetCustomEvent(event.type)); + ShowProgress(GetCustomEvent(event)); RedrawEverything(); if (!HeadlessMode) { diff --git a/Source/engine/demomode.cpp b/Source/engine/demomode.cpp index 21cb4de8b..1468e9ec3 100644 --- a/Source/engine/demomode.cpp +++ b/Source/engine/demomode.cpp @@ -280,7 +280,7 @@ bool CreateSdlEvent(const DemoMsg &dmsg, SDL_Event &event, uint16_t &modState) return true; default: if (type >= DemoMsg::MinCustomEvent) { - event.type = CustomEventToSdlEvent(static_cast(type - DemoMsg::MinCustomEvent)); + CustomEventToSdlEvent(event, static_cast(type - DemoMsg::MinCustomEvent)); return true; } event.type = static_cast(0); @@ -377,7 +377,7 @@ bool CreateSdlEvent(const DemoMsg &dmsg, SDL_Event &event, uint16_t &modState) return true; default: if (type >= DemoMsg::MinCustomEvent) { - event.type = CustomEventToSdlEvent(static_cast(type - DemoMsg::MinCustomEvent)); + CustomEventToSdlEvent(event, static_cast(type - DemoMsg::MinCustomEvent)); return true; } event.type = static_cast(0); @@ -802,7 +802,7 @@ void RecordMessage(const SDL_Event &event, uint16_t modState) default: if (IsCustomEvent(event.type)) { WriteDemoMsgHeader(static_cast( - DemoMsg::MinCustomEvent + static_cast(GetCustomEvent(event.type)))); + DemoMsg::MinCustomEvent + static_cast(GetCustomEvent(event)))); } break; } diff --git a/Source/interfac.cpp b/Source/interfac.cpp index 4866ef831..caa38772d 100644 --- a/Source/interfac.cpp +++ b/Source/interfac.cpp @@ -73,8 +73,7 @@ const int BarPos[3][2] = { { 53, 37 }, { 53, 421 }, { 53, 37 } }; OptionalOwnedClxSpriteList ArtCutsceneWidescreen; -SdlEventType CustomEventsBegin = SDL_USEREVENT; -constexpr uint16_t NumCustomEvents = WM_LAST - WM_FIRST + 1; +SdlEventType CustomEventType = SDL_USEREVENT; Cutscenes GetCutSceneFromLevelType(dungeon_type type) { @@ -413,7 +412,7 @@ void DoLoad(interface_mode uMsg) if (!loadResult.has_value()) { #if SDL_PUSH_EVENT_BG_THREAD_WORKS SDL_Event event; - event.type = CustomEventToSdlEvent(WM_ERROR); + CustomEventToSdlEvent(event, WM_ERROR); event.user.data1 = new std::string(std::move(loadResult).error()); if (SDL_PushEvent(&event) < 0) { LogError("Failed to send WM_ERROR {}", SDL_GetError()); @@ -428,7 +427,7 @@ void DoLoad(interface_mode uMsg) #if SDL_PUSH_EVENT_BG_THREAD_WORKS SDL_Event event; - event.type = CustomEventToSdlEvent(WM_DONE); + CustomEventToSdlEvent(event, WM_DONE); if (SDL_PushEvent(&event) < 0) { LogError("Failed to send WM_DONE {}", SDL_GetError()); SDL_ClearError(); @@ -485,7 +484,7 @@ void ProgressEventHandler(const SDL_Event &event, uint16_t modState) DisableInputEventHandler(event, modState); if (!IsCustomEvent(event.type)) return; - const interface_mode customEvent = GetCustomEvent(event.type); + const interface_mode customEvent = GetCustomEvent(event); switch (customEvent) { case WM_PROGRESS: if (!HeadlessMode && ProgressEventHandlerState.drawnProgress != sgdwProgress && !ProgressEventHandlerState.skipRendering) { @@ -557,23 +556,24 @@ void ProgressEventHandler(const SDL_Event &event, uint16_t modState) void RegisterCustomEvents() { #ifndef USE_SDL1 - CustomEventsBegin = SDL_RegisterEvents(NumCustomEvents); + CustomEventType = SDL_RegisterEvents(1); #endif } bool IsCustomEvent(SdlEventType eventType) { - return eventType >= CustomEventsBegin && eventType < CustomEventsBegin + NumCustomEvents; + return eventType == CustomEventType; } -interface_mode GetCustomEvent(SdlEventType eventType) +interface_mode GetCustomEvent(const SDL_Event &event) { - return static_cast(eventType - CustomEventsBegin); + return static_cast(event.user.code); } -SdlEventType CustomEventToSdlEvent(interface_mode eventType) +void CustomEventToSdlEvent(SDL_Event &event, interface_mode eventType) { - return CustomEventsBegin + eventType; + event.type = CustomEventType; + event.user.code = static_cast(eventType); } void interface_msg_pump() @@ -598,7 +598,7 @@ void IncProgress(uint32_t steps) if (!HeadlessMode && sgdwProgress != prevProgress) { #if SDL_PUSH_EVENT_BG_THREAD_WORKS SDL_Event event; - event.type = CustomEventToSdlEvent(WM_PROGRESS); + CustomEventToSdlEvent(event, WM_PROGRESS); if (SDL_PushEvent(&event) < 0) { LogError("Failed to send WM_PROGRESS {}", SDL_GetError()); SDL_ClearError(); @@ -691,7 +691,7 @@ void ShowProgress(interface_mode uMsg) } #if !SDL_PUSH_EVENT_BG_THREAD_WORKS if (const int customEventType = NextCustomEvent.type.exchange(-1); customEventType != -1) { - event.type = CustomEventToSdlEvent(static_cast(customEventType)); + CustomEventToSdlEvent(event, static_cast(customEventType)); if (static_cast(customEventType) == static_cast(WM_ERROR)) { event.user.data1 = &NextCustomEvent.error; } diff --git a/Source/interfac.h b/Source/interfac.h index a5316f519..5face5d13 100644 --- a/Source/interfac.h +++ b/Source/interfac.h @@ -7,6 +7,8 @@ #include +#include + #include "utils/ui_fwd.h" namespace devilution { @@ -45,9 +47,9 @@ using SdlEventType = uint8_t; bool IsCustomEvent(SdlEventType eventType); -interface_mode GetCustomEvent(SdlEventType eventType); +interface_mode GetCustomEvent(const SDL_Event &event); -SdlEventType CustomEventToSdlEvent(interface_mode eventType); +void CustomEventToSdlEvent(SDL_Event &event, interface_mode eventType); enum Cutscenes : uint8_t { CutStart, diff --git a/Source/player.cpp b/Source/player.cpp index e5cd1d61c..0d0980c25 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -2861,7 +2861,7 @@ StartNewLvl(Player &player, interface_mode fom, int lvl) player._pmode = PM_NEWLVL; player._pInvincible = true; SDL_Event event; - event.type = CustomEventToSdlEvent(fom); + CustomEventToSdlEvent(event, fom); SDL_PushEvent(&event); if (gbIsMultiplayer) { NetSendCmdParam2(true, CMD_NEWLVL, fom, lvl); @@ -2887,7 +2887,7 @@ void RestartTownLvl(Player &player) if (&player == MyPlayer) { player._pInvincible = true; SDL_Event event; - event.type = CustomEventToSdlEvent(WM_DIABRETOWN); + CustomEventToSdlEvent(event, WM_DIABRETOWN); SDL_PushEvent(&event); } } @@ -2912,7 +2912,7 @@ void StartWarpLvl(Player &player, size_t pidx) player._pmode = PM_NEWLVL; player._pInvincible = true; SDL_Event event; - event.type = CustomEventToSdlEvent(WM_DIABWARPLVL); + CustomEventToSdlEvent(event, WM_DIABWARPLVL); SDL_PushEvent(&event); } }