|
|
|
@ -37,10 +37,6 @@ |
|
|
|
|
#include <mach/mach_error.h> |
|
|
|
|
|
|
|
|
|
#include <CoreFoundation/CoreFoundation.h> |
|
|
|
|
#include <IOKit/IOKitLib.h> |
|
|
|
|
#include <IOKit/IOCFPlugIn.h> |
|
|
|
|
#include <IOKit/hid/IOHIDLib.h> |
|
|
|
|
#include <IOKit/hid/IOHIDKeys.h> |
|
|
|
|
#include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -59,30 +55,7 @@ typedef struct |
|
|
|
|
long minReport; |
|
|
|
|
long maxReport; |
|
|
|
|
|
|
|
|
|
} _glfwJoystickElement; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------ |
|
|
|
|
// Joystick information & state |
|
|
|
|
//------------------------------------------------------------------------ |
|
|
|
|
typedef struct |
|
|
|
|
{ |
|
|
|
|
int present; |
|
|
|
|
char name[256]; |
|
|
|
|
|
|
|
|
|
IOHIDDeviceInterface** interface; |
|
|
|
|
|
|
|
|
|
int numAxes; |
|
|
|
|
int numButtons; |
|
|
|
|
int numHats; |
|
|
|
|
|
|
|
|
|
CFMutableArrayRef axes; |
|
|
|
|
CFMutableArrayRef buttons; |
|
|
|
|
CFMutableArrayRef hats; |
|
|
|
|
|
|
|
|
|
} _glfwJoystick; |
|
|
|
|
|
|
|
|
|
static _glfwJoystick _glfwJoysticks[GLFW_JOYSTICK_LAST + 1]; |
|
|
|
|
} _GLFWjoyelement; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void getElementsCFArrayHandler(const void* value, void* parameter); |
|
|
|
@ -90,7 +63,7 @@ static void getElementsCFArrayHandler(const void* value, void* parameter); |
|
|
|
|
|
|
|
|
|
// Adds an element to the specified joystick |
|
|
|
|
// |
|
|
|
|
static void addJoystickElement(_glfwJoystick* joystick, CFTypeRef refElement) |
|
|
|
|
static void addJoystickElement(_GLFWjoy* joystick, CFTypeRef refElement) |
|
|
|
|
{ |
|
|
|
|
long elementType, usagePage, usage; |
|
|
|
|
CFTypeRef refElementType, refUsagePage, refUsage; |
|
|
|
@ -149,7 +122,7 @@ static void addJoystickElement(_glfwJoystick* joystick, CFTypeRef refElement) |
|
|
|
|
long number; |
|
|
|
|
CFTypeRef refType; |
|
|
|
|
|
|
|
|
|
_glfwJoystickElement* element = (_glfwJoystickElement*) malloc(sizeof(_glfwJoystickElement)); |
|
|
|
|
_GLFWjoyelement* element = (_GLFWjoyelement*) malloc(sizeof(_GLFWjoyelement)); |
|
|
|
|
|
|
|
|
|
CFArrayAppendValue(elementsArray, element); |
|
|
|
|
|
|
|
|
@ -186,12 +159,12 @@ static void addJoystickElement(_glfwJoystick* joystick, CFTypeRef refElement) |
|
|
|
|
static void getElementsCFArrayHandler(const void* value, void* parameter) |
|
|
|
|
{ |
|
|
|
|
if (CFGetTypeID(value) == CFDictionaryGetTypeID()) |
|
|
|
|
addJoystickElement((_glfwJoystick*) parameter, (CFTypeRef) value); |
|
|
|
|
addJoystickElement((_GLFWjoy*) parameter, (CFTypeRef) value); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Returns the value of the specified element of the specified joystick |
|
|
|
|
// |
|
|
|
|
static long getElementValue(_glfwJoystick* joystick, _glfwJoystickElement* element) |
|
|
|
|
static long getElementValue(_GLFWjoy* joystick, _GLFWjoyelement* element) |
|
|
|
|
{ |
|
|
|
|
IOReturn result = kIOReturnSuccess; |
|
|
|
|
IOHIDEventStruct hidEvent; |
|
|
|
@ -218,7 +191,7 @@ static long getElementValue(_glfwJoystick* joystick, _glfwJoystickElement* eleme |
|
|
|
|
|
|
|
|
|
// Removes the specified joystick |
|
|
|
|
// |
|
|
|
|
static void removeJoystick(_glfwJoystick* joystick) |
|
|
|
|
static void removeJoystick(_GLFWjoy* joystick) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
@ -228,8 +201,8 @@ static void removeJoystick(_glfwJoystick* joystick) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < joystick->numAxes; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* axes = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->axes, i); |
|
|
|
|
_GLFWjoyelement* axes = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->axes, i); |
|
|
|
|
free(axes); |
|
|
|
|
} |
|
|
|
|
CFArrayRemoveAllValues(joystick->axes); |
|
|
|
@ -237,8 +210,8 @@ static void removeJoystick(_glfwJoystick* joystick) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < joystick->numButtons; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* button = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->buttons, i); |
|
|
|
|
_GLFWjoyelement* button = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->buttons, i); |
|
|
|
|
free(button); |
|
|
|
|
} |
|
|
|
|
CFArrayRemoveAllValues(joystick->buttons); |
|
|
|
@ -246,8 +219,8 @@ static void removeJoystick(_glfwJoystick* joystick) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < joystick->numHats; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* hat = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->hats, i); |
|
|
|
|
_GLFWjoyelement* hat = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->hats, i); |
|
|
|
|
free(hat); |
|
|
|
|
} |
|
|
|
|
CFArrayRemoveAllValues(joystick->hats); |
|
|
|
@ -264,7 +237,7 @@ static void removeJoystick(_glfwJoystick* joystick) |
|
|
|
|
// |
|
|
|
|
static void removalCallback(void* target, IOReturn result, void* refcon, void* sender) |
|
|
|
|
{ |
|
|
|
|
removeJoystick((_glfwJoystick*) refcon); |
|
|
|
|
removeJoystick((_GLFWjoy*) refcon); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Polls for joystick events and updates GLFW state |
|
|
|
@ -276,28 +249,28 @@ static void pollJoystickEvents(void) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < GLFW_JOYSTICK_LAST + 1; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystick* joystick = &_glfwJoysticks[i]; |
|
|
|
|
_GLFWjoy* joystick = &_glfw.ns.joysticks[i]; |
|
|
|
|
|
|
|
|
|
if (joystick->present) |
|
|
|
|
{ |
|
|
|
|
for (j = 0; j < joystick->numButtons; j++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* button = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->buttons, j); |
|
|
|
|
_GLFWjoyelement* button = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->buttons, j); |
|
|
|
|
button->value = getElementValue(joystick, button); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (j = 0; j < joystick->numAxes; j++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* axes = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->axes, j); |
|
|
|
|
_GLFWjoyelement* axes = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->axes, j); |
|
|
|
|
axes->value = getElementValue(joystick, axes); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (j = 0; j < joystick->numHats; j++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* hat = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->hats, j); |
|
|
|
|
_GLFWjoyelement* hat = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->hats, j); |
|
|
|
|
hat->value = getElementValue(joystick, hat); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -320,8 +293,6 @@ void _glfwInitJoysticks(void) |
|
|
|
|
CFMutableDictionaryRef hidMatchDictionary = NULL; |
|
|
|
|
io_object_t ioHIDDeviceObject = 0; |
|
|
|
|
|
|
|
|
|
memset(&_glfwJoysticks, 0, sizeof(_glfwJoysticks)); |
|
|
|
|
|
|
|
|
|
result = IOMasterPort(bootstrap_port, &masterPort); |
|
|
|
|
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey); |
|
|
|
|
if (kIOReturnSuccess != result || !hidMatchDictionary) |
|
|
|
@ -390,7 +361,7 @@ void _glfwInitJoysticks(void) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_glfwJoystick* joystick = &_glfwJoysticks[deviceCounter]; |
|
|
|
|
_GLFWjoy* joystick = &_glfw.ns.joysticks[deviceCounter]; |
|
|
|
|
|
|
|
|
|
joystick->present = GL_TRUE; |
|
|
|
|
|
|
|
|
@ -460,7 +431,7 @@ void _glfwTerminateJoysticks(void) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < GLFW_JOYSTICK_LAST + 1; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystick* joystick = &_glfwJoysticks[i]; |
|
|
|
|
_GLFWjoy* joystick = &_glfw.ns.joysticks[i]; |
|
|
|
|
removeJoystick(joystick); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -472,7 +443,7 @@ void _glfwTerminateJoysticks(void) |
|
|
|
|
|
|
|
|
|
int _glfwPlatformGetJoystickParam(int joy, int param) |
|
|
|
|
{ |
|
|
|
|
if (!_glfwJoysticks[joy].present) |
|
|
|
|
if (!_glfw.ns.joysticks[joy].present) |
|
|
|
|
{ |
|
|
|
|
// TODO: Figure out if this is an error |
|
|
|
|
return GL_FALSE; |
|
|
|
@ -484,11 +455,11 @@ int _glfwPlatformGetJoystickParam(int joy, int param) |
|
|
|
|
return GL_TRUE; |
|
|
|
|
|
|
|
|
|
case GLFW_AXES: |
|
|
|
|
return (int) CFArrayGetCount(_glfwJoysticks[joy].axes); |
|
|
|
|
return (int) CFArrayGetCount(_glfw.ns.joysticks[joy].axes); |
|
|
|
|
|
|
|
|
|
case GLFW_BUTTONS: |
|
|
|
|
return (int) CFArrayGetCount(_glfwJoysticks[joy].buttons) + |
|
|
|
|
(int) CFArrayGetCount(_glfwJoysticks[joy].hats) * 4; |
|
|
|
|
return (int) CFArrayGetCount(_glfw.ns.joysticks[joy].buttons) + |
|
|
|
|
(int) CFArrayGetCount(_glfw.ns.joysticks[joy].hats) * 4; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
@ -504,7 +475,7 @@ int _glfwPlatformGetJoystickAxes(int joy, float* axes, int numaxes) |
|
|
|
|
if (joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_LAST) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
_glfwJoystick joystick = _glfwJoysticks[joy]; |
|
|
|
|
_GLFWjoy joystick = _glfw.ns.joysticks[joy]; |
|
|
|
|
|
|
|
|
|
if (!joystick.present) |
|
|
|
|
{ |
|
|
|
@ -519,8 +490,8 @@ int _glfwPlatformGetJoystickAxes(int joy, float* axes, int numaxes) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < numaxes; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* elements = |
|
|
|
|
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.axes, i); |
|
|
|
|
_GLFWjoyelement* elements = |
|
|
|
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick.axes, i); |
|
|
|
|
|
|
|
|
|
long readScale = elements->maxReport - elements->minReport; |
|
|
|
|
|
|
|
|
@ -544,7 +515,7 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, |
|
|
|
|
if (joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_LAST) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
_glfwJoystick joystick = _glfwJoysticks[joy]; |
|
|
|
|
_GLFWjoy joystick = _glfw.ns.joysticks[joy]; |
|
|
|
|
|
|
|
|
|
if (!joystick.present) |
|
|
|
|
{ |
|
|
|
@ -557,7 +528,7 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, |
|
|
|
|
|
|
|
|
|
for (button = 0; button < numbuttons && button < joystick.numButtons; button++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* element = (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.buttons, button); |
|
|
|
|
_GLFWjoyelement* element = (_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick.buttons, button); |
|
|
|
|
buttons[button] = element->value ? GLFW_PRESS : GLFW_RELEASE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -569,7 +540,7 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, |
|
|
|
|
|
|
|
|
|
for (i = 0; i < joystick.numHats; i++) |
|
|
|
|
{ |
|
|
|
|
_glfwJoystickElement* hat = (_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.hats, i); |
|
|
|
|
_GLFWjoyelement* hat = (_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick.hats, i); |
|
|
|
|
|
|
|
|
|
int value = hat->value; |
|
|
|
|
if (value < 0 || value > 8) |
|
|
|
@ -591,6 +562,6 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons, |
|
|
|
|
|
|
|
|
|
const char* _glfwPlatformGetJoystickName(int joy) |
|
|
|
|
{ |
|
|
|
|
return _glfwJoysticks[joy].name; |
|
|
|
|
return _glfw.ns.joysticks[joy].name; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|