Przeglądaj źródła

citra-qt: release all buttons when render window focus is lost

credit to @Hawkheart for the original idea
wwylele 9 lat temu
rodzic
commit
5245c86f26

+ 5 - 0
src/citra_qt/bootmanager.cpp

@@ -235,6 +235,11 @@ void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) {
         motion_emu->EndTilt();
         motion_emu->EndTilt();
 }
 }
 
 
+void GRenderWindow::focusOutEvent(QFocusEvent* event) {
+    QWidget::focusOutEvent(event);
+    InputCommon::GetKeyboard()->ReleaseAllKeys();
+}
+
 void GRenderWindow::ReloadSetKeymaps() {}
 void GRenderWindow::ReloadSetKeymaps() {}
 
 
 void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height) {
 void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height) {

+ 2 - 0
src/citra_qt/bootmanager.h

@@ -128,6 +128,8 @@ public:
     void mouseMoveEvent(QMouseEvent* event) override;
     void mouseMoveEvent(QMouseEvent* event) override;
     void mouseReleaseEvent(QMouseEvent* event) override;
     void mouseReleaseEvent(QMouseEvent* event) override;
 
 
+    void focusOutEvent(QFocusEvent* event) override;
+
     void ReloadSetKeymaps();
     void ReloadSetKeymaps();
 
 
     void OnClientAreaResized(unsigned width, unsigned height);
     void OnClientAreaResized(unsigned width, unsigned height);

+ 11 - 0
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:
 private:
     std::mutex mutex;
     std::mutex mutex;
     std::list<KeyButtonPair> list;
     std::list<KeyButtonPair> list;
@@ -79,4 +86,8 @@ void Keyboard::ReleaseKey(int key_code) {
     key_button_list->ChangeKeyStatus(key_code, false);
     key_button_list->ChangeKeyStatus(key_code, false);
 }
 }
 
 
+void Keyboard::ReleaseAllKeys() {
+    key_button_list->ChangeAllKeyStatus(false);
+}
+
 } // namespace InputCommon
 } // namespace InputCommon

+ 2 - 0
src/input_common/keyboard.h

@@ -38,6 +38,8 @@ public:
      */
      */
     void ReleaseKey(int key_code);
     void ReleaseKey(int key_code);
 
 
+    void ReleaseAllKeys();
+
 private:
 private:
     std::shared_ptr<KeyButtonList> key_button_list;
     std::shared_ptr<KeyButtonList> key_button_list;
 };
 };