diff --git a/app/streaming/input/input.cpp b/app/streaming/input/input.cpp index 1ed2cfae..7c61dc20 100644 --- a/app/streaming/input/input.cpp +++ b/app/streaming/input/input.cpp @@ -11,12 +11,13 @@ #define MOUSE_POLLING_INTERVAL 5 -SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int streamWidth, int streamHeight) +SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer* computer, int streamWidth, int streamHeight) : m_MultiController(prefs.multiController), m_GamepadMouse(prefs.gamepadMouse), m_SwapMouseButtons(prefs.swapMouseButtons), m_ReverseScrollDirection(prefs.reverseScrollDirection), m_SwapFaceButtons(prefs.swapFaceButtons), + m_BatchMouseMotion(computer->isNvidiaServerSoftware), m_MouseMoveTimer(0), m_MousePositionLock(0), m_MouseWasInVideoRegion(false), @@ -193,17 +194,19 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s SDL_AtomicSet(&m_MouseDeltaY, 0); SDL_AtomicSet(&m_MousePositionUpdated, 0); - Uint32 pollingInterval = QString(qgetenv("MOUSE_POLLING_INTERVAL")).toUInt(); - if (pollingInterval == 0) { - pollingInterval = MOUSE_POLLING_INTERVAL; - } - else { - SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, - "Using custom mouse polling interval: %u ms", - pollingInterval); - } + if (m_BatchMouseMotion) { + Uint32 pollingInterval = QString(qgetenv("MOUSE_POLLING_INTERVAL")).toUInt(); + if (pollingInterval == 0) { + pollingInterval = MOUSE_POLLING_INTERVAL; + } + else { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Using custom mouse polling interval: %u ms", + pollingInterval); + } - m_MouseMoveTimer = SDL_AddTimer(pollingInterval, SdlInputHandler::mouseMoveTimerCallback, this); + m_MouseMoveTimer = SDL_AddTimer(pollingInterval, SdlInputHandler::mouseMoveTimerCallback, this); + } } SdlInputHandler::~SdlInputHandler() diff --git a/app/streaming/input/input.h b/app/streaming/input/input.h index 269989eb..ca46bca7 100644 --- a/app/streaming/input/input.h +++ b/app/streaming/input/input.h @@ -147,6 +147,7 @@ private: bool m_SwapMouseButtons; bool m_ReverseScrollDirection; bool m_SwapFaceButtons; + bool m_BatchMouseMotion; SDL_TimerID m_MouseMoveTimer; SDL_atomic_t m_MouseDeltaX; SDL_atomic_t m_MouseDeltaY; diff --git a/app/streaming/input/mouse.cpp b/app/streaming/input/mouse.cpp index 6c6369b9..ac3c58d4 100644 --- a/app/streaming/input/mouse.cpp +++ b/app/streaming/input/mouse.cpp @@ -181,14 +181,26 @@ void SdlInputHandler::handleMouseMotionEvent(SDL_MouseMotionEvent* event) return; } - // Batch until the next mouse polling window or we'll get awful - // input lag everything except GFE 3.14 and 3.15. - if (m_AbsoluteMouseMode) { - updateMousePositionReport(event->x, event->y); + if (m_BatchMouseMotion) { + // Batch until the next mouse polling window or we'll get awful + // input lag everything except GFE 3.14 and 3.15. + if (m_AbsoluteMouseMode) { + updateMousePositionReport(event->x, event->y); + } + else { + SDL_AtomicAdd(&m_MouseDeltaX, event->xrel); + SDL_AtomicAdd(&m_MouseDeltaY, event->yrel); + } } else { - SDL_AtomicAdd(&m_MouseDeltaX, event->xrel); - SDL_AtomicAdd(&m_MouseDeltaY, event->yrel); + // On Sunshine, we can send input immediately + if (m_AbsoluteMouseMode) { + updateMousePositionReport(event->x, event->y); + flushMousePositionUpdate(); + } + else { + LiSendMouseMoveEvent(event->xrel, event->yrel); + } } }