void CGUIDialogContextMenu::PositionAtCurrentFocus() { CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); if (window) { const CGUIControl *focusedControl = window->GetFocusedControl(); if (focusedControl) { CPoint pos = focusedControl->GetRenderPosition() + CPoint(focusedControl->GetWidth() * 0.5f, focusedControl->GetHeight() * 0.5f); SetPosition(m_coordX + pos.x - GetWidth() * 0.5f, m_coordY + pos.y - GetHeight() * 0.5f); return; } } // no control to center at, so just center the window CenterWindow(); }
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); }
bool CInputManager::OnKey(const CKey& key) { for (std::vector<KEYBOARD::IKeyboardHandler*>::iterator it = m_keyboardHandlers.begin(); it != m_keyboardHandlers.end(); ++it) { if ((*it)->OnKeyPress(key)) return true; } // Turn the mouse off, as we've just got a keypress from controller or remote m_Mouse.SetActive(false); // get the current active window int iWin = g_windowManager.GetActiveWindowID(); // this will be checked for certain keycodes that need // special handling if the screensaver is active CAction action = m_buttonTranslator->GetAction(iWin, key); // a key has been pressed. // reset Idle Timer g_application.ResetSystemIdleTimer(); bool processKey = AlwaysProcess(action); if (StringUtils::StartsWithNoCase(action.GetName(), "CECToggleState") || StringUtils::StartsWithNoCase(action.GetName(), "CECStandby")) { // do not wake up the screensaver right after switching off the playing device if (StringUtils::StartsWithNoCase(action.GetName(), "CECToggleState")) { CLog::LogF(LOGDEBUG, "action %s [%d], toggling state of playing device", action.GetName().c_str(), action.GetID()); bool result; CApplicationMessenger::GetInstance().SendMsg(TMSG_CECTOGGLESTATE, 0, 0, static_cast<void*>(&result)); if (!result) return true; } else { CApplicationMessenger::GetInstance().PostMsg(TMSG_CECSTANDBY); return true; } } g_application.ResetScreenSaver(); // allow some keys to be processed while the screensaver is active if (g_application.WakeUpScreenSaverAndDPMS(processKey) && !processKey) { CLog::LogF(LOGDEBUG, "%s pressed, screen saver/dpms woken up", m_Keyboard.GetKeyName((int)key.GetButtonCode()).c_str()); return true; } if (iWin != WINDOW_FULLSCREEN_VIDEO) { // current active window isnt the fullscreen window // just use corresponding section from keymap.xml // to map key->action // first determine if we should use keyboard input directly bool useKeyboard = key.FromKeyboard() && (iWin == WINDOW_DIALOG_KEYBOARD || iWin == WINDOW_DIALOG_NUMERIC); CGUIWindow *window = g_windowManager.GetWindow(iWin); if (window) { CGUIControl *control = window->GetFocusedControl(); if (control) { // If this is an edit control set usekeyboard to true. This causes the // keypress to be processed directly not through the key mappings. if (control->GetControlType() == CGUIControl::GUICONTROL_EDIT) useKeyboard = true; // If the key pressed is shift-A to shift-Z set usekeyboard to true. // This causes the keypress to be used for list navigation. if (control->IsContainer() && key.GetModifiers() == CKey::MODIFIER_SHIFT && key.GetVKey() >= XBMCVK_A && key.GetVKey() <= XBMCVK_Z) useKeyboard = true; } } if (useKeyboard) { // use the virtualkeyboard section of the keymap, and send keyboard-specific or navigation // actions through if that's what they are CAction action = m_buttonTranslator->GetAction(WINDOW_DIALOG_KEYBOARD, key); if (!(action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT || action.GetID() == ACTION_MOVE_UP || action.GetID() == ACTION_MOVE_DOWN || action.GetID() == ACTION_SELECT_ITEM || action.GetID() == ACTION_ENTER || action.GetID() == ACTION_PREVIOUS_MENU || action.GetID() == ACTION_NAV_BACK || action.GetID() == ACTION_VOICE_RECOGNIZE)) { // the action isn't plain navigation - check for a keyboard-specific keymap action = m_buttonTranslator->GetAction(WINDOW_DIALOG_KEYBOARD, key, false); if (!(action.GetID() >= REMOTE_0 && action.GetID() <= REMOTE_9) || action.GetID() == ACTION_BACKSPACE || action.GetID() == ACTION_SHIFT || action.GetID() == ACTION_SYMBOLS || action.GetID() == ACTION_CURSOR_LEFT || action.GetID() == ACTION_CURSOR_RIGHT) action = CAction(0); // don't bother with this action } // else pass the keys through directly if (!action.GetID()) { if (key.GetFromService()) action = CAction(key.GetButtonCode() != KEY_INVALID ? key.GetButtonCode() : 0, key.GetUnicode()); else { // Check for paste keypress #ifdef TARGET_WINDOWS // In Windows paste is ctrl-V if (key.GetVKey() == XBMCVK_V && key.GetModifiers() == CKey::MODIFIER_CTRL) #elif defined(TARGET_LINUX) // In Linux paste is ctrl-V if (key.GetVKey() == XBMCVK_V && key.GetModifiers() == CKey::MODIFIER_CTRL) #elif defined(TARGET_DARWIN_OSX) // In OSX paste is cmd-V if (key.GetVKey() == XBMCVK_V && key.GetModifiers() == CKey::MODIFIER_META) #else // Placeholder for other operating systems if (false) #endif action = CAction(ACTION_PASTE); // If the unicode is non-zero the keypress is a non-printing character else if (key.GetUnicode()) action = CAction(key.GetAscii() | KEY_ASCII, key.GetUnicode()); // The keypress is a non-printing character else action = CAction(key.GetVKey() | KEY_VKEY); } } CLog::LogF(LOGDEBUG, "%s pressed, trying keyboard action %x", m_Keyboard.GetKeyName((int)key.GetButtonCode()).c_str(), action.GetID()); if (g_application.OnAction(action)) return true; // failed to handle the keyboard action, drop down through to standard action } if (key.GetFromService()) { if (key.GetButtonCode() != KEY_INVALID) action = m_buttonTranslator->GetAction(iWin, key); } else action = m_buttonTranslator->GetAction(iWin, key); } if (!key.IsAnalogButton()) CLog::LogF(LOGDEBUG, "%s pressed, action is %s", m_Keyboard.GetKeyName((int)key.GetButtonCode()).c_str(), action.GetName().c_str()); return ExecuteInputAction(action); }
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); }