diff --git a/app/streaming/input.cpp b/app/streaming/input.cpp index b5e72628..19a26364 100644 --- a/app/streaming/input.cpp +++ b/app/streaming/input.cpp @@ -1415,19 +1415,30 @@ bool SdlInputHandler::isCaptureActive() void SdlInputHandler::setCaptureActive(bool active) { if (active) { + // If we're in full-screen exclusive mode, grab the cursor so it can't accidentally leave our window. + if ((SDL_GetWindowFlags(m_Window) & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN) { + SDL_SetWindowGrab(m_Window, SDL_TRUE); + } + // If we're in relative mode, try to activate SDL's relative mouse mode if (m_AbsoluteMouseMode || SDL_SetRelativeMouseMode(SDL_TRUE) < 0) { - // Relative mouse mode didn't work, so we'll use fake capture + // Relative mouse mode didn't work or was disabled, so we'll just hide the cursor SDL_ShowCursor(SDL_DISABLE); m_FakeCaptureActive = true; } } - else if (m_FakeCaptureActive) { - SDL_ShowCursor(SDL_ENABLE); - m_FakeCaptureActive = false; - } else { - SDL_SetRelativeMouseMode(SDL_FALSE); + if (m_FakeCaptureActive) { + // Display the cursor again + SDL_ShowCursor(SDL_ENABLE); + m_FakeCaptureActive = false; + } + else { + SDL_SetRelativeMouseMode(SDL_FALSE); + } + + // Allow the cursor to leave the bounds of our window again. + SDL_SetWindowGrab(m_Window, SDL_FALSE); } } diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index e7b1b0fd..8fdc5a62 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -867,8 +867,8 @@ void Session::toggleFullscreen() bool fullScreen = !(SDL_GetWindowFlags(m_Window) & m_FullScreenFlag); if (fullScreen) { - if (m_FullScreenFlag == SDL_WINDOW_FULLSCREEN) { - // Confine the cursor to the window + if (m_FullScreenFlag == SDL_WINDOW_FULLSCREEN && m_InputHandler->isCaptureActive()) { + // Confine the cursor to the window if we're capturing input SDL_SetWindowGrab(m_Window, SDL_TRUE); } @@ -1120,11 +1120,6 @@ void Session::exec(int displayOriginX, int displayOriginY) SDL_SetWindowResizable(m_Window, SDL_TRUE); } else { - if (m_FullScreenFlag == SDL_WINDOW_FULLSCREEN) { - // Confine the cursor to the window - SDL_SetWindowGrab(m_Window, SDL_TRUE); - } - // Update the window display mode based on our current monitor updateOptimalWindowDisplayMode(); @@ -1360,7 +1355,6 @@ DispatchDeferredCleanup: // Uncapture the mouse and hide the window immediately, // so we can return to the Qt GUI ASAP. m_InputHandler->setCaptureActive(false); - SDL_SetWindowGrab(m_Window, SDL_FALSE); SDL_EnableScreenSaver(); SDL_SetHint(SDL_HINT_TIMER_RESOLUTION, "0"); if (QGuiApplication::platformName() == "eglfs") {