diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/input.h | 1 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 259 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.h | 6 | ||||
| -rw-r--r-- | src/core/hid/input_converter.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 6 | ||||
| -rw-r--r-- | src/input_common/drivers/gc_adapter.cpp | 75 | ||||
| -rw-r--r-- | src/input_common/drivers/gc_adapter.h | 6 | ||||
| -rw-r--r-- | src/input_common/drivers/keyboard.cpp | 2 | ||||
| -rw-r--r-- | src/input_common/drivers/sdl_driver.cpp | 22 | ||||
| -rw-r--r-- | src/input_common/drivers/tas_input.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player_widget.cpp | 12 |
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 | ||
| 32 | enum class BatteryLevel { | 32 | enum 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() { | |||
| 94 | void EmulatedController::ReloadInput() { | 94 | void 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 | ||
| 456 | void EmulatedController::SetStick(Input::CallbackStatus callback, std::size_t index) { | 465 | void 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 | ||
| 495 | void EmulatedController::SetTrigger(Input::CallbackStatus callback, std::size_t index) { | 504 | void 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 | ||
| 526 | void EmulatedController::SetMotion(Input::CallbackStatus callback, std::size_t index) { | 535 | void 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 | ||
| 563 | void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t index) { | 572 | void 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 | ||
| 629 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { | 639 | bool 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 | ||
| 693 | void EmulatedController::Disconnect() { | 703 | void 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 | ||
| 713 | bool EmulatedController::IsConnected(bool temporary) const { | 723 | bool 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 | ||
| 760 | LedPattern EmulatedController::GetLedPattern() const { | 770 | LedPattern 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 | ||
| 847 | void EmulatedController::TriggerOnChange(ControllerTriggerType type) { | 857 | void 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 | ||
| 114 | struct ControllerUpdateCallback { | 114 | struct ControllerUpdateCallback { |
| 115 | std::function<void(ControllerTriggerType)> on_change; | 115 | std::function<void(ControllerTriggerType)> on_change; |
| 116 | bool is_service; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | class EmulatedController { | 119 | class 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 @@ | |||
| 10 | namespace Core::HID { | 10 | namespace Core::HID { |
| 11 | 11 | ||
| 12 | Input::BatteryStatus TransformToBattery(const Input::CallbackStatus& callback) { | 12 | Input::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 | ||
| 484 | std::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 | |||
| 480 | std::string GCAdapter::GetUIName(const Common::ParamPackage& params) const { | 528 | std::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() { | |||
| 26 | std::vector<Common::ParamPackage> Keyboard::GetInputDevices() const { | 26 | std::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 | } |
| 528 | Common::ParamPackage SDLDriver::BuildAnalogParamPackageForButton(int port, std::string guid, | 530 | Common::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 | ||
| 539 | Common::ParamPackage SDLDriver::BuildButtonParamPackageForButton(int port, std::string guid, | 542 | Common::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 | ||
| 548 | Common::ParamPackage SDLDriver::BuildHatParamPackageForButton(int port, std::string guid, s32 hat, | 552 | Common::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 | ||
| 559 | Common::ParamPackage SDLDriver::BuildMotionParam(int port, std::string guid) const { | 563 | Common::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 | ||
| 816 | void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) { | 818 | void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) { |
| @@ -2655,6 +2657,9 @@ void PlayerControlPreview::DrawTriggerButton(QPainter& p, const QPointF center, | |||
| 2655 | } | 2657 | } |
| 2656 | 2658 | ||
| 2657 | void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center, Input::BatteryLevel battery) { | 2659 | void 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 | ||