X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=Classes%2FNJDeviceController.m;h=1b64aaf3f694e5dd26eb3c8324ebf0de77c82e04;hp=000df5f60a4f4d6be91dd8f1e391b02bc2423de7;hb=6cee2033d1c0fc0dacf444064305b9e7e87672a9;hpb=24bdb92798b9abe86c7954042a47523791736b7c diff --git a/Classes/NJDeviceController.m b/Classes/NJDeviceController.m index 000df5f..1b64aaf 100644 --- a/Classes/NJDeviceController.m +++ b/Classes/NJDeviceController.m @@ -12,9 +12,7 @@ #import "NJDevice.h" #import "NJInput.h" #import "NJOutput.h" -#import "NJOutputController.h" #import "NJEvents.h" -#import "NJDeviceViewController.h" @implementation NJDeviceController { NJHIDManager *_hidManager; @@ -68,6 +66,14 @@ [_continuousOutputsTick invalidate]; } +- (NJDevice *)objectAtIndexedSubscript:(NSUInteger)idx { + return idx < _devices.count ? _devices[idx] : nil; +} + +- (NSUInteger)count { + return _devices.count; +} + - (void)addRunningOutput:(NJOutput *)output { // Axis events will trigger every small movement, don't keep // re-adding them or they trigger multiple times each time. @@ -102,8 +108,7 @@ if (!handler) return; - [devicesViewController expandAndSelectItem:handler]; - [outputController focusKey]; + [self.delegate deviceController:self didInput:handler]; } - (void)hidManager:(NJHIDManager *)manager @@ -117,22 +122,25 @@ } } -- (void)hidManager:(NJHIDManager *)manager deviceAdded:(IOHIDDeviceRef)device { - NJDevice *match = [[NJDevice alloc] initWithDevice:device]; - match.index = 1; +- (void)addDevice:(NJDevice *)device { BOOL available; do { available = YES; for (NJDevice *used in _devices) { - if ([used isEqual:match]) { - match.index += 1; + if ([used isEqual:device]) { + device.index += 1; available = NO; } } } while (!available); + + [_devices addObject:device]; +} - [_devices addObject:match]; - [devicesViewController addedDevice:match atIndex:_devices.count - 1]; +- (void)hidManager:(NJHIDManager *)manager deviceAdded:(IOHIDDeviceRef)device { + NJDevice *match = [[NJDevice alloc] initWithDevice:device]; + [self addDevice:match]; + [self.delegate deviceController:self didAddDevice:match]; } - (NJDevice *)findDeviceByRef:(IOHIDDeviceRef)device { @@ -144,11 +152,10 @@ - (void)hidManager:(NJHIDManager *)manager deviceRemoved:(IOHIDDeviceRef)device { NJDevice *match = [self findDeviceByRef:device]; - IOHIDDeviceRegisterInputValueCallback(device, NULL, NULL); if (match) { NSInteger idx = [_devices indexOfObjectIdenticalTo:match]; [_devices removeObjectAtIndex:idx]; - [devicesViewController removedDevice:match atIndex:idx]; + [self.delegate deviceController:self didRemoveDeviceAtIndex:idx]; } } @@ -166,28 +173,17 @@ } - (void)hidManager:(NJHIDManager *)manager didError:(NSError *)error { - // Since the error shows the window, it can trigger another attempt - // to re-open the HID manager, which will also probably fail and error, - // so don't bother repeating ourselves. - if (!simulatingEventsButton.window.attachedSheet) { - [NSApplication.sharedApplication activateIgnoringOtherApps:YES]; - [simulatingEventsButton.window makeKeyAndOrderFront:nil]; - [simulatingEventsButton.window presentError:error - modalForWindow:simulatingEventsButton.window - delegate:nil - didPresentSelector:nil - contextInfo:nil]; - } + [self.delegate deviceController:self didError:error]; self.simulatingEvents = NO; } - (void)hidManagerDidStart:(NJHIDManager *)manager { - [devicesViewController hidStarted]; + [self.delegate deviceControllerDidStartHID:self]; } - (void)hidManagerDidStop:(NJHIDManager *)manager { [_devices removeAllObjects]; - [devicesViewController hidStopped]; + [self.delegate deviceControllerDidStopHID:self]; } - (void)startHid { @@ -198,15 +194,9 @@ [_hidManager stop]; } -- (NJInput *)selectedInput { - return (NJInput *)devicesViewController.selectedHandler; -} - - (void)setSimulatingEvents:(BOOL)simulatingEvents { if (simulatingEvents != _simulatingEvents) { _simulatingEvents = simulatingEvents; - NSInteger state = simulatingEvents ? NSOnState : NSOffState; - simulatingEventsButton.state = state; NSString *name = simulatingEvents ? NJEventSimulationStarted : NJEventSimulationStopped; @@ -225,21 +215,7 @@ [self stopHid]; } -- (IBAction)simulatingEventsChanged:(NSButton *)sender { - self.simulatingEvents = sender.state == NSOnState; -} - -- (NSInteger)numberOfDevicesInDeviceList:(NJDeviceViewController *)dvc { - return _devices.count; -} - -- (NJDevice *)deviceViewController:(NJDeviceViewController *)dvc - deviceForIndex:(NSUInteger)idx { - return _devices[idx]; -} - -- (id)deviceViewController:(NJDeviceViewController *)dvc - elementForUID:(NSString *)uid { +- (NJInputPathElement *)objectForKeyedSubscript:(NSString *)uid { for (NJDevice *dev in _devices) { id item = [dev elementForUID:uid]; if (item) @@ -248,23 +224,4 @@ return nil; } -- (void)deviceViewControllerDidSelectNothing:(NJDeviceViewController *)dvc { - [outputController loadCurrent]; -} - -- (void)deviceViewController:(NJDeviceViewController *)dvc - didSelectBranch:(NJInputPathElement *)handler { - [outputController loadCurrent]; -} - -- (void)deviceViewController:(NJDeviceViewController *)dvc - didSelectHandler:(NJInputPathElement *)handler { - [outputController loadCurrent]; -} - -- (void)deviceViewController:(NJDeviceViewController *)dvc - didSelectDevice:(NJInputPathElement *)device { - [outputController loadCurrent]; -} - @end