|
@@ -29,7 +29,6 @@
|
|
|
#include "../../events/scancodes_darwin.h"
|
|
|
|
|
|
#include <Carbon/Carbon.h>
|
|
|
-#include <IOKit/hid/IOHIDLib.h>
|
|
|
|
|
|
/*#define DEBUG_IME NSLog */
|
|
|
#define DEBUG_IME(...)
|
|
@@ -187,115 +186,6 @@
|
|
|
|
|
|
@end
|
|
|
|
|
|
-/*------------------------------------------------------------------------------
|
|
|
-Set up a HID callback to properly detect Caps Lock up/down events.
|
|
|
-Derived from:
|
|
|
-http://stackoverflow.com/questions/7190852/using-iohidmanager-to-get-modifier-key-events
|
|
|
-*/
|
|
|
-
|
|
|
-static IOHIDManagerRef s_hidManager = NULL;
|
|
|
-
|
|
|
-static void
|
|
|
-HIDCallback(void *context, IOReturn result, void *sender, IOHIDValueRef value)
|
|
|
-{
|
|
|
- if (context != s_hidManager) {
|
|
|
- /* An old callback, ignore it (related to bug 2157 below) */
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- IOHIDElementRef elem = IOHIDValueGetElement(value);
|
|
|
- if (IOHIDElementGetUsagePage(elem) != kHIDPage_KeyboardOrKeypad
|
|
|
- || IOHIDElementGetUsage(elem) != kHIDUsage_KeyboardCapsLock) {
|
|
|
- return;
|
|
|
- }
|
|
|
- CFIndex pressed = IOHIDValueGetIntegerValue(value);
|
|
|
- SDL_SendKeyboardKey(pressed ? SDL_PRESSED : SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
|
|
|
-}
|
|
|
-
|
|
|
-static CFDictionaryRef
|
|
|
-CreateHIDDeviceMatchingDictionary(UInt32 usagePage, UInt32 usage)
|
|
|
-{
|
|
|
- CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorDefault,
|
|
|
- 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
|
|
|
- if (dict) {
|
|
|
- CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usagePage);
|
|
|
- if (number) {
|
|
|
- CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsagePageKey), number);
|
|
|
- CFRelease(number);
|
|
|
- number = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &usage);
|
|
|
- if (number) {
|
|
|
- CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsageKey), number);
|
|
|
- CFRelease(number);
|
|
|
- return dict;
|
|
|
- }
|
|
|
- }
|
|
|
- CFRelease(dict);
|
|
|
- }
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-QuitHIDCallback()
|
|
|
-{
|
|
|
- if (!s_hidManager) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
-#if 0 /* Releasing here causes a crash on Mac OS X 10.10 and earlier,
|
|
|
- * so just leak it for now. See bug 2157 for details.
|
|
|
- */
|
|
|
- IOHIDManagerUnscheduleFromRunLoop(s_hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
|
|
|
- IOHIDManagerRegisterInputValueCallback(s_hidManager, NULL, NULL);
|
|
|
- IOHIDManagerClose(s_hidManager, 0);
|
|
|
-
|
|
|
- CFRelease(s_hidManager);
|
|
|
-#endif
|
|
|
- s_hidManager = NULL;
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-InitHIDCallback()
|
|
|
-{
|
|
|
- s_hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
|
|
|
- if (!s_hidManager) {
|
|
|
- return;
|
|
|
- }
|
|
|
- CFDictionaryRef keyboard = NULL, keypad = NULL;
|
|
|
- CFArrayRef matches = NULL;
|
|
|
- keyboard = CreateHIDDeviceMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keyboard);
|
|
|
- if (!keyboard) {
|
|
|
- goto fail;
|
|
|
- }
|
|
|
- keypad = CreateHIDDeviceMatchingDictionary(kHIDPage_GenericDesktop, kHIDUsage_GD_Keypad);
|
|
|
- if (!keypad) {
|
|
|
- goto fail;
|
|
|
- }
|
|
|
- CFDictionaryRef matchesList[] = { keyboard, keypad };
|
|
|
- matches = CFArrayCreate(kCFAllocatorDefault, (const void **)matchesList, 2, NULL);
|
|
|
- if (!matches) {
|
|
|
- goto fail;
|
|
|
- }
|
|
|
- IOHIDManagerSetDeviceMatchingMultiple(s_hidManager, matches);
|
|
|
- IOHIDManagerRegisterInputValueCallback(s_hidManager, HIDCallback, s_hidManager);
|
|
|
- IOHIDManagerScheduleWithRunLoop(s_hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
|
|
|
- if (IOHIDManagerOpen(s_hidManager, kIOHIDOptionsTypeNone) == kIOReturnSuccess) {
|
|
|
- goto cleanup;
|
|
|
- }
|
|
|
-
|
|
|
-fail:
|
|
|
- QuitHIDCallback();
|
|
|
-
|
|
|
-cleanup:
|
|
|
- if (matches) {
|
|
|
- CFRelease(matches);
|
|
|
- }
|
|
|
- if (keypad) {
|
|
|
- CFRelease(keypad);
|
|
|
- }
|
|
|
- if (keyboard) {
|
|
|
- CFRelease(keyboard);
|
|
|
- }
|
|
|
-}
|
|
|
|
|
|
/* This is a helper function for HandleModifierSide. This
|
|
|
* function reverts back to behavior before the distinction between
|
|
@@ -585,8 +475,6 @@ Cocoa_InitKeyboard(_THIS)
|
|
|
|
|
|
data->modifierFlags = [NSEvent modifierFlags];
|
|
|
SDL_ToggleModState(KMOD_CAPS, (data->modifierFlags & NSEventModifierFlagCapsLock) != 0);
|
|
|
-
|
|
|
- InitHIDCallback();
|
|
|
}
|
|
|
|
|
|
void
|
|
@@ -712,7 +600,6 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
|
|
void
|
|
|
Cocoa_QuitKeyboard(_THIS)
|
|
|
{
|
|
|
- QuitHIDCallback();
|
|
|
}
|
|
|
|
|
|
#endif /* SDL_VIDEO_DRIVER_COCOA */
|