From 25029f81a70dfe77ecae856dc7843f443119df24 Mon Sep 17 00:00:00 2001 From: Memphiz Date: Fri, 8 Mar 2019 19:47:53 +0000 Subject: GUIWindowManager - wait for the closing animation to finish when closing a window sync only when GUI is rendered Declare GetRenderGUI in IWIndowManagerCallback and adjust method in CApplication subclass to override, so callback can determine if render GUI is enabled --- xbmc/Application.h | 2 +- xbmc/guilib/GUIWindowManager.cpp | 11 ++++++++--- xbmc/guilib/IWindowManagerCallback.h | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/xbmc/Application.h b/xbmc/Application.h index 30cf6e7d32..57b006b60c 100644 --- a/xbmc/Application.h +++ b/xbmc/Application.h @@ -318,7 +318,7 @@ public: bool SwitchToFullScreen(bool force = false); - bool GetRenderGUI() const { return m_renderGUI; }; + bool GetRenderGUI() const override { return m_renderGUI; }; bool SetLanguage(const std::string &strLanguage); bool LoadLanguage(bool reload); diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp index d5fbae93c2..3b1e63da05 100644 --- a/xbmc/guilib/GUIWindowManager.cpp +++ b/xbmc/guilib/GUIWindowManager.cpp @@ -1289,8 +1289,11 @@ CGUIWindow* CGUIWindowManager::GetWindow(int id) const bool CGUIWindowManager::ProcessRenderLoop(bool renderOnly) { + bool renderGui = true; + if (g_application.IsCurrentThread() && m_pCallback) { + renderGui = m_pCallback->GetRenderGUI(); m_iNested++; if (!renderOnly) m_pCallback->Process(); @@ -1298,7 +1301,7 @@ bool CGUIWindowManager::ProcessRenderLoop(bool renderOnly) m_pCallback->Render(); m_iNested--; } - if (g_application.m_bStop) + if (g_application.m_bStop || !renderGui) return false; else return true; @@ -1670,8 +1673,10 @@ void CGUIWindowManager::CloseWindowSync(CGUIWindow *window, int nextWindowID /*= } window->Close(false, nextWindowID); - while (window->IsAnimating(ANIM_TYPE_WINDOW_CLOSE)) - ProcessRenderLoop(true); + + bool renderLoopProcessed = true; + while (window->IsAnimating(ANIM_TYPE_WINDOW_CLOSE) && renderLoopProcessed) + renderLoopProcessed = ProcessRenderLoop(true); } #ifdef _DEBUG diff --git a/xbmc/guilib/IWindowManagerCallback.h b/xbmc/guilib/IWindowManagerCallback.h index b66edaaf89..d5fc89c4e9 100644 --- a/xbmc/guilib/IWindowManagerCallback.h +++ b/xbmc/guilib/IWindowManagerCallback.h @@ -26,4 +26,5 @@ public: virtual void FrameMove(bool processEvents, bool processGUI = true) = 0; virtual void Render() = 0; virtual void Process() = 0; + virtual bool GetRenderGUI() const { return false; }; }; -- cgit v1.2.3