mirror of
https://github.com/glfw/glfw.git
synced 2024-11-25 22:14:34 +00:00
Moved Cocoa joystick state to library struct.
This commit is contained in:
parent
94f5b28152
commit
ec8273f249
@ -37,10 +37,6 @@
|
|||||||
#include <mach/mach_error.h>
|
#include <mach/mach_error.h>
|
||||||
|
|
||||||
#include <CoreFoundation/CoreFoundation.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>
|
#include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h>
|
||||||
|
|
||||||
|
|
||||||
@ -59,30 +55,7 @@ typedef struct
|
|||||||
long minReport;
|
long minReport;
|
||||||
long maxReport;
|
long maxReport;
|
||||||
|
|
||||||
} _glfwJoystickElement;
|
} _GLFWjoyelement;
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
|
||||||
// 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];
|
|
||||||
|
|
||||||
|
|
||||||
static void getElementsCFArrayHandler(const void* value, void* parameter);
|
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
|
// 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;
|
long elementType, usagePage, usage;
|
||||||
CFTypeRef refElementType, refUsagePage, refUsage;
|
CFTypeRef refElementType, refUsagePage, refUsage;
|
||||||
@ -149,7 +122,7 @@ static void addJoystickElement(_glfwJoystick* joystick, CFTypeRef refElement)
|
|||||||
long number;
|
long number;
|
||||||
CFTypeRef refType;
|
CFTypeRef refType;
|
||||||
|
|
||||||
_glfwJoystickElement* element = (_glfwJoystickElement*) malloc(sizeof(_glfwJoystickElement));
|
_GLFWjoyelement* element = (_GLFWjoyelement*) malloc(sizeof(_GLFWjoyelement));
|
||||||
|
|
||||||
CFArrayAppendValue(elementsArray, element);
|
CFArrayAppendValue(elementsArray, element);
|
||||||
|
|
||||||
@ -186,12 +159,12 @@ static void addJoystickElement(_glfwJoystick* joystick, CFTypeRef refElement)
|
|||||||
static void getElementsCFArrayHandler(const void* value, void* parameter)
|
static void getElementsCFArrayHandler(const void* value, void* parameter)
|
||||||
{
|
{
|
||||||
if (CFGetTypeID(value) == CFDictionaryGetTypeID())
|
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
|
// 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;
|
IOReturn result = kIOReturnSuccess;
|
||||||
IOHIDEventStruct hidEvent;
|
IOHIDEventStruct hidEvent;
|
||||||
@ -218,7 +191,7 @@ static long getElementValue(_glfwJoystick* joystick, _glfwJoystickElement* eleme
|
|||||||
|
|
||||||
// Removes the specified joystick
|
// Removes the specified joystick
|
||||||
//
|
//
|
||||||
static void removeJoystick(_glfwJoystick* joystick)
|
static void removeJoystick(_GLFWjoy* joystick)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -228,8 +201,8 @@ static void removeJoystick(_glfwJoystick* joystick)
|
|||||||
|
|
||||||
for (i = 0; i < joystick->numAxes; i++)
|
for (i = 0; i < joystick->numAxes; i++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* axes =
|
_GLFWjoyelement* axes =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->axes, i);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->axes, i);
|
||||||
free(axes);
|
free(axes);
|
||||||
}
|
}
|
||||||
CFArrayRemoveAllValues(joystick->axes);
|
CFArrayRemoveAllValues(joystick->axes);
|
||||||
@ -237,8 +210,8 @@ static void removeJoystick(_glfwJoystick* joystick)
|
|||||||
|
|
||||||
for (i = 0; i < joystick->numButtons; i++)
|
for (i = 0; i < joystick->numButtons; i++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* button =
|
_GLFWjoyelement* button =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->buttons, i);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->buttons, i);
|
||||||
free(button);
|
free(button);
|
||||||
}
|
}
|
||||||
CFArrayRemoveAllValues(joystick->buttons);
|
CFArrayRemoveAllValues(joystick->buttons);
|
||||||
@ -246,8 +219,8 @@ static void removeJoystick(_glfwJoystick* joystick)
|
|||||||
|
|
||||||
for (i = 0; i < joystick->numHats; i++)
|
for (i = 0; i < joystick->numHats; i++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* hat =
|
_GLFWjoyelement* hat =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->hats, i);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->hats, i);
|
||||||
free(hat);
|
free(hat);
|
||||||
}
|
}
|
||||||
CFArrayRemoveAllValues(joystick->hats);
|
CFArrayRemoveAllValues(joystick->hats);
|
||||||
@ -264,7 +237,7 @@ static void removeJoystick(_glfwJoystick* joystick)
|
|||||||
//
|
//
|
||||||
static void removalCallback(void* target, IOReturn result, void* refcon, void* sender)
|
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
|
// 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++)
|
for (i = 0; i < GLFW_JOYSTICK_LAST + 1; i++)
|
||||||
{
|
{
|
||||||
_glfwJoystick* joystick = &_glfwJoysticks[i];
|
_GLFWjoy* joystick = &_glfw.ns.joysticks[i];
|
||||||
|
|
||||||
if (joystick->present)
|
if (joystick->present)
|
||||||
{
|
{
|
||||||
for (j = 0; j < joystick->numButtons; j++)
|
for (j = 0; j < joystick->numButtons; j++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* button =
|
_GLFWjoyelement* button =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->buttons, j);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->buttons, j);
|
||||||
button->value = getElementValue(joystick, button);
|
button->value = getElementValue(joystick, button);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < joystick->numAxes; j++)
|
for (j = 0; j < joystick->numAxes; j++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* axes =
|
_GLFWjoyelement* axes =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->axes, j);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->axes, j);
|
||||||
axes->value = getElementValue(joystick, axes);
|
axes->value = getElementValue(joystick, axes);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < joystick->numHats; j++)
|
for (j = 0; j < joystick->numHats; j++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* hat =
|
_GLFWjoyelement* hat =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick->hats, j);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick->hats, j);
|
||||||
hat->value = getElementValue(joystick, hat);
|
hat->value = getElementValue(joystick, hat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,8 +293,6 @@ void _glfwInitJoysticks(void)
|
|||||||
CFMutableDictionaryRef hidMatchDictionary = NULL;
|
CFMutableDictionaryRef hidMatchDictionary = NULL;
|
||||||
io_object_t ioHIDDeviceObject = 0;
|
io_object_t ioHIDDeviceObject = 0;
|
||||||
|
|
||||||
memset(&_glfwJoysticks, 0, sizeof(_glfwJoysticks));
|
|
||||||
|
|
||||||
result = IOMasterPort(bootstrap_port, &masterPort);
|
result = IOMasterPort(bootstrap_port, &masterPort);
|
||||||
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
|
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
|
||||||
if (kIOReturnSuccess != result || !hidMatchDictionary)
|
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;
|
joystick->present = GL_TRUE;
|
||||||
|
|
||||||
@ -460,7 +431,7 @@ void _glfwTerminateJoysticks(void)
|
|||||||
|
|
||||||
for (i = 0; i < GLFW_JOYSTICK_LAST + 1; i++)
|
for (i = 0; i < GLFW_JOYSTICK_LAST + 1; i++)
|
||||||
{
|
{
|
||||||
_glfwJoystick* joystick = &_glfwJoysticks[i];
|
_GLFWjoy* joystick = &_glfw.ns.joysticks[i];
|
||||||
removeJoystick(joystick);
|
removeJoystick(joystick);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -472,7 +443,7 @@ void _glfwTerminateJoysticks(void)
|
|||||||
|
|
||||||
int _glfwPlatformGetJoystickParam(int joy, int param)
|
int _glfwPlatformGetJoystickParam(int joy, int param)
|
||||||
{
|
{
|
||||||
if (!_glfwJoysticks[joy].present)
|
if (!_glfw.ns.joysticks[joy].present)
|
||||||
{
|
{
|
||||||
// TODO: Figure out if this is an error
|
// TODO: Figure out if this is an error
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
@ -484,11 +455,11 @@ int _glfwPlatformGetJoystickParam(int joy, int param)
|
|||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
|
|
||||||
case GLFW_AXES:
|
case GLFW_AXES:
|
||||||
return (int) CFArrayGetCount(_glfwJoysticks[joy].axes);
|
return (int) CFArrayGetCount(_glfw.ns.joysticks[joy].axes);
|
||||||
|
|
||||||
case GLFW_BUTTONS:
|
case GLFW_BUTTONS:
|
||||||
return (int) CFArrayGetCount(_glfwJoysticks[joy].buttons) +
|
return (int) CFArrayGetCount(_glfw.ns.joysticks[joy].buttons) +
|
||||||
(int) CFArrayGetCount(_glfwJoysticks[joy].hats) * 4;
|
(int) CFArrayGetCount(_glfw.ns.joysticks[joy].hats) * 4;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -504,7 +475,7 @@ int _glfwPlatformGetJoystickAxes(int joy, float* axes, int numaxes)
|
|||||||
if (joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_LAST)
|
if (joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_LAST)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_glfwJoystick joystick = _glfwJoysticks[joy];
|
_GLFWjoy joystick = _glfw.ns.joysticks[joy];
|
||||||
|
|
||||||
if (!joystick.present)
|
if (!joystick.present)
|
||||||
{
|
{
|
||||||
@ -519,8 +490,8 @@ int _glfwPlatformGetJoystickAxes(int joy, float* axes, int numaxes)
|
|||||||
|
|
||||||
for (i = 0; i < numaxes; i++)
|
for (i = 0; i < numaxes; i++)
|
||||||
{
|
{
|
||||||
_glfwJoystickElement* elements =
|
_GLFWjoyelement* elements =
|
||||||
(_glfwJoystickElement*) CFArrayGetValueAtIndex(joystick.axes, i);
|
(_GLFWjoyelement*) CFArrayGetValueAtIndex(joystick.axes, i);
|
||||||
|
|
||||||
long readScale = elements->maxReport - elements->minReport;
|
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)
|
if (joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_LAST)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_glfwJoystick joystick = _glfwJoysticks[joy];
|
_GLFWjoy joystick = _glfw.ns.joysticks[joy];
|
||||||
|
|
||||||
if (!joystick.present)
|
if (!joystick.present)
|
||||||
{
|
{
|
||||||
@ -557,7 +528,7 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons,
|
|||||||
|
|
||||||
for (button = 0; button < numbuttons && button < joystick.numButtons; button++)
|
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;
|
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++)
|
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;
|
int value = hat->value;
|
||||||
if (value < 0 || value > 8)
|
if (value < 0 || value > 8)
|
||||||
@ -591,6 +562,6 @@ int _glfwPlatformGetJoystickButtons(int joy, unsigned char* buttons,
|
|||||||
|
|
||||||
const char* _glfwPlatformGetJoystickName(int joy)
|
const char* _glfwPlatformGetJoystickName(int joy)
|
||||||
{
|
{
|
||||||
return _glfwJoysticks[joy].name;
|
return _glfw.ns.joysticks[joy].name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,11 @@ typedef void* id;
|
|||||||
#error "No supported context creation API selected"
|
#error "No supported context creation API selected"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <IOKit/IOKitLib.h>
|
||||||
|
#include <IOKit/IOCFPlugIn.h>
|
||||||
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
#include <IOKit/hid/IOHIDKeys.h>
|
||||||
|
|
||||||
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS ns
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowNS ns
|
||||||
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns
|
||||||
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorNS ns
|
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorNS ns
|
||||||
@ -73,6 +78,27 @@ typedef struct _GLFWwindowNS
|
|||||||
} _GLFWwindowNS;
|
} _GLFWwindowNS;
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Joystick information & state
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int present;
|
||||||
|
char name[256];
|
||||||
|
|
||||||
|
IOHIDDeviceInterface** interface;
|
||||||
|
|
||||||
|
int numAxes;
|
||||||
|
int numButtons;
|
||||||
|
int numHats;
|
||||||
|
|
||||||
|
CFMutableArrayRef axes;
|
||||||
|
CFMutableArrayRef buttons;
|
||||||
|
CFMutableArrayRef hats;
|
||||||
|
|
||||||
|
} _GLFWjoy;
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Platform-specific library global data for Cocoa
|
// Platform-specific library global data for Cocoa
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
@ -88,6 +114,8 @@ typedef struct _GLFWlibraryNS
|
|||||||
id autoreleasePool;
|
id autoreleasePool;
|
||||||
|
|
||||||
char* clipboardString;
|
char* clipboardString;
|
||||||
|
|
||||||
|
_GLFWjoy joysticks[GLFW_JOYSTICK_LAST + 1];
|
||||||
} _GLFWlibraryNS;
|
} _GLFWlibraryNS;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user