summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/input.h5
-rw-r--r--src/core/hid/input_converter.cpp3
-rw-r--r--src/input_common/input_poller.cpp1
-rw-r--r--src/yuzu/configuration/configure_input_player.cpp21
4 files changed, 23 insertions, 7 deletions
diff --git a/src/common/input.h b/src/common/input.h
index 213aa2384..825b0d650 100644
--- a/src/common/input.h
+++ b/src/common/input.h
@@ -102,6 +102,8 @@ struct AnalogProperties {
102 float offset{}; 102 float offset{};
103 // Invert direction of the sensor data 103 // Invert direction of the sensor data
104 bool inverted{}; 104 bool inverted{};
105 // Press once to activate, press again to release
106 bool toggle{};
105}; 107};
106 108
107// Single analog sensor data 109// Single analog sensor data
@@ -115,8 +117,11 @@ struct AnalogStatus {
115struct ButtonStatus { 117struct ButtonStatus {
116 Common::UUID uuid{}; 118 Common::UUID uuid{};
117 bool value{}; 119 bool value{};
120 // Invert value of the button
118 bool inverted{}; 121 bool inverted{};
122 // Press once to activate, press again to release
119 bool toggle{}; 123 bool toggle{};
124 // Internal lock for the toggle status
120 bool locked{}; 125 bool locked{};
121}; 126};
122 127
diff --git a/src/core/hid/input_converter.cpp b/src/core/hid/input_converter.cpp
index 68d143a01..52fb69e9c 100644
--- a/src/core/hid/input_converter.cpp
+++ b/src/core/hid/input_converter.cpp
@@ -52,6 +52,9 @@ Common::Input::ButtonStatus TransformToButton(const Common::Input::CallbackStatu
52 Common::Input::ButtonStatus status{}; 52 Common::Input::ButtonStatus status{};
53 switch (callback.type) { 53 switch (callback.type) {
54 case Common::Input::InputType::Analog: 54 case Common::Input::InputType::Analog:
55 status.value = TransformToTrigger(callback).pressed.value;
56 status.toggle = callback.analog_status.properties.toggle;
57 break;
55 case Common::Input::InputType::Trigger: 58 case Common::Input::InputType::Trigger:
56 status.value = TransformToTrigger(callback).pressed.value; 59 status.value = TransformToTrigger(callback).pressed.value;
57 break; 60 break;
diff --git a/src/input_common/input_poller.cpp b/src/input_common/input_poller.cpp
index 133422d5c..ffb9b945e 100644
--- a/src/input_common/input_poller.cpp
+++ b/src/input_common/input_poller.cpp
@@ -824,6 +824,7 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateAnalogDevice(
824 .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f), 824 .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f),
825 .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f), 825 .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f),
826 .inverted = params.Get("invert", "+") == "-", 826 .inverted = params.Get("invert", "+") == "-",
827 .toggle = static_cast<bool>(params.Get("toggle", false)),
827 }; 828 };
828 input_engine->PreSetController(identifier); 829 input_engine->PreSetController(identifier);
829 input_engine->PreSetAxis(identifier, axis); 830 input_engine->PreSetAxis(identifier, axis);
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp
index 109689c88..9b4f765ce 100644
--- a/src/yuzu/configuration/configure_input_player.cpp
+++ b/src/yuzu/configuration/configure_input_player.cpp
@@ -161,6 +161,7 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) {
161 161
162 const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : ""); 162 const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
163 const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : ""); 163 const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : "");
164 const QString invert = QString::fromStdString(param.Get("invert", "+") == "-" ? "-" : "");
164 const auto common_button_name = input_subsystem->GetButtonName(param); 165 const auto common_button_name = input_subsystem->GetButtonName(param);
165 166
166 // Retrieve the names from Qt 167 // Retrieve the names from Qt
@@ -184,7 +185,7 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) {
184 } 185 }
185 if (param.Has("axis")) { 186 if (param.Has("axis")) {
186 const QString axis = QString::fromStdString(param.Get("axis", "")); 187 const QString axis = QString::fromStdString(param.Get("axis", ""));
187 return QObject::tr("%1%2Axis %3").arg(toggle, inverted, axis); 188 return QObject::tr("%1%2Axis %3").arg(toggle, invert, axis);
188 } 189 }
189 if (param.Has("axis_x") && param.Has("axis_y") && param.Has("axis_z")) { 190 if (param.Has("axis_x") && param.Has("axis_y") && param.Has("axis_z")) {
190 const QString axis_x = QString::fromStdString(param.Get("axis_x", "")); 191 const QString axis_x = QString::fromStdString(param.Get("axis_x", ""));
@@ -362,18 +363,18 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
362 button_map[button_id]->setText(tr("[not set]")); 363 button_map[button_id]->setText(tr("[not set]"));
363 }); 364 });
364 if (param.Has("code") || param.Has("button") || param.Has("hat")) { 365 if (param.Has("code") || param.Has("button") || param.Has("hat")) {
365 context_menu.addAction(tr("Toggle button"), [&] {
366 const bool toggle_value = !param.Get("toggle", false);
367 param.Set("toggle", toggle_value);
368 button_map[button_id]->setText(ButtonToText(param));
369 emulated_controller->SetButtonParam(button_id, param);
370 });
371 context_menu.addAction(tr("Invert button"), [&] { 366 context_menu.addAction(tr("Invert button"), [&] {
372 const bool invert_value = !param.Get("inverted", false); 367 const bool invert_value = !param.Get("inverted", false);
373 param.Set("inverted", invert_value); 368 param.Set("inverted", invert_value);
374 button_map[button_id]->setText(ButtonToText(param)); 369 button_map[button_id]->setText(ButtonToText(param));
375 emulated_controller->SetButtonParam(button_id, param); 370 emulated_controller->SetButtonParam(button_id, param);
376 }); 371 });
372 context_menu.addAction(tr("Toggle button"), [&] {
373 const bool toggle_value = !param.Get("toggle", false);
374 param.Set("toggle", toggle_value);
375 button_map[button_id]->setText(ButtonToText(param));
376 emulated_controller->SetButtonParam(button_id, param);
377 });
377 } 378 }
378 if (param.Has("axis")) { 379 if (param.Has("axis")) {
379 context_menu.addAction(tr("Invert axis"), [&] { 380 context_menu.addAction(tr("Invert axis"), [&] {
@@ -398,6 +399,12 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
398 } 399 }
399 emulated_controller->SetButtonParam(button_id, param); 400 emulated_controller->SetButtonParam(button_id, param);
400 }); 401 });
402 context_menu.addAction(tr("Toggle axis"), [&] {
403 const bool toggle_value = !param.Get("toggle", false);
404 param.Set("toggle", toggle_value);
405 button_map[button_id]->setText(ButtonToText(param));
406 emulated_controller->SetButtonParam(button_id, param);
407 });
401 } 408 }
402 context_menu.exec(button_map[button_id]->mapToGlobal(menu_location)); 409 context_menu.exec(button_map[button_id]->mapToGlobal(menu_location));
403 }); 410 });