From dacd5a9e3db7d9393017b24050e0385d7ec699d2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 17 Jan 2022 19:49:52 -0600 Subject: [PATCH] Discard stale gamepad events when enabling gamepad navigation --- app/gui/sdlgamepadkeynavigation.cpp | 14 ++++++++++++++ app/gui/sdlgamepadkeynavigation.h | 1 + 2 files changed, 15 insertions(+) diff --git a/app/gui/sdlgamepadkeynavigation.cpp b/app/gui/sdlgamepadkeynavigation.cpp index 4e9f1952..ff978d9f 100644 --- a/app/gui/sdlgamepadkeynavigation.cpp +++ b/app/gui/sdlgamepadkeynavigation.cpp @@ -12,6 +12,7 @@ SdlGamepadKeyNavigation::SdlGamepadKeyNavigation() : m_Enabled(false), m_UiNavMode(false), + m_FirstPoll(false), m_LastAxisNavigationEventTime(0) { m_PollingTimer = new QTimer(this); @@ -62,6 +63,9 @@ void SdlGamepadKeyNavigation::enable() } } + // Flush events on the first poll + m_FirstPoll = true; + // Poll every 50 ms for a new joystick event m_PollingTimer->start(50); @@ -91,6 +95,16 @@ void SdlGamepadKeyNavigation::onPollingTimerFired() SDL_Event event; StreamingPreferences prefs; + // Discard any pending button events on the first poll to avoid picking up + // stale input data from the stream session (like the quit combo). + if (m_FirstPoll) { + SDL_PumpEvents(); + SDL_FlushEvent(SDL_CONTROLLERBUTTONDOWN); + SDL_FlushEvent(SDL_CONTROLLERBUTTONUP); + + m_FirstPoll = false; + } + while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: diff --git a/app/gui/sdlgamepadkeynavigation.h b/app/gui/sdlgamepadkeynavigation.h index bdec990d..f4e54a95 100644 --- a/app/gui/sdlgamepadkeynavigation.h +++ b/app/gui/sdlgamepadkeynavigation.h @@ -34,5 +34,6 @@ private: QList m_Gamepads; bool m_Enabled; bool m_UiNavMode; + bool m_FirstPoll; Uint32 m_LastAxisNavigationEventTime; };