Skip to content

Commit 96e7d20

Browse files
committed
basic filtering
1 parent 5bbe727 commit 96e7d20

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

src/controller/physicaldevice/ConnectedPhysicalDeviceManager.cpp

+32-4
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,37 @@ ConnectedPhysicalDeviceManager::~ConnectedPhysicalDeviceManager() {
99

1010
std::unordered_map<int32_t, SDL_GameController*>
1111
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;
1421
}
1522

16-
std::vector<std::string> ConnectedPhysicalDeviceManager::GetConnectedSDLGamepadNames() {
23+
std::unordered_map<int32_t, std::string> ConnectedPhysicalDeviceManager::GetConnectedSDLGamepadNames() {
1724
return mConnectedSDLGamepadNames;
1825
}
1926

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+
2043
void ConnectedPhysicalDeviceManager::HandlePhysicalDeviceConnect(int32_t sdlDeviceIndex) {
2144
RefreshConnectedSDLGamepads();
2245
}
@@ -28,6 +51,7 @@ void ConnectedPhysicalDeviceManager::HandlePhysicalDeviceDisconnect(int32_t sdlJ
2851
void ConnectedPhysicalDeviceManager::RefreshConnectedSDLGamepads() {
2952
mConnectedSDLGamepads.clear();
3053
mConnectedSDLGamepadNames.clear();
54+
3155
for (int32_t i = 0; i < SDL_NumJoysticks(); i++) {
3256
// skip if this SDL joystick isn't a Gamepad
3357
if (!SDL_IsGameController(i)) {
@@ -39,7 +63,11 @@ void ConnectedPhysicalDeviceManager::RefreshConnectedSDLGamepads() {
3963
auto name = SDL_GameControllerName(gamepad);
4064

4165
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+
}
4371
}
4472
}
4573
} // namespace Ship

src/controller/physicaldevice/ConnectedPhysicalDeviceManager.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <unordered_map>
4+
#include <unordered_set>
45
#include <vector>
56
#include <string>
67
#include <SDL2/SDL.h>
@@ -13,14 +14,19 @@ class ConnectedPhysicalDeviceManager {
1314
~ConnectedPhysicalDeviceManager();
1415

1516
std::unordered_map<int32_t, SDL_GameController*> GetConnectedSDLGamepadsForPort(uint8_t portIndex);
16-
std::vector<std::string> GetConnectedSDLGamepadNames();
17+
std::unordered_map<int32_t, std::string> GetConnectedSDLGamepadNames();
18+
std::unordered_set<int32_t> GetIgnoredInstanceIdsForPort(uint8_t portIndex);
19+
bool PortIsIgnoringInstanceId(uint8_t portIndex, int32_t instanceId);
20+
void IgnoreInstanceIdForPort(uint8_t portIndex, int32_t instanceId);
21+
void UnignoreInstanceIdForPort(uint8_t portIndex, int32_t instanceId);
1722

1823
void HandlePhysicalDeviceConnect(int32_t sdlDeviceIndex);
1924
void HandlePhysicalDeviceDisconnect(int32_t sdlJoystickInstanceId);
2025
void RefreshConnectedSDLGamepads();
2126

2227
private:
2328
std::unordered_map<int32_t, SDL_GameController*> mConnectedSDLGamepads;
24-
std::vector<std::string> mConnectedSDLGamepadNames;
29+
std::unordered_map<int32_t, std::string> mConnectedSDLGamepadNames;
30+
std::unordered_map<uint8_t, std::unordered_set<int32_t>> mIgnoredInstanceIds;
2531
};
2632
} // namespace Ship

src/window/gui/InputEditorWindow.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1186,7 +1186,7 @@ void InputEditorWindow::DrawDeviceNameButtons() {
11861186
ImGui::PopStyleColor();
11871187
ImGui::PopStyleColor();
11881188

1189-
for (const auto& name :
1189+
for (const auto& [instanceId, name] :
11901190
Context::GetInstance()->GetControlDeck()->GetConnectedPhysicalDeviceManager()->GetConnectedSDLGamepadNames()) {
11911191
auto buttonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
11921192
auto buttonHoveredColor = ImGui::GetStyleColorVec4(ImGuiCol_ButtonHovered);

0 commit comments

Comments
 (0)