From 33b6b09e5dd00f6598c7305b392c2432a91b38b0 Mon Sep 17 00:00:00 2001 From: Hyper <34012267+hyperbx@users.noreply.github.com> Date: Sat, 9 Nov 2024 20:28:03 +0000 Subject: [PATCH] Implemented SDL event listener class --- UnleashedRecomp/CMakeLists.txt | 1 + .../patches/ui/frontend_listener.cpp | 3 +++ .../patches/ui/frontend_listener.h | 24 ++++++++++++++++++ UnleashedRecomp/ui/window.cpp | 10 ++++++++ UnleashedRecomp/ui/window.h | 6 ++++- UnleashedRecomp/ui/window_listener.h | 25 +++++++++++++++++++ 6 files changed, 68 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/window_listener.h diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index 552f9fb5..fb45d090 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 00000000..0dd92edc --- /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 00000000..3ddd9343 --- /dev/null +++ b/UnleashedRecomp/patches/ui/frontend_listener.h @@ -0,0 +1,24 @@ +#pragma once + +#include "ui/window_listener.h" + +class FrontendListener : public WindowListener +{ +private: + bool m_isF8KeyDown = false; + +public: + void OnKeyDown(SDL_Keycode key) override + { + if (key == SDLK_F8 && !m_isF8KeyDown) + { + printf("F8 pressed!\n"); + m_isF8KeyDown = true; + } + } + + void OnKeyUp(SDL_Keycode key) override + { + m_isF8KeyDown = key != SDLK_F8; + } +}; diff --git a/UnleashedRecomp/ui/window.cpp b/UnleashedRecomp/ui/window.cpp index fb5b746b..5b673f4e 100644 --- a/UnleashedRecomp/ui/window.cpp +++ b/UnleashedRecomp/ui/window.cpp @@ -1,4 +1,5 @@ #include "window.h" +#include "window_listener.h" #include #include #include @@ -56,6 +57,9 @@ int Window_OnSDLEvent(void*, SDL_Event* event) } } + for (auto listener : Window::s_listeners) + listener->OnKeyDown(event->key.keysym.sym); + break; } @@ -68,6 +72,9 @@ int Window_OnSDLEvent(void*, SDL_Event* event) m_isFullscreenKeyReleased = true; break; } + + for (auto listener : Window::s_listeners) + listener->OnKeyUp(event->key.keysym.sym); } case SDL_WINDOWEVENT: @@ -107,6 +114,9 @@ int Window_OnSDLEvent(void*, SDL_Event* event) } } + for (auto listener : Window::s_listeners) + listener->OnSDLEvent(event); + return 0; } diff --git a/UnleashedRecomp/ui/window.h b/UnleashedRecomp/ui/window.h index 85a83994..07025168 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 WindowListener; + +class Window { public: inline static SDL_Window* s_pWindow; @@ -20,6 +22,8 @@ public: inline static bool s_isFocused; + inline static std::vector> s_listeners; + 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); diff --git a/UnleashedRecomp/ui/window_listener.h b/UnleashedRecomp/ui/window_listener.h new file mode 100644 index 00000000..c7aecc02 --- /dev/null +++ b/UnleashedRecomp/ui/window_listener.h @@ -0,0 +1,25 @@ +#pragma once + +#include "ui/window.h" + +class IWindowListener +{ +public: + virtual ~IWindowListener() = default; + virtual void OnSDLEvent(SDL_Event* event) = 0; + virtual void OnKeyDown(SDL_Keycode key) = 0; + virtual void OnKeyUp(SDL_Keycode key) = 0; +}; + +class WindowListener : public IWindowListener +{ +public: + WindowListener() + { + Window::s_listeners.emplace_back(this); + } + + void OnSDLEvent(SDL_Event* event) override {} + void OnKeyDown(SDL_Keycode key) override {} + void OnKeyUp(SDL_Keycode key) override {} +};