From 5245c86f2662caa0e1e4b20508608b11237993b3 Mon Sep 17 00:00:00 2001
From: wwylele <wwylele@gmail.com>
Date: Fri, 17 Mar 2017 21:41:25 +0200
Subject: [PATCH 1/2] citra-qt: release all buttons when render window focus is
 lost

credit to @Hawkheart for the original idea
---
 src/citra_qt/bootmanager.cpp  |  5 +++++
 src/citra_qt/bootmanager.h    |  2 ++
 src/input_common/keyboard.cpp | 11 +++++++++++
 src/input_common/keyboard.h   |  2 ++
 4 files changed, 20 insertions(+)

diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 28264df9a8..e212433d96 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -235,6 +235,11 @@ void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
         motion_emu->EndTilt();
 }
 
+void GRenderWindow::focusOutEvent(QFocusEvent* event) {
+    QWidget::focusOutEvent(event);
+    InputCommon::GetKeyboard()->ReleaseAllKeys();
+}
+
 void GRenderWindow::ReloadSetKeymaps() {}
 
 void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height) {
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 923a5b4569..d1c00fc18f 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -128,6 +128,8 @@ public:
     void mouseMoveEvent(QMouseEvent* event) override;
     void mouseReleaseEvent(QMouseEvent* event) override;
 
+    void focusOutEvent(QFocusEvent* event) override;
+
     void ReloadSetKeymaps();
 
     void OnClientAreaResized(unsigned width, unsigned height);
diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp
index a8fc01f2e9..0f0d10f237 100644
--- a/src/input_common/keyboard.cpp
+++ b/src/input_common/keyboard.cpp
@@ -53,6 +53,13 @@ public:
         }
     }
 
+    void ChangeAllKeyStatus(bool pressed) {
+        std::lock_guard<std::mutex> guard(mutex);
+        for (const KeyButtonPair& pair : list) {
+            pair.key_button->status.store(pressed);
+        }
+    }
+
 private:
     std::mutex mutex;
     std::list<KeyButtonPair> list;
@@ -79,4 +86,8 @@ void Keyboard::ReleaseKey(int key_code) {
     key_button_list->ChangeKeyStatus(key_code, false);
 }
 
+void Keyboard::ReleaseAllKeys() {
+    key_button_list->ChangeAllKeyStatus(false);
+}
+
 } // namespace InputCommon
diff --git a/src/input_common/keyboard.h b/src/input_common/keyboard.h
index 76359aa305..8619504729 100644
--- a/src/input_common/keyboard.h
+++ b/src/input_common/keyboard.h
@@ -38,6 +38,8 @@ public:
      */
     void ReleaseKey(int key_code);
 
+    void ReleaseAllKeys();
+
 private:
     std::shared_ptr<KeyButtonList> key_button_list;
 };

From 560884336f706846545cd4c3243002ccb03cfe6d Mon Sep 17 00:00:00 2001
From: wwylele <wwylele@gmail.com>
Date: Fri, 17 Mar 2017 21:45:29 +0200
Subject: [PATCH 2/2] citra-qt: remove dead code

---
 src/citra_qt/bootmanager.cpp | 2 --
 src/citra_qt/bootmanager.h   | 2 --
 src/citra_qt/main.cpp        | 1 -
 3 files changed, 5 deletions(-)

diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index e212433d96..bae576d6ab 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -240,8 +240,6 @@ void GRenderWindow::focusOutEvent(QFocusEvent* event) {
     InputCommon::GetKeyboard()->ReleaseAllKeys();
 }
 
-void GRenderWindow::ReloadSetKeymaps() {}
-
 void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height) {
     NotifyClientAreaSizeChanged(std::make_pair(width, height));
 }
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index d1c00fc18f..9d39f1af8f 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -130,8 +130,6 @@ public:
 
     void focusOutEvent(QFocusEvent* event) override;
 
-    void ReloadSetKeymaps();
-
     void OnClientAreaResized(unsigned width, unsigned height);
 
     void InitRenderTarget();
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index fd51659b90..2723a02170 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -612,7 +612,6 @@ void GMainWindow::OnConfigure() {
     auto result = configureDialog.exec();
     if (result == QDialog::Accepted) {
         configureDialog.applyConfiguration();
-        render_window->ReloadSetKeymaps();
         config->Save();
     }
 }