From 71b214ca43088ceade1ad30f816e349fa557dc92 Mon Sep 17 00:00:00 2001 From: Elia Zammuto Date: Sat, 8 May 2021 13:08:07 +0200 Subject: [PATCH 1/2] Fix Stuck Modifiers on Disconnection --- sunshine/input.cpp | 7 +++++++ sunshine/input.h | 1 + sunshine/stream.cpp | 2 ++ 3 files changed, 10 insertions(+) diff --git a/sunshine/input.cpp b/sunshine/input.cpp index 7d9b7733..402d4ce3 100644 --- a/sunshine/input.cpp +++ b/sunshine/input.cpp @@ -402,6 +402,13 @@ void passthrough(std::shared_ptr &input, std::vector &&in task_pool.push(passthrough_helper, input, util::cmove(input_data)); } +void reset(){ + for(auto& kp : key_press){ + platf::keyboard(platf_input, kp.first & 0x00FF, true); + key_press[kp.first] = false; + } +} + void init() { platf_input = platf::input(); } diff --git a/sunshine/input.h b/sunshine/input.h index ce5b9161..e1d4c82c 100644 --- a/sunshine/input.h +++ b/sunshine/input.h @@ -11,6 +11,7 @@ namespace input { struct input_t; void print(void *input); +void reset(); void passthrough(std::shared_ptr &input, std::vector &&input_data); void init(); diff --git a/sunshine/stream.cpp b/sunshine/stream.cpp index f6d4ef21..ccc6c697 100644 --- a/sunshine/stream.cpp +++ b/sunshine/stream.cpp @@ -885,6 +885,8 @@ state_e state(session_t &session) { void stop(session_t &session) { while_starting_do_nothing(session.state); + //Reset input on session stop to avoid stuck repeated keys + input::reset(); auto expected = state_e::RUNNING; auto already_stopping = !session.state.compare_exchange_strong(expected, state_e::STOPPING); if(already_stopping) { From 661c8260e525161d139d812a702d126f0b952def Mon Sep 17 00:00:00 2001 From: Elia Zammuto Date: Sat, 8 May 2021 13:46:20 +0200 Subject: [PATCH 2/2] Fix Position for input::reset --- sunshine/stream.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sunshine/stream.cpp b/sunshine/stream.cpp index ccc6c697..a86f4cca 100644 --- a/sunshine/stream.cpp +++ b/sunshine/stream.cpp @@ -884,9 +884,6 @@ state_e state(session_t &session) { void stop(session_t &session) { while_starting_do_nothing(session.state); - - //Reset input on session stop to avoid stuck repeated keys - input::reset(); auto expected = state_e::RUNNING; auto already_stopping = !session.state.compare_exchange_strong(expected, state_e::STOPPING); if(already_stopping) { @@ -903,6 +900,9 @@ void join(session_t &session) { session.audioThread.join(); BOOST_LOG(debug) << "Waiting for control to end..."sv; session.controlEnd.view(); + //Reset input on session stop to avoid stuck repeated keys + BOOST_LOG(debug) << "Resetting Input..."sv; + input::reset(); BOOST_LOG(debug) << "Session ended"sv; }