summaryrefslogtreecommitdiffstats
path: root/core/input
diff options
context:
space:
mode:
authorYuri Sizov <yuris@humnom.net>2023-07-12 17:16:36 +0200
committerYuri Sizov <yuris@humnom.net>2023-07-12 17:16:36 +0200
commit55b74c7cdf5157312ef9e7086cd3d3725249f315 (patch)
tree113a976b5345636b8ab9025d33af1b74672b90ac /core/input
parent4d862d6cc9bfe2c2d772f16222e00996b6aee943 (diff)
parent8de98dbf21ba734feb26d5568151bd810d566817 (diff)
downloadredot-engine-55b74c7cdf5157312ef9e7086cd3d3725249f315.tar.gz
Merge pull request #76045 from Eoin-ONeill-Yokai/steaminput-fix
Prevent double input events on gamepad when running through steam input
Diffstat (limited to 'core/input')
-rw-r--r--core/input/input.cpp27
-rw-r--r--core/input/input.h4
2 files changed, 31 insertions, 0 deletions
diff --git a/core/input/input.cpp b/core/input/input.cpp
index cf8d71b9a7..d481acf005 100644
--- a/core/input/input.cpp
+++ b/core/input/input.cpp
@@ -113,6 +113,7 @@ void Input::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_joy_axis", "device", "axis"), &Input::get_joy_axis);
ClassDB::bind_method(D_METHOD("get_joy_name", "device"), &Input::get_joy_name);
ClassDB::bind_method(D_METHOD("get_joy_guid", "device"), &Input::get_joy_guid);
+ ClassDB::bind_method(D_METHOD("should_ignore_device", "vendor_id", "product_id"), &Input::should_ignore_device);
ClassDB::bind_method(D_METHOD("get_connected_joypads"), &Input::get_connected_joypads);
ClassDB::bind_method(D_METHOD("get_joy_vibration_strength", "device"), &Input::get_joy_vibration_strength);
ClassDB::bind_method(D_METHOD("get_joy_vibration_duration", "device"), &Input::get_joy_vibration_duration);
@@ -1498,6 +1499,11 @@ String Input::get_joy_guid(int p_device) const {
return joy_names[p_device].uid;
}
+bool Input::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);
+}
+
TypedArray<int> Input::get_connected_joypads() {
TypedArray<int> ret;
HashMap<int, Joypad>::Iterator elem = joy_names.begin();
@@ -1542,6 +1548,27 @@ Input::Input() {
}
}
+ String env_ignore_devices = OS::get_singleton()->get_environment("SDL_GAMECONTROLLER_IGNORE_DEVICES");
+ if (!env_ignore_devices.is_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);
+ }
+ }
+
legacy_just_pressed_behavior = GLOBAL_DEF("input_devices/compatibility/legacy_just_pressed_behavior", false);
if (Engine::get_singleton()->is_editor_hint()) {
// Always use standard behavior in the editor.
diff --git a/core/input/input.h b/core/input/input.h
index 9cc596ee90..ec16871b72 100644
--- a/core/input/input.h
+++ b/core/input/input.h
@@ -154,6 +154,9 @@ private:
VelocityTrack mouse_velocity_track;
HashMap<int, VelocityTrack> touch_velocity_track;
HashMap<int, Joypad> joy_names;
+
+ HashSet<uint32_t> ignored_device_ids;
+
int fallback_mapping = -1;
CursorShape default_shape = CURSOR_ARROW;
@@ -328,6 +331,7 @@ public:
bool is_joy_known(int p_device);
String get_joy_guid(int p_device) const;
+ bool should_ignore_device(int p_vendor_id, int p_product_id) const;
void set_fallback_mapping(String p_guid);
void flush_buffered_events();