From ed0769dd3c473ee7bda4c641f0ea9fa2250e8a16 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 28 Dec 2007 20:39:31 +0000 Subject: [PATCH] Fixed fatbuild.sh script for building on Mac OS X 10.5 The minimum PPC SDK is 10.3.9 --- build-scripts/fatbuild.sh | 28 +- src/joystick/darwin/10.3.9-FIX/IOHIDLib.h | 874 ++++++++++++++++++++++ src/joystick/darwin/SDL_sysjoystick.c | 4 + 3 files changed, 892 insertions(+), 14 deletions(-) create mode 100644 src/joystick/darwin/10.3.9-FIX/IOHIDLib.h diff --git a/build-scripts/fatbuild.sh b/build-scripts/fatbuild.sh index d5da20788..3816168db 100755 --- a/build-scripts/fatbuild.sh +++ b/build-scripts/fatbuild.sh @@ -10,26 +10,26 @@ NJOB=$NCPU # Generic, cross-platform CFLAGS you always want go here. CFLAGS="-O3 -g -pipe" -# PowerPC configure flags (10.2 runtime compatibility) +# PowerPC configure flags (10.3 runtime compatibility) # We dynamically load X11, so using the system X11 headers is fine. CONFIG_PPC="--build=`uname -p`-apple-darwin --host=powerpc-apple-darwin \ --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib" # PowerPC compiler flags -CC_PPC="gcc-3.3 -arch ppc" -CXX_PPC="g++-3.3 -arch ppc" +CC_PPC="gcc-4.0 -arch ppc" +CXX_PPC="g++-4.0 -arch ppc" CFLAGS_PPC="" -CPPFLAGS_PPC="-DMAC_OS_X_VERSION_MIN_REQUIRED=1020 \ +CPPFLAGS_PPC="-DMAC_OS_X_VERSION_MIN_REQUIRED=1030 \ -nostdinc \ --F/Developer/SDKs/MacOSX10.2.8.sdk/System/Library/Frameworks \ --I/Developer/SDKs/MacOSX10.2.8.sdk/usr/include/gcc/darwin/3.3 \ --isystem /Developer/SDKs/MacOSX10.2.8.sdk/usr/include" +-F/Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks \ +-I/Developer/SDKs/MacOSX10.3.9.sdk/usr/lib/gcc/powerpc-apple-darwin9/4.0.1/include \ +-isystem /Developer/SDKs/MacOSX10.3.9.sdk/usr/include" -# PowerPC linker flags -LFLAGS_PPC="-arch ppc \ --L/Developer/SDKs/MacOSX10.2.8.sdk/usr/lib/gcc/darwin/3.3 \ --F/Developer/SDKs/MacOSX10.2.8.sdk/System/Library/Frameworks \ --Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk" +# PowerPC linker flags +LFLAGS_PPC="-arch ppc -mmacosx-version-min=10.3 \ +-L/Developer/SDKs/MacOSX10.3.9.sdk/usr/lib/gcc/powerpc-apple-darwin9/4.0.1 \ +-F/Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks \ +-Wl,-syslibroot,/Developer/SDKs/MacOSX10.3.9.sdk" # Intel configure flags (10.4 runtime compatibility) # We dynamically load X11, so using the system X11 headers is fine. @@ -43,12 +43,12 @@ CFLAGS_X86="-mmacosx-version-min=10.4" CPPFLAGS_X86="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040 \ -nostdinc \ -F/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks \ --I/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.1/include \ +-I/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin9/4.0.1/include \ -isystem /Developer/SDKs/MacOSX10.4u.sdk/usr/include" # Intel linker flags LFLAGS_X86="-arch i386 -mmacosx-version-min=10.4 \ --L/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.1 \ +-L/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin9/4.0.1 \ -Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" # diff --git a/src/joystick/darwin/10.3.9-FIX/IOHIDLib.h b/src/joystick/darwin/10.3.9-FIX/IOHIDLib.h new file mode 100644 index 000000000..836a71ec3 --- /dev/null +++ b/src/joystick/darwin/10.3.9-FIX/IOHIDLib.h @@ -0,0 +1,874 @@ +/* *INDENT-OFF* */ +/* + * + * @APPLE_LICENSE_HEADER_START@ + * + * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#ifndef _IOKIT_HID_IOHIDLIB_H_ +#define _IOKIT_HID_IOHIDLIB_H_ + +#include + +__BEGIN_DECLS +#include +#if COREFOUNDATION_CFPLUGINCOM_SEPARATE +#include +#endif + +#include +#include + +#include + +struct IOHIDEventStruct +{ + IOHIDElementType type; + IOHIDElementCookie elementCookie; + SInt32 value; + AbsoluteTime timestamp; + UInt32 longValueSize; + void * longValue; +}; +typedef struct IOHIDEventStruct IOHIDEventStruct; + +/* FA12FA38-6F1A-11D4-BA0C-0005028F18D5 */ +#define kIOHIDDeviceUserClientTypeID CFUUIDGetConstantUUIDWithBytes(NULL, \ + 0xFA, 0x12, 0xFA, 0x38, 0x6F, 0x1A, 0x11, 0xD4, \ + 0xBA, 0x0C, 0x00, 0x05, 0x02, 0x8F, 0x18, 0xD5) + +/* 13AA9C44-6F1B-11D4-907C-0005028F18D5 */ +#define kIOHIDDeviceFactoryID CFUUIDGetConstantUUIDWithBytes(NULL, \ + 0x13, 0xAA, 0x9C, 0x44, 0x6F, 0x1B, 0x11, 0xD4, \ + 0x90, 0x7C, 0x00, 0x05, 0x02, 0x8F, 0x18, 0xD5) + +/* 78BD420C-6F14-11D4-9474-0005028F18D5 */ +/*! @defined kIOHIDDeviceInterfaceID + @discussion Interface ID for the IOHIDDeviceInterface. Corresponds to an + available HID device. */ +#define kIOHIDDeviceInterfaceID CFUUIDGetConstantUUIDWithBytes(NULL, \ + 0x78, 0xBD, 0x42, 0x0C, 0x6F, 0x14, 0x11, 0xD4, \ + 0x94, 0x74, 0x00, 0x05, 0x02, 0x8F, 0x18, 0xD5) + +/* 7D0B510E-16D5-11D7-9E9B-000393992E38 */ +/*! @defined kIOHIDDeviceInterfaceID121 + @discussion Interface ID for the IOHIDDeviceInterface121. Corresponds to + an available HID device that includes methods from + IOHIDDeviceInterface. This interface is available on + IOHIDLib 1.2.1 and Mac OS X 10.2.3 or later.*/ +#define kIOHIDDeviceInterfaceID121 CFUUIDGetConstantUUIDWithBytes(NULL, \ + 0x7d, 0xb, 0x51, 0xe, 0x16, 0xd5, 0x11, 0xd7, \ + 0x9e, 0x9b, 0x0, 0x3, 0x93, 0x99, 0x2e, 0x38) + +/* B70ABF31-16D5-11D7-AB35-000393992E38 */ +/*! @defined kIOHIDDeviceInterfaceID122 + @discussion Interface ID for the IOHIDDeviceInterface122. Corresponds to + an available HID device that includes methods from + IOHIDDeviceInterface and IOHIDDeviceInterface121. This + interface is available on IOHIDLib 1.2.2 and Mac OS X 10.3 + or later.*/ +#define kIOHIDDeviceInterfaceID122 CFUUIDGetConstantUUIDWithBytes(NULL, \ + 0xb7, 0xa, 0xbf, 0x31, 0x16, 0xd5, 0x11, 0xd7, \ + 0xab, 0x35, 0x0, 0x3, 0x93, 0x99, 0x2e, 0x38) + +/* 8138629E-6F14-11D4-970E-0005028F18D5 */ +/*! @defined kIOHIDQueueInterfaceID + @discussion Interface ID for the kIOHIDQueueInterfaceID. Corresponds to a + queue for a specific HID device. */ +#define kIOHIDQueueInterfaceID CFUUIDGetConstantUUIDWithBytes(NULL, \ + 0x81, 0x38, 0x62, 0x9E, 0x6F, 0x14, 0x11, 0xD4, \ + 0x97, 0x0E, 0x00, 0x05, 0x02, 0x8F, 0x18, 0xD5) + +/* 80CDCC00-755D-11D4-8E0F-0005028F18D5 */ +/*! @defined kIOHIDOutputTransactionInterfaceID + @discussion Interface ID for the kIOHIDOutputTransactionInterfaceID. + Corresponds to an output transaction for one or more report IDs + on a specific device. */ +#define kIOHIDOutputTransactionInterfaceID CFUUIDGetConstantUUIDWithBytes(NULL,\ + 0x80, 0xCD, 0xCC, 0x00, 0x75, 0x5D, 0x11, 0xD4, \ + 0x80, 0xEF, 0x00, 0x05, 0x02, 0x8F, 0x18, 0xD5) + +/*! @typedef IOHIDCallbackFunction + @discussion Type and arguments of callout C function that is used when a + completion routine is called, see + IOHIDLib.h:setRemovalCallback(). + @param target void * pointer to your data, often a pointer to an object. + @param result Completion result of desired operation. + @param refcon void * pointer to more data. + @param sender Interface instance sending the completion routine. +*/ +typedef void (*IOHIDCallbackFunction) + (void * target, IOReturn result, void * refcon, void * sender); + +/*! @typedef IOHIDElementCallbackFunction + @discussion Type and arguments of callout C function that is used when a + completion routine is called, see IOHIDLib.h:setElementValue(). + @param target void * pointer to your data, often a pointer to an object. + @param result Completion result of desired operation. + @param refcon void * pointer to more data. + @param sender Interface instance sending the completion routine. + @param elementCookie Element within interface instance sending completion. +*/ +typedef void (*IOHIDElementCallbackFunction) + (void * target, + IOReturn result, + void * refcon, + void * sender, + IOHIDElementCookie elementCookie); + +/*! @typedef IOHIDReportCallbackFunction + @discussion Type and arguments of callout C function that is used when a + completion routine is called, see IOHIDLib.h:setReport(). + @param target void * pointer to your data, often a pointer to an object. + @param result Completion result of desired operation. + @param refcon void * pointer to more data. + @param sender Interface instance sending the completion routine. + @param bufferSize Size of the buffer received upon completion. +*/ +typedef void (*IOHIDReportCallbackFunction) + (void * target, + IOReturn result, + void * refcon, + void * sender, + UInt32 bufferSize); + + +/* Forward declarations of the queue and output transaction interfaces */ +struct IOHIDQueueInterface; +struct IOHIDOutputTransactionInterface; +typedef struct IOHIDQueueInterface IOHIDQueueInterface; +typedef struct IOHIDOutputTransactionInterface IOHIDOutputTransactionInterface; + +// +// IOHIDDeviceInterface Functions available in version 1.0 (10.0) and higher of Mac OS X +// +#define IOHIDDEVICEINTERFACE_FUNCS_100 \ + IOReturn (*createAsyncEventSource)(void * self, CFRunLoopSourceRef * source); \ + CFRunLoopSourceRef (*getAsyncEventSource)(void * self); \ + IOReturn (*createAsyncPort)(void * self, mach_port_t * port); \ + mach_port_t (*getAsyncPort)(void * self); \ + IOReturn (*open)(void * self, UInt32 flags); \ + IOReturn (*close)(void * self); \ + IOReturn (*setRemovalCallback)(void * self, IOHIDCallbackFunction removalCallback, \ + void * removalTarget, void * removalRefcon); \ + IOReturn (*getElementValue)(void * self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * valueEvent); \ + IOReturn (*setElementValue)(void * self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * valueEvent, UInt32 timeoutMS, \ + IOHIDElementCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon); \ + IOReturn (*queryElementValue)(void * self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * valueEvent, UInt32 timeoutMS, \ + IOHIDElementCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon); \ + IOReturn (*startAllQueues)(void * self); \ + IOReturn (*stopAllQueues)(void * self); \ + IOHIDQueueInterface ** (*allocQueue) (void *self); \ + IOHIDOutputTransactionInterface ** (*allocOutputTransaction) (void *self) + +// +// IOHIDDeviceInterface Functions available in version 1.2.1 (10.2.3) and higher of Mac OS X +// +#define IOHIDDEVICEINTERFACE_FUNCS_121 \ + IOReturn (*setReport)(void * self, IOHIDReportType reportType, UInt32 reportID, \ + void * reportBuffer, UInt32 reportBufferSize, \ + UInt32 timeoutMS, IOHIDReportCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon); \ + IOReturn (*getReport)(void * self, IOHIDReportType reportType, \ + UInt32 reportID, void * reportBuffer, \ + UInt32 * reportBufferSize, UInt32 timeoutMS, \ + IOHIDReportCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon) + +// +// IOHIDDeviceInterface Functions available in version 1.2.2 (10.3) and higher of Mac OS X +// +#define IOHIDDEVICEINTERFACE_FUNCS_122 \ + IOReturn (*copyMatchingElements)(void * self, CFDictionaryRef matchingDict, \ + CFArrayRef * elements); \ + IOReturn (*setInterruptReportHandlerCallback)(void * self, void * reportBuffer, \ + UInt32 reportBufferSize, \ + IOHIDReportCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon) + +typedef struct IOHIDDeviceInterface +{ + IUNKNOWN_C_GUTS; + IOHIDDEVICEINTERFACE_FUNCS_100; + IOHIDDEVICEINTERFACE_FUNCS_121; +} IOHIDDeviceInterface; + +typedef struct IOHIDDeviceInterface121 +{ + IUNKNOWN_C_GUTS; + IOHIDDEVICEINTERFACE_FUNCS_100; + IOHIDDEVICEINTERFACE_FUNCS_121; +} IOHIDDeviceInterface121; + +typedef struct IOHIDDeviceInterface122 +{ + IUNKNOWN_C_GUTS; + IOHIDDEVICEINTERFACE_FUNCS_100; + IOHIDDEVICEINTERFACE_FUNCS_121; + IOHIDDEVICEINTERFACE_FUNCS_122; +} IOHIDDeviceInterface122; + + +// +// IOHIDQueueInterface Functions available in version 1.0 (10.0) and higher of Mac OS X +// +#define IOHIDQUEUEINTERFACE_FUNCS_100 \ + IOReturn (*createAsyncEventSource)(void * self, CFRunLoopSourceRef * source); \ + CFRunLoopSourceRef (*getAsyncEventSource)(void * self); \ + IOReturn (*createAsyncPort)(void * self, mach_port_t * port); \ + mach_port_t (*getAsyncPort)(void * self); \ + IOReturn (*create)(void * self, UInt32 flags, UInt32 depth); \ + IOReturn (*dispose)(void * self); \ + IOReturn (*addElement)(void * self, IOHIDElementCookie elementCookie, UInt32 flags);\ + IOReturn (*removeElement)(void * self, IOHIDElementCookie elementCookie); \ + Boolean (*hasElement)(void * self, IOHIDElementCookie elementCookie); \ + IOReturn (*start)(void * self); \ + IOReturn (*stop)(void * self); \ + IOReturn (*getNextEvent)(void * self, IOHIDEventStruct * event, \ + AbsoluteTime maxTime, UInt32 timeoutMS); \ + IOReturn (*setEventCallout)(void * self, IOHIDCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon); \ + IOReturn (*getEventCallout)(void * self, IOHIDCallbackFunction * outCallback, \ + void ** outCallbackTarget, void ** outCallbackRefcon) + +struct IOHIDQueueInterface +{ + IUNKNOWN_C_GUTS; + IOHIDQUEUEINTERFACE_FUNCS_100; +}; + +// +// IOHIDOutputTransactionInterface Functions available in version 1.2 (10.2) and higher of Mac OS X +// +#define IOHIDOUTPUTTRANSACTIONINTERFACE_FUNCS_120 \ + IOReturn (*createAsyncEventSource)(void * self, CFRunLoopSourceRef * source); \ + CFRunLoopSourceRef (*getAsyncEventSource)(void * self); \ + IOReturn (*createAsyncPort)(void * self, mach_port_t * port); \ + mach_port_t (*getAsyncPort)(void * self); \ + IOReturn (*create)(void * self); \ + IOReturn (*dispose)(void * self); \ + IOReturn (*addElement)(void * self, IOHIDElementCookie elementCookie); \ + IOReturn (*removeElement)(void * self, IOHIDElementCookie elementCookie); \ + Boolean (*hasElement)(void * self, IOHIDElementCookie elementCookie); \ + IOReturn (*setElementDefault)(void *self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * valueEvent); \ + IOReturn (*getElementDefault)(void * self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * outValueEvent); \ + IOReturn (*setElementValue)(void * self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * valueEvent); \ + IOReturn (*getElementValue)(void * self, IOHIDElementCookie elementCookie, \ + IOHIDEventStruct * outValueEvent); \ + IOReturn (*commit)(void * self, UInt32 timeoutMS, IOHIDCallbackFunction callback, \ + void * callbackTarget, void * callbackRefcon); \ + IOReturn (*clear)(void * self) + +struct IOHIDOutputTransactionInterface +{ + IUNKNOWN_C_GUTS; + IOHIDOUTPUTTRANSACTIONINTERFACE_FUNCS_120; +}; + + +// +// BEGIN READABLE STRUCTURE DEFINITIONS +// +// This portion of uncompiled code provides a more reader friendly representation of +// the CFPlugin methods defined above. + +#if 0 +/*! @class IOHIDDeviceInterface + @discussion CFPlugin object subclass which provides the primary interface to + HID devices. +*/ +typedef struct IOHIDDeviceInterface +{ + + IUNKNOWN_C_GUTS; + +/*! @function createAsyncEventSource + @abstract Creates async eventsource. + @discussion This method will create an async mach port, if one + has not already been created. + @param source Reference to CFRunLoopSourceRef that is created. + @result Returns an IOReturn code. +*/ + IOReturn (*createAsyncEventSource)(void * self, + CFRunLoopSourceRef * source); + +/*! @function getAsyncEventSource + @abstract Gets the created async event source. + @result Returns a CFRunLoopSourceRef. +*/ + CFRunLoopSourceRef (*getAsyncEventSource)(void * self); + +/*! @function createAsyncPort + @abstract Creates an async port. + @discussion The port must be created before any callbacks can be used. + @param port Reference to mach port that is created. + @result Returns an IOReturn code. +*/ + IOReturn (*createAsyncPort)(void * self, mach_port_t * port); + +/*! @function getAsyncPort + @abstract Gets the current async port. + @result Returns a mach_port_t. +*/ + mach_port_t (*getAsyncPort)(void * self); + +/*! @function open + @abstract Opens the device. + @param flags Flags to be passed down to the user client. + @result Returns an IOReturn code. +*/ + IOReturn (*open)(void * self, UInt32 flags); + +/*! @function close + @abstract Closes the device. + @result Returns an IOReturn code. +*/ + IOReturn (*close)(void * self); + +/*! @function setRemovalCallback + @abstract Sets callback to be used when device is removed. + @param removalCallback Called when the device is removed. + @param removeTarget Passed to the callback. + @param removalRefcon Passed to the callback. + @result Returns an IOReturn code. +*/ + IOReturn (*setRemovalCallback)(void * self, + IOHIDCallbackFunction removalCallback, + void * removalTarget, + void * removalRefcon); + +/*! @function getElementValue + @abstract Obtains the most recent value of an element. + @discussion This call is most useful for interrupt driven elements, + such as input type elements. Since feature type element values + need to be polled from the device, it is recommended to use the + queryElementValue method to obtain the current value. The + timestamp field in the event details the last time the element + value was altered. + @param elementCookie The element of interest. + @param valueEvent The event that will be filled. If a long value is + present, it is up to the caller to deallocate it. + @result Returns an IOReturn code. +*/ + IOReturn (*getElementValue)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * valueEvent); + +/*! @function setElementValue + @abstract Sets an element value on the device. + @discussion This call is most useful for feature type elements. It is + recommended to use IOOutputTransaction for output type elements. + @param elementCookie The element of interest. + @param valueEvent The event that will be filled. If a long value is + present, it will be copied. + @param timeoutMS UNSUPPORTED. + @param callback UNSUPPORTED. + @param callbackTarget UNSUPPORTED. + @param callbackRefcon UNSUPPORTED. + @result Returns an IOReturn code. +*/ + IOReturn (*setElementValue)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * valueEvent, + UInt32 timeoutMS, + IOHIDElementCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +/*! @function queryElementValue + @abstract Obtains the current value of an element. + @discussion This call is most useful for feature type elements. This + method will poll the device for the current element value. + @param elementCookie The element of interest. + @param valueEvent The event that will be filled. If a long value is + present, it is up to the caller to deallocate it. + @param timeoutMS UNSUPPORTED. + @param callback UNSUPPORTED. + @param callbackTarget UNSUPPORTED. + @param callbackRefcon UNSUPPORTED. + @result Returns an IOReturn code. +*/ + IOReturn (*queryElementValue)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * valueEvent, + UInt32 timeoutMS, + IOHIDElementCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +/*! @function startAllQueues + @abstract Starts data delivery on all queues for this device. + @result Returns an IOReturn code. +*/ + IOReturn (*startAllQueues)(void * self); + +/*! @function stopAllQueues + @abstract Stops data delivery on all queues for this device. + @result Returns an IOReturn code. +*/ + IOReturn (*stopAllQueues)(void * self); + +/*! @function allocQueue + @abstract Wrapper to return instances of the IOHIDQueueInterface. + @result Returns the created IOHIDQueueInterface. +*/ + IOHIDQueueInterface ** (*allocQueue) (void *self); + +/*! @function allocOutputTransaction + @abstract Wrapper to return instances of the IOHIDOutputTransactionInterface. + @result Returns the created IOHIDOutputTransactionInterface. +*/ + IOHIDOutputTransactionInterface ** (*allocOutputTransaction) (void *self); + +} IOHIDDeviceInterface; + +/*! @class IOHIDDeviceInterface121 + @discussion CFPlugin object subclass which provides the primary interface to + HID devices. This class is a subclass of IOHIDDeviceInterface. +*/ +typedef struct IOHIDDeviceInterface121 +{ + + IUNKNOWN_C_GUTS; + IOHIDDEVICEINTERFACE_FUNCS_100; + +/*! @function setReport + @abstract Sends a report to the device. + @param reportType The report type. + @param reportID The report id. + @param reportBuffer Pointer to a preallocated buffer. + @param reportBufferSize Size of the reportBuffer in bytes. + @param timeoutMS + @param callback If null, this method will behave synchronously. + @param callbackTarget The callback target passed to the callback. + @param callbackRefcon The callback refcon passed to the callback. + @result Returns an IOReturn code. +*/ + IOReturn (*setReport) (void * self, + IOHIDReportType reportType, + UInt32 reportID, + void * reportBuffer, + UInt32 reportBufferSize, + UInt32 timeoutMS, + IOHIDReportCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +/*! @function getReport + @abstract Obtains a report from the device. + @param reportType The report type. + @param reportID The report ID. + @param reportBuffer Pointer to a preallocated buffer. + @param reportBufferSize Size of the reportBuffer in bytes. + When finished, will contain the actual size of the report. + @param timeoutMS + @param callback If null, this method will behave synchronously. + @param callbackTarget The callback target passed to the callback. + @param callbackRefcon The callback refcon passed to the callback. + @result Returns an IOReturn code. +*/ + IOReturn (*getReport) (void * self, + IOHIDReportType reportType, + UInt32 reportID, + void * reportBuffer, + UInt32 * reportBufferSize, + UInt32 timeoutMS, + IOHIDReportCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +}IOHIDDeviceInterface121; + +/*! @class IOHIDDeviceInterface122 + @discussion CFPlugin object subclass which provides the primary interface to + HID devices. This class is a subclass of IOHIDDeviceInterface121. +*/ +typedef struct IOHIDDeviceInterface122 +{ + + IUNKNOWN_C_GUTS; + IOHIDDEVICEINTERFACE_FUNCS_100; + IOHIDDEVICEINTERFACE_FUNCS_121; + +/*! @function copyMatchingElements + @abstract Obtains specific elements defined by the device. + @discussion Using keys defined in IOHIDKeys.h for elements, create a + matching dictonary containing items that you wish to search for. + A null array indicates that no elements matching that criteria + were found. Each item in the array is a reference to the same + dictionary item that represents each element in the I/O Registry. + It is up to the caller to release the returned array of elements. + @param matchingDict Dictionary containg key/value pairs to match on. Pass + a null value to match on all elements. + @param elements Pointer to a CFArrayRef that will be returned by this + method. It is up to the caller to release it when finished. + @result Returns an IOReturn code. +*/ + IOReturn (*copyMatchingElements)(void * self, + CFDictionaryRef matchingDict, + CFArrayRef * elements); + +/*! @function setInterruptReportHandlerCallback + @abstract Sets the report handler callout to be called when the data + is received from the Interrupt-In pipe. + @discussion In order for this to work correctly, you must call + createAsyncPort and createAsyncEventSource. + @param reportBuffer Pointer to a preallocated buffer. + @param reportBufferSize Size of the reportBuffer in bytes. + @param callback If non-NULL, is a callback to be called when data + is received from the device. + @param callbackTarget The callback target passed to the callback + @param callbackRefcon The callback refcon passed to the callback. + @result Returns an IOReturn code. +*/ + IOReturn (*setInterruptReportHandlerCallback)( + void * self, + void * reportBuffer, + UInt32 reportBufferSize, + IOHIDReportCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +}IOHIDDeviceInterface122; + +/*! @class IOHIDQueueInterface + @discussion CFPlugin object subclass which provides an interface for input + queues from HID devices. Created by an IOHIDDeviceInterface + object. +*/ +typedef struct IOHIDQueueInterface +{ + + IUNKNOWN_C_GUTS; + +/*! @function createAsyncEventSource + @abstract Creates an async event source. + @discussion This will be used with setEventCallout. + @param source The newly created event source. + @result Returns an IOReturn code. +*/ + IOReturn (*createAsyncEventSource)(void * self, + CFRunLoopSourceRef * source); + +/*! @function getAsyncEventSource + @abstract Obtains the current event source. + @result Returns a CFRunLoopSourceRef. +*/ + CFRunLoopSourceRef (*getAsyncEventSource)(void * self); + +/*! @function createAsyncPort + @abstract Creates an async port. + @discussion This will be used with createAsyncEventSource. + @param port The newly created async port. + @result Returns an IOReturn code. +*/ + IOReturn (*createAsyncPort)(void * self, mach_port_t * port); + +/*! @function getAsyncPort + @abstract Obtains the current async port. + @result Returns a mach_port_t. +*/ + mach_port_t (*getAsyncPort)(void * self); + +/*! @function create + @abstract Creates the current queue. + @param flags + @param depth The maximum number of elements in the queue + before the oldest elements in the queue begin to be lost. + @result Returns an IOReturn code. +*/ + IOReturn (*create)(void * self, + UInt32 flags, + UInt32 depth); + +/*! @function create + @abstract Disposes of the current queue. + @result Returns an IOReturn code. +*/ + IOReturn (*dispose)(void * self); + +/*! @function addElement + @abstract Adds an element to the queue. + @discussion If the element has already been added to queue, + an error will be returned. + @param elementCookie The element of interest. + @param flags + @result Returns an IOReturn code. +*/ + IOReturn (*addElement)(void * self, + IOHIDElementCookie elementCookie, + UInt32 flags); + +/*! @function removeElement + @abstract Removes an element from the queue. + @discussion If the element has not been added to queue, + an error will be returned. + @param elementCookie The element of interest. + @result Returns an IOReturn code. +*/ + IOReturn (*removeElement)(void * self, IOHIDElementCookie elementCookie); + +/*! @function hasElement + @abstract Checks whether an element has been added to + the queue. + @discussion Will return true if present, otherwise will return false. + @param elementCookie The element of interest. + @result Returns a Boolean value. +*/ + Boolean (*hasElement)(void * self, IOHIDElementCookie elementCookie); + +/*! @function start + @abstract Starts event delivery to the queue. + @result Returns an IOReturn code. +*/ + IOReturn (*start)(void * self); + +/*! @function stop + @abstract Stops event delivery to the queue. + @result Returns an IOReturn code. +*/ + IOReturn (*stop)(void * self); + +/*! @function getNextEvent + @abstract Reads next event from the queue. + @param event The event that will be filled. If a long value is + present, it is up to the caller to deallocate it. + @param maxtime UNSUPPORTED. If non-zero, limits read events to + those that occured on or before maxTime. + @param timoutMS UNSUPPORTED. The timeout in milliseconds, a zero + timeout will cause this call to be non-blocking (returning + queue empty) if there is a NULL callback, and blocking forever + until the queue is non-empty if there is a valid callback. + @result Returns an IOReturn code. +*/ + IOReturn (*getNextEvent)(void * self, + IOHIDEventStruct * event, + AbsoluteTime maxTime, + UInt32 timeoutMS); + +/*! @function setEventCallout + @abstract Sets the event callout to be called when the queue + transitions to non-empty. + @discussion In order for this to work correctly, you must call + createAsyncPort and createAsyncEventSource. + @param callback if non-NULL is a callback to be called when data + is inserted to the queue + @param callbackTarget The callback target passed to the callback + @param callbackRefcon The callback refcon passed to the callback. + @result Returns an IOReturn code. +*/ + IOReturn (*setEventCallout)(void * self, + IOHIDCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +/*! @function getEventCallout + @abstract Gets the event callout. + @discussion This callback will be called the queue transitions + to non-empty. + @param callback if non-NULL is a callback to be called when data + is inserted to the queue + @param callbackTarget The callback target passed to the callback + @param callbackRefcon The callback refcon passed to the callback + @result Returns an IOReturn code. +*/ + IOReturn (*getEventCallout)(void * self, + IOHIDCallbackFunction * outCallback, + void ** outCallbackTarget, + void ** outCallbackRefcon); +} IOHIDQueueInterface; + +/*! @class IOHIDOutputTransactionInterface + @discussion CFPlugin object subclass which privides interface for output + transactions to HID devices. Created by a IOHIDDeviceInterface + object. */ + +typedef struct IOHIDOutputTransactionInterface +{ + IUNKNOWN_C_GUTS; + +/*! @function createAsyncEventSource + @abstract Creates an async event source. + @discussion This will be used with setEventCallout. + @param source The newly created event source + @result Returns an IOReturn code. +*/ + IOReturn (*createAsyncEventSource)(void * self, + CFRunLoopSourceRef * source); + +/*! @function getAsyncEventSource + @abstract Obtains the current event source. + @result Returns a CFRunLoopSourceRef. +*/ + CFRunLoopSourceRef (*getAsyncEventSource)(void * self); + +/*! @function createAsyncPort + @abstract Creates an async port. + @discussion This will be used with createAsyncEventSource. + @param port The newly created async port. + @result Returns an IOReturn code. +*/ + IOReturn (*createAsyncPort)(void * self, mach_port_t * port); + +/*! @function getAsyncPort + @abstract Obtains the current async port. + @result Returns a mach_port_t. +*/ + mach_port_t (*getAsyncPort)(void * self); + +/*! @function create + @abstract Creates the current transaction. + @discussion This method will free any memory that has been + allocated for this transaction. + @result Returns an IOReturn code. +*/ + IOReturn (*create)(void * self); + +/*! @function dispose + @abstract Disposes of the current transaction. + @discussion The transaction will have to be recreated, in order + to perform any operations on the transaction. + @result Returns an IOReturn code. +*/ + IOReturn (*dispose)(void * self); + +/*! @function addElement + @abstract Adds an element to the transaction. + @discussion If the element has already been added to transaction, + an error will be returned. + @param elementCookie The element of interest. + @result Returns an IOReturn code. +*/ + IOReturn (*addElement) (void * self, IOHIDElementCookie elementCookie); + +/*! @function removeElement + @abstract Removes an element from the transaction. + @discussion If the element has not been added to transaction, + an error will be returned. + @param elementCookie The element of interest. + @result Returns an IOReturn code. +*/ + IOReturn (*removeElement) (void * self, IOHIDElementCookie elementCookie); + +/*! @function hasElement + @abstract Checks whether an element has been added to + the transaction. + @discussion Will return true if present, otherwise will return false. + @param elementCookie The element of interest. + @result Returns a Boolean value. +*/ + Boolean (*hasElement) (void * self, IOHIDElementCookie elementCookie); + +/*! @function setElementDefault + @abstract Sets the default value of an element in a + transaction. + @discussion An error will be returned if the element has not been + added to the transaction. + @param elementCookie The element of interest. + @param valueEvent The event that will be filled. If a long value is + present, it will be copied. + @result Returns an IOReturn code. +*/ + IOReturn (*setElementDefault)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * valueEvent); + +/*! @function getElementDefault + @abstract Obtains the default value of an element in a + transaction. + @discussion An error will be returned if the element has not been + added to the transaction. + @param elementCookie The element of interest. + @param outValueEvent The event that will be filled. If a long value is + present, it is up to the caller to deallocate it. + @result Returns an IOReturn code. +*/ + IOReturn (*getElementDefault)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * outValueEvent); + +/*! @function setElementValue + @abstract Sets the value of an element in a transaction. + @discussion An error will be returned if the element has not been + added to the transaction. + @param elementCookie The element of interest. + @param valueEvent The event that will be filled. If a long value is + present, it will be copied. + @result Returns an IOReturn code. +*/ + IOReturn (*setElementValue)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * valueEvent); + +/*! @function getElementValue + @abstract Obtains the value of an element in a transaction. + @discussion An error will be returned if the element has not been + added to the transaction. + @param elementCookie The element of interest. + @param outValueEvent The event that will be filled. If a long value is + present, it is up to the caller to deallocate it. + @result Returns an IOReturn code. +*/ + IOReturn (*getElementValue)(void * self, + IOHIDElementCookie elementCookie, + IOHIDEventStruct * outValueEvent); + +/*! @function commit + @abstract Commits the transaction. + @discussion Transaction element values, if set, will be sent to the + device. Otherwise, the default element value will be used. If + neither are set, that element will be omitted from the commit. + After a transaction is committed, transaction element values + will be cleared. Default values will be preserved. + @param timeoutMS UNSUPPORTED + @param callback UNSUPPORTED + @param callbackTarget UNSUPPORTED + @param callbackRefcon UNSUPPORTED + @result Returns an IOReturn code. +*/ + IOReturn (*commit)(void * self, + UInt32 timeoutMS, + IOHIDCallbackFunction callback, + void * callbackTarget, + void * callbackRefcon); + +/*! @function clear + @abstract Clears the transaction. + @discussion Transaction element values will cleared. Default + values will be preserved. + @result Returns an IOReturn code. +*/ + IOReturn (*clear)(void * self); +} IOHIDOutputTransactionInterface; + +#endif + +__END_DECLS + +#endif /* !_IOKIT_HID_IOHIDLIB_H_ */ diff --git a/src/joystick/darwin/SDL_sysjoystick.c b/src/joystick/darwin/SDL_sysjoystick.c index 8fd983ee2..ec2751daa 100644 --- a/src/joystick/darwin/SDL_sysjoystick.c +++ b/src/joystick/darwin/SDL_sysjoystick.c @@ -39,7 +39,11 @@ /* The header was moved here in Mac OS X 10.1 */ #include #endif +#if MAC_OS_X_VERSION_MIN_REQUIRED == 1030 +#include "10.3.9-FIX/IOHIDLib.h" +#else #include +#endif #include #include #include /* for NewPtrClear, DisposePtr */