1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-30 16:26:50 +00:00

Updating the index after the first mapping record of p_guid requires a second loop

This commit is contained in:
MJacred
2025-01-13 16:55:26 +01:00
parent e98f3a6bf0
commit f355382ef5

View File

@@ -1709,16 +1709,18 @@ void Input::add_joy_mapping(const String &p_mapping, bool p_update_existing) {
} }
void Input::remove_joy_mapping(const String &p_guid) { void Input::remove_joy_mapping(const String &p_guid) {
int index_removed = -1; int count = 0; // The amount of removals performed.
int count = 0; int index_removed = -1; // The smallest index where an entry was removed.
int fallback_mapping_offset = 0;
for (int i = map_db.size() - 1; i >= 0; i--) { for (int i = map_db.size() - 1; i >= 0; i--) {
if (p_guid == map_db[i].uid) { if (p_guid == map_db[i].uid) {
map_db.remove_at(i); map_db.remove_at(i);
index_removed = i; index_removed = i;
count++;
if (i < fallback_mapping) { if (i < fallback_mapping) {
count++; fallback_mapping_offset++;
} else if (i == fallback_mapping) { } else if (i == fallback_mapping) {
fallback_mapping = -1; fallback_mapping = -1;
WARN_PRINT_ONCE(vformat("Removed fallback joypad input mapping \"%s\". This could lead to joypads not working as intended.", p_guid)); WARN_PRINT_ONCE(vformat("Removed fallback joypad input mapping \"%s\". This could lead to joypads not working as intended.", p_guid));
@@ -1732,17 +1734,28 @@ void Input::remove_joy_mapping(const String &p_guid) {
if (fallback_mapping > 0) { if (fallback_mapping > 0) {
// Fixing the shifted index. // Fixing the shifted index.
fallback_mapping -= count; fallback_mapping -= fallback_mapping_offset;
} }
for (KeyValue<int, Joypad> &E : joy_names) { for (KeyValue<int, Joypad> &E : joy_names) {
Joypad &joy = E.value; Joypad &joy = E.value;
if (joy.puid == _guid) { if (joy.uid == p_guid) {
_set_joypad_mapping(joy, fallback_mapping); _set_joypad_mapping(joy, fallback_mapping);
} else if (joy.mapping > index_removed) { } else if (joy.mapping > index_removed) {
if (count == 1) {
// The map_db update offset this joypad's mapping reference, update it: // The map_db update offset this joypad's mapping reference, update it:
_set_joypad_mapping(joy, joy.mapping - 1); _set_joypad_mapping(joy, joy.mapping - 1);
} else {
// Re-validate the joypad's correct mapping. Fix it if necessary.
int mapping = fallback_mapping;
for (int i = 0; i < map_db.size(); i++) {
if (joy.uid == map_db[i].uid) {
mapping = i;
}
}
_set_joypad_mapping(joy, mapping);
}
} }
} }
} }