From 1667b11564a754cb1477c475e4562ab5236a01b1 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sun, 6 Apr 2025 19:42:04 +0200 Subject: [PATCH] Pause menu video playback when OpenMW is minimized --- CHANGELOG.md | 1 + apps/openmw/mwbase/windowmanager.hpp | 2 +- apps/openmw/mwgui/mainmenu.cpp | 21 ++++++++++++++++++--- apps/openmw/mwgui/windowmanagerimp.cpp | 2 +- apps/openmw/mwgui/windowmanagerimp.hpp | 2 +- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f1b76ccc8..c74ff74397 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -230,6 +230,7 @@ Bug #8364: Crash when clicking scrollbar without handle (divide by zero) Bug #8378: Korean bitmap fonts are unusable Bug #8439: Creatures without models can crash the game + Bug #8441: Freeze when using video main menu replacers Feature #1415: Infinite fall failsafe Feature #2566: Handle NAM9 records for manual cell references Feature #3501: OpenMW-CS: Instance Editing - Shortcuts for axial locking diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index df334bbfe8..8164501b4b 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -363,7 +363,7 @@ namespace MWBase void windowVisibilityChange(bool visible) override = 0; void windowResized(int x, int y) override = 0; void windowClosed() override = 0; - virtual bool isWindowVisible() = 0; + virtual bool isWindowVisible() const = 0; virtual void watchActor(const MWWorld::Ptr& ptr) = 0; virtual MWWorld::Ptr getWatchedActor() const = 0; diff --git a/apps/openmw/mwgui/mainmenu.cpp b/apps/openmw/mwgui/mainmenu.cpp index da747dd7a2..1b3619bd9f 100644 --- a/apps/openmw/mwgui/mainmenu.cpp +++ b/apps/openmw/mwgui/mainmenu.cpp @@ -29,11 +29,26 @@ namespace MWGui { Misc::FrameRateLimiter frameRateLimiter = Misc::makeFrameRateLimiter(MWBase::Environment::get().getFrameRateLimit()); + const MWBase::WindowManager& windowManager = *MWBase::Environment::get().getWindowManager(); + bool paused = false; while (mRunning) { - // If finished playing, start again - if (!mVideo->update()) - mVideo->playVideo("video\\menu_background.bik"); + if (windowManager.isWindowVisible()) + { + if (paused) + { + mVideo->resume(); + paused = false; + } + // If finished playing, start again + if (!mVideo->update()) + mVideo->playVideo("video\\menu_background.bik"); + } + else if (!paused) + { + paused = true; + mVideo->pause(); + } frameRateLimiter.limit(); } } diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 322b38b7e6..565fb43127 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -1218,7 +1218,7 @@ namespace MWGui // TODO: check if any windows are now off-screen and move them back if so } - bool WindowManager::isWindowVisible() + bool WindowManager::isWindowVisible() const { return mWindowVisible; } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 409a31a514..03902e21c4 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -290,7 +290,7 @@ namespace MWGui void windowVisibilityChange(bool visible) override; void windowResized(int x, int y) override; void windowClosed() override; - bool isWindowVisible() override; + bool isWindowVisible() const override; void watchActor(const MWWorld::Ptr& ptr) override; MWWorld::Ptr getWatchedActor() const override;