From 333867eb38ab9e728eba2b8589f9143f376536b5 Mon Sep 17 00:00:00 2001 From: Kylie C Date: Sat, 18 Oct 2025 02:20:20 -0400 Subject: [PATCH] ISLE_DEBUG support and event changes --- 3rdparty/CMakeLists.txt | 15 ++++++- 3rdparty/sdl3-shim/SDL3/SDL_events.h | 58 ++++++++++++++++++++++++++++ 3rdparty/sdl3-shim/main.cpp | 10 +++++ ISLE/isledebug.cpp | 35 ++++++++++++++++- 4 files changed, 115 insertions(+), 3 deletions(-) diff --git a/3rdparty/CMakeLists.txt b/3rdparty/CMakeLists.txt index a1dffac7..10a527de 100644 --- a/3rdparty/CMakeLists.txt +++ b/3rdparty/CMakeLists.txt @@ -67,9 +67,19 @@ if(ISLE_DEBUG) ${imgui_SOURCE_DIR}/imgui_tables.cpp ${imgui_SOURCE_DIR}/imgui_widgets.cpp ${imgui_SOURCE_DIR}/imgui_demo.cpp - ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp - ${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer3.cpp ) + if(USE_SDL2) + target_sources(imgui PRIVATE + ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl2.cpp + ${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer2.cpp + ) + else() + target_sources(imgui PRIVATE + ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl3.cpp + ${imgui_SOURCE_DIR}/backends/imgui_impl_sdlrenderer3.cpp + ) + endif() + target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR}) target_link_libraries(imgui PUBLIC SDL3::Headers) target_link_libraries(imgui PRIVATE SDL3::SDL3) @@ -123,6 +133,7 @@ if(USE_SDL2) ) target_link_libraries(SDL3_shim PRIVATE SDL2::SDL2) target_include_directories(SDL3_shim PUBLIC + ${SDL2_INCLUDE_DIRS} "${CMAKE_CURRENT_SOURCE_DIR}/sdl3-shim" "${CMAKE_CURRENT_BINARY_DIR}/sdl3-shim" ) diff --git a/3rdparty/sdl3-shim/SDL3/SDL_events.h b/3rdparty/sdl3-shim/SDL3/SDL_events.h index 8d6b514a..61113ed5 100644 --- a/3rdparty/sdl3-shim/SDL3/SDL_events.h +++ b/3rdparty/sdl3-shim/SDL3/SDL_events.h @@ -3,6 +3,7 @@ #include "SDL.h" #include +#include // https://wiki.libsdl.org/SDL3/README-migration#sdl_eventsh @@ -66,3 +67,60 @@ #define touchID touchId #define gaxis caxis #define gbutton cbutton + +inline SDL_Window* SDL_GetWindowFromEvent(const SDL_Event* event) +{ + Uint32 windowID = 0; + + if (event->type >= SDL_USEREVENT && event->type <= SDL_LASTEVENT) { + windowID = event->user.windowID; + } + else { + switch (event->type) { + case SDL_WINDOWEVENT: + windowID = event->window.windowID; + break; + + case SDL_KEYDOWN: + case SDL_KEYUP: + case SDL_KEYMAPCHANGED: + windowID = event->key.windowID; + break; + + case SDL_TEXTEDITING: + windowID = event->edit.windowID; + break; + case SDL_TEXTINPUT: + windowID = event->text.windowID; + break; + case SDL_TEXTEDITING_EXT: + windowID = event->editExt.windowID; + break; + + case SDL_MOUSEMOTION: + windowID = event->motion.windowID; + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + windowID = event->button.windowID; + break; + case SDL_MOUSEWHEEL: + windowID = event->wheel.windowID; + break; + + case SDL_FINGERDOWN: + case SDL_FINGERUP: + case SDL_FINGERMOTION: + windowID = event->tfinger.windowID; + break; + + case SDL_DROPFILE: + case SDL_DROPTEXT: + case SDL_DROPBEGIN: + case SDL_DROPCOMPLETE: + windowID = event->drop.windowID; + break; + } + } + return SDL_GetWindowFromID(windowID); +} diff --git a/3rdparty/sdl3-shim/main.cpp b/3rdparty/sdl3-shim/main.cpp index b87237c7..7b46335d 100644 --- a/3rdparty/sdl3-shim/main.cpp +++ b/3rdparty/sdl3-shim/main.cpp @@ -2,6 +2,15 @@ #include "SDL3/SDL_events.h" #include "SDL3/SDL_main.h" +static void TranslateSDLEvents(SDL_Event* e) +{ + // Extend to SDL_DISPLAYEVENT & fully replace the event object passed to AppEvent + // if wanting to drop the ifs on key, mouse and keyboard events. + if (e->type == SDL_WINDOWEVENT) { + e->type = SDL_WINDOWEVENT + 2 + e->window.event; + } +} + int main(int argc, char *argv[]) { void *appstate = NULL; if (SDL_AppInit(&appstate, argc, argv) != 0) { @@ -11,6 +20,7 @@ int main(int argc, char *argv[]) { SDL_Event e; while (!SDL_AppIterate(appstate)) { while (SDL_PollEvent(&e)) { + TranslateSDLEvents(&e); SDL_AppEvent(appstate, &e); } } diff --git a/ISLE/isledebug.cpp b/ISLE/isledebug.cpp index ab3433a5..929f9c73 100644 --- a/ISLE/isledebug.cpp +++ b/ISLE/isledebug.cpp @@ -12,8 +12,13 @@ #include "mxticklemanager.h" #include +#if SDL_MAJOR_VERSION >= 3 #include #include +#else +#include +#include +#endif #include #ifdef ISLE_VALGRIND @@ -176,7 +181,11 @@ void IsleDebug_Init() ImGui::CreateContext(); ImGui::StyleColorsDark(); +#if SDL_MAJOR_VERSION >= 3 if (!ImGui_ImplSDL3_InitForSDLRenderer(g_debugWindow, g_debugRenderer)) { +#else + if (!ImGui_ImplSDL2_InitForSDLRenderer(g_debugWindow, g_debugRenderer)) { +#endif SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "ImGui_ImplSDL3_InitForSDLRenderer failed"); g_debugEnabled = false; break; @@ -188,7 +197,11 @@ void IsleDebug_Init() #else SDL_SetTextureScaleMode(g_videoPalette, SDL_SCALEMODE_NEAREST); #endif +#if SDL_MAJOR_VERSION >= 3 if (!ImGui_ImplSDLRenderer3_Init(g_debugRenderer)) { +#else + if (!ImGui_ImplSDLRenderer2_Init(g_debugRenderer)) { +#endif g_debugEnabled = false; break; } @@ -221,7 +234,11 @@ bool IsleDebug_Event(SDL_Event* event) return false; } if (event->type == SDL_EVENT_KEY_DOWN) { +#if SDL_MAJOR_VERSION >= 3 if (event->key.scancode == SCANCODE_KEY_PAUSE) { +#else + if (event->key.keysym.scancode == SCANCODE_KEY_PAUSE) { +#endif if (!g_debugPaused) { IsleDebug_SetPaused(true); } @@ -230,7 +247,11 @@ bool IsleDebug_Event(SDL_Event* event) } return true; } +#if SDL_MAJOR_VERSION >= 3 if (event->key.scancode == SCANCODE_KEY_RESUME) { +#else + if (event->key.keysym.scancode == SCANCODE_KEY_RESUME) { +#endif g_debugDoStep = false; if (g_debugPaused) { IsleDebug_SetPaused(false); @@ -241,7 +262,11 @@ bool IsleDebug_Event(SDL_Event* event) if (SDL_GetWindowFromEvent(event) != g_debugWindow) { return false; } +#if SDL_MAJOR_VERSION >= 3 ImGui_ImplSDL3_ProcessEvent(event); +#else + ImGui_ImplSDL2_ProcessEvent(event); +#endif return true; } @@ -251,9 +276,13 @@ void IsleDebug_Render() return; } const ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - +#if SDL_MAJOR_VERSION >= 3 ImGui_ImplSDLRenderer3_NewFrame(); ImGui_ImplSDL3_NewFrame(); +#else + ImGui_ImplSDLRenderer2_NewFrame(); + ImGui_ImplSDL2_NewFrame(); +#endif ImGui::NewFrame(); ImGuiIO& io = ImGui::GetIO(); { @@ -346,7 +375,11 @@ void IsleDebug_Render() (Uint8) (clear_color.z * 255), (Uint8) (clear_color.w * 255) ); +#if SDL_MAJOR_VERSION >= 3 ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), g_debugRenderer); +#else + ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), g_debugRenderer); +#endif SDL_RenderPresent(g_debugRenderer); }