From 0073bef980f27a6e76456a675d82064b5a3216cb Mon Sep 17 00:00:00 2001 From: meancoot Date: Tue, 10 Dec 2013 16:22:26 -0500 Subject: [PATCH] =?UTF-8?q?(OSX)=20Fix=20support=20for=20gamepads=20that?= =?UTF-8?q?=20aren=E2=80=99t=20a=20WiiMote=20or=20DualShock=203.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apple/OSX/hid_pad.c | 11 ++++++++--- apple/common/apple_input.h | 3 +++ apple/common/apple_joypad.c | 9 +++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/apple/OSX/hid_pad.c b/apple/OSX/hid_pad.c index 0ba9281d5c..01c7a15d51 100644 --- a/apple/OSX/hid_pad.c +++ b/apple/OSX/hid_pad.c @@ -130,10 +130,15 @@ static void hid_manager_device_attached(void* context, IOReturn result, void* se CFStringGetCString(device_name, buffer, 1024, kCFStringEncodingUTF8); connection->slot = apple_joypad_connect(buffer, connection); - IOHIDDeviceRegisterInputReportCallback(device, connection->data + 1, sizeof(connection->data) - 1, hid_device_report, connection); + + if (apple_joypad_has_interface(connection->slot)) + { + IOHIDDeviceRegisterInputReportCallback(device, connection->data + 1, sizeof(connection->data) - 1, hid_device_report, connection); + return; + } } - else - IOHIDDeviceRegisterInputValueCallback(device, hid_device_input_callback, connection); + + IOHIDDeviceRegisterInputValueCallback(device, hid_device_input_callback, connection); } static void append_matching_dictionary(CFMutableArrayRef array, uint32_t page, uint32_t use) diff --git a/apple/common/apple_input.h b/apple/common/apple_input.h index 08c3f0c256..9bfb39afec 100644 --- a/apple/common/apple_input.h +++ b/apple/common/apple_input.h @@ -58,6 +58,9 @@ int32_t apple_joypad_connect(const char* name, struct apple_pad_connection* conn void apple_joypad_disconnect(uint32_t slot); void apple_joypad_packet(uint32_t slot, uint8_t* data, uint32_t length); +// Determine if connected joypad is a hidpad backed device; if false apple_joypad_packet cannot be used +bool apple_joypad_has_interface(uint32_t slot); + // This is implemented in the platform specific portions of the input code void apple_joypad_send_hid_control(struct apple_pad_connection* connection, uint8_t* data, size_t size); diff --git a/apple/common/apple_joypad.c b/apple/common/apple_joypad.c index b025ad416f..1bc71bb17e 100644 --- a/apple/common/apple_joypad.c +++ b/apple/common/apple_joypad.c @@ -41,7 +41,10 @@ static int32_t find_empty_slot() { for (int i = 0; i != MAX_PLAYERS; i ++) if (!slots[i].used) + { + memset(&slots[i], 0, sizeof(slots[0])); return i; + } return -1; } @@ -94,6 +97,12 @@ void apple_joypad_packet(uint32_t slot, uint8_t* data, uint32_t length) } } +bool apple_joypad_has_interface(uint32_t slot) +{ + if (slot < MAX_PLAYERS && slots[slot].used) + return slots[slot].iface ? true : false; + return false; +} // RetroArch joypad driver: static bool apple_joypad_init(void)