bool CInputManager::AlwaysProcess(const CAction& action) { // check if this button is mapped to a built-in function if (!action.GetName().empty()) { std::string builtInFunction; std::vector<std::string> params; CUtil::SplitExecFunction(action.GetName(), builtInFunction, params); StringUtils::ToLower(builtInFunction); // should this button be handled normally or just cancel the screensaver? if (builtInFunction == "powerdown" || builtInFunction == "reboot" || builtInFunction == "restart" || builtInFunction == "restartapp" || builtInFunction == "suspend" || builtInFunction == "hibernate" || builtInFunction == "quit" || builtInFunction == "shutdown") { return true; } } return false; }
bool CInputManager::ProcessMouse(int windowId) { MEASURE_FUNCTION; if (!m_Mouse.IsActive() || !g_application.IsAppFocused()) return false; // Get the mouse command ID uint32_t mousekey = m_Mouse.GetKey(); if (mousekey == KEY_MOUSE_NOOP) return true; // Reset the screensaver and idle timers g_application.ResetSystemIdleTimer(); g_application.ResetScreenSaver(); if (g_application.WakeUpScreenSaverAndDPMS()) return true; // Retrieve the corresponding action CKey key(mousekey, (unsigned int)0); CAction mouseaction = CButtonTranslator::GetInstance().GetAction(windowId, key); // Deactivate mouse if non-mouse action if (!mouseaction.IsMouse()) m_Mouse.SetActive(false); // Consume ACTION_NOOP. // Some views or dialogs gets closed after any ACTION and // a sensitive mouse might cause problems. if (mouseaction.GetID() == ACTION_NOOP) return false; // If we couldn't find an action return false to indicate we have not // handled this mouse action if (!mouseaction.GetID()) { CLog::LogF(LOGDEBUG, "unknown mouse command %d", mousekey); return false; } // Log mouse actions except for move and noop if (mouseaction.GetID() != ACTION_MOUSE_MOVE && mouseaction.GetID() != ACTION_NOOP) CLog::LogF(LOGDEBUG, "trying mouse action %s", mouseaction.GetName().c_str()); // The action might not be a mouse action. For example wheel moves might // be mapped to volume up/down in mouse.xml. In this case we do not want // the mouse position saved in the action. if (!mouseaction.IsMouse()) return g_application.OnAction(mouseaction); // This is a mouse action so we need to record the mouse position return g_application.OnAction(CAction(mouseaction.GetID(), m_Mouse.GetHold(MOUSE_LEFT_BUTTON), (float)m_Mouse.GetX(), (float)m_Mouse.GetY(), (float)m_Mouse.GetDX(), (float)m_Mouse.GetDY(), mouseaction.GetName())); }
bool CGUIWindowLoginScreen::OnAction(const CAction &action) { // don't allow built in actions to act here except shutdown related ones. // this forces only navigation type actions to be performed. if (action.GetID() == ACTION_BUILT_IN_FUNCTION) { CStdString actionName = action.GetName(); actionName.ToLower(); if (actionName.Find("shutdown") != -1) CBuiltins::Execute(action.GetName()); return true; } return CGUIWindow::OnAction(action); }
bool CGUIWindowLoginScreen::OnAction(const CAction &action) { // don't allow built in actions to act here except shutdown related ones. // this forces only navigation type actions to be performed. if (action.GetID() == ACTION_BUILT_IN_FUNCTION) { std::string actionName = action.GetName(); StringUtils::ToLower(actionName); if ((actionName.find("shutdown") != std::string::npos) && PVR::g_PVRManager.CanSystemPowerdown()) CBuiltins::GetInstance().Execute(action.GetName()); return true; } return CGUIWindow::OnAction(action); }
bool CStereoscopicsManager::OnAction(const CAction &action) { RENDER_STEREO_MODE mode = GetStereoMode(); if (action.GetID() == ACTION_STEREOMODE_NEXT) { SetStereoMode(GetNextSupportedStereoMode(mode)); return true; } else if (action.GetID() == ACTION_STEREOMODE_PREVIOUS) { SetStereoMode(GetNextSupportedStereoMode(mode, RENDER_STEREO_MODE_COUNT - 1)); return true; } else if (action.GetID() == ACTION_STEREOMODE_TOGGLE) { if (mode == RENDER_STEREO_MODE_OFF) { RENDER_STEREO_MODE targetMode = m_lastStereoMode; if (targetMode == RENDER_STEREO_MODE_OFF) targetMode = GetPreferredPlaybackMode(); SetStereoMode(targetMode); } else { SetStereoMode(RENDER_STEREO_MODE_OFF); } return true; } else if (action.GetID() == ACTION_STEREOMODE_SELECT) { SetStereoMode(GetStereoModeByUserChoice()); return true; } else if (action.GetID() == ACTION_STEREOMODE_TOMONO) { if (mode == RENDER_STEREO_MODE_MONO) { RENDER_STEREO_MODE targetMode = m_lastStereoMode; if (targetMode == RENDER_STEREO_MODE_OFF) targetMode = GetPreferredPlaybackMode(); SetStereoMode(targetMode); } else { SetStereoMode(RENDER_STEREO_MODE_MONO); } return true; } else if (action.GetID() == ACTION_STEREOMODE_SET) { int stereoMode = ConvertStringToGuiStereoMode(action.GetName()); if (stereoMode > -1) SetStereoMode( (RENDER_STEREO_MODE) stereoMode); return true; } return false; }
void Action::setFromCAction(const CAction& action) { TRACE; id = action.GetID(); buttonCode = action.GetButtonCode(); fAmount1 = action.GetAmount(0); fAmount2 = action.GetAmount(1); fRepeat = action.GetRepeat(); strAction = action.GetName(); }
void CJoystickManager::CActionRepeater::Track(const CAction &action) { if (m_actionID != action.GetID()) { // A new button was pressed, start tracking it m_actionID = action.GetID(); m_name = action.GetName(); m_timeout.Set(ACTION_FIRST_DELAY); } else { // Already tracking the action, update timer if expired if (m_timeout.IsTimePast()) m_timeout.Set(ACTION_REPEAT_DELAY); } }
bool CStereoscopicsManager::OnAction(const CAction &action) { RENDER_STEREO_MODE mode = GetStereoMode(); if (action.GetID() == ACTION_STEREOMODE_NEXT) { SetStereoModeByUser(GetNextSupportedStereoMode(mode)); return true; } else if (action.GetID() == ACTION_STEREOMODE_PREVIOUS) { SetStereoModeByUser(GetNextSupportedStereoMode(mode, RENDER_STEREO_MODE_COUNT - 1)); return true; } else if (action.GetID() == ACTION_STEREOMODE_TOGGLE) { if (mode == RENDER_STEREO_MODE_OFF) { RENDER_STEREO_MODE targetMode = GetPreferredPlaybackMode(); // if user selected a specific mode before, make sure to // switch back into that mode on toggle. if (m_stereoModeSetByUser != RENDER_STEREO_MODE_UNDEFINED) { // if user mode is set to OFF, he manually turned it off before. In this case use the last user applied mode if (m_stereoModeSetByUser != RENDER_STEREO_MODE_OFF) targetMode = m_stereoModeSetByUser; else if (m_lastStereoModeSetByUser != RENDER_STEREO_MODE_UNDEFINED && m_lastStereoModeSetByUser != RENDER_STEREO_MODE_OFF) targetMode = m_lastStereoModeSetByUser; } SetStereoModeByUser(targetMode); } else { SetStereoModeByUser(RENDER_STEREO_MODE_OFF); } return true; } else if (action.GetID() == ACTION_STEREOMODE_SELECT) { SetStereoModeByUser(GetStereoModeByUserChoice()); return true; } else if (action.GetID() == ACTION_STEREOMODE_TOMONO) { if (mode == RENDER_STEREO_MODE_MONO) { RENDER_STEREO_MODE targetMode = GetPreferredPlaybackMode(); // if we have an old userdefined steremode, use that one as toggle target if (m_stereoModeSetByUser != RENDER_STEREO_MODE_UNDEFINED) { // if user mode is set to OFF, he manually turned it off before. In this case use the last user applied mode if (m_stereoModeSetByUser != RENDER_STEREO_MODE_OFF && m_stereoModeSetByUser != mode) targetMode = m_stereoModeSetByUser; else if (m_lastStereoModeSetByUser != RENDER_STEREO_MODE_UNDEFINED && m_lastStereoModeSetByUser != RENDER_STEREO_MODE_OFF && m_lastStereoModeSetByUser != mode) targetMode = m_lastStereoModeSetByUser; } SetStereoModeByUser(targetMode); } else { SetStereoModeByUser(RENDER_STEREO_MODE_MONO); } return true; } else if (action.GetID() == ACTION_STEREOMODE_SET) { int stereoMode = ConvertStringToGuiStereoMode(action.GetName()); if (stereoMode > -1) SetStereoModeByUser( (RENDER_STEREO_MODE) stereoMode ); return true; } return false; }
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); }