Просмотр исходного кода

Enable button toggle for keyboard in the modifier button

german 5 лет назад
Родитель
Сommit
1f228c51ca

+ 26 - 3
src/input_common/keyboard.cpp

@@ -12,20 +12,37 @@ namespace InputCommon {
 
 class KeyButton final : public Input::ButtonDevice {
 public:
-    explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_)
-        : key_button_list(std::move(key_button_list_)) {}
+    explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_, bool toggle_)
+        : key_button_list(std::move(key_button_list_)), toggle(toggle_) {}
 
     ~KeyButton() override;
 
     bool GetStatus() const override {
+        if (toggle) {
+            return toggled_status.load();
+        }
         return status.load();
     }
 
+    void ToggleButton() {
+        if (!lock) {
+            lock = true;
+            toggled_status.store(!toggled_status.load());
+        }
+    }
+
+    void UnlockButton() {
+        lock = false;
+    }
+
     friend class KeyButtonList;
 
 private:
     std::shared_ptr<KeyButtonList> key_button_list;
     std::atomic<bool> status{false};
+    std::atomic<bool> toggled_status{false};
+    bool lock = {};
+    const bool toggle;
 };
 
 struct KeyButtonPair {
@@ -51,6 +68,11 @@ public:
         for (const KeyButtonPair& pair : list) {
             if (pair.key_code == key_code) {
                 pair.key_button->status.store(pressed);
+                if (pressed) {
+                    pair.key_button->ToggleButton();
+                } else {
+                    pair.key_button->UnlockButton();
+                }
             }
         }
     }
@@ -75,7 +97,8 @@ KeyButton::~KeyButton() {
 
 std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage& params) {
     const int key_code = params.Get("code", 0);
-    std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list);
+    const bool toggle = params.Get("toggle", false);
+    std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list, toggle);
     key_button_list->AddKeyButton(key_code, button.get());
     return button;
 }

+ 6 - 2
src/yuzu/bootmanager.cpp

@@ -376,11 +376,15 @@ void GRenderWindow::closeEvent(QCloseEvent* event) {
 }
 
 void GRenderWindow::keyPressEvent(QKeyEvent* event) {
-    input_subsystem->GetKeyboard()->PressKey(event->key());
+    if (!event->isAutoRepeat()) {
+        input_subsystem->GetKeyboard()->PressKey(event->key());
+    }
 }
 
 void GRenderWindow::keyReleaseEvent(QKeyEvent* event) {
-    input_subsystem->GetKeyboard()->ReleaseKey(event->key());
+    if (!event->isAutoRepeat()) {
+        input_subsystem->GetKeyboard()->ReleaseKey(event->key());
+    }
 }
 
 void GRenderWindow::mousePressEvent(QMouseEvent* event) {

+ 12 - 1
src/yuzu/configuration/configure_input_player.cpp

@@ -104,7 +104,9 @@ QString ButtonToText(const Common::ParamPackage& param) {
     }
 
     if (param.Get("engine", "") == "keyboard") {
-        return GetKeyName(param.Get("code", 0));
+        const QString button_str = GetKeyName(param.Get("code", 0));
+        const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
+        return QObject::tr("%1%2").arg(toggle, button_str);
     }
 
     if (param.Get("engine", "") == "gcpad") {
@@ -412,6 +414,15 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
                         analogs_param[analog_id].Set("modifier", "");
                         analog_map_modifier_button[analog_id]->setText(tr("[not set]"));
                     });
+                    context_menu.addAction(tr("Toggle button"), [&] {
+                        Common::ParamPackage modifier_param =
+                            Common::ParamPackage{analogs_param[analog_id].Get("modifier", "")};
+                        const bool toggle_value = !modifier_param.Get("toggle", false);
+                        modifier_param.Set("toggle", toggle_value);
+                        analogs_param[analog_id].Set("modifier", modifier_param.Serialize());
+                        analog_map_modifier_button[analog_id]->setText(
+                            ButtonToText(modifier_param));
+                    });
                     context_menu.exec(
                         analog_map_modifier_button[analog_id]->mapToGlobal(menu_location));
                 });