Align input policy startup flow and fix gamepad reconnect handling
This commit is contained in:
parent
3767a9eac3
commit
e88be5dce2
4 changed files with 65 additions and 4 deletions
|
|
@ -890,6 +890,20 @@ void SdlInputHandler::handleJoystickArrivalEvent(SDL_JoyDeviceEvent* event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SdlInputHandler::handleJoystickRemovalEvent(SDL_JoyDeviceEvent* event)
|
||||||
|
{
|
||||||
|
SDL_assert(event->type == SDL_JOYDEVICEREMOVED);
|
||||||
|
|
||||||
|
if (findStateForGamepad(event->which) == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_ControllerDeviceEvent controllerEvent = {};
|
||||||
|
controllerEvent.type = SDL_CONTROLLERDEVICEREMOVED;
|
||||||
|
controllerEvent.which = event->which;
|
||||||
|
handleControllerDeviceEvent(&controllerEvent);
|
||||||
|
}
|
||||||
|
|
||||||
void SdlInputHandler::rumble(unsigned short controllerNumber, unsigned short lowFreqMotor, unsigned short highFreqMotor)
|
void SdlInputHandler::rumble(unsigned short controllerNumber, unsigned short lowFreqMotor, unsigned short highFreqMotor)
|
||||||
{
|
{
|
||||||
// Make sure the controller number is within our supported count
|
// Make sure the controller number is within our supported count
|
||||||
|
|
|
||||||
|
|
@ -307,6 +307,41 @@ void SdlInputHandler::raiseAllMouseButtons()
|
||||||
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_X2);
|
LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_X2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SdlInputHandler::raiseAllGamepadInputs()
|
||||||
|
{
|
||||||
|
uint16_t raisedIndexMask = 0;
|
||||||
|
|
||||||
|
for (auto &state : m_GamepadState) {
|
||||||
|
if (state.controller == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.buttons = 0;
|
||||||
|
state.lt = 0;
|
||||||
|
state.rt = 0;
|
||||||
|
state.lsX = 0;
|
||||||
|
state.lsY = 0;
|
||||||
|
state.rsX = 0;
|
||||||
|
state.rsY = 0;
|
||||||
|
state.emulatedClickpadButtonDown = false;
|
||||||
|
|
||||||
|
if ((raisedIndexMask & (1 << state.index)) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
LiSendMultiControllerEvent(state.index,
|
||||||
|
m_GamepadMask,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
raisedIndexMask |= (1 << state.index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SdlInputHandler::notifyMouseLeave()
|
void SdlInputHandler::notifyMouseLeave()
|
||||||
{
|
{
|
||||||
// SDL on Windows doesn't send the mouse button up until the mouse re-enters the window
|
// SDL on Windows doesn't send the mouse button up until the mouse re-enters the window
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,8 @@ public:
|
||||||
|
|
||||||
void handleJoystickArrivalEvent(SDL_JoyDeviceEvent* event);
|
void handleJoystickArrivalEvent(SDL_JoyDeviceEvent* event);
|
||||||
|
|
||||||
|
void handleJoystickRemovalEvent(SDL_JoyDeviceEvent* event);
|
||||||
|
|
||||||
void sendText(QString& string);
|
void sendText(QString& string);
|
||||||
|
|
||||||
void rumble(uint16_t controllerNumber, uint16_t lowFreqMotor, uint16_t highFreqMotor);
|
void rumble(uint16_t controllerNumber, uint16_t lowFreqMotor, uint16_t highFreqMotor);
|
||||||
|
|
@ -136,6 +138,8 @@ public:
|
||||||
|
|
||||||
void raiseAllMouseButtons();
|
void raiseAllMouseButtons();
|
||||||
|
|
||||||
|
void raiseAllGamepadInputs();
|
||||||
|
|
||||||
void notifyMouseLeave();
|
void notifyMouseLeave();
|
||||||
|
|
||||||
void notifyFocusLost();
|
void notifyFocusLost();
|
||||||
|
|
|
||||||
|
|
@ -579,6 +579,10 @@ Session::Session(NvComputer* computer, NvApp& app, StreamingPreferences *prefere
|
||||||
|
|
||||||
void Session::setGamepadInputAllowed(bool allowed)
|
void Session::setGamepadInputAllowed(bool allowed)
|
||||||
{
|
{
|
||||||
|
if (!allowed && m_InputHandler != nullptr) {
|
||||||
|
m_InputHandler->raiseAllGamepadInputs();
|
||||||
|
}
|
||||||
|
|
||||||
m_AllowGamepadInput.store(allowed, std::memory_order_relaxed);
|
m_AllowGamepadInput.store(allowed, std::memory_order_relaxed);
|
||||||
sendInputPermissionStateToHost(LI_SESSION_INPUT_POLICY_REASON_USER_TOGGLE);
|
sendInputPermissionStateToHost(LI_SESSION_INPUT_POLICY_REASON_USER_TOGGLE);
|
||||||
notifyInputPermissionState();
|
notifyInputPermissionState();
|
||||||
|
|
@ -777,7 +781,10 @@ void Session::applyHostInputPolicy(bool allowKeyboard, bool allowMouse, bool all
|
||||||
m_InputHandler->raiseAllMouseButtons();
|
m_InputHandler->raiseAllMouseButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_AllowGamepadInput.store(allowGamepad, std::memory_order_relaxed);
|
const bool previousGamepad = m_AllowGamepadInput.exchange(allowGamepad, std::memory_order_relaxed);
|
||||||
|
if (previousGamepad && !allowGamepad && m_InputHandler != nullptr) {
|
||||||
|
m_InputHandler->raiseAllGamepadInputs();
|
||||||
|
}
|
||||||
|
|
||||||
if (reason != LI_SESSION_INPUT_POLICY_REASON_STREAM_START) {
|
if (reason != LI_SESSION_INPUT_POLICY_REASON_STREAM_START) {
|
||||||
notifyInputPermissionState();
|
notifyInputPermissionState();
|
||||||
|
|
@ -1925,8 +1932,6 @@ bool Session::startConnectionAsync()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendInputPermissionStateToHost(LI_SESSION_INPUT_POLICY_REASON_STREAM_START);
|
|
||||||
|
|
||||||
emit connectionStarted();
|
emit connectionStarted();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -1970,7 +1975,7 @@ void Session::start()
|
||||||
s_ActiveSession = this;
|
s_ActiveSession = this;
|
||||||
|
|
||||||
m_AllowGamepadInput.store(true, std::memory_order_relaxed);
|
m_AllowGamepadInput.store(true, std::memory_order_relaxed);
|
||||||
m_AllowKeyboardMouseInput.store(true, std::memory_order_relaxed);
|
m_AllowKeyboardMouseInput.store(false, std::memory_order_relaxed);
|
||||||
m_ManualAudioMuted.store(false, std::memory_order_relaxed);
|
m_ManualAudioMuted.store(false, std::memory_order_relaxed);
|
||||||
m_AudioMuted.store(false, std::memory_order_relaxed);
|
m_AudioMuted.store(false, std::memory_order_relaxed);
|
||||||
m_AudioVolumeScalar.store(1.0f, std::memory_order_relaxed);
|
m_AudioVolumeScalar.store(1.0f, std::memory_order_relaxed);
|
||||||
|
|
@ -2530,6 +2535,9 @@ void Session::exec()
|
||||||
case SDL_JOYDEVICEADDED:
|
case SDL_JOYDEVICEADDED:
|
||||||
m_InputHandler->handleJoystickArrivalEvent(&event.jdevice);
|
m_InputHandler->handleJoystickArrivalEvent(&event.jdevice);
|
||||||
break;
|
break;
|
||||||
|
case SDL_JOYDEVICEREMOVED:
|
||||||
|
m_InputHandler->handleJoystickRemovalEvent(&event.jdevice);
|
||||||
|
break;
|
||||||
case SDL_FINGERDOWN:
|
case SDL_FINGERDOWN:
|
||||||
case SDL_FINGERMOTION:
|
case SDL_FINGERMOTION:
|
||||||
case SDL_FINGERUP:
|
case SDL_FINGERUP:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue