diff --git a/core/os/input.cpp b/core/os/input.cpp index dacddc0928e..efbae579506 100644 --- a/core/os/input.cpp +++ b/core/os/input.cpp @@ -59,6 +59,7 @@ void Input::_bind_methods() { ObjectTypeDB::bind_method(_MD("get_joy_axis","device","axis"),&Input::get_joy_axis); ObjectTypeDB::bind_method(_MD("get_joy_name","device"),&Input::get_joy_name); ObjectTypeDB::bind_method(_MD("get_joy_guid","device"),&Input::get_joy_guid); + ObjectTypeDB::bind_method(_MD("get_connected_joysticks"),&Input::get_connected_joysticks); ObjectTypeDB::bind_method(_MD("get_joy_vibration_strength", "device"), &Input::get_joy_vibration_strength); ObjectTypeDB::bind_method(_MD("get_joy_vibration_duration", "device"), &Input::get_joy_vibration_duration); ObjectTypeDB::bind_method(_MD("start_joy_vibration", "device", "weak_magnitude", "strong_magnitude", "duration"), &Input::start_joy_vibration, DEFVAL(0)); diff --git a/core/os/input.h b/core/os/input.h index fa2cef54678..d11703470bd 100644 --- a/core/os/input.h +++ b/core/os/input.h @@ -62,6 +62,7 @@ public: virtual float get_joy_axis(int p_device,int p_axis)=0; virtual String get_joy_name(int p_idx)=0; + virtual Array get_connected_joysticks()=0; virtual void joy_connection_changed(int p_idx, bool p_connected, String p_name, String p_guid)=0; virtual void add_joy_mapping(String p_mapping, bool p_update_existing=false)=0; virtual void remove_joy_mapping(String p_guid)=0; diff --git a/doc/base/classes.xml b/doc/base/classes.xml index dd00a0312ce..b5384cfc2b0 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -15759,6 +15759,13 @@ If the device has an accelerometer, this will return the movement. + + + + + Returns an [Array] containing the device IDs of all currently connected joysticks. + + diff --git a/main/input_default.cpp b/main/input_default.cpp index e975d4141f1..945898f1f3f 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -102,7 +102,7 @@ bool InputDefault::is_action_pressed(const StringName& p_action) { const List *alist = InputMap::get_singleton()->get_action_list(p_action); if (!alist) - return NULL; + return false; for (const List::Element *E=alist->front();E;E=E->next()) { @@ -221,18 +221,18 @@ void InputDefault::joy_connection_changed(int p_idx, bool p_connected, String p_ }; }; js.uid = uidname; - //printf("looking for mappings for guid %ls\n", uidname.c_str()); + js.connected = true; int mapping = fallback_mapping; for (int i=0; i < map_db.size(); i++) { if (js.uid == map_db[i].uid) { mapping = i; js.name = map_db[i].name; - //printf("found mapping\n"); }; }; js.mapping = mapping; } else { + js.connected = false; for (int i = 0; i < JOY_BUTTON_MAX; i++) { if (i < JOY_AXIS_MAX) @@ -1042,3 +1042,15 @@ bool InputDefault::is_joy_mapped(int p_device) { String InputDefault::get_joy_guid_remapped(int p_device) const { return joy_names[p_device].uid; } + +Array InputDefault::get_connected_joysticks() { + Array ret; + Map::Element *elem = joy_names.front(); + while (elem) { + if (elem->get().connected) { + ret.push_back(elem->key()); + } + elem = elem->next(); + } + return ret; +} diff --git a/main/input_default.h b/main/input_default.h index c7fef8374c7..644af15e3b8 100644 --- a/main/input_default.h +++ b/main/input_default.h @@ -75,6 +75,7 @@ class InputDefault : public Input { struct Joystick { StringName name; StringName uid; + bool connected; bool last_buttons[JOY_BUTTON_MAX + 19]; //apparently SDL specifies 35 possible buttons on android float last_axis[JOY_AXIS_MAX]; float filter; @@ -93,6 +94,7 @@ class InputDefault : public Input { last_buttons[i] = false; } + connected = false; last_hat = HAT_MASK_CENTER; filter = 0.01f; mapping = -1; @@ -168,6 +170,7 @@ public: virtual float get_joy_axis(int p_device,int p_axis); String get_joy_name(int p_idx); + virtual Array get_connected_joysticks(); virtual Vector2 get_joy_vibration_strength(int p_device); virtual float get_joy_vibration_duration(int p_device); virtual uint64_t get_joy_vibration_timestamp(int p_device);