summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgerman <german@thesoftwareartisans.com>2021-03-06 02:21:04 +0100
committergerman <german@thesoftwareartisans.com>2021-03-06 02:21:04 +0100
commit1f228c51ca2c510622f4204937f90c7f2bbc7bf6 (patch)
treebb29a416ef52d308c38adb16b4ee7d0fe55fe391
parentMerge pull request #6034 from Morph1984/mbedtls (diff)
downloadyuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.tar
yuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.tar.gz
yuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.tar.bz2
yuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.tar.lz
yuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.tar.xz
yuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.tar.zst
yuzu-1f228c51ca2c510622f4204937f90c7f2bbc7bf6.zip
-rw-r--r--src/input_common/keyboard.cpp29
-rw-r--r--src/yuzu/bootmanager.cpp8
-rw-r--r--src/yuzu/configuration/configure_input_player.cpp13
3 files changed, 44 insertions, 6 deletions
diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp
index 24a6f7a33..fa0e60ac1 100644
--- a/src/input_common/keyboard.cpp
+++ b/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;
}
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 1c61d419d..50938fb04 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/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) {
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp
index 21d0d3449..e297eeffd 100644
--- a/src/yuzu/configuration/configure_input_player.cpp
+++ b/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));
});