mirror of
https://github.com/godotengine/godot.git
synced 2024-11-22 04:06:14 +00:00
Merge pull request #7862 from Hinsbart/joypad_connections
Better handling of joypad device IDs.
This commit is contained in:
commit
34a0aa6900
@ -1214,6 +1214,15 @@ int InputDefault::get_joy_button_index_from_string(String p_button) {
|
|||||||
ERR_FAIL_V(-1);
|
ERR_FAIL_V(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int InputDefault::get_unused_joy_id() {
|
||||||
|
for (int i=0;i<JOYPADS_MAX;i++) {
|
||||||
|
if (!joy_names.has(i) || !joy_names[i].connected) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
String InputDefault::get_joy_axis_string(int p_axis) {
|
String InputDefault::get_joy_axis_string(int p_axis) {
|
||||||
ERR_FAIL_INDEX_V(p_axis, JOY_AXIS_MAX, "");
|
ERR_FAIL_INDEX_V(p_axis, JOY_AXIS_MAX, "");
|
||||||
return _axes[p_axis];
|
return _axes[p_axis];
|
||||||
|
@ -134,6 +134,11 @@ public:
|
|||||||
HAT_LEFT,
|
HAT_LEFT,
|
||||||
HAT_MAX,
|
HAT_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
JOYPADS_MAX = 16,
|
||||||
|
};
|
||||||
|
|
||||||
struct JoyAxis {
|
struct JoyAxis {
|
||||||
int min;
|
int min;
|
||||||
float value;
|
float value;
|
||||||
@ -243,6 +248,8 @@ public:
|
|||||||
virtual int get_joy_axis_index_from_string(String p_axis);
|
virtual int get_joy_axis_index_from_string(String p_axis);
|
||||||
virtual int get_joy_button_index_from_string(String p_button);
|
virtual int get_joy_button_index_from_string(String p_button);
|
||||||
|
|
||||||
|
int get_unused_joy_id();
|
||||||
|
|
||||||
bool is_joy_mapped(int p_device);
|
bool is_joy_mapped(int p_device);
|
||||||
String get_joy_guid_remapped(int p_device) const;
|
String get_joy_guid_remapped(int p_device) const;
|
||||||
void set_fallback_mapping(String p_guid);
|
void set_fallback_mapping(String p_guid);
|
||||||
|
@ -275,7 +275,6 @@ void JoypadOSX::_device_removed(int p_id) {
|
|||||||
input->joy_connection_changed(p_id, false, "");
|
input->joy_connection_changed(p_id, false, "");
|
||||||
device_list[device].free();
|
device_list[device].free();
|
||||||
device_list.remove(device);
|
device_list.remove(device);
|
||||||
attached_devices[p_id] = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static String _hex_str(uint8_t p_byte) {
|
static String _hex_str(uint8_t p_byte) {
|
||||||
@ -307,7 +306,7 @@ bool JoypadOSX::configure_joypad(IOHIDDeviceRef p_device_ref, joypad* p_joy) {
|
|||||||
}
|
}
|
||||||
name = c_name;
|
name = c_name;
|
||||||
|
|
||||||
int id = get_free_joy_id();
|
int id = input->get_unused_joy_id();
|
||||||
ERR_FAIL_COND_V(id == -1, false);
|
ERR_FAIL_COND_V(id == -1, false);
|
||||||
p_joy->id = id;
|
p_joy->id = id;
|
||||||
int vendor = 0;
|
int vendor = 0;
|
||||||
@ -510,16 +509,6 @@ void JoypadOSX::joypad_vibration_stop(int p_id, uint64_t p_timestamp) {
|
|||||||
FFEffectStop(joy->ff_object);
|
FFEffectStop(joy->ff_object);
|
||||||
}
|
}
|
||||||
|
|
||||||
int JoypadOSX::get_free_joy_id() {
|
|
||||||
for (int i = 0; i < JOYPADS_MAX; i++) {
|
|
||||||
if (!attached_devices[i]) {
|
|
||||||
attached_devices[i] = true;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int JoypadOSX::get_joy_index(int p_id) const {
|
int JoypadOSX::get_joy_index(int p_id) const {
|
||||||
for (int i = 0; i < device_list.size(); i++) {
|
for (int i = 0; i < device_list.size(); i++) {
|
||||||
if (device_list[i].id == p_id) return i;
|
if (device_list[i].id == p_id) return i;
|
||||||
@ -582,10 +571,6 @@ JoypadOSX::JoypadOSX()
|
|||||||
self = this;
|
self = this;
|
||||||
input = (InputDefault*)Input::get_singleton();
|
input = (InputDefault*)Input::get_singleton();
|
||||||
|
|
||||||
for (int i = 0; i < JOYPADS_MAX; i++) {
|
|
||||||
attached_devices[i] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int okay = 1;
|
int okay = 1;
|
||||||
const void *vals[] = {
|
const void *vals[] = {
|
||||||
(void *) create_match_dictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick, &okay),
|
(void *) create_match_dictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick, &okay),
|
||||||
|
@ -95,14 +95,11 @@ private:
|
|||||||
InputDefault *input;
|
InputDefault *input;
|
||||||
IOHIDManagerRef hid_manager;
|
IOHIDManagerRef hid_manager;
|
||||||
|
|
||||||
bool attached_devices[JOYPADS_MAX];
|
|
||||||
Vector<joypad> device_list;
|
Vector<joypad> device_list;
|
||||||
|
|
||||||
bool have_device(IOHIDDeviceRef p_device) const;
|
bool have_device(IOHIDDeviceRef p_device) const;
|
||||||
bool configure_joypad(IOHIDDeviceRef p_device_ref, joypad *p_joy);
|
bool configure_joypad(IOHIDDeviceRef p_device_ref, joypad *p_joy);
|
||||||
|
|
||||||
|
|
||||||
int get_free_joy_id();
|
|
||||||
int get_joy_index(int p_id) const;
|
int get_joy_index(int p_id) const;
|
||||||
|
|
||||||
void poll_joypads() const;
|
void poll_joypads() const;
|
||||||
|
@ -87,16 +87,6 @@ bool JoypadWindows::have_device(const GUID &p_guid) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int JoypadWindows::check_free_joy_slot() const {
|
|
||||||
|
|
||||||
for (int i = 0; i < JOYPADS_MAX; i++) {
|
|
||||||
|
|
||||||
if (!attached_joypads[i])
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// adapted from SDL2, works a lot better than the MSDN version
|
// adapted from SDL2, works a lot better than the MSDN version
|
||||||
bool JoypadWindows::is_xinput_device(const GUID *p_guid) {
|
bool JoypadWindows::is_xinput_device(const GUID *p_guid) {
|
||||||
@ -146,7 +136,7 @@ bool JoypadWindows::is_xinput_device(const GUID *p_guid) {
|
|||||||
bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE* instance) {
|
bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE* instance) {
|
||||||
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
int num = check_free_joy_slot();
|
int num = input->get_unused_joy_id();
|
||||||
|
|
||||||
if (have_device(instance->guidInstance) || num == -1)
|
if (have_device(instance->guidInstance) || num == -1)
|
||||||
return false;
|
return false;
|
||||||
@ -296,7 +286,7 @@ void JoypadWindows::probe_joypads() {
|
|||||||
dwResult = xinput_get_state(i, &x_joypads[i].state);
|
dwResult = xinput_get_state(i, &x_joypads[i].state);
|
||||||
if ( dwResult == ERROR_SUCCESS) {
|
if ( dwResult == ERROR_SUCCESS) {
|
||||||
|
|
||||||
int id = check_free_joy_slot();
|
int id = input->get_unused_joy_id();
|
||||||
if (id != -1 && !x_joypads[i].attached) {
|
if (id != -1 && !x_joypads[i].attached) {
|
||||||
|
|
||||||
x_joypads[i].attached = true;
|
x_joypads[i].attached = true;
|
||||||
|
@ -132,7 +132,6 @@ private:
|
|||||||
void load_xinput();
|
void load_xinput();
|
||||||
void unload_xinput();
|
void unload_xinput();
|
||||||
|
|
||||||
int check_free_joy_slot() const;
|
|
||||||
unsigned int post_hat(unsigned int p_last_id, int p_device, DWORD p_dpad);
|
unsigned int post_hat(unsigned int p_last_id, int p_device, DWORD p_dpad);
|
||||||
|
|
||||||
bool have_device(const GUID &p_guid);
|
bool have_device(const GUID &p_guid);
|
||||||
|
@ -219,15 +219,6 @@ void JoypadLinux::monitor_joypads() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int JoypadLinux::get_free_joy_slot() const {
|
|
||||||
|
|
||||||
for (int i = 0; i < JOYPADS_MAX; i++) {
|
|
||||||
|
|
||||||
if (joypads[i].fd == -1) return i;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int JoypadLinux::get_joy_from_path(String p_path) const {
|
int JoypadLinux::get_joy_from_path(String p_path) const {
|
||||||
|
|
||||||
for (int i = 0; i < JOYPADS_MAX; i++) {
|
for (int i = 0; i < JOYPADS_MAX; i++) {
|
||||||
@ -329,7 +320,7 @@ void JoypadLinux::setup_joypad_properties(int p_id) {
|
|||||||
|
|
||||||
void JoypadLinux::open_joypad(const char *p_path) {
|
void JoypadLinux::open_joypad(const char *p_path) {
|
||||||
|
|
||||||
int joy_num = get_free_joy_slot();
|
int joy_num = input->get_unused_joy_id();
|
||||||
int fd = open(p_path, O_RDWR | O_NONBLOCK);
|
int fd = open(p_path, O_RDWR | O_NONBLOCK);
|
||||||
if (fd != -1 && joy_num != -1) {
|
if (fd != -1 && joy_num != -1) {
|
||||||
|
|
||||||
|
@ -81,7 +81,6 @@ private:
|
|||||||
static void joy_thread_func(void *p_user);
|
static void joy_thread_func(void *p_user);
|
||||||
|
|
||||||
int get_joy_from_path(String path) const;
|
int get_joy_from_path(String path) const;
|
||||||
int get_free_joy_slot() const;
|
|
||||||
|
|
||||||
void setup_joypad_properties(int p_id);
|
void setup_joypad_properties(int p_id);
|
||||||
void close_joypad(int p_id = -1);
|
void close_joypad(int p_id = -1);
|
||||||
|
Loading…
Reference in New Issue
Block a user