From c873ff2f2e7dfb9a2fcdf126486f90b9fa288868 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Tue, 10 Mar 2020 13:04:58 -0700 Subject: [PATCH] Allow sparse rendering while resizing/moving application on Windows --- project/src/backend/sdl/SDLApplication.cpp | 53 ++++++++++++++++++++++ project/src/backend/sdl/SDLApplication.h | 1 + 2 files changed, 54 insertions(+) diff --git a/project/src/backend/sdl/SDLApplication.cpp b/project/src/backend/sdl/SDLApplication.cpp index 835d10ae6..e42d8efec 100644 --- a/project/src/backend/sdl/SDLApplication.cpp +++ b/project/src/backend/sdl/SDLApplication.cpp @@ -7,6 +7,11 @@ #include #endif +#ifdef HX_WINDOWS +#include +#include +#endif + #ifdef EMSCRIPTEN #include "emscripten.h" #endif @@ -21,6 +26,8 @@ namespace lime { const int analogAxisDeadZone = 1000; std::map > gamepadsAxisMap; bool inBackground = false; + bool winTimerActive = false; + int winTimerID = 1; SDLApplication::SDLApplication () { @@ -325,6 +332,11 @@ namespace lime { lastUpdate = SDL_GetTicks (); nextUpdate = lastUpdate; + #ifdef HX_WINDOWS + SDL_AddEventWatch (SDLApplication::WatchEvent, nullptr); + SDL_EventState (SDL_SYSWMEVENT, SDL_ENABLE); + #endif + } @@ -875,6 +887,15 @@ namespace lime { while (SDL_PollEvent (&event)) { + #ifdef HX_WINDOWS + if (winTimerActive) { + + KillTimer (GetActiveWindow (), winTimerID); + winTimerActive = false; + + } + #endif + HandleEvent (&event); event.type = -1; if (!active) @@ -982,6 +1003,38 @@ namespace lime { } + int SDLApplication::WatchEvent (void* userData, SDL_Event* event) { + + #ifdef HX_WINDOWS + if (event->type == SDL_SYSWMEVENT) { + + const auto& message = event->syswm.msg->msg.win; + + if (message.msg == WM_ENTERSIZEMOVE) { + + winTimerActive = SetTimer (GetActiveWindow (), winTimerID, currentApplication->framePeriod, nullptr); + + // TODO: Are we thread-safe to call GL here? + RenderEvent::Dispatch (¤tApplication->renderEvent); + + } else if (message.msg == WM_TIMER) { + + if (message.wParam == winTimerID) { + + RenderEvent::Dispatch (¤tApplication->renderEvent); + + } + + } + + } + #endif + + return 0; + + } + + Application* CreateApplication () { return new SDLApplication (); diff --git a/project/src/backend/sdl/SDLApplication.h b/project/src/backend/sdl/SDLApplication.h index 85d2930f2..6ad6e0e84 100644 --- a/project/src/backend/sdl/SDLApplication.h +++ b/project/src/backend/sdl/SDLApplication.h @@ -54,6 +54,7 @@ namespace lime { static void UpdateFrame (); static void UpdateFrame (void*); + static int WatchEvent (void* userData, SDL_Event* event); static SDLApplication* currentApplication;