From e587c31150f93b9e7ede1c9dc1ed0394e3d1a9b4 Mon Sep 17 00:00:00 2001 From: SimoneN64 Date: Sat, 22 Jul 2023 19:34:57 +0200 Subject: [PATCH] Avoid rendering if window is minimized + pause on minimize/losing focus --- src/backend/Core.hpp | 1 + src/frontend/App.cpp | 24 ++++++++++++++---------- src/frontend/imgui/Window.cpp | 8 ++++++-- src/frontend/imgui/Window.hpp | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/backend/Core.hpp b/src/backend/Core.hpp index 099a41eb..a6cd8a75 100644 --- a/src/backend/Core.hpp +++ b/src/backend/Core.hpp @@ -19,6 +19,7 @@ struct Core { u32 breakpoint = 0; bool pause = true; + bool render = true; int cycles = 0; bool romLoaded = false; std::string rom; diff --git a/src/frontend/App.cpp b/src/frontend/App.cpp index 2206bc77..0129cf38 100644 --- a/src/frontend/App.cpp +++ b/src/frontend/App.cpp @@ -12,15 +12,6 @@ void App::Run() { n64::SI& si = core.cpu.mem.mmio.si; while (!window.done) { - if(core.romLoaded) { - if(!core.pause) { - core.Run(window.settings.GetVolumeL(), window.settings.GetVolumeR()); - } - UpdateScreenParallelRdp(core, window, core.GetVI()); - } else { - UpdateScreenParallelRdpNoGame(core, window); - } - SDL_Event event; while (SDL_PollEvent(&event)) { ImGui_ImplSDL2_ProcessEvent(&event); @@ -29,7 +20,7 @@ void App::Run() { window.done = true; break; case SDL_WINDOWEVENT: - window.onClose(event); + window.handleEvents(event, core); break; case SDL_CONTROLLERDEVICEADDED: { const int index = event.cdevice.which; @@ -61,5 +52,18 @@ void App::Run() { } break; } } + + if(core.romLoaded) { + if(!core.pause) { + core.Run(window.settings.GetVolumeL(), window.settings.GetVolumeR()); + } + if(core.render) { + UpdateScreenParallelRdp(core, window, core.GetVI()); + } + } else { + if(core.render) { + UpdateScreenParallelRdpNoGame(core, window); + } + } } } \ No newline at end of file diff --git a/src/frontend/imgui/Window.cpp b/src/frontend/imgui/Window.cpp index 29d010b6..44faabbc 100644 --- a/src/frontend/imgui/Window.cpp +++ b/src/frontend/imgui/Window.cpp @@ -15,9 +15,13 @@ Window::Window(n64::Core& core) : settings() { NFD::Init(); } -void Window::onClose(SDL_Event event) { +void Window::handleEvents(SDL_Event event, n64::Core& core) { done = event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window); + + bool minimized = SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED; + core.pause = event.window.event == SDL_WINDOWEVENT_FOCUS_LOST || minimized; + core.render = !minimized; } static void check_vk_result(VkResult err) { @@ -222,7 +226,7 @@ void Window::Render(n64::Core& core) { u32 ticks = SDL_GetTicks(); static u32 lastFrame = 0; - if(!core.pause && lastFrame < ticks - 1000) { + if(!core.pause && core.romLoaded && lastFrame < ticks - 1000) { lastFrame = ticks; windowTitle += fmt::format(" | {:02d} VI/s", core.cpu.mem.mmio.vi.swaps); core.cpu.mem.mmio.vi.swaps = 0; diff --git a/src/frontend/imgui/Window.hpp b/src/frontend/imgui/Window.hpp index 85b88332..0cc0dbcc 100644 --- a/src/frontend/imgui/Window.hpp +++ b/src/frontend/imgui/Window.hpp @@ -14,7 +14,7 @@ struct Window { ~Window(); ImDrawData* Present(n64::Core& core); - void onClose(SDL_Event event); + void handleEvents(SDL_Event event, n64::Core&); ImFont *uiFont{}; Settings settings; void LoadROM(n64::Core& core, const std::string& path);