X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=JoystickController.m;fp=JoystickController.m;h=0000000000000000000000000000000000000000;hp=2efd68f34586384d64133025c9bd923ef5af3c1d;hb=f864d363128de19fc6591b77ae9226b34166d715;hpb=f563321aec9e13b8479ab3b890a9179f095a8b17 diff --git a/JoystickController.m b/JoystickController.m deleted file mode 100644 index 2efd68f..0000000 --- a/JoystickController.m +++ /dev/null @@ -1,235 +0,0 @@ -// -// JoystickController.m -// Enjoy -// -// Created by Sam McCall on 4/05/09. -// - -#import "JoystickController.h" - -#import "Config.h" -#import "ConfigsController.h" -#import "Joystick.h" -#import "JSAction.h" -#import "Target.h" -#import "TargetController.h" -#import "NJEvents.h" - -@implementation JoystickController { - IOHIDManagerRef hidManager; - NSTimer *continuousTimer; - NSMutableArray *runningTargets; - NSMutableArray *_joysticks; -} - -- (id)init { - if ((self = [super init])) { - _joysticks = [[NSMutableArray alloc] initWithCapacity:16]; - runningTargets = [[NSMutableArray alloc] initWithCapacity:32]; - } - return self; -} - -- (void)dealloc { - [continuousTimer invalidate]; - IOHIDManagerClose(hidManager, kIOHIDOptionsTypeNone); - CFRelease(hidManager); -} - -- (void)expandRecursive:(id )pathElement { - if (pathElement) { - [self expandRecursive:pathElement.base]; - [outlineView expandItem:pathElement]; - } -} - -- (void)addRunningTarget:(Target *)target { - if (![runningTargets containsObject:target]) { - [runningTargets addObject:target]; - } - if (!continuousTimer) { - continuousTimer = [NSTimer scheduledTimerWithTimeInterval:1.f/60.f - target:self - selector:@selector(updateContinuousActions:) - userInfo:nil - repeats:YES]; - NSLog(@"Scheduled continuous target timer."); - } -} - -- (void)runTargetForDevice:(IOHIDDeviceRef)device value:(IOHIDValueRef)value { - Joystick *js = [self findJoystickByRef:device]; - JSAction *mainAction = [js actionForEvent:value]; - [mainAction notifyEvent:value]; - NSArray *children = mainAction.children ? mainAction.children : mainAction ? @[mainAction] : @[]; - for (JSAction *subaction in children) { - Target *target = configsController.currentConfig[subaction]; - target.magnitude = mainAction.magnitude; - target.running = subaction.active; - if (target.running && target.isContinuous) - [self addRunningTarget:target]; - } -} - -- (void)showTargetForDevice:(IOHIDDeviceRef)device value:(IOHIDValueRef)value { - Joystick *js = [self findJoystickByRef:device]; - JSAction *handler = [js handlerForEvent:value]; - if (!handler) - return; - - [self expandRecursive:handler]; - [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:[outlineView rowForItem:handler]] byExtendingSelection: NO]; - [targetController focusKey]; -} - -static void input_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDValueRef value) { - JoystickController *controller = (__bridge JoystickController *)ctx; - IOHIDDeviceRef device = IOHIDQueueGetDevice(inSender); - - if (controller.translatingEvents) { - [controller runTargetForDevice:device value:value]; - } else if ([NSApplication sharedApplication].mainWindow.isVisible) { - [controller showTargetForDevice:device value:value]; - } -} - -static int findAvailableIndex(NSArray *list, Joystick *js) { - for (int index = 1; ; index++) { - BOOL available = YES; - for (Joystick *used in list) { - if ([used.productName isEqualToString:js.productName] && used.index == index) { - available = NO; - break; - } - } - if (available) - return index; - } -} - -- (void)addJoystickForDevice:(IOHIDDeviceRef)device { - IOHIDDeviceRegisterInputValueCallback(device, input_callback, (__bridge void*)self); - Joystick *js = [[Joystick alloc] initWithDevice:device]; - js.index = findAvailableIndex(_joysticks, js); - [_joysticks addObject:js]; - [outlineView reloadData]; -} - -static void add_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDDeviceRef device) { - JoystickController *controller = (__bridge JoystickController *)ctx; - [controller addJoystickForDevice:device]; -} - -- (Joystick *)findJoystickByRef:(IOHIDDeviceRef)device { - for (Joystick *js in _joysticks) - if (js.device == device) - return js; - return nil; -} - -static void remove_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDDeviceRef device) { - JoystickController *controller = (__bridge JoystickController *)ctx; - [controller removeJoystickForDevice:device]; -} - -- (void)removeJoystickForDevice:(IOHIDDeviceRef)device { - Joystick *match = [self findJoystickByRef:device]; - IOHIDDeviceRegisterInputValueCallback(device, NULL, NULL); - if (match) { - [_joysticks removeObject:match]; - [outlineView reloadData]; - } - -} - -- (void)updateContinuousActions:(NSTimer *)timer { - self.mouseLoc = [NSEvent mouseLocation]; - for (Target *target in [runningTargets copy]) { - if (![target update:self]) { - [runningTargets removeObject:target]; - } - } - if (!runningTargets.count) { - [continuousTimer invalidate]; - continuousTimer = nil; - NSLog(@"Unscheduled continuous target timer."); - } -} - -#define NSSTR(e) ((NSString *)CFSTR(e)) - -- (void)setup { - hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - NSArray *criteria = @[ @{ NSSTR(kIOHIDDeviceUsagePageKey) : @(kHIDPage_GenericDesktop), - NSSTR(kIOHIDDeviceUsageKey) : @(kHIDUsage_GD_Joystick) }, - @{ NSSTR(kIOHIDDeviceUsagePageKey) : @(kHIDPage_GenericDesktop), - NSSTR(kIOHIDDeviceUsageKey) : @(kHIDUsage_GD_GamePad) }, - @{ NSSTR(kIOHIDDeviceUsagePageKey) : @(kHIDPage_GenericDesktop), - NSSTR(kIOHIDDeviceUsageKey) : @(kHIDUsage_GD_MultiAxisController) } - ]; - IOHIDManagerSetDeviceMatchingMultiple(hidManager, (__bridge CFArrayRef)criteria); - - IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - IOReturn ret = IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone); - if (ret != kIOReturnSuccess) { - [[NSAlert alertWithMessageText:@"Input devices are unavailable" - defaultButton:nil - alternateButton:nil - otherButton:nil - informativeTextWithFormat:@"Error 0x%08x occured trying to access your devices. " - @"Input may not be correctly detected or mapped.", - ret] - beginSheetModalForWindow:outlineView.window - modalDelegate:nil - didEndSelector:nil - contextInfo:nil]; - } - - IOHIDManagerRegisterDeviceMatchingCallback(hidManager, add_callback, (__bridge void *)self); - IOHIDManagerRegisterDeviceRemovalCallback(hidManager, remove_callback, (__bridge void *)self); -} - -- (JSAction *)selectedAction { - id item = [outlineView itemAtRow:outlineView.selectedRow]; - return (!item.children && item.base) ? item : nil; -} - -- (NSInteger)outlineView:(NSOutlineView *)outlineView - numberOfChildrenOfItem:(id )item { - return item ? item.children.count : _joysticks.count; -} - -- (BOOL)outlineView:(NSOutlineView *)outlineView - isItemExpandable:(id )item { - return item ? [[item children] count] > 0: YES; -} - -- (id)outlineView:(NSOutlineView *)outlineView - child:(NSInteger)index - ofItem:(id )item { - return item ? item.children[index] : _joysticks[index]; -} - -- (id)outlineView:(NSOutlineView *)outlineView -objectValueForTableColumn:(NSTableColumn *)tableColumn - byItem:(id )item { - return item ? item.name : @"root"; -} - -- (void)outlineViewSelectionDidChange:(NSNotification *)notification { - - [targetController loadCurrent]; -} - -- (void)setTranslatingEvents:(BOOL)translatingEvents { - if (translatingEvents != _translatingEvents) { - _translatingEvents = translatingEvents; - NSString *name = translatingEvents - ? NJEventTranslationActivated - : NJEventTranslationDeactivated; - [NSNotificationCenter.defaultCenter postNotificationName:name - object:self]; - } -} - -@end