summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-11-03 12:55:39 -0400
committerGravatar Zach Hilman2018-11-18 23:22:36 -0500
commit3a6cd5b3c8dec11cc88c6aebdc4773233f615c91 (patch)
tree980ef0304b375ddea0ef83c8786253e1a3548be7 /src/core
parentqt: Move controller button config to separate dialog (diff)
downloadyuzu-3a6cd5b3c8dec11cc88c6aebdc4773233f615c91.tar.gz
yuzu-3a6cd5b3c8dec11cc88c6aebdc4773233f615c91.tar.xz
yuzu-3a6cd5b3c8dec11cc88c6aebdc4773233f615c91.zip
hid: Use player-defined controller type as PREFERRED_CONTROLLER
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/hid/controllers/keyboard.cpp5
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp213
-rw-r--r--src/core/hle/service/hid/controllers/npad.h11
-rw-r--r--src/core/hle/service/hid/controllers/touchscreen.cpp6
-rw-r--r--src/core/settings.cpp50
-rw-r--r--src/core/settings.h44
6 files changed, 114 insertions, 215 deletions
diff --git a/src/core/hle/service/hid/controllers/keyboard.cpp b/src/core/hle/service/hid/controllers/keyboard.cpp
index 088f00b43..ca75adc2b 100644
--- a/src/core/hle/service/hid/controllers/keyboard.cpp
+++ b/src/core/hle/service/hid/controllers/keyboard.cpp
@@ -10,6 +10,7 @@
10 10
11namespace Service::HID { 11namespace Service::HID {
12constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3800; 12constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3800;
13constexpr u8 KEYS_PER_BYTE = 8;
13 14
14Controller_Keyboard::Controller_Keyboard() = default; 15Controller_Keyboard::Controller_Keyboard() = default;
15Controller_Keyboard::~Controller_Keyboard() = default; 16Controller_Keyboard::~Controller_Keyboard() = default;
@@ -37,8 +38,8 @@ void Controller_Keyboard::OnUpdate(u8* data, std::size_t size) {
37 cur_entry.sampling_number2 = cur_entry.sampling_number; 38 cur_entry.sampling_number2 = cur_entry.sampling_number;
38 39
39 for (std::size_t i = 0; i < keyboard_keys.size(); ++i) { 40 for (std::size_t i = 0; i < keyboard_keys.size(); ++i) {
40 for (std::size_t k = 0; k < 8; ++k) { 41 for (std::size_t k = 0; k < KEYS_PER_BYTE; ++k) {
41 cur_entry.key[i / 8] |= (keyboard_keys[i]->GetStatus() << k); 42 cur_entry.key[i / KEYS_PER_BYTE] |= (keyboard_keys[i]->GetStatus() << k);
42 } 43 }
43 } 44 }
44 45
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 911ba3574..46604887c 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -21,13 +21,9 @@ constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
21constexpr s32 HID_JOYSTICK_MIN = -0x7fff; 21constexpr s32 HID_JOYSTICK_MIN = -0x7fff;
22constexpr std::size_t NPAD_OFFSET = 0x9A00; 22constexpr std::size_t NPAD_OFFSET = 0x9A00;
23constexpr u32 BATTERY_FULL = 2; 23constexpr u32 BATTERY_FULL = 2;
24constexpr u32 NPAD_HANDHELD = 32;
25constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this?
26constexpr u32 MAX_NPAD_ID = 7; 24constexpr u32 MAX_NPAD_ID = 7;
27constexpr Controller_NPad::NPadControllerType PREFERRED_CONTROLLER =
28 Controller_NPad::NPadControllerType::JoyDual;
29constexpr std::array<u32, 10> npad_id_list{ 25constexpr std::array<u32, 10> npad_id_list{
30 0, 1, 2, 3, 4, 5, 6, 7, 32, 16, 26 0, 1, 2, 3, 4, 5, 6, 7, NPAD_HANDHELD, NPAD_UNKNOWN,
31}; 27};
32 28
33enum class JoystickId : std::size_t { 29enum class JoystickId : std::size_t {
@@ -51,7 +47,7 @@ static Controller_NPad::NPadControllerType MapSettingsTypeToNPad(Settings::Contr
51 } 47 }
52} 48}
53 49
54static std::size_t NPadIdToIndex(u32 npad_id) { 50std::size_t Controller_NPad::NPadIdToIndex(u32 npad_id) {
55 switch (npad_id) { 51 switch (npad_id) {
56 case 0: 52 case 0:
57 case 1: 53 case 1:
@@ -74,6 +70,27 @@ static std::size_t NPadIdToIndex(u32 npad_id) {
74 } 70 }
75} 71}
76 72
73u32 Controller_NPad::IndexToNPad(std::size_t index) {
74 switch (index) {
75 case 0:
76 case 1:
77 case 2:
78 case 3:
79 case 4:
80 case 5:
81 case 6:
82 case 7:
83 return static_cast<u32>(index);
84 case 8:
85 return NPAD_HANDHELD;
86 case 9:
87 return NPAD_UNKNOWN;
88 default:
89 UNIMPLEMENTED_MSG("Unknown npad index {}", index);
90 return 0;
91 };
92}
93
77Controller_NPad::Controller_NPad() = default; 94Controller_NPad::Controller_NPad() = default;
78Controller_NPad::~Controller_NPad() = default; 95Controller_NPad::~Controller_NPad() = default;
79 96
@@ -190,7 +207,7 @@ void Controller_NPad::OnInit() {
190 supported_npad_id_types.resize(npad_id_list.size()); 207 supported_npad_id_types.resize(npad_id_list.size());
191 std::memcpy(supported_npad_id_types.data(), npad_id_list.data(), 208 std::memcpy(supported_npad_id_types.data(), npad_id_list.data(),
192 npad_id_list.size() * sizeof(u32)); 209 npad_id_list.size() * sizeof(u32));
193 AddNewController(PREFERRED_CONTROLLER); 210 AddNewController(NPadControllerType::JoyDual);
194 } 211 }
195 212
196 for (std::size_t i = 0; i < connected_controllers.size(); ++i) { 213 for (std::size_t i = 0; i < connected_controllers.size(); ++i) {
@@ -391,9 +408,9 @@ void Controller_NPad::OnUpdate(u8* data, std::size_t data_len) {
391 libnx_entry.connection_status.IsRightJoyConnected.Assign(1); 408 libnx_entry.connection_status.IsRightJoyConnected.Assign(1);
392 libnx_entry.connection_status.IsConnected.Assign(1); 409 libnx_entry.connection_status.IsConnected.Assign(1);
393 410
394 dual_entry.pad_states.raw = pad_state.raw; 411 dual_entry.pad.pad_states.raw = pad_state.pad_states.raw;
395 dual_entry.l_stick = lstick_entry; 412 dual_entry.pad.l_stick = pad_state.l_stick;
396 dual_entry.r_stick = rstick_entry; 413 dual_entry.pad.r_stick = pad_state.r_stick;
397 break; 414 break;
398 case NPadControllerType::JoyLeft: 415 case NPadControllerType::JoyLeft:
399 left_entry.connection_status.raw = 0; 416 left_entry.connection_status.raw = 0;
@@ -461,23 +478,24 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) {
461 if (!controller.is_connected) { 478 if (!controller.is_connected) {
462 continue; 479 continue;
463 } 480 }
464 if (!IsControllerSupported(PREFERRED_CONTROLLER)) { 481 const auto requested_controller =
465 const auto best_type = DecideBestController(PREFERRED_CONTROLLER); 482 i <= MAX_NPAD_ID ? MapSettingsTypeToNPad(Settings::values.players[i].type)
466 const bool is_handheld = (best_type == NPadControllerType::Handheld || 483 : NPadControllerType::Handheld;
467 PREFERRED_CONTROLLER == NPadControllerType::Handheld); 484 if (!IsControllerSupported(requested_controller)) {
485 const auto is_handheld = requested_controller == NPadControllerType::Handheld;
468 if (is_handheld) { 486 if (is_handheld) {
469 controller.type = NPadControllerType::None; 487 controller.type = NPadControllerType::None;
470 controller.is_connected = false; 488 controller.is_connected = false;
471 AddNewController(best_type); 489 AddNewController(requested_controller);
472 } else { 490 } else {
473 controller.type = best_type; 491 controller.type = requested_controller;
474 InitNewlyAddedControler(i); 492 InitNewlyAddedControler(i);
475 } 493 }
476 had_controller_update = true; 494 had_controller_update = true;
477 } 495 }
478 } 496 if (had_controller_update) {
479 if (had_controller_update) { 497 styleset_changed_event->Signal();
480 styleset_changed_event->Signal(); 498 }
481 } 499 }
482} 500}
483 501
@@ -530,50 +548,6 @@ Controller_NPad::Vibration Controller_NPad::GetLastVibration() const {
530 return last_processed_vibration; 548 return last_processed_vibration;
531} 549}
532 550
533std::size_t Controller_NPad::NPadIdToIndex(u32 npad_id) {
534 switch (npad_id) {
535 case 0:
536 case 1:
537 case 2:
538 case 3:
539 case 4:
540 case 5:
541 case 6:
542 case 7:
543 return static_cast<std::size_t>(npad_id);
544 case 8:
545 case 32:
546 return 8;
547 case 9:
548 case 16:
549 return 9;
550 default:
551 UNIMPLEMENTED_MSG("Unknown npad id {}", npad_id);
552 return 0;
553 }
554}
555
556u32 Controller_NPad::IndexToNPad(std::size_t index) {
557 switch (index) {
558 case 0:
559 case 1:
560 case 2:
561 case 3:
562 case 4:
563 case 5:
564 case 6:
565 case 7:
566 return static_cast<u32>(index);
567 case 8:
568 return 32;
569 case 9:
570 return 16;
571 default:
572 UNIMPLEMENTED_MSG("Unknown npad index {}", index);
573 return 0;
574 };
575}
576
577void Controller_NPad::AddNewController(NPadControllerType controller) { 551void Controller_NPad::AddNewController(NPadControllerType controller) {
578 controller = DecideBestController(controller); 552 controller = DecideBestController(controller);
579 if (controller == NPadControllerType::Handheld) { 553 if (controller == NPadControllerType::Handheld) {
@@ -596,13 +570,13 @@ void Controller_NPad::AddNewController(NPadControllerType controller) {
596void Controller_NPad::AddNewControllerAt(NPadControllerType controller, u32 npad_id) { 570void Controller_NPad::AddNewControllerAt(NPadControllerType controller, u32 npad_id) {
597 controller = DecideBestController(controller); 571 controller = DecideBestController(controller);
598 if (controller == NPadControllerType::Handheld) { 572 if (controller == NPadControllerType::Handheld) {
599 connected_controllers[8] = {controller, true}; 573 connected_controllers[NPadIdToIndex(NPAD_HANDHELD)] = {controller, true};
600 InitNewlyAddedControler(8); 574 InitNewlyAddedControler(NPadIdToIndex(NPAD_HANDHELD));
601 return; 575 return;
602 } 576 }
603 const size_t controller_id = static_cast<std::size_t>(npad_id); 577
604 connected_controllers[controller_id] = {controller, true}; 578 connected_controllers[npad_id] = {controller, true};
605 InitNewlyAddedControler(controller_id); 579 InitNewlyAddedControler(npad_id);
606} 580}
607 581
608void Controller_NPad::ConnectNPad(u32 npad_id) { 582void Controller_NPad::ConnectNPad(u32 npad_id) {
@@ -613,97 +587,11 @@ void Controller_NPad::DisconnectNPad(u32 npad_id) {
613 connected_controllers[NPadIdToIndex(npad_id)].is_connected = false; 587 connected_controllers[NPadIdToIndex(npad_id)].is_connected = false;
614} 588}
615 589
616Controller_NPad::NPadControllerType Controller_NPad::DecideBestController(
617 NPadControllerType priority) {
618 if (IsControllerSupported(priority)) {
619 return priority;
620 }
621 const auto is_docked = Settings::values.use_docked_mode;
622 if (is_docked && priority == NPadControllerType::Handheld) {
623 priority = NPadControllerType::JoyDual;
624 if (IsControllerSupported(priority)) {
625 return priority;
626 }
627 }
628 std::vector<NPadControllerType> priority_list{};
629 switch (priority) {
630 case NPadControllerType::ProController:
631 priority_list.push_back(NPadControllerType::JoyDual);
632 if (!is_docked) {
633 priority_list.push_back(NPadControllerType::Handheld);
634 }
635 priority_list.push_back(NPadControllerType::JoyLeft);
636 priority_list.push_back(NPadControllerType::JoyRight);
637 priority_list.push_back(NPadControllerType::Pokeball);
638 break;
639 case NPadControllerType::Handheld:
640 priority_list.push_back(NPadControllerType::JoyDual);
641 priority_list.push_back(NPadControllerType::ProController);
642 priority_list.push_back(NPadControllerType::JoyLeft);
643 priority_list.push_back(NPadControllerType::JoyRight);
644 priority_list.push_back(NPadControllerType::Pokeball);
645 break;
646 case NPadControllerType::JoyDual:
647 if (!is_docked) {
648 priority_list.push_back(NPadControllerType::Handheld);
649 }
650 priority_list.push_back(NPadControllerType::ProController);
651 priority_list.push_back(NPadControllerType::JoyLeft);
652 priority_list.push_back(NPadControllerType::JoyRight);
653 priority_list.push_back(NPadControllerType::Pokeball);
654 break;
655 case NPadControllerType::JoyLeft:
656 priority_list.push_back(NPadControllerType::JoyRight);
657 priority_list.push_back(NPadControllerType::JoyDual);
658 if (!is_docked) {
659 priority_list.push_back(NPadControllerType::Handheld);
660 }
661 priority_list.push_back(NPadControllerType::ProController);
662 priority_list.push_back(NPadControllerType::Pokeball);
663 break;
664 case NPadControllerType::JoyRight:
665 priority_list.push_back(NPadControllerType::JoyLeft);
666 priority_list.push_back(NPadControllerType::JoyDual);
667 if (!is_docked) {
668 priority_list.push_back(NPadControllerType::Handheld);
669 }
670 priority_list.push_back(NPadControllerType::ProController);
671 priority_list.push_back(NPadControllerType::Pokeball);
672 break;
673 case NPadControllerType::Pokeball:
674 priority_list.push_back(NPadControllerType::JoyLeft);
675 priority_list.push_back(NPadControllerType::JoyRight);
676 priority_list.push_back(NPadControllerType::JoyDual);
677 if (!is_docked) {
678 priority_list.push_back(NPadControllerType::Handheld);
679 }
680 priority_list.push_back(NPadControllerType::ProController);
681 break;
682 default:
683 priority_list.push_back(NPadControllerType::JoyDual);
684 if (!is_docked) {
685 priority_list.push_back(NPadControllerType::Handheld);
686 }
687 priority_list.push_back(NPadControllerType::ProController);
688 priority_list.push_back(NPadControllerType::JoyLeft);
689 priority_list.push_back(NPadControllerType::JoyRight);
690 priority_list.push_back(NPadControllerType::JoyDual);
691 }
692
693 for (const auto controller_type : priority_list) {
694 if (IsControllerSupported(controller_type)) {
695 return controller_type;
696 }
697 }
698 UNIMPLEMENTED_MSG("Could not find supported controller!");
699 return priority;
700}
701
702bool Controller_NPad::IsControllerSupported(NPadControllerType controller) { 590bool Controller_NPad::IsControllerSupported(NPadControllerType controller) {
703 if (controller == NPadControllerType::Handheld) { 591 if (controller == NPadControllerType::Handheld) {
704 // Handheld is not even a supported type, lets stop here 592 // Handheld is not even a supported type, lets stop here
705 if (std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(), 32) == 593 if (std::find(supported_npad_id_types.begin(), supported_npad_id_types.end(),
706 supported_npad_id_types.end()) { 594 NPAD_HANDHELD) == supported_npad_id_types.end()) {
707 return false; 595 return false;
708 } 596 }
709 // Handheld should not be supported in docked mode 597 // Handheld should not be supported in docked mode
@@ -761,13 +649,12 @@ void Controller_NPad::SetVibrationEnabled(bool can_vibrate) {
761} 649}
762 650
763void Controller_NPad::ClearAllConnectedControllers() { 651void Controller_NPad::ClearAllConnectedControllers() {
764 std::for_each(connected_controllers.begin(), connected_controllers.end(), 652 for (auto& controller : connected_controllers) {
765 [](ControllerHolder& controller) { 653 if (controller.is_connected && controller.type != NPadControllerType::None) {
766 if (controller.is_connected && controller.type != NPadControllerType::None) { 654 controller.type = NPadControllerType::None;
767 controller.type = NPadControllerType::None; 655 controller.is_connected = false;
768 controller.is_connected = false; 656 }
769 } 657 }
770 });
771} 658}
772void Controller_NPad::DisconnectAllConnectedControllers() { 659void Controller_NPad::DisconnectAllConnectedControllers() {
773 std::for_each(connected_controllers.begin(), connected_controllers.end(), 660 std::for_each(connected_controllers.begin(), connected_controllers.end(),
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index 52f92a4f1..ea8057b80 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -5,13 +5,18 @@
5#pragma once 5#pragma once
6 6
7#include <array> 7#include <array>
8#include "common/bit_field.h"
8#include "common/common_types.h" 9#include "common/common_types.h"
9#include "core/frontend/input.h" 10#include "core/frontend/input.h"
11#include "core/hle/kernel/event.h"
10#include "core/hle/service/hid/controllers/controller_base.h" 12#include "core/hle/service/hid/controllers/controller_base.h"
11#include "core/settings.h" 13#include "core/settings.h"
12 14
13namespace Service::HID { 15namespace Service::HID {
14 16
17constexpr u32 NPAD_HANDHELD = 32;
18constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this?
19
15class Controller_NPad final : public ControllerBase { 20class Controller_NPad final : public ControllerBase {
16public: 21public:
17 Controller_NPad(); 22 Controller_NPad();
@@ -118,6 +123,9 @@ public:
118 void ConnectAllDisconnectedControllers(); 123 void ConnectAllDisconnectedControllers();
119 void ClearAllControllers(); 124 void ClearAllControllers();
120 125
126 static std::size_t NPadIdToIndex(u32 npad_id);
127 static u32 IndexToNPad(std::size_t index);
128
121private: 129private:
122 struct CommonHeader { 130 struct CommonHeader {
123 s64_le timestamp; 131 s64_le timestamp;
@@ -304,10 +312,7 @@ private:
304 bool IsControllerSupported(NPadControllerType controller) const; 312 bool IsControllerSupported(NPadControllerType controller) const;
305 NPadControllerType DecideBestController(NPadControllerType priority) const; 313 NPadControllerType DecideBestController(NPadControllerType priority) const;
306 void RequestPadStateUpdate(u32 npad_id); 314 void RequestPadStateUpdate(u32 npad_id);
307 std::size_t NPadIdToIndex(u32 npad_id);
308 u32 IndexToNPad(std::size_t index);
309 std::array<ControllerPad, 10> npad_pad_states{}; 315 std::array<ControllerPad, 10> npad_pad_states{};
310 NPadControllerType DecideBestController(NPadControllerType priority);
311 bool IsControllerSupported(NPadControllerType controller); 316 bool IsControllerSupported(NPadControllerType controller);
312}; 317};
313} // namespace Service::HID 318} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/touchscreen.cpp b/src/core/hle/service/hid/controllers/touchscreen.cpp
index 8b9763de6..f666b1bd8 100644
--- a/src/core/hle/service/hid/controllers/touchscreen.cpp
+++ b/src/core/hle/service/hid/controllers/touchscreen.cpp
@@ -43,9 +43,6 @@ void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) {
43 auto& touch_entry = cur_entry.states[0]; 43 auto& touch_entry = cur_entry.states[0];
44 touch_entry.attribute.raw = 0; 44 touch_entry.attribute.raw = 0;
45 if (pressed && Settings::values.touchscreen.enabled) { 45 if (pressed && Settings::values.touchscreen.enabled) {
46 if (cur_entry.entry_count == 0) {
47 touch_entry.attribute.start_touch.Assign(1);
48 }
49 touch_entry.x = static_cast<u16>(x * Layout::ScreenUndocked::Width); 46 touch_entry.x = static_cast<u16>(x * Layout::ScreenUndocked::Width);
50 touch_entry.y = static_cast<u16>(y * Layout::ScreenUndocked::Height); 47 touch_entry.y = static_cast<u16>(y * Layout::ScreenUndocked::Height);
51 touch_entry.diameter_x = Settings::values.touchscreen.diameter_x; 48 touch_entry.diameter_x = Settings::values.touchscreen.diameter_x;
@@ -57,9 +54,6 @@ void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) {
57 touch_entry.finger = Settings::values.touchscreen.finger; 54 touch_entry.finger = Settings::values.touchscreen.finger;
58 cur_entry.entry_count = 1; 55 cur_entry.entry_count = 1;
59 } else { 56 } else {
60 if (cur_entry.entry_count == 1) {
61 touch_entry.attribute.end_touch.Assign(1);
62 }
63 cur_entry.entry_count = 0; 57 cur_entry.entry_count = 0;
64 } 58 }
65 59
diff --git a/src/core/settings.cpp b/src/core/settings.cpp
index 0da159559..26fcd3405 100644
--- a/src/core/settings.cpp
+++ b/src/core/settings.cpp
@@ -10,6 +10,56 @@
10 10
11namespace Settings { 11namespace Settings {
12 12
13namespace NativeButton {
14const std::array<const char*, NumButtons> mapping = {{
15 "button_a",
16 "button_b",
17 "button_x",
18 "button_y",
19 "button_lstick",
20 "button_rstick",
21 "button_l",
22 "button_r",
23 "button_zl",
24 "button_zr",
25 "button_plus",
26 "button_minus",
27 "button_dleft",
28 "button_dup",
29 "button_dright",
30 "button_ddown",
31 "button_lstick_left",
32 "button_lstick_up",
33 "button_lstick_right",
34 "button_lstick_down",
35 "button_rstick_left",
36 "button_rstick_up",
37 "button_rstick_right",
38 "button_rstick_down",
39 "button_sl",
40 "button_sr",
41 "button_home",
42 "button_screenshot",
43}};
44}
45
46namespace NativeAnalog {
47const std::array<const char*, NumAnalogs> mapping = {{
48 "lstick",
49 "rstick",
50}};
51}
52
53namespace NativeMouseButton {
54const std::array<const char*, NumMouseButtons> mapping = {{
55 "left",
56 "right",
57 "middle",
58 "forward",
59 "back",
60}};
61}
62
13Values values = {}; 63Values values = {};
14 64
15void Apply() { 65void Apply() {
diff --git a/src/core/settings.h b/src/core/settings.h
index 9cc3c1dc8..e63134f80 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -60,36 +60,7 @@ constexpr int BUTTON_NS_END = NumButtons;
60constexpr int NUM_BUTTONS_HID = BUTTON_HID_END - BUTTON_HID_BEGIN; 60constexpr int NUM_BUTTONS_HID = BUTTON_HID_END - BUTTON_HID_BEGIN;
61constexpr int NUM_BUTTONS_NS = BUTTON_NS_END - BUTTON_NS_BEGIN; 61constexpr int NUM_BUTTONS_NS = BUTTON_NS_END - BUTTON_NS_BEGIN;
62 62
63static const std::array<const char*, NumButtons> mapping = {{ 63extern const std::array<const char*, NumButtons> mapping;
64 "button_a",
65 "button_b",
66 "button_x",
67 "button_y",
68 "button_lstick",
69 "button_rstick",
70 "button_l",
71 "button_r",
72 "button_zl",
73 "button_zr",
74 "button_plus",
75 "button_minus",
76 "button_dleft",
77 "button_dup",
78 "button_dright",
79 "button_ddown",
80 "button_lstick_left",
81 "button_lstick_up",
82 "button_lstick_right",
83 "button_lstick_down",
84 "button_rstick_left",
85 "button_rstick_up",
86 "button_rstick_right",
87 "button_rstick_down",
88 "button_sl",
89 "button_sr",
90 "button_home",
91 "button_screenshot",
92}};
93 64
94} // namespace NativeButton 65} // namespace NativeButton
95 66
@@ -105,10 +76,7 @@ constexpr int STICK_HID_BEGIN = LStick;
105constexpr int STICK_HID_END = NumAnalogs; 76constexpr int STICK_HID_END = NumAnalogs;
106constexpr int NUM_STICKS_HID = NumAnalogs; 77constexpr int NUM_STICKS_HID = NumAnalogs;
107 78
108static const std::array<const char*, NumAnalogs> mapping = {{ 79extern const std::array<const char*, NumAnalogs> mapping;
109 "lstick",
110 "rstick",
111}};
112} // namespace NativeAnalog 80} // namespace NativeAnalog
113 81
114namespace NativeMouseButton { 82namespace NativeMouseButton {
@@ -126,13 +94,7 @@ constexpr int MOUSE_HID_BEGIN = Left;
126constexpr int MOUSE_HID_END = NumMouseButtons; 94constexpr int MOUSE_HID_END = NumMouseButtons;
127constexpr int NUM_MOUSE_HID = NumMouseButtons; 95constexpr int NUM_MOUSE_HID = NumMouseButtons;
128 96
129static const std::array<const char*, NumMouseButtons> mapping = {{ 97extern const std::array<const char*, NumMouseButtons> mapping;
130 "left",
131 "right",
132 "middle",
133 "forward",
134 "back",
135}};
136} // namespace NativeMouseButton 98} // namespace NativeMouseButton
137 99
138namespace NativeKeyboard { 100namespace NativeKeyboard {