From f157b21d6737637b71a2ba8538c2e0dcb68b1177 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:23:36 +0000 Subject: [PATCH] Implemented SDL event listener class and HUD toggle key (#4) * Implemented SDL event listener class * Add HUD toggle. * frontend_listener: clean-up * window: invoke all listener callbacks at once * window: use raw pointers for listeners * Rename WindowListener to SDLEventListener, reduce virtual functions --------- Co-authored-by: RadiantDerg --- UnleashedRecomp/CMakeLists.txt | 1 + .../patches/ui/frontend_listener.cpp | 3 ++ .../patches/ui/frontend_listener.h | 37 +++++++++++++++++++ UnleashedRecomp/ui/sdl_listener.h | 21 +++++++++++ UnleashedRecomp/ui/window.cpp | 4 ++ UnleashedRecomp/ui/window.h | 6 ++- 6 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 UnleashedRecomp/patches/ui/frontend_listener.cpp create mode 100644 UnleashedRecomp/patches/ui/frontend_listener.h create mode 100644 UnleashedRecomp/ui/sdl_listener.h diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index 552f9fb..fb45d09 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -59,6 +59,7 @@ set(SWA_HID_CXX_SOURCES ) set(SWA_PATCHES_CXX_SOURCES + "patches/ui/frontend_listener.cpp" "patches/fps_patches.cpp" "patches/misc_patches.cpp" "patches/object_patches.cpp" diff --git a/UnleashedRecomp/patches/ui/frontend_listener.cpp b/UnleashedRecomp/patches/ui/frontend_listener.cpp new file mode 100644 index 0000000..0dd92ed --- /dev/null +++ b/UnleashedRecomp/patches/ui/frontend_listener.cpp @@ -0,0 +1,3 @@ +#include "frontend_listener.h" + +FrontendListener m_frontendListener; diff --git a/UnleashedRecomp/patches/ui/frontend_listener.h b/UnleashedRecomp/patches/ui/frontend_listener.h new file mode 100644 index 0000000..da89c73 --- /dev/null +++ b/UnleashedRecomp/patches/ui/frontend_listener.h @@ -0,0 +1,37 @@ +#pragma once + +#include "kernel/memory.h" +#include "ui/sdl_listener.h" + +class FrontendListener : public SDLEventListener +{ + bool m_isF8KeyDown = false; + +public: + void OnSDLEvent(SDL_Event* event) override + { + switch (event->type) + { + case SDL_KEYDOWN: + { + if (event->key.keysym.sym != SDLK_F8 || m_isF8KeyDown) + break; + + // アプリケーション設定 / 開発用 / デバッグ / HUD / 全 HUD 描画 + const auto ms_IsRenderHud = (bool*)g_memory.Translate(0x8328BB26); + + *ms_IsRenderHud = !*ms_IsRenderHud; + + printf("[*] HUD %s\n", *ms_IsRenderHud ? "On" : "Off"); + + m_isF8KeyDown = true; + + break; + } + + case SDL_KEYUP: + m_isF8KeyDown = event->key.keysym.sym != SDLK_F8; + break; + } + } +}; diff --git a/UnleashedRecomp/ui/sdl_listener.h b/UnleashedRecomp/ui/sdl_listener.h new file mode 100644 index 0000000..785b774 --- /dev/null +++ b/UnleashedRecomp/ui/sdl_listener.h @@ -0,0 +1,21 @@ +#pragma once + +#include "ui/window.h" + +class ISDLEventListener +{ +public: + virtual ~ISDLEventListener() = default; + virtual void OnSDLEvent(SDL_Event* event) = 0; +}; + +class SDLEventListener : public ISDLEventListener +{ +public: + SDLEventListener() + { + Window::s_eventListeners.emplace_back(this); + } + + void OnSDLEvent(SDL_Event* event) override {} +}; diff --git a/UnleashedRecomp/ui/window.cpp b/UnleashedRecomp/ui/window.cpp index fb5b746..94ddf75 100644 --- a/UnleashedRecomp/ui/window.cpp +++ b/UnleashedRecomp/ui/window.cpp @@ -1,4 +1,5 @@ #include "window.h" +#include "sdl_listener.h" #include #include #include @@ -107,6 +108,9 @@ int Window_OnSDLEvent(void*, SDL_Event* event) } } + for (auto listener : Window::s_eventListeners) + listener->OnSDLEvent(event); + return 0; } diff --git a/UnleashedRecomp/ui/window.h b/UnleashedRecomp/ui/window.h index 85a8399..c4f715d 100644 --- a/UnleashedRecomp/ui/window.h +++ b/UnleashedRecomp/ui/window.h @@ -7,7 +7,9 @@ #define DEFAULT_WIDTH 1280 #define DEFAULT_HEIGHT 720 -struct Window +class SDLEventListener; + +class Window { public: inline static SDL_Window* s_pWindow; @@ -20,6 +22,8 @@ public: inline static bool s_isFocused; + inline static std::vector s_eventListeners; + static SDL_Surface* GetIconSurface(void* pIconBmp = nullptr, size_t iconSize = 0) { auto rw = SDL_RWFromMem(pIconBmp ? pIconBmp : (void*)g_icon, pIconBmp ? iconSize : g_icon_size);