bool CGUIWindowManager::OnAction(const CAction &action) { if (g_powerManager.IsSuspended()) { g_powerManager.Resume(); return true; } // If the screen saver is active, it is on top of // existing dialogs. Pass the actions to the screen // saver and not to the dialogs if (!g_application.GetInSlideshowScreensaver()) { CSingleLock lock(g_graphicsContext); unsigned int topMost = m_activeDialogs.size(); while (topMost) { CGUIWindow *dialog = m_activeDialogs[--topMost]; lock.Leave(); if (dialog->IsModalDialog()) { // we have the topmost modal dialog if (!dialog->IsAnimating(ANIM_TYPE_WINDOW_CLOSE)) { bool fallThrough = (dialog->GetID() == WINDOW_DIALOG_FULLSCREEN_INFO); if (dialog->OnAction(action)) return true; // dialog didn't want the action - we'd normally return false // but for some dialogs we want to drop the actions through if (fallThrough) break; return false; } return true; // do nothing with the action until the anim is finished } // music or video overlay are handled as a special case, as they're modeless, but we allow // clicking on them with the mouse. if (action.id == ACTION_MOUSE && (dialog->GetID() == WINDOW_VIDEO_OVERLAY || dialog->GetID() == WINDOW_MUSIC_OVERLAY)) { if (dialog->OnAction(action)) return true; } lock.Enter(); if (topMost > m_activeDialogs.size()) topMost = m_activeDialogs.size(); } lock.Leave(); } CGUIWindow* window = GetWindow(GetActiveWindow()); if (window) return window->OnAction(action); return false; }
bool CGUIWindowManager::OnAction(const CAction &action) { /* 参数: 1、 返回: 1、 说明: 1、 */ CSingleLock lock(g_graphicsContext); unsigned int topMost = m_activeDialogs.size(); while (topMost) { CGUIWindow *dialog = m_activeDialogs[--topMost]; lock.Leave(); if (dialog->IsModalDialog()) { // we have the topmost modal dialog if (!dialog->IsAnimating(ANIM_TYPE_WINDOW_CLOSE)) { bool fallThrough = (dialog->GetID() == WINDOW_DIALOG_FULLSCREEN_INFO); if (dialog->OnAction(action)) return true; // dialog didn't want the action - we'd normally return false // but for some dialogs we want to drop the actions through if (fallThrough) break; return false; } return true; // do nothing with the action until the anim is finished } // music or video overlay are handled as a special case, as they're modeless, but we allow // clicking on them with the mouse. if (action.IsMouse() && (dialog->GetID() == WINDOW_DIALOG_VIDEO_OVERLAY || dialog->GetID() == WINDOW_DIALOG_MUSIC_OVERLAY)) { if (dialog->OnAction(action)) return true; } lock.Enter(); if (topMost > m_activeDialogs.size()) topMost = m_activeDialogs.size(); } lock.Leave(); CGUIWindow* window = GetWindow(GetActiveWindow()); if (window) return window->OnAction(action); return false; }
bool CGUIWindowManager::OnAction(const CAction &action) const { CSingleLock lock(g_graphicsContext); unsigned int topMost = m_activeDialogs.size(); while (topMost) { CGUIWindow *dialog = m_activeDialogs[--topMost]; lock.Leave(); if (dialog->IsModalDialog()) { // we have the topmost modal dialog if (!dialog->IsAnimating(ANIM_TYPE_WINDOW_CLOSE)) { bool fallThrough = (dialog->GetID() == WINDOW_DIALOG_FULLSCREEN_INFO); if (dialog->OnAction(action)) return true; // dialog didn't want the action - we'd normally return false // but for some dialogs we want to drop the actions through if (fallThrough) break; return false; } return true; // do nothing with the action until the anim is finished } lock.Enter(); if (topMost > m_activeDialogs.size()) topMost = m_activeDialogs.size(); } lock.Leave(); CGUIWindow* window = GetWindow(GetActiveWindow()); if (window) return window->OnAction(action); return false; }
void CGUIWindowManager::DeInitialize() { CSingleLock lock(g_graphicsContext); for (WindowMap::iterator it = m_mapWindows.begin(); it != m_mapWindows.end(); it++) { CGUIWindow* pWindow = (*it).second; if (IsWindowActive(it->first)) { pWindow->DisableAnimations(); pWindow->Close(true); } pWindow->ResetControlStates(); pWindow->FreeResources(true); } UnloadNotOnDemandWindows(); m_vecMsgTargets.erase( m_vecMsgTargets.begin(), m_vecMsgTargets.end() ); // destroy our custom windows... for (int i = 0; i < (int)m_vecCustomWindows.size(); i++) { CGUIWindow *pWindow = m_vecCustomWindows[i]; Remove(pWindow->GetID()); delete pWindow; } // clear our vectors of windows m_vecCustomWindows.clear(); m_activeDialogs.clear(); m_initialized = false; }
bool CGUIWindowManager::IsWindowActive(int id, bool ignoreClosing /* = true */) const { /* 参数: 1、 返回: 1、 说明: 1、 */ // mask out multiple instances of the same window id &= WINDOW_ID_MASK; if ((GetActiveWindow() & WINDOW_ID_MASK) == id) return true; // run through the dialogs CSingleLock lock(g_graphicsContext); for (ciDialog it = m_activeDialogs.begin(); it != m_activeDialogs.end(); ++it) { CGUIWindow *window = *it; if ((window->GetID() & WINDOW_ID_MASK) == id && (!ignoreClosing || !window->IsAnimating(ANIM_TYPE_WINDOW_CLOSE))) return true; } return false; // window isn't active }
bool CGUIWindowManager::IsWindowTopMost(int id) const { CGUIWindow *topMost = GetTopMostDialog(); if (topMost && (topMost->GetID() & WINDOW_ID_MASK) == id) return true; return false; }
JSONRPC_STATUS CInputOperations::SendText(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); if (!window) return InternalError; CGUIMessage msg(GUI_MSG_SET_TEXT, 0, 0); msg.SetLabel(parameterObject["text"].asString()); msg.SetParam1(parameterObject["done"].asBoolean() ? 1 : 0); CApplicationMessenger::Get().SendGUIMessage(msg, window->GetID()); return ACK; }
/// \brief Get the ID of the top most routed window /// \return id ID of the window or WINDOW_INVALID if no routed window available int CGUIWindowManager::GetTopMostModalDialogID(bool ignoreClosing /*= false*/) const { CSingleLock lock(g_graphicsContext); for (crDialog it = m_activeDialogs.rbegin(); it != m_activeDialogs.rend(); ++it) { CGUIWindow *dialog = *it; if (dialog->IsModalDialog() && (!ignoreClosing || !dialog->IsAnimating(ANIM_TYPE_WINDOW_CLOSE))) { // have a modal window return dialog->GetID(); } } return WINDOW_INVALID; }
/// \brief Get the ID of the top most routed window /// \return id ID of the window or WINDOW_INVALID if no routed window available int CGUIWindowManager::GetTopMostModalDialogID() const { CSingleLock lock(g_graphicsContext); for (crDialog it = m_activeDialogs.rbegin(); it != m_activeDialogs.rend(); ++it) { CGUIWindow *dialog = *it; if (dialog->IsModalDialog()) { // have a modal window return dialog->GetID(); } } return WINDOW_INVALID; }
void CApplicationMessenger::SendText(const std::string &aTextString, bool closeKeyboard /* = false */) { if (CGUIKeyboardFactory::SendTextToActiveKeyboard(aTextString, closeKeyboard)) return; CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); if (!window) return; CGUIMessage msg(GUI_MSG_SET_TEXT, 0, window->GetFocusedControlID()); msg.SetLabel(aTextString); msg.SetParam1(closeKeyboard ? 1 : 0); SendGUIMessage(msg, window->GetID()); }
JSONRPC_STATUS CInputOperations::SendText(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { if (CGUIKeyboardFactory::SendTextToActiveKeyboard(parameterObject["text"].asString(), parameterObject["done"].asBoolean())) return ACK; CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); if (!window) return ACK; CGUIMessage msg(GUI_MSG_SET_TEXT, 0, window->GetFocusedControlID()); msg.SetLabel(parameterObject["text"].asString()); msg.SetParam1(parameterObject["done"].asBoolean() ? 1 : 0); CApplicationMessenger::GetInstance().SendGUIMessage(msg, window->GetID()); return ACK; }
/// \brief Get the ID of the top most routed window /// \return id ID of the window or WINDOW_INVALID if no routed window available int CGUIWindowManager::GetTopMostModalDialogID() const { // If the screen saver is active, don't tell anyone that there // are any dialogs open, so the window will get the events and // not the dialogs if (g_application.GetInSlideshowScreensaver()) return WINDOW_INVALID; CSingleLock lock(g_graphicsContext); for (crDialog it = m_activeDialogs.rbegin(); it != m_activeDialogs.rend(); ++it) { CGUIWindow *dialog = *it; if (dialog->IsModalDialog()) { // have a modal window return dialog->GetID(); } } return WINDOW_INVALID; }
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 CGUIWindowDebugInfo::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); g_cpuInfo.getUsedPercentage(); // must call it to recalculate pct values static int yShift = 20; static int xShift = 40; static unsigned int lastShift = time(NULL); time_t now = time(NULL); if (now - lastShift > 10) { yShift *= -1; if (now % 5 == 0) xShift *= -1; lastShift = now; MarkDirtyRegion(); } if (!m_layout) { CGUIFont *font13 = g_fontManager.GetDefaultFont(); CGUIFont *font13border = g_fontManager.GetDefaultFont(true); if (font13) m_layout = new CGUITextLayout(font13, true, 0, font13border); } if (!m_layout) return; CStdString info; if (LOG_LEVEL_DEBUG_FREEMEM <= g_advancedSettings.m_logLevel) { MEMORYSTATUS stat; GlobalMemoryStatus(&stat); CStdString profiling = CGUIControlProfiler::IsRunning() ? " (profiling)" : ""; CStdString strCores = g_cpuInfo.GetCoresUsageString(); #if !defined(_LINUX) info.Format("LOG: %sxbmc.log\nMEM: %d/%d KB - FPS: %2.1f fps\nCPU: %s%s", g_settings.m_logFolder.c_str(), stat.dwAvailPhys/1024, stat.dwTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), profiling.c_str()); #else double dCPU = m_resourceCounter.GetCPUUsage(); info.Format("LOG: %sxbmc.log\nMEM: %"PRIu64"/%"PRIu64" KB - FPS: %2.1f fps\nCPU: %s (CPU-XBMC %4.2f%%%s)", g_settings.m_logFolder.c_str(), stat.dwAvailPhys/1024, stat.dwTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), dCPU, profiling.c_str()); #endif } // render the skin debug info if (g_SkinInfo->IsDebugging()) { if (!info.IsEmpty()) info += "\n"; CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); CGUIWindow *pointer = g_windowManager.GetWindow(WINDOW_DIALOG_POINTER); CPoint point; if (pointer) point = CPoint(pointer->GetXPosition(), pointer->GetYPosition()); if (window) { CStdString windowName = CButtonTranslator::TranslateWindow(window->GetID()); if (!windowName.IsEmpty()) windowName += " (" + window->GetProperty("xmlfile") + ")"; else windowName = window->GetProperty("xmlfile"); info += "Window: " + windowName + " "; // transform the mouse coordinates to this window's coordinates g_graphicsContext.SetScalingResolution(window->GetCoordsRes(), true); point.x *= g_graphicsContext.GetGUIScaleX(); point.y *= g_graphicsContext.GetGUIScaleY(); g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); } info.AppendFormat("Mouse: (%d,%d) ", (int)point.x, (int)point.y); if (window) { CGUIControl *control = window->GetFocusedControl(); if (control) info.AppendFormat("Focused: %i (%s)", control->GetID(), CGUIControlFactory::TranslateControlType(control->GetControlType()).c_str()); } } float w, h; if (m_layout->Update(info)) MarkDirtyRegion(); m_layout->GetTextExtent(w, h); float x = xShift + 0.04f * g_graphicsContext.GetWidth(); float y = yShift + 0.04f * g_graphicsContext.GetHeight(); m_renderRegion.SetRect(x, y, x+w, y+h); }
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 g_audioManager.PlayWindowSound(pCurrentWindow->GetID(), SOUND_DEINIT); CGUIMessage msg(GUI_MSG_WINDOW_DEINIT, 0, 0); pCurrentWindow->OnMessage(msg); 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"); g_audioManager.PlayWindowSound(pNewWindow->GetID(), SOUND_INIT); CGUIMessage msg2(GUI_MSG_WINDOW_INIT, 0, 0, WINDOW_INVALID, GetActiveWindow()); pNewWindow->OnMessage(msg2); g_infoManager.SetPreviousWindow(WINDOW_INVALID); return; }
bool CGUIWindowManager::SendMessage(CGUIMessage& message) { bool handled = false; // CLog::Log(LOGDEBUG,"SendMessage: mess=%d send=%d control=%d param1=%d", message.GetMessage(), message.GetSenderId(), message.GetControlId(), message.GetParam1()); // Send the message to all none window targets for (int i = 0; i < (int) m_vecMsgTargets.size(); i++) { IMsgTargetCallback* pMsgTarget = m_vecMsgTargets[i]; if (pMsgTarget) { if (pMsgTarget->OnMessage( message )) handled = true; } } // A GUI_MSG_NOTIFY_ALL is send to any active modal dialog // and all windows whether they are active or not if (message.GetMessage()==GUI_MSG_NOTIFY_ALL) { CSingleLock lock(g_graphicsContext); for (rDialog it = m_activeDialogs.rbegin(); it != m_activeDialogs.rend(); ++it) { CGUIWindow *dialog = *it; dialog->OnMessage(message); } for (WindowMap::iterator it = m_mapWindows.begin(); it != m_mapWindows.end(); it++) { CGUIWindow *pWindow = (*it).second; pWindow->OnMessage(message); } return true; } // Normal messages are sent to: // 1. All active modeless dialogs // 2. The topmost dialog that accepts the message // 3. The underlying window (only if it is the sender or receiver if a modal dialog is active) bool hasModalDialog(false); bool modalAcceptedMessage(false); // don't use an iterator for this loop, as some messages mean that m_activeDialogs is altered, // which will invalidate any iterator CSingleLock lock(g_graphicsContext); unsigned int topWindow = m_activeDialogs.size(); while (topWindow) { CGUIWindow* dialog = m_activeDialogs[--topWindow]; lock.Leave(); if (!modalAcceptedMessage && dialog->IsModalDialog()) { // modal window hasModalDialog = true; if (!modalAcceptedMessage && dialog->OnMessage( message )) { modalAcceptedMessage = handled = true; } } else if (!dialog->IsModalDialog()) { // modeless if (dialog->OnMessage( message )) handled = true; } lock.Enter(); if (topWindow > m_activeDialogs.size()) topWindow = m_activeDialogs.size(); } lock.Leave(); // now send to the underlying window CGUIWindow* window = GetWindow(GetActiveWindow()); if (window) { if (hasModalDialog) { // only send the message to the underlying window if it's the recipient // or sender (or we have no sender) if (message.GetSenderId() == window->GetID() || message.GetControlId() == window->GetID() || message.GetSenderId() == 0 ) { if (window->OnMessage(message)) handled = true; } } else { if (window->OnMessage(message)) handled = true; } } return handled; }
void CGUIWindowDebugInfo::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); g_cpuInfo.getUsedPercentage(); // must call it to recalculate pct values static int yShift = 20; static int xShift = 40; static unsigned int lastShift = time(nullptr); time_t now = time(nullptr); if (now - lastShift > 10) { yShift *= -1; if (now % 5 == 0) xShift *= -1; lastShift = now; MarkDirtyRegion(); } if (!m_layout) { CGUIFont *font13 = g_fontManager.GetDefaultFont(); CGUIFont *font13border = g_fontManager.GetDefaultFont(true); if (font13) m_layout = new CGUITextLayout(font13, true, 0, font13border); } if (!m_layout) return; std::string info; if (LOG_LEVEL_DEBUG_FREEMEM <= g_advancedSettings.m_logLevel) { MEMORYSTATUSEX stat; stat.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&stat); std::string profiling = CGUIControlProfiler::IsRunning() ? " (profiling)" : ""; std::string strCores = g_cpuInfo.GetCoresUsageString(); std::string lcAppName = CCompileInfo::GetAppName(); StringUtils::ToLower(lcAppName); #if !defined(TARGET_POSIX) info = StringUtils::Format("LOG: %s%s.log\nMEM: %" PRIu64"/%" PRIu64" KB - FPS: %2.1f fps\nCPU: %s%s", CSpecialProtocol::TranslatePath("special://logpath").c_str(), lcAppName.c_str(), stat.ullAvailPhys/1024, stat.ullTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), profiling.c_str()); #else double dCPU = m_resourceCounter.GetCPUUsage(); std::string ucAppName = lcAppName; StringUtils::ToUpper(ucAppName); info = StringUtils::Format("LOG: %s%s.log\n" "MEM: %" PRIu64"/%" PRIu64" KB - FPS: %2.1f fps\n" "CPU: %s (CPU-%s %4.2f%%%s)", CSpecialProtocol::TranslatePath("special://logpath").c_str(), lcAppName.c_str(), stat.ullAvailPhys/1024, stat.ullTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), ucAppName.c_str(), dCPU, profiling.c_str()); #endif } // render the skin debug info if (g_SkinInfo->IsDebugging()) { if (!info.empty()) info += "\n"; CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); CGUIWindow *pointer = g_windowManager.GetWindow(WINDOW_DIALOG_POINTER); CPoint point; if (pointer) point = CPoint(pointer->GetXPosition(), pointer->GetYPosition()); if (window) { std::string windowName = CWindowTranslator::TranslateWindow(window->GetID()); if (!windowName.empty()) windowName += " (" + std::string(window->GetProperty("xmlfile").asString()) + ")"; else windowName = window->GetProperty("xmlfile").asString(); info += "Window: " + windowName + "\n"; // transform the mouse coordinates to this window's coordinates g_graphicsContext.SetScalingResolution(window->GetCoordsRes(), true); point.x *= g_graphicsContext.GetGUIScaleX(); point.y *= g_graphicsContext.GetGUIScaleY(); g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); } info += StringUtils::Format("Mouse: (%d,%d) ", static_cast<int>(point.x), static_cast<int>(point.y)); if (window) { CGUIControl *control = window->GetFocusedControl(); if (control) info += StringUtils::Format("Focused: %i (%s)", control->GetID(), CGUIControlFactory::TranslateControlType(control->GetControlType()).c_str()); } } float w, h; if (m_layout->Update(info)) MarkDirtyRegion(); m_layout->GetTextExtent(w, h); float x = xShift + 0.04f * g_graphicsContext.GetWidth(); float y = yShift + 0.04f * g_graphicsContext.GetHeight(); m_renderRegion.SetRect(x, y, x+w, y+h); }
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 = g_settings.m_iVideoStartWindow; // ensure the virtual video window only returns video windows if (iWindowID != WINDOW_VIDEO_NAV) iWindowID = WINDOW_VIDEO_FILES; } 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()) ((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) { // 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); msg.SetStringParams(params); pNewWindow->OnMessage(msg); // g_infoManager.SetPreviousWindow(WINDOW_INVALID); }