@@ -9,14 +9,37 @@ ConnectedPhysicalDeviceManager::~ConnectedPhysicalDeviceManager() {
9
9
10
10
std::unordered_map<int32_t , SDL_GameController*>
11
11
ConnectedPhysicalDeviceManager::GetConnectedSDLGamepadsForPort (uint8_t portIndex) {
12
- // todo: filter somehow
13
- return mConnectedSDLGamepads ;
12
+ std::unordered_map<int32_t , SDL_GameController*> result;
13
+
14
+ for (const auto & [instanceId, gamepad] : mConnectedSDLGamepads ) {
15
+ if (!PortIsIgnoringInstanceId (portIndex, instanceId)) {
16
+ result[instanceId] = gamepad;
17
+ }
18
+ }
19
+
20
+ return result;
14
21
}
15
22
16
- std::vector< std::string> ConnectedPhysicalDeviceManager::GetConnectedSDLGamepadNames () {
23
+ std::unordered_map< int32_t , std::string> ConnectedPhysicalDeviceManager::GetConnectedSDLGamepadNames () {
17
24
return mConnectedSDLGamepadNames ;
18
25
}
19
26
27
+ std::unordered_set<int32_t > ConnectedPhysicalDeviceManager::GetIgnoredInstanceIdsForPort (uint8_t portIndex) {
28
+ return mIgnoredInstanceIds [portIndex];
29
+ }
30
+
31
+ bool ConnectedPhysicalDeviceManager::PortIsIgnoringInstanceId (uint8_t portIndex, int32_t instanceId) {
32
+ return GetIgnoredInstanceIdsForPort (portIndex).contains (instanceId);
33
+ }
34
+
35
+ void ConnectedPhysicalDeviceManager::IgnoreInstanceIdForPort (uint8_t portIndex, int32_t instanceId) {
36
+ mIgnoredInstanceIds [portIndex].insert (instanceId);
37
+ }
38
+
39
+ void ConnectedPhysicalDeviceManager::UnignoreInstanceIdForPort (uint8_t portIndex, int32_t instanceId) {
40
+ mIgnoredInstanceIds [portIndex].erase (instanceId);
41
+ }
42
+
20
43
void ConnectedPhysicalDeviceManager::HandlePhysicalDeviceConnect (int32_t sdlDeviceIndex) {
21
44
RefreshConnectedSDLGamepads ();
22
45
}
@@ -28,6 +51,7 @@ void ConnectedPhysicalDeviceManager::HandlePhysicalDeviceDisconnect(int32_t sdlJ
28
51
void ConnectedPhysicalDeviceManager::RefreshConnectedSDLGamepads () {
29
52
mConnectedSDLGamepads .clear ();
30
53
mConnectedSDLGamepadNames .clear ();
54
+
31
55
for (int32_t i = 0 ; i < SDL_NumJoysticks (); i++) {
32
56
// skip if this SDL joystick isn't a Gamepad
33
57
if (!SDL_IsGameController (i)) {
@@ -39,7 +63,11 @@ void ConnectedPhysicalDeviceManager::RefreshConnectedSDLGamepads() {
39
63
auto name = SDL_GameControllerName (gamepad);
40
64
41
65
mConnectedSDLGamepads [instanceId] = gamepad;
42
- mConnectedSDLGamepadNames .push_back (name);
66
+ mConnectedSDLGamepadNames [instanceId] = name;
67
+
68
+ for (uint8_t port = 1 ; port < 4 ; port++) {
69
+ mIgnoredInstanceIds [port].insert (instanceId);
70
+ }
43
71
}
44
72
}
45
73
} // namespace Ship
0 commit comments