summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/input.h1
-rw-r--r--src/core/hid/emulated_controller.cpp259
-rw-r--r--src/core/hid/emulated_controller.h6
-rw-r--r--src/core/hid/input_converter.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp6
-rw-r--r--src/input_common/drivers/gc_adapter.cpp75
-rw-r--r--src/input_common/drivers/gc_adapter.h6
-rw-r--r--src/input_common/drivers/keyboard.cpp2
-rw-r--r--src/input_common/drivers/sdl_driver.cpp22
-rw-r--r--src/input_common/drivers/tas_input.cpp2
-rw-r--r--src/yuzu/configuration/configure_input_player_widget.cpp12
11 files changed, 240 insertions, 153 deletions
diff --git a/src/common/input.h b/src/common/input.h
index 3a28b77a7..8871a9d07 100644
--- a/src/common/input.h
+++ b/src/common/input.h
@@ -30,6 +30,7 @@ enum class InputType {
30}; 30};
31 31
32enum class BatteryLevel { 32enum class BatteryLevel {
33 None,
33 Empty, 34 Empty,
34 Critical, 35 Critical,
35 Low, 36 Low,
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 7ef6ef118..e102c9437 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -94,7 +94,6 @@ void EmulatedController::ReloadFromSettings() {
94void EmulatedController::ReloadInput() { 94void EmulatedController::ReloadInput() {
95 //LOG_ERROR(Service_HID, "reload config {}", NpadIdTypeToIndex(npad_id_type)); 95 //LOG_ERROR(Service_HID, "reload config {}", NpadIdTypeToIndex(npad_id_type));
96 // If you load any device here add the equivalent to the UnloadInput() function 96 // If you load any device here add the equivalent to the UnloadInput() function
97 const auto player_index = NpadIdTypeToIndex(npad_id_type);
98 const auto left_side = button_params[Settings::NativeButton::ZL]; 97 const auto left_side = button_params[Settings::NativeButton::ZL];
99 const auto right_side = button_params[Settings::NativeButton::ZR]; 98 const auto right_side = button_params[Settings::NativeButton::ZR];
100 99
@@ -337,120 +336,130 @@ void EmulatedController::SetButton(Input::CallbackStatus callback, std::size_t i
337 if (index >= controller.button_values.size()) { 336 if (index >= controller.button_values.size()) {
338 return; 337 return;
339 } 338 }
340 std::lock_guard lock{mutex}; 339 {
341 bool value_changed = false; 340 std::lock_guard lock{mutex};
342 const auto new_status = TransformToButton(callback); 341 bool value_changed = false;
343 auto& current_status = controller.button_values[index]; 342 const auto new_status = TransformToButton(callback);
344 current_status.toggle = new_status.toggle; 343 auto& current_status = controller.button_values[index];
345 344 current_status.toggle = new_status.toggle;
346 // Update button status with current
347 if (!current_status.toggle) {
348 current_status.locked = false;
349 if (current_status.value != new_status.value) {
350 current_status.value = new_status.value;
351 value_changed = true;
352 }
353 } else {
354 // Toggle button and lock status
355 if (new_status.value && !current_status.locked) {
356 current_status.locked = true;
357 current_status.value = !current_status.value;
358 value_changed = true;
359 }
360 345
361 // Unlock button ready for next press 346 // Update button status with current
362 if (!new_status.value && current_status.locked) { 347 if (!current_status.toggle) {
363 current_status.locked = false; 348 current_status.locked = false;
349 if (current_status.value != new_status.value) {
350 current_status.value = new_status.value;
351 value_changed = true;
352 }
353 } else {
354 // Toggle button and lock status
355 if (new_status.value && !current_status.locked) {
356 current_status.locked = true;
357 current_status.value = !current_status.value;
358 value_changed = true;
359 }
360
361 // Unlock button ready for next press
362 if (!new_status.value && current_status.locked) {
363 current_status.locked = false;
364 }
364 } 365 }
365 }
366 366
367 if (!value_changed) { 367 if (!value_changed) {
368 return; 368 return;
369 } 369 }
370 370
371 if (is_configuring) { 371 if (is_configuring) {
372 controller.npad_button_state.raw = NpadButton::None; 372 controller.npad_button_state.raw = NpadButton::None;
373 controller.debug_pad_button_state.raw = 0; 373 controller.debug_pad_button_state.raw = 0;
374 TriggerOnChange(ControllerTriggerType::Button); 374 TriggerOnChange(ControllerTriggerType::Button, false);
375 return; 375 return;
376 } 376 }
377 377
378 switch (index) { 378 switch (index) {
379 case Settings::NativeButton::A: 379 case Settings::NativeButton::A:
380 controller.npad_button_state.a.Assign(current_status.value); 380 controller.npad_button_state.a.Assign(current_status.value);
381 controller.debug_pad_button_state.a.Assign(current_status.value); 381 controller.debug_pad_button_state.a.Assign(current_status.value);
382 break; 382 break;
383 case Settings::NativeButton::B: 383 case Settings::NativeButton::B:
384 controller.npad_button_state.b.Assign(current_status.value); 384 controller.npad_button_state.b.Assign(current_status.value);
385 controller.debug_pad_button_state.b.Assign(current_status.value); 385 controller.debug_pad_button_state.b.Assign(current_status.value);
386 break; 386 break;
387 case Settings::NativeButton::X: 387 case Settings::NativeButton::X:
388 controller.npad_button_state.x.Assign(current_status.value); 388 controller.npad_button_state.x.Assign(current_status.value);
389 controller.debug_pad_button_state.x.Assign(current_status.value); 389 controller.debug_pad_button_state.x.Assign(current_status.value);
390 break; 390 break;
391 case Settings::NativeButton::Y: 391 case Settings::NativeButton::Y:
392 controller.npad_button_state.y.Assign(current_status.value); 392 controller.npad_button_state.y.Assign(current_status.value);
393 controller.debug_pad_button_state.y.Assign(current_status.value); 393 controller.debug_pad_button_state.y.Assign(current_status.value);
394 break; 394 break;
395 case Settings::NativeButton::LStick: 395 case Settings::NativeButton::LStick:
396 controller.npad_button_state.stick_l.Assign(current_status.value); 396 controller.npad_button_state.stick_l.Assign(current_status.value);
397 break; 397 break;
398 case Settings::NativeButton::RStick: 398 case Settings::NativeButton::RStick:
399 controller.npad_button_state.stick_r.Assign(current_status.value); 399 controller.npad_button_state.stick_r.Assign(current_status.value);
400 break; 400 break;
401 case Settings::NativeButton::L: 401 case Settings::NativeButton::L:
402 controller.npad_button_state.l.Assign(current_status.value); 402 controller.npad_button_state.l.Assign(current_status.value);
403 controller.debug_pad_button_state.l.Assign(current_status.value); 403 controller.debug_pad_button_state.l.Assign(current_status.value);
404 break; 404 break;
405 case Settings::NativeButton::R: 405 case Settings::NativeButton::R:
406 controller.npad_button_state.r.Assign(current_status.value); 406 controller.npad_button_state.r.Assign(current_status.value);
407 controller.debug_pad_button_state.r.Assign(current_status.value); 407 controller.debug_pad_button_state.r.Assign(current_status.value);
408 break; 408 break;
409 case Settings::NativeButton::ZL: 409 case Settings::NativeButton::ZL:
410 controller.npad_button_state.zl.Assign(current_status.value); 410 controller.npad_button_state.zl.Assign(current_status.value);
411 controller.debug_pad_button_state.zl.Assign(current_status.value); 411 controller.debug_pad_button_state.zl.Assign(current_status.value);
412 break; 412 break;
413 case Settings::NativeButton::ZR: 413 case Settings::NativeButton::ZR:
414 controller.npad_button_state.zr.Assign(current_status.value); 414 controller.npad_button_state.zr.Assign(current_status.value);
415 controller.debug_pad_button_state.zr.Assign(current_status.value); 415 controller.debug_pad_button_state.zr.Assign(current_status.value);
416 break; 416 break;
417 case Settings::NativeButton::Plus: 417 case Settings::NativeButton::Plus:
418 controller.npad_button_state.plus.Assign(current_status.value); 418 controller.npad_button_state.plus.Assign(current_status.value);
419 controller.debug_pad_button_state.plus.Assign(current_status.value); 419 controller.debug_pad_button_state.plus.Assign(current_status.value);
420 break; 420 break;
421 case Settings::NativeButton::Minus: 421 case Settings::NativeButton::Minus:
422 controller.npad_button_state.minus.Assign(current_status.value); 422 controller.npad_button_state.minus.Assign(current_status.value);
423 controller.debug_pad_button_state.minus.Assign(current_status.value); 423 controller.debug_pad_button_state.minus.Assign(current_status.value);
424 break; 424 break;
425 case Settings::NativeButton::DLeft: 425 case Settings::NativeButton::DLeft:
426 controller.npad_button_state.left.Assign(current_status.value); 426 controller.npad_button_state.left.Assign(current_status.value);
427 controller.debug_pad_button_state.d_left.Assign(current_status.value); 427 controller.debug_pad_button_state.d_left.Assign(current_status.value);
428 break; 428 break;
429 case Settings::NativeButton::DUp: 429 case Settings::NativeButton::DUp:
430 controller.npad_button_state.up.Assign(current_status.value); 430 controller.npad_button_state.up.Assign(current_status.value);
431 controller.debug_pad_button_state.d_up.Assign(current_status.value); 431 controller.debug_pad_button_state.d_up.Assign(current_status.value);
432 break; 432 break;
433 case Settings::NativeButton::DRight: 433 case Settings::NativeButton::DRight:
434 controller.npad_button_state.right.Assign(current_status.value); 434 controller.npad_button_state.right.Assign(current_status.value);
435 controller.debug_pad_button_state.d_right.Assign(current_status.value); 435 controller.debug_pad_button_state.d_right.Assign(current_status.value);
436 break; 436 break;
437 case Settings::NativeButton::DDown: 437 case Settings::NativeButton::DDown:
438 controller.npad_button_state.down.Assign(current_status.value); 438 controller.npad_button_state.down.Assign(current_status.value);
439 controller.debug_pad_button_state.d_down.Assign(current_status.value); 439 controller.debug_pad_button_state.d_down.Assign(current_status.value);
440 break; 440 break;
441 case Settings::NativeButton::SL: 441 case Settings::NativeButton::SL:
442 controller.npad_button_state.left_sl.Assign(current_status.value); 442 controller.npad_button_state.left_sl.Assign(current_status.value);
443 controller.npad_button_state.right_sl.Assign(current_status.value); 443 controller.npad_button_state.right_sl.Assign(current_status.value);
444 break; 444 break;
445 case Settings::NativeButton::SR: 445 case Settings::NativeButton::SR:
446 controller.npad_button_state.left_sr.Assign(current_status.value); 446 controller.npad_button_state.left_sr.Assign(current_status.value);
447 controller.npad_button_state.right_sr.Assign(current_status.value); 447 controller.npad_button_state.right_sr.Assign(current_status.value);
448 break; 448 break;
449 case Settings::NativeButton::Home: 449 case Settings::NativeButton::Home:
450 case Settings::NativeButton::Screenshot: 450 case Settings::NativeButton::Screenshot:
451 break; 451 break;
452 }
453 }
454 if (!is_connected) {
455 if (npad_id_type == NpadIdType::Player1 && npad_type != NpadType::Handheld) {
456 Connect();
457 }
458 if (npad_id_type == NpadIdType::Handheld && npad_type == NpadType::Handheld) {
459 Connect();
460 }
452 } 461 }
453 TriggerOnChange(ControllerTriggerType::Button); 462 TriggerOnChange(ControllerTriggerType::Button, true);
454} 463}
455 464
456void EmulatedController::SetStick(Input::CallbackStatus callback, std::size_t index) { 465void EmulatedController::SetStick(Input::CallbackStatus callback, std::size_t index) {
@@ -463,7 +472,7 @@ void EmulatedController::SetStick(Input::CallbackStatus callback, std::size_t in
463 if (is_configuring) { 472 if (is_configuring) {
464 controller.analog_stick_state.left = {}; 473 controller.analog_stick_state.left = {};
465 controller.analog_stick_state.right = {}; 474 controller.analog_stick_state.right = {};
466 TriggerOnChange(ControllerTriggerType::Stick); 475 TriggerOnChange(ControllerTriggerType::Stick, false);
467 return; 476 return;
468 } 477 }
469 478
@@ -489,7 +498,7 @@ void EmulatedController::SetStick(Input::CallbackStatus callback, std::size_t in
489 break; 498 break;
490 } 499 }
491 500
492 TriggerOnChange(ControllerTriggerType::Stick); 501 TriggerOnChange(ControllerTriggerType::Stick, true);
493} 502}
494 503
495void EmulatedController::SetTrigger(Input::CallbackStatus callback, std::size_t index) { 504void EmulatedController::SetTrigger(Input::CallbackStatus callback, std::size_t index) {
@@ -502,7 +511,7 @@ void EmulatedController::SetTrigger(Input::CallbackStatus callback, std::size_t
502 if (is_configuring) { 511 if (is_configuring) {
503 controller.gc_trigger_state.left = 0; 512 controller.gc_trigger_state.left = 0;
504 controller.gc_trigger_state.right = 0; 513 controller.gc_trigger_state.right = 0;
505 TriggerOnChange(ControllerTriggerType::Trigger); 514 TriggerOnChange(ControllerTriggerType::Trigger, false);
506 return; 515 return;
507 } 516 }
508 517
@@ -520,7 +529,7 @@ void EmulatedController::SetTrigger(Input::CallbackStatus callback, std::size_t
520 break; 529 break;
521 } 530 }
522 531
523 TriggerOnChange(ControllerTriggerType::Trigger); 532 TriggerOnChange(ControllerTriggerType::Trigger, true);
524} 533}
525 534
526void EmulatedController::SetMotion(Input::CallbackStatus callback, std::size_t index) { 535void EmulatedController::SetMotion(Input::CallbackStatus callback, std::size_t index) {
@@ -546,7 +555,7 @@ void EmulatedController::SetMotion(Input::CallbackStatus callback, std::size_t i
546 emulated.UpdateOrientation(raw_status.delta_timestamp); 555 emulated.UpdateOrientation(raw_status.delta_timestamp);
547 556
548 if (is_configuring) { 557 if (is_configuring) {
549 TriggerOnChange(ControllerTriggerType::Motion); 558 TriggerOnChange(ControllerTriggerType::Motion, false);
550 return; 559 return;
551 } 560 }
552 561
@@ -557,7 +566,7 @@ void EmulatedController::SetMotion(Input::CallbackStatus callback, std::size_t i
557 motion.orientation = emulated.GetOrientation(); 566 motion.orientation = emulated.GetOrientation();
558 motion.is_at_rest = emulated.IsMoving(motion_sensitivity); 567 motion.is_at_rest = emulated.IsMoving(motion_sensitivity);
559 568
560 TriggerOnChange(ControllerTriggerType::Motion); 569 TriggerOnChange(ControllerTriggerType::Motion, true);
561} 570}
562 571
563void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t index) { 572void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t index) {
@@ -568,7 +577,7 @@ void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t
568 controller.battery_values[index] = TransformToBattery(callback); 577 controller.battery_values[index] = TransformToBattery(callback);
569 578
570 if (is_configuring) { 579 if (is_configuring) {
571 TriggerOnChange(ControllerTriggerType::Battery); 580 TriggerOnChange(ControllerTriggerType::Battery, false);
572 return; 581 return;
573 } 582 }
574 583
@@ -593,6 +602,7 @@ void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t
593 case Input::BatteryLevel::Empty: 602 case Input::BatteryLevel::Empty:
594 battery_level = 0; 603 battery_level = 0;
595 break; 604 break;
605 case Input::BatteryLevel::None:
596 case Input::BatteryLevel::Full: 606 case Input::BatteryLevel::Full:
597 default: 607 default:
598 is_powered = true; 608 is_powered = true;
@@ -623,7 +633,7 @@ void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t
623 }; 633 };
624 break; 634 break;
625 } 635 }
626 TriggerOnChange(ControllerTriggerType::Battery); 636 TriggerOnChange(ControllerTriggerType::Battery, true);
627} 637}
628 638
629bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { 639bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) {
@@ -677,7 +687,7 @@ void EmulatedController::Connect() {
677 std::lock_guard lock{mutex}; 687 std::lock_guard lock{mutex};
678 if (is_configuring) { 688 if (is_configuring) {
679 temporary_is_connected = true; 689 temporary_is_connected = true;
680 TriggerOnChange(ControllerTriggerType::Connected); 690 TriggerOnChange(ControllerTriggerType::Connected,false);
681 return; 691 return;
682 } 692 }
683 693
@@ -687,7 +697,7 @@ void EmulatedController::Connect() {
687 is_connected = true; 697 is_connected = true;
688 } 698 }
689 LOG_ERROR(Service_HID, "Connected controller {}", NpadIdTypeToIndex(npad_id_type)); 699 LOG_ERROR(Service_HID, "Connected controller {}", NpadIdTypeToIndex(npad_id_type));
690 TriggerOnChange(ControllerTriggerType::Connected); 700 TriggerOnChange(ControllerTriggerType::Connected,true);
691} 701}
692 702
693void EmulatedController::Disconnect() { 703void EmulatedController::Disconnect() {
@@ -697,7 +707,7 @@ void EmulatedController::Disconnect() {
697 temporary_is_connected = false; 707 temporary_is_connected = false;
698 LOG_ERROR(Service_HID, "Disconnected temporal controller {}", 708 LOG_ERROR(Service_HID, "Disconnected temporal controller {}",
699 NpadIdTypeToIndex(npad_id_type)); 709 NpadIdTypeToIndex(npad_id_type));
700 TriggerOnChange(ControllerTriggerType::Disconnected); 710 TriggerOnChange(ControllerTriggerType::Disconnected,false);
701 return; 711 return;
702 } 712 }
703 713
@@ -707,7 +717,7 @@ void EmulatedController::Disconnect() {
707 is_connected = false; 717 is_connected = false;
708 } 718 }
709 LOG_ERROR(Service_HID, "Disconnected controller {}", NpadIdTypeToIndex(npad_id_type)); 719 LOG_ERROR(Service_HID, "Disconnected controller {}", NpadIdTypeToIndex(npad_id_type));
710 TriggerOnChange(ControllerTriggerType::Disconnected); 720 TriggerOnChange(ControllerTriggerType::Disconnected,true);
711} 721}
712 722
713bool EmulatedController::IsConnected(bool temporary) const { 723bool EmulatedController::IsConnected(bool temporary) const {
@@ -741,7 +751,7 @@ void EmulatedController::SetNpadType(NpadType npad_type_) {
741 return; 751 return;
742 } 752 }
743 temporary_npad_type = npad_type_; 753 temporary_npad_type = npad_type_;
744 TriggerOnChange(ControllerTriggerType::Type); 754 TriggerOnChange(ControllerTriggerType::Type,false);
745 return; 755 return;
746 } 756 }
747 757
@@ -754,7 +764,7 @@ void EmulatedController::SetNpadType(NpadType npad_type_) {
754 } 764 }
755 npad_type = npad_type_; 765 npad_type = npad_type_;
756 } 766 }
757 TriggerOnChange(ControllerTriggerType::Type); 767 TriggerOnChange(ControllerTriggerType::Type,true);
758} 768}
759 769
760LedPattern EmulatedController::GetLedPattern() const { 770LedPattern EmulatedController::GetLedPattern() const {
@@ -844,9 +854,12 @@ BatteryLevelState EmulatedController::GetBattery() const {
844 return controller.battery_state; 854 return controller.battery_state;
845} 855}
846 856
847void EmulatedController::TriggerOnChange(ControllerTriggerType type) { 857void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_service_update) {
848 for (const std::pair<int, ControllerUpdateCallback> poller_pair : callback_list) { 858 for (const std::pair<int, ControllerUpdateCallback> poller_pair : callback_list) {
849 const ControllerUpdateCallback& poller = poller_pair.second; 859 const ControllerUpdateCallback& poller = poller_pair.second;
860 if (!is_service_update && poller.is_service) {
861 continue;
862 }
850 if (poller.on_change) { 863 if (poller.on_change) {
851 poller.on_change(type); 864 poller.on_change(type);
852 } 865 }
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
index 6a6dc1892..3a0b20cf8 100644
--- a/src/core/hid/emulated_controller.h
+++ b/src/core/hid/emulated_controller.h
@@ -113,6 +113,7 @@ enum class ControllerTriggerType {
113 113
114struct ControllerUpdateCallback { 114struct ControllerUpdateCallback {
115 std::function<void(ControllerTriggerType)> on_change; 115 std::function<void(ControllerTriggerType)> on_change;
116 bool is_service;
116}; 117};
117 118
118class EmulatedController { 119class EmulatedController {
@@ -325,9 +326,10 @@ private:
325 326
326 /** 327 /**
327 * Triggers a callback that something has changed on the controller status 328 * Triggers a callback that something has changed on the controller status
328 * @param Input type of the event to trigger 329 * @param type: Input type of the event to trigger
330 * @param is_service_update: indicates if this event should be sended to only services
329 */ 331 */
330 void TriggerOnChange(ControllerTriggerType type); 332 void TriggerOnChange(ControllerTriggerType type, bool is_service_update);
331 333
332 NpadIdType npad_id_type; 334 NpadIdType npad_id_type;
333 NpadType npad_type{NpadType::None}; 335 NpadType npad_type{NpadType::None};
diff --git a/src/core/hid/input_converter.cpp b/src/core/hid/input_converter.cpp
index 5834622e9..128a48ec9 100644
--- a/src/core/hid/input_converter.cpp
+++ b/src/core/hid/input_converter.cpp
@@ -10,7 +10,7 @@
10namespace Core::HID { 10namespace Core::HID {
11 11
12Input::BatteryStatus TransformToBattery(const Input::CallbackStatus& callback) { 12Input::BatteryStatus TransformToBattery(const Input::CallbackStatus& callback) {
13 Input::BatteryStatus battery{}; 13 Input::BatteryStatus battery{Input::BatteryStatus::None};
14 switch (callback.type) { 14 switch (callback.type) {
15 case Input::InputType::Analog: 15 case Input::InputType::Analog:
16 case Input::InputType::Trigger: { 16 case Input::InputType::Trigger: {
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 144abab65..6b9d6d11c 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -104,7 +104,10 @@ Controller_NPad::Controller_NPad(Core::System& system_,
104 controller.vibration[0].latest_vibration_value = DEFAULT_VIBRATION_VALUE; 104 controller.vibration[0].latest_vibration_value = DEFAULT_VIBRATION_VALUE;
105 controller.vibration[1].latest_vibration_value = DEFAULT_VIBRATION_VALUE; 105 controller.vibration[1].latest_vibration_value = DEFAULT_VIBRATION_VALUE;
106 Core::HID::ControllerUpdateCallback engine_callback{ 106 Core::HID::ControllerUpdateCallback engine_callback{
107 [this, i](Core::HID::ControllerTriggerType type) { ControllerUpdate(type, i); }}; 107 .on_change = [this,
108 i](Core::HID::ControllerTriggerType type) { ControllerUpdate(type, i); },
109 .is_service = true,
110 };
108 controller.callback_key = controller.device->SetCallback(engine_callback); 111 controller.callback_key = controller.device->SetCallback(engine_callback);
109 } 112 }
110} 113}
@@ -283,7 +286,6 @@ void Controller_NPad::OnInit() {
283 286
284 // Prefill controller buffers 287 // Prefill controller buffers
285 for (auto& controller : controller_data) { 288 for (auto& controller : controller_data) {
286 NPadGenericState dummy_pad_state{};
287 auto& npad = controller.shared_memory_entry; 289 auto& npad = controller.shared_memory_entry;
288 for (std::size_t i = 0; i < 19; ++i) { 290 for (std::size_t i = 0; i < 19; ++i) {
289 WriteEmptyEntry(npad); 291 WriteEmptyEntry(npad);
diff --git a/src/input_common/drivers/gc_adapter.cpp b/src/input_common/drivers/gc_adapter.cpp
index 4a56abb99..4fb6ab5af 100644
--- a/src/input_common/drivers/gc_adapter.cpp
+++ b/src/input_common/drivers/gc_adapter.cpp
@@ -150,7 +150,10 @@ void GCAdapter::UpdatePadType(std::size_t port, ControllerTypes pad_type) {
150 return; 150 return;
151 } 151 }
152 // Device changed reset device and set new type 152 // Device changed reset device and set new type
153 pads[port] = {}; 153 pads[port].axis_origin = {};
154 pads[port].reset_origin_counter = {};
155 pads[port].enable_vibration = {};
156 pads[port].rumble_amplitude = {};
154 pads[port].type = pad_type; 157 pads[port].type = pad_type;
155} 158}
156 159
@@ -396,12 +399,11 @@ std::vector<Common::ParamPackage> GCAdapter::GetInputDevices() const {
396 if (!DeviceConnected(port)) { 399 if (!DeviceConnected(port)) {
397 continue; 400 continue;
398 } 401 }
399 const std::string name = fmt::format("Gamecube Controller {}", port + 1); 402 Common::ParamPackage identifier{};
400 devices.emplace_back(Common::ParamPackage{ 403 identifier.Set("engine", GetEngineName());
401 {"engine", "gcpad"}, 404 identifier.Set("display", fmt::format("Gamecube Controller {}", port + 1));
402 {"display", std::move(name)}, 405 identifier.Set("port", static_cast<int>(port));
403 {"port", std::to_string(port)}, 406 devices.emplace_back(identifier);
404 });
405 } 407 }
406 return devices; 408 return devices;
407} 409}
@@ -431,7 +433,8 @@ ButtonMapping GCAdapter::GetButtonMappingForDevice(const Common::ParamPackage& p
431 433
432 ButtonMapping mapping{}; 434 ButtonMapping mapping{};
433 for (const auto& [switch_button, gcadapter_button] : switch_to_gcadapter_button) { 435 for (const auto& [switch_button, gcadapter_button] : switch_to_gcadapter_button) {
434 Common::ParamPackage button_params({{"engine", "gcpad"}}); 436 Common::ParamPackage button_params{};
437 button_params.Set("engine", GetEngineName());
435 button_params.Set("port", params.Get("port", 0)); 438 button_params.Set("port", params.Get("port", 0));
436 button_params.Set("button", static_cast<int>(gcadapter_button)); 439 button_params.Set("button", static_cast<int>(gcadapter_button));
437 mapping.insert_or_assign(switch_button, std::move(button_params)); 440 mapping.insert_or_assign(switch_button, std::move(button_params));
@@ -444,7 +447,8 @@ ButtonMapping GCAdapter::GetButtonMappingForDevice(const Common::ParamPackage& p
444 {Settings::NativeButton::ZR, PadButton::TriggerR, PadAxes::TriggerRight}, 447 {Settings::NativeButton::ZR, PadButton::TriggerR, PadAxes::TriggerRight},
445 }; 448 };
446 for (const auto& [switch_button, gcadapter_buton, gcadapter_axis] : switch_to_gcadapter_axis) { 449 for (const auto& [switch_button, gcadapter_buton, gcadapter_axis] : switch_to_gcadapter_axis) {
447 Common::ParamPackage button_params({{"engine", "gcpad"}}); 450 Common::ParamPackage button_params{};
451 button_params.Set("engine", GetEngineName());
448 button_params.Set("port", params.Get("port", 0)); 452 button_params.Set("port", params.Get("port", 0));
449 button_params.Set("button", static_cast<s32>(gcadapter_buton)); 453 button_params.Set("button", static_cast<s32>(gcadapter_buton));
450 button_params.Set("axis", static_cast<s32>(gcadapter_axis)); 454 button_params.Set("axis", static_cast<s32>(gcadapter_axis));
@@ -463,13 +467,13 @@ AnalogMapping GCAdapter::GetAnalogMappingForDevice(const Common::ParamPackage& p
463 467
464 AnalogMapping mapping = {}; 468 AnalogMapping mapping = {};
465 Common::ParamPackage left_analog_params; 469 Common::ParamPackage left_analog_params;
466 left_analog_params.Set("engine", "gcpad"); 470 left_analog_params.Set("engine", GetEngineName());
467 left_analog_params.Set("port", params.Get("port", 0)); 471 left_analog_params.Set("port", params.Get("port", 0));
468 left_analog_params.Set("axis_x", static_cast<int>(PadAxes::StickX)); 472 left_analog_params.Set("axis_x", static_cast<int>(PadAxes::StickX));
469 left_analog_params.Set("axis_y", static_cast<int>(PadAxes::StickY)); 473 left_analog_params.Set("axis_y", static_cast<int>(PadAxes::StickY));
470 mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params)); 474 mapping.insert_or_assign(Settings::NativeAnalog::LStick, std::move(left_analog_params));
471 Common::ParamPackage right_analog_params; 475 Common::ParamPackage right_analog_params;
472 right_analog_params.Set("engine", "gcpad"); 476 right_analog_params.Set("engine", GetEngineName());
473 right_analog_params.Set("port", params.Get("port", 0)); 477 right_analog_params.Set("port", params.Get("port", 0));
474 right_analog_params.Set("axis_x", static_cast<int>(PadAxes::SubstickX)); 478 right_analog_params.Set("axis_x", static_cast<int>(PadAxes::SubstickX));
475 right_analog_params.Set("axis_y", static_cast<int>(PadAxes::SubstickY)); 479 right_analog_params.Set("axis_y", static_cast<int>(PadAxes::SubstickY));
@@ -477,9 +481,56 @@ AnalogMapping GCAdapter::GetAnalogMappingForDevice(const Common::ParamPackage& p
477 return mapping; 481 return mapping;
478} 482}
479 483
484std::string GCAdapter::GetUIButtonName(const Common::ParamPackage& params) const {
485 PadButton button = static_cast<PadButton>(params.Get("button", 0));
486 switch (button) {
487 case PadButton::ButtonLeft:
488 return "left";
489 break;
490 case PadButton::ButtonRight:
491 return "right";
492 break;
493 case PadButton::ButtonDown:
494 return "down";
495 break;
496 case PadButton::ButtonUp:
497 return "up";
498 break;
499 case PadButton::TriggerZ:
500 return "Z";
501 break;
502 case PadButton::TriggerR:
503 return "R";
504 break;
505 case PadButton::TriggerL:
506 return "L";
507 break;
508 case PadButton::ButtonA:
509 return "A";
510 break;
511 case PadButton::ButtonB:
512 return "B";
513 break;
514 case PadButton::ButtonX:
515 return "X";
516 break;
517 case PadButton::ButtonY:
518 return "Y";
519 break;
520 case PadButton::ButtonStart:
521 return "start";
522 break;
523 default:
524 return "Unkown GC";
525 }
526}
527
480std::string GCAdapter::GetUIName(const Common::ParamPackage& params) const { 528std::string GCAdapter::GetUIName(const Common::ParamPackage& params) const {
481 if (params.Has("button")) { 529 if (params.Has("button")) {
482 return fmt::format("Button {}", params.Get("button", 0)); 530 return fmt::format("Button {}", GetUIButtonName(params));
531 }
532 if (params.Has("axis")) {
533 return fmt::format("Axis {}", params.Get("axis",0));
483 } 534 }
484 535
485 return "Bad GC Adapter"; 536 return "Bad GC Adapter";
diff --git a/src/input_common/drivers/gc_adapter.h b/src/input_common/drivers/gc_adapter.h
index dd0e4aa1d..b82e4803d 100644
--- a/src/input_common/drivers/gc_adapter.h
+++ b/src/input_common/drivers/gc_adapter.h
@@ -105,8 +105,12 @@ private:
105 void Reset(); 105 void Reset();
106 106
107 void UpdateVibrations(); 107 void UpdateVibrations();
108 // Updates vibration state of all controllers 108
109 /// Updates vibration state of all controllers
109 void SendVibrations(); 110 void SendVibrations();
111
112 std::string GetUIButtonName(const Common::ParamPackage& params) const;
113
110 std::unique_ptr<LibUSBDeviceHandle> usb_adapter_handle; 114 std::unique_ptr<LibUSBDeviceHandle> usb_adapter_handle;
111 std::array<GCController, 4> pads; 115 std::array<GCController, 4> pads;
112 116
diff --git a/src/input_common/drivers/keyboard.cpp b/src/input_common/drivers/keyboard.cpp
index b00a4b8d9..85a781a30 100644
--- a/src/input_common/drivers/keyboard.cpp
+++ b/src/input_common/drivers/keyboard.cpp
@@ -26,7 +26,7 @@ void Keyboard::ReleaseAllKeys() {
26std::vector<Common::ParamPackage> Keyboard::GetInputDevices() const { 26std::vector<Common::ParamPackage> Keyboard::GetInputDevices() const {
27 std::vector<Common::ParamPackage> devices; 27 std::vector<Common::ParamPackage> devices;
28 devices.emplace_back(Common::ParamPackage{ 28 devices.emplace_back(Common::ParamPackage{
29 {"engine", "keyboard"}, 29 {"engine", GetEngineName()},
30 {"display", "Keyboard Only"}, 30 {"display", "Keyboard Only"},
31 }); 31 });
32 return devices; 32 return devices;
diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp
index f7f03c5f2..cee2d965f 100644
--- a/src/input_common/drivers/sdl_driver.cpp
+++ b/src/input_common/drivers/sdl_driver.cpp
@@ -305,6 +305,7 @@ void SDLDriver::InitJoystick(int joystick_index) {
305 if (joystick_map.find(guid) == joystick_map.end()) { 305 if (joystick_map.find(guid) == joystick_map.end()) {
306 auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); 306 auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller);
307 PreSetController(joystick->GetPadIdentifier()); 307 PreSetController(joystick->GetPadIdentifier());
308 SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel());
308 joystick_map[guid].emplace_back(std::move(joystick)); 309 joystick_map[guid].emplace_back(std::move(joystick));
309 return; 310 return;
310 } 311 }
@@ -322,6 +323,7 @@ void SDLDriver::InitJoystick(int joystick_index) {
322 const int port = static_cast<int>(joystick_guid_list.size()); 323 const int port = static_cast<int>(joystick_guid_list.size());
323 auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller); 324 auto joystick = std::make_shared<SDLJoystick>(guid, port, sdl_joystick, sdl_gamecontroller);
324 PreSetController(joystick->GetPadIdentifier()); 325 PreSetController(joystick->GetPadIdentifier());
326 SetBattery(joystick->GetPadIdentifier(), joystick->GetBatteryLevel());
325 joystick_guid_list.emplace_back(std::move(joystick)); 327 joystick_guid_list.emplace_back(std::move(joystick));
326} 328}
327 329
@@ -472,7 +474,7 @@ std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const {
472 const std::string name = 474 const std::string name =
473 fmt::format("{} {}", joystick->GetControllerName(), joystick->GetPort()); 475 fmt::format("{} {}", joystick->GetControllerName(), joystick->GetPort());
474 devices.emplace_back(Common::ParamPackage{ 476 devices.emplace_back(Common::ParamPackage{
475 {"engine", "sdl"}, 477 {"engine", GetEngineName()},
476 {"display", std::move(name)}, 478 {"display", std::move(name)},
477 {"guid", joystick->GetGUID()}, 479 {"guid", joystick->GetGUID()},
478 {"port", std::to_string(joystick->GetPort())}, 480 {"port", std::to_string(joystick->GetPort())},
@@ -495,7 +497,7 @@ std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const {
495 const std::string name = 497 const std::string name =
496 fmt::format("{} {}", "Nintendo Dual Joy-Con", joystick->GetPort()); 498 fmt::format("{} {}", "Nintendo Dual Joy-Con", joystick->GetPort());
497 devices.emplace_back(Common::ParamPackage{ 499 devices.emplace_back(Common::ParamPackage{
498 {"engine", "sdl"}, 500 {"engine", GetEngineName()},
499 {"display", std::move(name)}, 501 {"display", std::move(name)},
500 {"guid", joystick->GetGUID()}, 502 {"guid", joystick->GetGUID()},
501 {"guid2", joystick2->GetGUID()}, 503 {"guid2", joystick2->GetGUID()},
@@ -527,7 +529,8 @@ Input::VibrationError SDLDriver::SetRumble(const PadIdentifier& identifier,
527} 529}
528Common::ParamPackage SDLDriver::BuildAnalogParamPackageForButton(int port, std::string guid, 530Common::ParamPackage SDLDriver::BuildAnalogParamPackageForButton(int port, std::string guid,
529 s32 axis, float value) const { 531 s32 axis, float value) const {
530 Common::ParamPackage params({{"engine", "sdl"}}); 532 Common::ParamPackage params{};
533 params.Set("engine", GetEngineName());
531 params.Set("port", port); 534 params.Set("port", port);
532 params.Set("guid", std::move(guid)); 535 params.Set("guid", std::move(guid));
533 params.Set("axis", axis); 536 params.Set("axis", axis);
@@ -538,7 +541,8 @@ Common::ParamPackage SDLDriver::BuildAnalogParamPackageForButton(int port, std::
538 541
539Common::ParamPackage SDLDriver::BuildButtonParamPackageForButton(int port, std::string guid, 542Common::ParamPackage SDLDriver::BuildButtonParamPackageForButton(int port, std::string guid,
540 s32 button) const { 543 s32 button) const {
541 Common::ParamPackage params({{"engine", "sdl"}}); 544 Common::ParamPackage params{};
545 params.Set("engine", GetEngineName());
542 params.Set("port", port); 546 params.Set("port", port);
543 params.Set("guid", std::move(guid)); 547 params.Set("guid", std::move(guid));
544 params.Set("button", button); 548 params.Set("button", button);
@@ -547,8 +551,8 @@ Common::ParamPackage SDLDriver::BuildButtonParamPackageForButton(int port, std::
547 551
548Common::ParamPackage SDLDriver::BuildHatParamPackageForButton(int port, std::string guid, s32 hat, 552Common::ParamPackage SDLDriver::BuildHatParamPackageForButton(int port, std::string guid, s32 hat,
549 u8 value) const { 553 u8 value) const {
550 Common::ParamPackage params({{"engine", "sdl"}}); 554 Common::ParamPackage params{};
551 555 params.Set("engine", GetEngineName());
552 params.Set("port", port); 556 params.Set("port", port);
553 params.Set("guid", std::move(guid)); 557 params.Set("guid", std::move(guid));
554 params.Set("hat", hat); 558 params.Set("hat", hat);
@@ -557,7 +561,9 @@ Common::ParamPackage SDLDriver::BuildHatParamPackageForButton(int port, std::str
557} 561}
558 562
559Common::ParamPackage SDLDriver::BuildMotionParam(int port, std::string guid) const { 563Common::ParamPackage SDLDriver::BuildMotionParam(int port, std::string guid) const {
560 Common::ParamPackage params({{"engine", "sdl"}, {"motion", "0"}}); 564 Common::ParamPackage params{};
565 params.Set("engine", GetEngineName());
566 params.Set("motion", 0);
561 params.Set("port", port); 567 params.Set("port", port);
562 params.Set("guid", std::move(guid)); 568 params.Set("guid", std::move(guid));
563 return params; 569 return params;
@@ -583,7 +589,7 @@ Common::ParamPackage SDLDriver::BuildParamPackageForAnalog(PadIdentifier identif
583 int axis_y, float offset_x, 589 int axis_y, float offset_x,
584 float offset_y) const { 590 float offset_y) const {
585 Common::ParamPackage params; 591 Common::ParamPackage params;
586 params.Set("engine", "sdl"); 592 params.Set("engine", GetEngineName());
587 params.Set("port", static_cast<int>(identifier.port)); 593 params.Set("port", static_cast<int>(identifier.port));
588 params.Set("guid", identifier.guid.Format()); 594 params.Set("guid", identifier.guid.Format());
589 params.Set("axis_x", axis_x); 595 params.Set("axis_x", axis_x);
diff --git a/src/input_common/drivers/tas_input.cpp b/src/input_common/drivers/tas_input.cpp
index 5e2101b27..7e7a1d58f 100644
--- a/src/input_common/drivers/tas_input.cpp
+++ b/src/input_common/drivers/tas_input.cpp
@@ -127,7 +127,7 @@ void Tas::WriteTasFile(std::u8string file_name) {
127 std::string output_text; 127 std::string output_text;
128 for (size_t frame = 0; frame < record_commands.size(); frame++) { 128 for (size_t frame = 0; frame < record_commands.size(); frame++) {
129 const TASCommand& line = record_commands[frame]; 129 const TASCommand& line = record_commands[frame];
130 output_text += fmt::format("{} {} {} {} {}\n", frame, WriteCommandButtons(line.buttons), 130 output_text += fmt::format("{} {} {} {}\n", frame, WriteCommandButtons(line.buttons),
131 WriteCommandAxis(line.l_axis), WriteCommandAxis(line.r_axis)); 131 WriteCommandAxis(line.l_axis), WriteCommandAxis(line.r_axis));
132 } 132 }
133 const auto bytes_written = Common::FS::WriteStringToFile( 133 const auto bytes_written = Common::FS::WriteStringToFile(
diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp
index 3b79b6076..93f7eddc9 100644
--- a/src/yuzu/configuration/configure_input_player_widget.cpp
+++ b/src/yuzu/configuration/configure_input_player_widget.cpp
@@ -27,7 +27,9 @@ void PlayerControlPreview::SetController(Core::HID::EmulatedController* controll
27 is_controller_set = true; 27 is_controller_set = true;
28 controller = controller_; 28 controller = controller_;
29 Core::HID::ControllerUpdateCallback engine_callback{ 29 Core::HID::ControllerUpdateCallback engine_callback{
30 [this](Core::HID::ControllerTriggerType type) { ControllerUpdate(type); }}; 30 .on_change = [this](Core::HID::ControllerTriggerType type) { ControllerUpdate(type); },
31 .is_service = false,
32 };
31 callback_key = controller->SetCallback(engine_callback); 33 callback_key = controller->SetCallback(engine_callback);
32 ControllerUpdate(Core::HID::ControllerTriggerType::All); 34 ControllerUpdate(Core::HID::ControllerTriggerType::All);
33} 35}
@@ -810,7 +812,7 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
810 DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f); 812 DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f);
811 813
812 // Draw battery 814 // Draw battery
813 DrawBattery(p, center + QPoint(-30, -165), battery_values[0]); 815 DrawBattery(p, center + QPoint(-30, -160), battery_values[0]);
814} 816}
815 817
816void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) { 818void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) {
@@ -2655,6 +2657,9 @@ void PlayerControlPreview::DrawTriggerButton(QPainter& p, const QPointF center,
2655} 2657}
2656 2658
2657void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center, Input::BatteryLevel battery) { 2659void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center, Input::BatteryLevel battery) {
2660 if (battery == Input::BatteryLevel::None) {
2661 return;
2662 }
2658 p.setPen(colors.outline); 2663 p.setPen(colors.outline);
2659 p.setBrush(colors.transparent); 2664 p.setBrush(colors.transparent);
2660 p.drawRect(center.x(), center.y(), 56, 20); 2665 p.drawRect(center.x(), center.y(), 56, 20);
@@ -2669,6 +2674,7 @@ void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center, Input::Batte
2669 p.drawRect(center.x() + 42, center.y(), 14, 20); 2674 p.drawRect(center.x() + 42, center.y(), 14, 20);
2670 p.drawRect(center.x() + 28, center.y(), 14, 20); 2675 p.drawRect(center.x() + 28, center.y(), 14, 20);
2671 p.drawRect(center.x() + 14, center.y(), 14, 20); 2676 p.drawRect(center.x() + 14, center.y(), 14, 20);
2677 p.drawRect(center.x(), center.y(), 14, 20);
2672 break; 2678 break;
2673 case Input::BatteryLevel::Medium: 2679 case Input::BatteryLevel::Medium:
2674 p.drawRect(center.x() + 28, center.y(), 14, 20); 2680 p.drawRect(center.x() + 28, center.y(), 14, 20);
@@ -2685,6 +2691,8 @@ void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center, Input::Batte
2685 case Input::BatteryLevel::Empty: 2691 case Input::BatteryLevel::Empty:
2686 p.drawRect(center.x(), center.y(), 5, 20); 2692 p.drawRect(center.x(), center.y(), 5, 20);
2687 break; 2693 break;
2694 default:
2695 break;
2688 } 2696 }
2689} 2697}
2690 2698