From a0fa4b8cad577a6be09982d7d221b9589c1b4078 Mon Sep 17 00:00:00 2001 From: xhaggi Date: Tue, 5 May 2015 12:35:20 +0200 Subject: [PATCH] introduce new force window activation which do not check for active modals --- xbmc/ApplicationMessenger.cpp | 7 ++++--- xbmc/ApplicationMessenger.h | 2 +- xbmc/guilib/GUIWindowManager.cpp | 18 +++++++++++++----- xbmc/guilib/GUIWindowManager.h | 13 +++++++++++-- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/xbmc/ApplicationMessenger.cpp b/xbmc/ApplicationMessenger.cpp index 30bb68fc07bff..209b38a590d2a 100644 --- a/xbmc/ApplicationMessenger.cpp +++ b/xbmc/ApplicationMessenger.cpp @@ -705,7 +705,7 @@ void CApplicationMessenger::ProcessMessage(ThreadMessage *pMsg) case TMSG_GUI_ACTIVATE_WINDOW: { - g_windowManager.ActivateWindow(pMsg->param1, pMsg->params, pMsg->param2 > 0); + g_windowManager.ActivateWindow(pMsg->param1, pMsg->params, pMsg->param2 & 0x1 ? true : false, pMsg->param2 & 0x2 ? true : false); } break; @@ -1256,9 +1256,10 @@ void CApplicationMessenger::Close(CGUIWindow *window, bool forceClose, bool wait SendMessage(tMsg, waitResult); } -void CApplicationMessenger::ActivateWindow(int windowID, const vector ¶ms, bool swappingWindows) +void CApplicationMessenger::ActivateWindow(int windowID, const vector ¶ms, bool swappingWindows, bool force /* = false */) { - ThreadMessage tMsg = {TMSG_GUI_ACTIVATE_WINDOW, windowID, swappingWindows ? 1 : 0}; + ThreadMessage tMsg = {TMSG_GUI_ACTIVATE_WINDOW, windowID}; + tMsg.param2 = (swappingWindows ? 0x01 : 0) | (force ? 0x02 : 0); tMsg.params = params; SendMessage(tMsg, true); } diff --git a/xbmc/ApplicationMessenger.h b/xbmc/ApplicationMessenger.h index 5ca37d6f4ba8d..f53dad24b6591 100644 --- a/xbmc/ApplicationMessenger.h +++ b/xbmc/ApplicationMessenger.h @@ -231,7 +231,7 @@ class CApplicationMessenger void DoModal(CGUIDialog *pDialog, int iWindowID, const std::string ¶m = ""); void Show(CGUIDialog *pDialog); void Close(CGUIWindow *window, bool forceClose, bool waitResult = true, int nextWindowID = 0, bool enableSound = true); - void ActivateWindow(int windowID, const std::vector ¶ms, bool swappingWindows); + void ActivateWindow(int windowID, const std::vector ¶ms, bool swappingWindows, bool force = false); void SendAction(const CAction &action, int windowID = WINDOW_INVALID, bool waitResult=true); //! \brief Send text to currently focused window / keyboard. diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp index eb357108de0d8..09baefa065654 100644 --- a/xbmc/guilib/GUIWindowManager.cpp +++ b/xbmc/guilib/GUIWindowManager.cpp @@ -707,22 +707,30 @@ void CGUIWindowManager::ActivateWindow(int iWindowID, const std::string& strPath ActivateWindow(iWindowID, params, false); } -void CGUIWindowManager::ActivateWindow(int iWindowID, const vector& params, bool swappingWindows) +void CGUIWindowManager::ForceActivateWindow(int iWindowID, const std::string& strPath) +{ + vector params; + if (!strPath.empty()) + params.push_back(strPath); + ActivateWindow(iWindowID, params, false, true); +} + +void CGUIWindowManager::ActivateWindow(int iWindowID, const vector& params, bool swappingWindows /* = false */, bool force /* = false */) { if (!g_application.IsCurrentThread()) { // make sure graphics lock is not held CSingleExit leaveIt(g_graphicsContext); - CApplicationMessenger::Get().ActivateWindow(iWindowID, params, swappingWindows); + CApplicationMessenger::Get().ActivateWindow(iWindowID, params, swappingWindows, force); } else { CSingleLock lock(g_graphicsContext); - ActivateWindow_Internal(iWindowID, params, swappingWindows); + ActivateWindow_Internal(iWindowID, params, swappingWindows, force); } } -void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector& params, bool swappingWindows) +void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector& params, bool swappingWindows, bool force /* = false */) { // translate virtual windows // virtual music window which returns the last open music window (aka the music start window) @@ -776,7 +784,7 @@ void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector& params, bool swappingWindows = false); + void ActivateWindow(int iWindowID, const std::vector& params, bool swappingWindows = false, bool force = false); void PreviousWindow(); void CloseDialogs(bool forceClose = false) const; @@ -181,7 +182,15 @@ class CGUIWindowManager CGUIWindow *GetTopMostDialog() const; friend class CApplicationMessenger; - void ActivateWindow_Internal(int windowID, const std::vector ¶ms, bool swappingWindows); + + /*! \brief Activate the given window. + * + * \param windowID The window ID to activate. + * \param params Parameter + * \param swappingWindows True if the window should be swapped with the previous window instead of put it in the window history, otherwise false + * \param force True to ignore checks which refuses opening the window, otherwise false + */ + void ActivateWindow_Internal(int windowID, const std::vector ¶ms, bool swappingWindows, bool force = false); typedef std::map WindowMap; WindowMap m_mapWindows;