Merge pull request #8152 from Hinsbart/input_id_2.1
[2.1] Better handling of joypad device IDs.
This commit is contained in:
commit
b3d1113ae3
@ -1157,6 +1157,15 @@ int InputDefault::get_joy_button_index_from_string(String p_button) {
|
||||
ERR_FAIL_V(-1);
|
||||
}
|
||||
|
||||
int InputDefault::get_unused_joy_id() {
|
||||
for (int i = 0; i < JOYSTICKS_MAX; i++) {
|
||||
if (!joy_names.has(i) || !joy_names[i].connected) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
String InputDefault::get_joy_axis_string(int p_axis) {
|
||||
ERR_FAIL_INDEX_V(p_axis, JOY_AXIS_MAX, "");
|
||||
return _axes[p_axis];
|
||||
|
@ -122,6 +122,11 @@ public:
|
||||
HAT_LEFT,
|
||||
HAT_MAX,
|
||||
};
|
||||
|
||||
enum {
|
||||
JOYSTICKS_MAX = 16,
|
||||
};
|
||||
|
||||
struct JoyAxis {
|
||||
int min;
|
||||
float value;
|
||||
@ -226,6 +231,8 @@ public:
|
||||
virtual int get_joy_axis_index_from_string(String p_axis);
|
||||
virtual int get_joy_button_index_from_string(String p_button);
|
||||
|
||||
int get_unused_joy_id();
|
||||
|
||||
bool is_joy_mapped(int p_device);
|
||||
String get_joy_guid_remapped(int p_device) const;
|
||||
void set_fallback_mapping(String p_guid);
|
||||
|
@ -271,7 +271,6 @@ void JoystickOSX::_device_removed(int p_id) {
|
||||
input->joy_connection_changed(p_id, false, "");
|
||||
device_list[device].free();
|
||||
device_list.remove(device);
|
||||
attached_devices[p_id] = false;
|
||||
}
|
||||
|
||||
static String _hex_str(uint8_t p_byte) {
|
||||
@ -303,7 +302,7 @@ bool JoystickOSX::configure_joystick(IOHIDDeviceRef p_device_ref, joystick *p_jo
|
||||
}
|
||||
name = c_name;
|
||||
|
||||
int id = get_free_joy_id();
|
||||
int id = input->get_unused_joy_id();
|
||||
ERR_FAIL_COND_V(id == -1, false);
|
||||
p_joy->id = id;
|
||||
int vendor = 0;
|
||||
@ -512,16 +511,6 @@ void JoystickOSX::joystick_vibration_stop(int p_id, uint64_t p_timestamp) {
|
||||
FFEffectStop(joy->ff_object);
|
||||
}
|
||||
|
||||
int JoystickOSX::get_free_joy_id() {
|
||||
for (int i = 0; i < JOYSTICKS_MAX; i++) {
|
||||
if (!attached_devices[i]) {
|
||||
attached_devices[i] = true;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int JoystickOSX::get_joy_index(int p_id) const {
|
||||
for (int i = 0; i < device_list.size(); i++) {
|
||||
if (device_list[i].id == p_id) return i;
|
||||
@ -582,10 +571,6 @@ JoystickOSX::JoystickOSX() {
|
||||
self = this;
|
||||
input = (InputDefault *)Input::get_singleton();
|
||||
|
||||
for (int i = 0; i < JOYSTICKS_MAX; i++) {
|
||||
attached_devices[i] = false;
|
||||
}
|
||||
|
||||
int okay = 1;
|
||||
const void *vals[] = {
|
||||
(void *)create_match_dictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick, &okay),
|
||||
|
@ -95,13 +95,11 @@ private:
|
||||
InputDefault *input;
|
||||
IOHIDManagerRef hid_manager;
|
||||
|
||||
bool attached_devices[JOYSTICKS_MAX];
|
||||
Vector<joystick> device_list;
|
||||
|
||||
bool have_device(IOHIDDeviceRef p_device) const;
|
||||
bool configure_joystick(IOHIDDeviceRef p_device_ref, joystick *p_joy);
|
||||
|
||||
int get_free_joy_id();
|
||||
int get_joy_index(int p_id) const;
|
||||
|
||||
void poll_joysticks() const;
|
||||
|
@ -89,16 +89,6 @@ bool joystick_windows::have_device(const GUID &p_guid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int joystick_windows::check_free_joy_slot() const {
|
||||
|
||||
for (int i = 0; i < JOYSTICKS_MAX; i++) {
|
||||
|
||||
if (!attached_joysticks[i])
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// adapted from SDL2, works a lot better than the MSDN version
|
||||
bool joystick_windows::is_xinput_device(const GUID *p_guid) {
|
||||
|
||||
@ -147,7 +137,7 @@ bool joystick_windows::is_xinput_device(const GUID *p_guid) {
|
||||
bool joystick_windows::setup_dinput_joystick(const DIDEVICEINSTANCE *instance) {
|
||||
|
||||
HRESULT hr;
|
||||
int num = check_free_joy_slot();
|
||||
int num = input->get_unused_joy_id();
|
||||
|
||||
if (have_device(instance->guidInstance) || num == -1)
|
||||
return false;
|
||||
@ -295,7 +285,7 @@ void joystick_windows::probe_joysticks() {
|
||||
dwResult = xinput_get_state(i, &x_joysticks[i].state);
|
||||
if (dwResult == ERROR_SUCCESS) {
|
||||
|
||||
int id = check_free_joy_slot();
|
||||
int id = input->get_unused_joy_id();
|
||||
if (id != -1 && !x_joysticks[i].attached) {
|
||||
|
||||
x_joysticks[i].attached = true;
|
||||
|
@ -131,7 +131,6 @@ private:
|
||||
void load_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);
|
||||
|
||||
bool have_device(const GUID &p_guid);
|
||||
|
@ -219,15 +219,6 @@ void joystick_linux::monitor_joysticks() {
|
||||
}
|
||||
}
|
||||
|
||||
int joystick_linux::get_free_joy_slot() const {
|
||||
|
||||
for (int i = 0; i < JOYSTICKS_MAX; i++) {
|
||||
|
||||
if (joysticks[i].fd == -1) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int joystick_linux::get_joy_from_path(String p_path) const {
|
||||
|
||||
for (int i = 0; i < JOYSTICKS_MAX; i++) {
|
||||
@ -329,7 +320,7 @@ void joystick_linux::setup_joystick_properties(int p_id) {
|
||||
|
||||
void joystick_linux::open_joystick(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);
|
||||
if (fd != -1 && joy_num != -1) {
|
||||
|
||||
|
@ -79,7 +79,6 @@ private:
|
||||
static void joy_thread_func(void *p_user);
|
||||
|
||||
int get_joy_from_path(String path) const;
|
||||
int get_free_joy_slot() const;
|
||||
|
||||
void setup_joystick_properties(int p_id);
|
||||
void close_joystick(int p_id = -1);
|
||||
|
Loading…
Reference in New Issue
Block a user