diff --git a/app/streaming/input/gamepad.cpp b/app/streaming/input/gamepad.cpp index fdc896ab..6d5601a4 100644 --- a/app/streaming/input/gamepad.cpp +++ b/app/streaming/input/gamepad.cpp @@ -648,9 +648,22 @@ void SdlInputHandler::handleControllerButtonEvent(SDL_ControllerButtonEvent* eve if (state->buttons == (BACK_FLAG | LB_FLAG | RB_FLAG | Y_FLAG)) { SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, - "Detected keyboard/mouse input toggle gamepad combo"); + "Detected keyboard input toggle gamepad combo"); - Session::get()->toggleKeyboardMouseInputAllowed(); + Session::get()->toggleKeyboardInputAllowed(); + + if (isGamepadInputAllowed()) { + LiSendMultiControllerEvent(state->index, m_GamepadMask, + 0, 0, 0, 0, 0, 0, 0); + } + return; + } + + if (state->buttons == (BACK_FLAG | LB_FLAG | RB_FLAG | UP_FLAG)) { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "Detected mouse input toggle gamepad combo"); + + Session::get()->toggleMouseInputAllowed(); if (isGamepadInputAllowed()) { LiSendMultiControllerEvent(state->index, m_GamepadMask, diff --git a/app/streaming/input/input.cpp b/app/streaming/input/input.cpp index 109f7b9b..39a230a5 100644 --- a/app/streaming/input/input.cpp +++ b/app/streaming/input/input.cpp @@ -130,10 +130,15 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, int streamWidth, i m_SpecialKeyCombos[KeyComboPasteText].scanCode = SDL_SCANCODE_V; m_SpecialKeyCombos[KeyComboPasteText].enabled = true; - m_SpecialKeyCombos[KeyComboToggleKeyboardMouseInput].keyCombo = KeyComboToggleKeyboardMouseInput; - m_SpecialKeyCombos[KeyComboToggleKeyboardMouseInput].keyCode = SDLK_k; - m_SpecialKeyCombos[KeyComboToggleKeyboardMouseInput].scanCode = SDL_SCANCODE_K; - m_SpecialKeyCombos[KeyComboToggleKeyboardMouseInput].enabled = true; + m_SpecialKeyCombos[KeyComboToggleKeyboardInput].keyCombo = KeyComboToggleKeyboardInput; + m_SpecialKeyCombos[KeyComboToggleKeyboardInput].keyCode = SDLK_k; + m_SpecialKeyCombos[KeyComboToggleKeyboardInput].scanCode = SDL_SCANCODE_K; + m_SpecialKeyCombos[KeyComboToggleKeyboardInput].enabled = true; + + m_SpecialKeyCombos[KeyComboToggleMouseInput].keyCombo = KeyComboToggleMouseInput; + m_SpecialKeyCombos[KeyComboToggleMouseInput].keyCode = SDLK_o; + m_SpecialKeyCombos[KeyComboToggleMouseInput].scanCode = SDL_SCANCODE_O; + m_SpecialKeyCombos[KeyComboToggleMouseInput].enabled = true; m_SpecialKeyCombos[KeyComboToggleGamepadInput].keyCombo = KeyComboToggleGamepadInput; m_SpecialKeyCombos[KeyComboToggleGamepadInput].keyCode = SDLK_g; diff --git a/app/streaming/input/input.h b/app/streaming/input/input.h index 6c177722..46e3ae79 100644 --- a/app/streaming/input/input.h +++ b/app/streaming/input/input.h @@ -174,7 +174,8 @@ private: KeyComboToggleCursorHide, KeyComboToggleMinimize, KeyComboPasteText, - KeyComboToggleKeyboardMouseInput, + KeyComboToggleKeyboardInput, + KeyComboToggleMouseInput, KeyComboToggleGamepadInput, KeyComboVolumeUp, KeyComboVolumeDown, diff --git a/app/streaming/input/keyboard.cpp b/app/streaming/input/keyboard.cpp index ed12a6f2..ede74d51 100644 --- a/app/streaming/input/keyboard.cpp +++ b/app/streaming/input/keyboard.cpp @@ -142,11 +142,19 @@ void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo) break; } - case KeyComboToggleKeyboardMouseInput: + case KeyComboToggleKeyboardInput: SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, - "Detected keyboard/mouse input toggle combo"); + "Detected keyboard input toggle combo"); if (auto session = Session::get(); session != nullptr) { - session->toggleKeyboardMouseInputAllowed(); + session->toggleKeyboardInputAllowed(); + } + break; + + case KeyComboToggleMouseInput: + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "Detected mouse input toggle combo"); + if (auto session = Session::get(); session != nullptr) { + session->toggleMouseInputAllowed(); } break; diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index c4d1d455..668e9108 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -589,6 +589,28 @@ void Session::setGamepadInputAllowed(bool allowed) notifyInputPermissionState(); } +void Session::setKeyboardInputAllowed(bool allowed) +{ + const bool previous = m_AllowKeyboardInput.exchange(allowed, std::memory_order_relaxed); + if (previous && !allowed && m_InputHandler != nullptr) { + m_InputHandler->raiseAllKeys(); + } + + sendInputPermissionStateToHost(LI_SESSION_INPUT_POLICY_REASON_USER_TOGGLE); + notifyInputPermissionState(); +} + +void Session::setMouseInputAllowed(bool allowed) +{ + const bool previous = m_AllowMouseInput.exchange(allowed, std::memory_order_relaxed); + if (previous && !allowed && m_InputHandler != nullptr) { + m_InputHandler->raiseAllMouseButtons(); + } + + sendInputPermissionStateToHost(LI_SESSION_INPUT_POLICY_REASON_USER_TOGGLE); + notifyInputPermissionState(); +} + void Session::setAudioVolumeScalar(float scalar) { scalar = SDL_clamp(scalar, 0.0f, 1.0f); @@ -647,6 +669,16 @@ void Session::toggleGamepadInputAllowed() setGamepadInputAllowed(!isGamepadInputAllowed()); } +void Session::toggleKeyboardInputAllowed() +{ + setKeyboardInputAllowed(!isKeyboardInputAllowed()); +} + +void Session::toggleMouseInputAllowed() +{ + setMouseInputAllowed(!isMouseInputAllowed()); +} + void Session::toggleKeyboardMouseInputAllowed() { setKeyboardMouseInputAllowed(!isKeyboardMouseInputAllowed()); @@ -726,11 +758,11 @@ void Session::refreshControlPanelOverlay() SDL_snprintf(panelText, sizeof(panelText), "Stream Controls\n" - "Keyboard: %s\n" - "Mouse: %s\n" - "Pad: %s\n" - "Vol (U/J, mute N): %s\n" - "UI (Ctrl+Alt+Shift+P / Select+L1+R1+B): ON\n" + "Keyboard: %s (KB: Ctrl+Alt+Shift+K, Pad: Select+L1+R1+Y)\n" + "Mouse: %s (KB: Ctrl+Alt+Shift+O, Pad: Select+L1+R1+DPad Up)\n" + "Pad: %s (KB: Ctrl+Alt+Shift+G, Pad: Select+L1+R1+A)\n" + "Vol: %s (KB: U/J, mute N; Pad: none)\n" + "UI: ON (KB: Ctrl+Alt+Shift+P, Pad: Select+L1+R1+B)\n" "Input policy: host controlled", isKeyboardInputAllowed() ? "ON" : "OFF", isMouseInputAllowed() ? "ON" : "OFF", diff --git a/app/streaming/session.h b/app/streaming/session.h index 856e4aac..6289bf62 100644 --- a/app/streaming/session.h +++ b/app/streaming/session.h @@ -147,8 +147,12 @@ public: } void setGamepadInputAllowed(bool allowed); + void setKeyboardInputAllowed(bool allowed); + void setMouseInputAllowed(bool allowed); void setKeyboardMouseInputAllowed(bool allowed); void toggleGamepadInputAllowed(); + void toggleKeyboardInputAllowed(); + void toggleMouseInputAllowed(); void toggleKeyboardMouseInputAllowed(); void toggleControlPanelVisibility(); void notifyInputPermissionState();