diff --git a/app/streaming/input/input.cpp b/app/streaming/input/input.cpp index 243606f0..7abe2c5d 100644 --- a/app/streaming/input/input.cpp +++ b/app/streaming/input/input.cpp @@ -111,6 +111,11 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, int streamWidth, i m_SpecialKeyCombos[KeyComboTogglePointerRegionLock].scanCode = SDL_SCANCODE_L; m_SpecialKeyCombos[KeyComboTogglePointerRegionLock].enabled = true; + m_SpecialKeyCombos[KeyComboQuitAndExit].keyCombo = KeyComboQuitAndExit; + m_SpecialKeyCombos[KeyComboQuitAndExit].keyCode = SDLK_e; + m_SpecialKeyCombos[KeyComboQuitAndExit].scanCode = SDL_SCANCODE_E; + m_SpecialKeyCombos[KeyComboQuitAndExit].enabled = true; + m_OldIgnoreDevices = SDL_GetHint(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES); m_OldIgnoreDevicesExcept = SDL_GetHint(SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT); diff --git a/app/streaming/input/input.h b/app/streaming/input/input.h index baa949fd..f2cae85f 100644 --- a/app/streaming/input/input.h +++ b/app/streaming/input/input.h @@ -164,6 +164,7 @@ private: KeyComboToggleMinimize, KeyComboPasteText, KeyComboTogglePointerRegionLock, + KeyComboQuitAndExit, KeyComboMax }; diff --git a/app/streaming/input/keyboard.cpp b/app/streaming/input/keyboard.cpp index 33003017..e1fcdc1a 100644 --- a/app/streaming/input/keyboard.cpp +++ b/app/streaming/input/keyboard.cpp @@ -139,6 +139,20 @@ void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo) updatePointerRegionLock(); break; + case KeyComboQuitAndExit: + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "Detected quitAndExit key combo"); + + // Indicate that we want to exit afterwards + Session::get()->setShouldExitAfterQuit(); + + // Push a quit event to the main loop + SDL_Event quitExitEvent; + quitExitEvent.type = SDL_QUIT; + quitExitEvent.quit.timestamp = SDL_GetTicks(); + SDL_PushEvent(&quitExitEvent); + break; + default: Q_UNREACHABLE(); } diff --git a/app/streaming/session.cpp b/app/streaming/session.cpp index f7a1b5f2..fd546263 100644 --- a/app/streaming/session.cpp +++ b/app/streaming/session.cpp @@ -577,6 +577,7 @@ Session::Session(NvComputer* computer, NvApp& app, StreamingPreferences *prefere m_InputHandler(nullptr), m_MouseEmulationRefCount(0), m_FlushingWindowEventsRef(0), + m_ShouldExitAfterQuit(false), m_AsyncConnectionSuccess(false), m_PortTestResults(0), m_OpusDecoder(nullptr), @@ -1251,7 +1252,8 @@ private: // Only quit the running app if our session terminated gracefully bool shouldQuit = !m_Session->m_UnexpectedTermination && - m_Session->m_Preferences->quitAppAfter; + (m_Session->m_Preferences->quitAppAfter || + m_Session->m_ShouldExitAfterQuit); // Notify the UI if (shouldQuit) { @@ -1280,6 +1282,11 @@ private: } catch (const QtNetworkReplyException&) { } + // Exit the entire program if requested + if (m_Session->m_ShouldExitAfterQuit) { + QCoreApplication::instance()->quit(); + } + // Session is finished now emit m_Session->sessionFinished(m_Session->m_PortTestResults); } @@ -1698,6 +1705,11 @@ void Session::flushWindowEvents() SDL_PushEvent(&flushEvent); } +void Session::setShouldExitAfterQuit() +{ + m_ShouldExitAfterQuit = true; +} + class ExecThread : public QThread { public: diff --git a/app/streaming/session.h b/app/streaming/session.h index 2a0e77e0..6463baf0 100644 --- a/app/streaming/session.h +++ b/app/streaming/session.h @@ -124,6 +124,8 @@ public: void flushWindowEvents(); + void setShouldExitAfterQuit(); + signals: void stageStarting(QString stage); @@ -264,6 +266,7 @@ private: int m_MouseEmulationRefCount; int m_FlushingWindowEventsRef; QList m_LaunchWarnings; + bool m_ShouldExitAfterQuit; bool m_AsyncConnectionSuccess; int m_PortTestResults;