- IOHIDManagerScheduleWithRunLoop( hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode );
- IOReturn tIOReturn = IOHIDManagerOpen( hidManager, kIOHIDOptionsTypeNone );
- (void)tIOReturn;
-
- IOHIDManagerRegisterDeviceMatchingCallback(hidManager, add_callback, (__bridge void *)self );
- IOHIDManagerRegisterDeviceRemovalCallback(hidManager, remove_callback, (__bridge void *)self);
-
- // Setup timer for continuous targets
- CFRunLoopTimerContext ctx = {
- 0, (__bridge void*)self, NULL, NULL, NULL
- };
- CFRunLoopTimerRef timer = CFRunLoopTimerCreate(kCFAllocatorDefault,
- CFAbsoluteTimeGetCurrent(), 1.0/80.0,
- 0, 0, timer_callback, &ctx);
- CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode);
-}
-
--(id) determineSelectedAction {
- id item = [outlineView itemAtRow: [outlineView selectedRow]];
- if(!item)
- return NULL;
- if([item isKindOfClass: [JSAction class]] && [item subActions] != NULL)
- return NULL;
- if([item isKindOfClass: [Joystick class]])
- return NULL;
- return item;
-}
-
-/* outline view */
-
-- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
- if(item == nil)
- return [joysticks count];
- if([item isKindOfClass: [Joystick class]])
- return [[item children] count];
- if([item isKindOfClass: [JSAction class]] && [item subActions] != NULL)
- return [[item subActions] count];
- return 0;
-}
-
-- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
- if(item == nil)
- return YES;
- if([item isKindOfClass: [Joystick class]])
- return YES;
- if([item isKindOfClass: [JSAction class]])
- return [item subActions]==NULL ? NO : YES;
- return NO;
-}
-
-- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item {
- if(item == nil)
- return joysticks[index];
-
- if([item isKindOfClass: [Joystick class]])
- return [item children][index];
-
- if([item isKindOfClass: [JSAction class]])
- return [item subActions][index];
-
- return NULL;
-}
-- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
- if(item == nil)
- return @"root";
- return [item name];
-}
-
-- (void)outlineViewSelectionDidChange: (NSNotification*) notification {
- [targetController reset];
- selectedAction = [self determineSelectedAction];
- [targetController load];
- if(programmaticallySelecting)
- [targetController focusKey];
- programmaticallySelecting = NO;
-}
-
+ 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 <NJActionPathElement> item = [outlineView itemAtRow:outlineView.selectedRow];
+ return (!item.children && item.base) ? item : nil;
+}
+
+- (NSInteger)outlineView:(NSOutlineView *)outlineView
+ numberOfChildrenOfItem:(id <NJActionPathElement>)item {
+ return item ? item.children.count : _joysticks.count;
+}
+
+- (BOOL)outlineView:(NSOutlineView *)outlineView
+ isItemExpandable:(id <NJActionPathElement>)item {
+ return item ? [[item children] count] > 0: YES;
+}
+
+- (id)outlineView:(NSOutlineView *)outlineView
+ child:(NSInteger)index
+ ofItem:(id <NJActionPathElement>)item {
+ return item ? item.children[index] : _joysticks[index];
+}
+
+- (id)outlineView:(NSOutlineView *)outlineView
+objectValueForTableColumn:(NSTableColumn *)tableColumn
+ byItem:(id <NJActionPathElement>)item {
+ return item ? item.name : @"root";
+}
+
+- (void)outlineViewSelectionDidChange:(NSNotification *)notification {
+ [targetController loadCurrent];
+}
+