bool CGUIDialog::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { CGUIWindow *pWindow = m_gWindowManager.GetWindow(m_gWindowManager.GetActiveWindow()); if (pWindow) m_gWindowManager.ShowOverlay(pWindow->GetOverlayState()); CGUIWindow::OnMessage(message); // if we were running, make sure we remove ourselves from the window manager if (m_bRunning) { m_gWindowManager.RemoveDialog(GetID()); m_bRunning = false; m_dialogClosing = false; m_autoClosing = false; } return true; } case GUI_MSG_WINDOW_INIT: { CGUIWindow::OnMessage(message); m_showStartTime = timeGetTime(); return true; } } return CGUIWindow::OnMessage(message); }
bool CGUIPythonWindowXMLDialog::OnMessage(CGUIMessage &message) { if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT) { CGUIWindow *pWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); if (pWindow) g_windowManager.ShowOverlay(pWindow->GetOverlayState()); return CGUIWindow::OnMessage(message); } return CGUIPythonWindowXML::OnMessage(message); }
bool CGUIDialog::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { CGUIWindow *pWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow()); if (pWindow) g_windowManager.ShowOverlay(pWindow->GetOverlayState()); CGUIWindow::OnMessage(message); return true; } case GUI_MSG_WINDOW_INIT: { CGUIWindow::OnMessage(message); m_showStartTime = 0; return true; } } return CGUIWindow::OnMessage(message); }
void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector<CStdString>& params, bool swappingWindows) { // translate virtual windows // virtual music window which returns the last open music window (aka the music start window) if (iWindowID == WINDOW_MUSIC) { iWindowID = g_settings.m_iMyMusicStartWindow; // ensure the music virtual window only returns music files and music library windows if (iWindowID != WINDOW_MUSIC_NAV) iWindowID = WINDOW_MUSIC_FILES; } // virtual video window which returns the last open video window (aka the video start window) if (iWindowID == WINDOW_VIDEOS || iWindowID == WINDOW_VIDEO_FILES) { // backward compatibility for pre-Eden iWindowID = WINDOW_VIDEO_NAV; } if (iWindowID == WINDOW_SCRIPTS) { // backward compatibility for pre-Dharma iWindowID = WINDOW_PROGRAMS; } if (iWindowID == WINDOW_START) { // virtual start window iWindowID = g_SkinInfo->GetStartWindow(); } // debug CLog::Log(LOGDEBUG, "Activating window ID: %i", iWindowID); if (!g_passwordManager.CheckMenuLock(iWindowID)) { CLog::Log(LOGERROR, "MasterCode is Wrong: Window with id %d will not be loaded! Enter a correct MasterCode!", iWindowID); if (GetActiveWindow() == WINDOW_INVALID && iWindowID != WINDOW_HOME) ActivateWindow(WINDOW_HOME); return; } // first check existence of the window we wish to activate. CGUIWindow *pNewWindow = GetWindow(iWindowID); if (!pNewWindow) { // nothing to see here - move along CLog::Log(LOGERROR, "Unable to locate window with id %d. Check skin files", iWindowID - WINDOW_HOME); return ; } else if (pNewWindow->IsDialog()) { // if we have a dialog, we do a DoModal() rather than activate the window if (!pNewWindow->IsDialogRunning()) { CSingleExit exitit(g_graphicsContext); ((CGUIDialog *)pNewWindow)->DoModal(iWindowID, params.size() ? params[0] : ""); } return; } g_infoManager.SetNextWindow(iWindowID); // set our overlay state HideOverlay(pNewWindow->GetOverlayState()); // deactivate any window int currentWindow = GetActiveWindow(); CGUIWindow *pWindow = GetWindow(currentWindow); if (pWindow) CloseWindowSync(pWindow, iWindowID); g_infoManager.SetNextWindow(WINDOW_INVALID); // Add window to the history list (we must do this before we activate it, // as all messages done in WINDOW_INIT will want to be sent to the new // topmost window). If we are swapping windows, we pop the old window // off the history stack if (swappingWindows && m_windowHistory.size()) m_windowHistory.pop(); AddToWindowHistory(iWindowID); g_infoManager.SetPreviousWindow(currentWindow); // Send the init message CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, currentWindow, iWindowID); msg.SetStringParams(params); pNewWindow->OnMessage(msg); // g_infoManager.SetPreviousWindow(WINDOW_INVALID); }
void CGUIWindowManager::PreviousWindow() { // deactivate any window CSingleLock lock(g_graphicsContext); CLog::Log(LOGDEBUG,"CGUIWindowManager::PreviousWindow: Deactivate"); int currentWindow = GetActiveWindow(); CGUIWindow *pCurrentWindow = GetWindow(currentWindow); if (!pCurrentWindow) return; // no windows or window history yet // check to see whether our current window has a <previouswindow> tag if (pCurrentWindow->GetPreviousWindow() != WINDOW_INVALID) { // TODO: we may need to test here for the // whether our history should be changed // don't reactivate the previouswindow if it is ourselves. if (currentWindow != pCurrentWindow->GetPreviousWindow()) ActivateWindow(pCurrentWindow->GetPreviousWindow()); return; } // get the previous window in our stack if (m_windowHistory.size() < 2) { // no previous window history yet - check if we should just activate home if (GetActiveWindow() != WINDOW_INVALID && GetActiveWindow() != WINDOW_HOME) { ClearWindowHistory(); ActivateWindow(WINDOW_HOME); } return; } m_windowHistory.pop(); int previousWindow = GetActiveWindow(); m_windowHistory.push(currentWindow); CGUIWindow *pNewWindow = GetWindow(previousWindow); if (!pNewWindow) { CLog::Log(LOGERROR, "Unable to activate the previous window"); ClearWindowHistory(); ActivateWindow(WINDOW_HOME); return; } // ok to go to the previous window now // tell our info manager which window we are going to g_infoManager.SetNextWindow(previousWindow); // set our overlay state (enables out animations on window change) HideOverlay(pNewWindow->GetOverlayState()); // deinitialize our window CloseWindowSync(pCurrentWindow); g_infoManager.SetNextWindow(WINDOW_INVALID); g_infoManager.SetPreviousWindow(currentWindow); // remove the current window off our window stack m_windowHistory.pop(); // ok, initialize the new window CLog::Log(LOGDEBUG,"CGUIWindowManager::PreviousWindow: Activate new"); CGUIMessage msg2(GUI_MSG_WINDOW_INIT, 0, 0, WINDOW_INVALID, GetActiveWindow()); pNewWindow->OnMessage(msg2); g_infoManager.SetPreviousWindow(WINDOW_INVALID); return; }
void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector<CStdString>& params, bool swappingWindows) { /* 参数: 1、iWindowID : 要激活的窗体id 号 2、params : 传递给窗体的参数 3、swappingWindows : 是否交换激活窗体( 见下面对此参数的说明) 返回: 1、 说明: 1、激活窗体的原则: A、根据传入的窗体id 找到要激活的窗体指针 1) 没找到 a、直接出错返回 2) 找到了 a、如果是一个对话框,则调用对话框的DoModal 方法将对话框显示,然后返回 b、执行下面的B 步骤 B、 C、 2、参数swappingWindows 的作用: 假设: AAA : 原来激活的窗体,即当前激活窗体 BBB : 要激活的窗体 true : 将BBB 窗体激活,将AAA 窗体从窗体操作栈出栈,将BBB 窗体添加到窗体操作栈 false : 将BBB 窗体激活,不将AAA 窗体从窗体操作栈出栈,将BBB 窗体添加到窗体操作栈 */ // translate virtual windows // virtual music window which returns the last open music window (aka the music start window) if (iWindowID == WINDOW_MUSIC) { iWindowID = g_settings.m_iMyMusicStartWindow; // ensure the music virtual window only returns music files and music library windows if (iWindowID != WINDOW_MUSIC_NAV) iWindowID = WINDOW_MUSIC_FILES; } // virtual video window which returns the last open video window (aka the video start window) if (iWindowID == WINDOW_VIDEOS || iWindowID == WINDOW_VIDEO_FILES) { // backward compatibility for pre-Eden iWindowID = WINDOW_VIDEO_NAV; } if (iWindowID == WINDOW_SCRIPTS) { // backward compatibility for pre-Dharma iWindowID = WINDOW_PROGRAMS; } if (iWindowID == WINDOW_START) { // virtual start window iWindowID = g_SkinInfo->GetStartWindow(); } // debug CLog::Log(LOGDEBUG, "Activating window ID: %i", iWindowID); if (!g_passwordManager.CheckMenuLock(iWindowID)) { CLog::Log(LOGERROR, "MasterCode is Wrong: Window with id %d will not be loaded! Enter a correct MasterCode!", iWindowID); if (GetActiveWindow() == WINDOW_INVALID && iWindowID != WINDOW_HOME) ActivateWindow(WINDOW_HOME); return; } // first check existence of the window we wish to activate. CGUIWindow *pNewWindow = GetWindow(iWindowID);/* 获取要激活的窗体*/ if (!pNewWindow)/* 没得到*/ { // nothing to see here - move along CLog::Log(LOGERROR, "Unable to locate window with id %d. Check skin files", iWindowID - WINDOW_HOME); return ; } else if (pNewWindow->IsDialog()) /* 如果要激活的窗体是个对话框*/ { // if we have a dialog, we do a DoModal() rather than activate the window if (!pNewWindow->IsDialogRunning())/* 对话框没有在运行状态,则将其模态显示出来*/ { CSingleExit exitit(g_graphicsContext); ((CGUIDialog *)pNewWindow)->DoModal(iWindowID, params.size() ? params[0] : ""); } return; } //-------------------------------------------------------->>> 调用SetNextWindow 开始 g_infoManager.SetNextWindow(iWindowID); /* 设定要激活的窗体的id 为下一个窗体id ,即相当于全局变量保存这个值*/ // set our overlay state HideOverlay(pNewWindow->GetOverlayState()); // deactivate any window int currentWindow = GetActiveWindow(); CGUIWindow *pWindow = GetWindow(currentWindow); if (pWindow) CloseWindowSync(pWindow, iWindowID); //-------------------------------------------------------->>> 调用SetNextWindow 结束 g_infoManager.SetNextWindow(WINDOW_INVALID); /* 设定下一个窗体id 为无效的*/ // Add window to the history list (we must do this before we activate it, // as all messages done in WINDOW_INIT will want to be sent to the new // topmost window). If we are swapping windows, we pop the old window // off the history stack if (swappingWindows && m_windowHistory.size()) m_windowHistory.pop(); /* 将当前激活的窗体从窗体操作栈中出栈*/ AddToWindowHistory(iWindowID); /* 将要激活的窗体id 号添加入窗体操作栈*/ g_infoManager.SetPreviousWindow(currentWindow); /* 向要激活的窗体发送init 消息,即直接调用要激活窗体的OnMessage 方法*/ // Send the init message CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, currentWindow, iWindowID); msg.SetStringParams(params); pNewWindow->OnMessage(msg); // g_infoManager.SetPreviousWindow(WINDOW_INVALID); }
void CGUIWindowManager::PreviousWindow() { /* 参数: 1、 返回: 1、 说明: 1、此函数实现激活上一个窗体的功能 2、函数执行的原理: 根据窗体操作栈(m_windowHistory) 来实现的 */ // deactivate any window CSingleLock lock(g_graphicsContext); CLog::Log(LOGDEBUG,"CGUIWindowManager::PreviousWindow: Deactivate"); int currentWindow = GetActiveWindow(); /* 获取当前激活窗体的id 号*/ CGUIWindow *pCurrentWindow = GetWindow(currentWindow); /* 获取当前激活窗体指针*/ if (!pCurrentWindow)/* 没有当前被激活的窗体*/ return; // no windows or window history yet // check to see whether our current window has a <previouswindow> tag if (pCurrentWindow->GetPreviousWindow() != WINDOW_INVALID)/* 获取当前窗体是否具有上一个窗体的标记*/ { // TODO: we may need to test here for the // whether our history should be changed // don't reactivate the previouswindow if it is ourselves. if (currentWindow != pCurrentWindow->GetPreviousWindow()) ActivateWindow(pCurrentWindow->GetPreviousWindow());/* 激活上一个窗体*/ return;/* 返回*/ } /* 执行到此处时只能是从窗体的历史记录中获取上一个窗体进行激活了 */ // get the previous window in our stack /* 窗体操作记录总数少于2 个,则激活home 窗体*/ if (m_windowHistory.size() < 2) { // no previous window history yet - check if we should just activate home if (GetActiveWindow() != WINDOW_INVALID && GetActiveWindow() != WINDOW_HOME)/* 当前窗体有效,并且不是home 窗体,则激活home 窗体,否则直接返回了*/ { ClearWindowHistory(); ActivateWindow(WINDOW_HOME); } return; /* 返回*/ } /* 执行到此处时窗体操作栈中的数量肯定是大于等于2 个,因此需要从窗体操作栈中获取前一个窗体 */ /* 如下三行代码就是从窗体的操作记录表( 窗体操作栈) 中取出当前窗体前一个窗体的id 号*/ m_windowHistory.pop(); /* 将当前激活的窗体出栈*/ int previousWindow = GetActiveWindow(); /* 取出当前窗体的前一个窗体,即当前窗体出栈后栈顶的那个窗体*/ m_windowHistory.push(currentWindow); /* 再将当前激活的窗体入栈*/ CGUIWindow *pNewWindow = GetWindow(previousWindow);/* 根据前一个窗体的id 号取出窗体的指针*/ if (!pNewWindow)/* 没得到前一个窗体的指针则清除窗体操作记录栈,将home 窗体激活*/ { CLog::Log(LOGERROR, "Unable to activate the previous window"); ClearWindowHistory(); ActivateWindow(WINDOW_HOME); return; } /* 执行到此处时获得到了前一个窗体的指针 */ // ok to go to the previous window now //-------------------------------------------------------->>> 调用SetNextWindow 开始 // tell our info manager which window we are going to g_infoManager.SetNextWindow(previousWindow); // set our overlay state (enables out animations on window change) HideOverlay(pNewWindow->GetOverlayState()); // deinitialize our window CloseWindowSync(pCurrentWindow); //-------------------------------------------------------->>> 调用SetNextWindow 结束 g_infoManager.SetNextWindow(WINDOW_INVALID); g_infoManager.SetPreviousWindow(currentWindow); // remove the current window off our window stack m_windowHistory.pop(); // ok, initialize the new window CLog::Log(LOGDEBUG,"CGUIWindowManager::PreviousWindow: Activate new"); CGUIMessage msg2(GUI_MSG_WINDOW_INIT, 0, 0, WINDOW_INVALID, GetActiveWindow()); pNewWindow->OnMessage(msg2); g_infoManager.SetPreviousWindow(WINDOW_INVALID); return; }
void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector<CStdString>& params, bool swappingWindows) { bool passParams = true; // translate virtual windows // virtual music window which returns the last open music window (aka the music start window) if (iWindowID == WINDOW_MUSIC) { iWindowID = g_stSettings.m_iMyMusicStartWindow; // ensure the music virtual window only returns music files and music library windows if (iWindowID != WINDOW_MUSIC_NAV) iWindowID = WINDOW_MUSIC_FILES; // destination path cannot be used with virtual window passParams = false; } // virtual video window which returns the last open video window (aka the video start window) if (iWindowID == WINDOW_VIDEOS) { iWindowID = g_stSettings.m_iVideoStartWindow; // ensure the virtual video window only returns video windows if (iWindowID != WINDOW_VIDEO_NAV) iWindowID = WINDOW_VIDEO_FILES; // destination path cannot be used with virtual window passParams = false; } // stop video player when entering home screen if(iWindowID == WINDOW_HOME && g_application.IsPlayingVideo()) { CLog::Log(LOGDEBUG,"CGUIWindowManager::ActivateWindow_Internal - [iWindowID=%d=WINDOW_HOME][IsPlayingVideo=TRUE] - Going to stop the video (ev)",iWindowID); g_application.StopPlaying(); } // debug CLog::Log(LOGDEBUG, "Activating window ID: %i", iWindowID); if(!g_passwordManager.CheckMenuLock(iWindowID)) { CLog::Log(LOGERROR, "MasterCode is Wrong: Window with id %d will not be loaded! Enter a correct MasterCode!", iWindowID); return; } // first check existence of the window we wish to activate. CGUIWindow *pNewWindow = GetWindow(iWindowID); if (!pNewWindow) { // nothing to see here - move along CLog::Log(LOGERROR, "Unable to locate window with id %d. Check skin files", iWindowID - WINDOW_HOME); return ; } else if (pNewWindow->IsDialog()) { // if we have a dialog, we do a DoModal() rather than activate the window if (!pNewWindow->IsDialogRunning()) ((CGUIDialog *)pNewWindow)->DoModal(iWindowID, (passParams && params.size()) ? params[0] : ""); return; } g_infoManager.SetNextWindow(iWindowID); // set our overlay state HideOverlay(pNewWindow->GetOverlayState()); // deactivate any window int currentWindow = GetActiveWindow(); CGUIWindow *pWindow = GetWindow(currentWindow); if (pWindow) { // If we got here from the screen saver, don't close the dialogs as we want to see // them when we come back if (!g_application.GetInSlideshowScreensaver()) CloseDialogs(); // Play the window specific deinit sound g_audioManager.PlayWindowSound(pWindow->GetID(), SOUND_DEINIT); CGUIMessage msg(GUI_MSG_WINDOW_DEINIT, 0, 0, iWindowID); pWindow->OnMessage(msg); } g_infoManager.SetNextWindow(WINDOW_INVALID); // Add window to the history list (we must do this before we activate it, // as all messages done in WINDOW_INIT will want to be sent to the new // topmost window). If we are swapping windows, we pop the old window // off the history stack if (swappingWindows && m_windowHistory.size()) m_windowHistory.pop(); AddToWindowHistory(iWindowID); g_infoManager.SetPreviousWindow(currentWindow); g_audioManager.PlayWindowSound(pNewWindow->GetID(), SOUND_INIT); // Send the init message CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, currentWindow, iWindowID); if (passParams) msg.SetStringParams(params); pNewWindow->OnMessage(msg); // g_infoManager.SetPreviousWindow(WINDOW_INVALID); }
void CGUIWindowManager::ActivateWindow_Internal(int iWindowID, const vector<string>& params, bool swappingWindows, bool force /* = false */) { // translate virtual windows // virtual music window which returns the last open music window (aka the music start window) if (iWindowID == WINDOW_MUSIC) { // backward compatibility for pre-something iWindowID = WINDOW_MUSIC_NAV; } // virtual video window which returns the last open video window (aka the video start window) if (iWindowID == WINDOW_VIDEOS || iWindowID == WINDOW_VIDEO_FILES) { // backward compatibility for pre-Eden iWindowID = WINDOW_VIDEO_NAV; } if (iWindowID == WINDOW_SCRIPTS) { // backward compatibility for pre-Dharma iWindowID = WINDOW_PROGRAMS; } if (iWindowID == WINDOW_START) { // virtual start window iWindowID = g_SkinInfo->GetStartWindow(); } // debug CLog::Log(LOGDEBUG, "Activating window ID: %i", iWindowID); if (!g_passwordManager.CheckMenuLock(iWindowID)) { CLog::Log(LOGERROR, "MasterCode is Wrong: Window with id %d will not be loaded! Enter a correct MasterCode!", iWindowID); if (GetActiveWindow() == WINDOW_INVALID && iWindowID != WINDOW_HOME) ActivateWindow(WINDOW_HOME); return; } // first check existence of the window we wish to activate. CGUIWindow *pNewWindow = GetWindow(iWindowID); if (!pNewWindow) { // nothing to see here - move along CLog::Log(LOGERROR, "Unable to locate window with id %d. Check skin files", iWindowID - WINDOW_HOME); return ; } else if (pNewWindow->IsDialog()) { // if we have a dialog, we do a DoModal() rather than activate the window if (!pNewWindow->IsDialogRunning()) { CSingleExit exitit(g_graphicsContext); ((CGUIDialog *)pNewWindow)->Open(); } return; } // don't activate a window if there are active modal dialogs of type NORMAL if (!force && HasModalDialog({ DialogModalityType::MODAL })) { CLog::Log(LOGINFO, "Activate of window '%i' refused because there are active modal dialogs", iWindowID); g_audioManager.PlayActionSound(CAction(ACTION_ERROR)); return; } g_infoManager.SetNextWindow(iWindowID); // set our overlay state HideOverlay(pNewWindow->GetOverlayState()); // deactivate any window int currentWindow = GetActiveWindow(); CGUIWindow *pWindow = GetWindow(currentWindow); if (pWindow) CloseWindowSync(pWindow, iWindowID); g_infoManager.SetNextWindow(WINDOW_INVALID); // Add window to the history list (we must do this before we activate it, // as all messages done in WINDOW_INIT will want to be sent to the new // topmost window). If we are swapping windows, we pop the old window // off the history stack if (swappingWindows && !m_windowHistory.empty()) m_windowHistory.pop(); AddToWindowHistory(iWindowID); g_infoManager.SetPreviousWindow(currentWindow); // Send the init message CGUIMessage msg(GUI_MSG_WINDOW_INIT, 0, 0, currentWindow, iWindowID); msg.SetStringParams(params); pNewWindow->OnMessage(msg); // g_infoManager.SetPreviousWindow(WINDOW_INVALID); }