Merge pull request #79706 from puzzud/3.x

[3.x] Prevent double input events on gamepad when running through steam input
This commit is contained in:
Rémi Verschelde
2023-08-02 17:29:55 +02:00
6 changed files with 51 additions and 4 deletions

View File

@ -858,6 +858,27 @@ InputDefault::InputDefault() {
parse_mapping(entries[i]);
}
}
String env_ignore_devices = OS::get_singleton()->get_environment("SDL_GAMECONTROLLER_IGNORE_DEVICES");
if (!env_ignore_devices.empty()) {
Vector<String> entries = env_ignore_devices.split(",");
for (int i = 0; i < entries.size(); i++) {
Vector<String> vid_pid = entries[i].split("/");
if (vid_pid.size() < 2) {
continue;
}
print_verbose(vformat("Device Ignored -- Vendor: %s Product: %s", vid_pid[0], vid_pid[1]));
const uint16_t vid_unswapped = vid_pid[0].hex_to_int();
const uint16_t pid_unswapped = vid_pid[1].hex_to_int();
const uint16_t vid = BSWAP16(vid_unswapped);
const uint16_t pid = BSWAP16(pid_unswapped);
uint32_t full_id = (((uint32_t)vid) << 16) | ((uint16_t)pid);
ignored_device_ids.insert(full_id);
}
}
}
void InputDefault::joy_button(int p_device, int p_button, bool p_pressed) {
@ -1350,6 +1371,11 @@ String InputDefault::get_joy_guid(int p_device) const {
return OS::get_singleton()->get_joy_guid(p_device);
}
bool InputDefault::should_ignore_device(int p_vendor_id, int p_product_id) const {
uint32_t full_id = (((uint32_t)p_vendor_id) << 16) | ((uint16_t)p_product_id);
return ignored_device_ids.has(full_id);
}
//platforms that use the remapping system can override and call to these ones
bool InputDefault::is_joy_mapped(int p_device) {
if (joy_names.has(p_device)) {

View File

@ -193,6 +193,8 @@ private:
Vector<JoyDeviceMapping> map_db;
Set<uint32_t> ignored_device_ids;
JoyEvent _get_mapped_button_event(const JoyDeviceMapping &mapping, int p_button);
JoyEvent _get_mapped_axis_event(const JoyDeviceMapping &mapping, int p_axis, float p_value);
void _get_mapped_hat_events(const JoyDeviceMapping &mapping, int p_hat, JoyEvent r_events[HAT_MAX]);
@ -295,6 +297,8 @@ public:
virtual bool is_joy_known(int p_device);
virtual String get_joy_guid(int p_device) const;
bool should_ignore_device(int p_vendor_id, int p_product_id) const;
virtual String get_joy_button_string(int p_button);
virtual String get_joy_axis_string(int p_axis);
virtual int get_joy_axis_index_from_string(String p_axis);