Merge pull request #7862 from Hinsbart/joypad_connections

Better handling of joypad device IDs.
This commit is contained in:
Rémi Verschelde 2017-02-26 21:30:24 +01:00 committed by GitHub
commit 34a0aa6900
8 changed files with 20 additions and 43 deletions

View File

@ -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];

View File

@ -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);

View File

@ -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),

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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) {

View File

@ -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);