-void timer_callback(CFRunLoopTimerRef timer, void *ctx) {
- JoystickController *jc = (JoystickController *)ctx;
- jc->mouseLoc = [NSEvent mouseLocation];
- for (Target *target in [jc runningTargets]) {
- [target update: jc];
+static void input_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDValueRef value) {
+ JoystickController *controller = (__bridge JoystickController *)ctx;
+ IOHIDDeviceRef device = IOHIDQueueGetDevice(inSender);
+
+ Joystick *js = [controller findJoystickByRef:device];
+ if (((ApplicationController *)[NSApplication sharedApplication].delegate).active) {
+ JSAction *mainAction = [js actionForEvent:value];
+ [mainAction notifyEvent:value];
+ NSArray *children = mainAction.children ? mainAction.children : mainAction ? @[mainAction] : @[];
+ for (JSAction *subaction in children) {
+ Target *target = controller.currentConfig[subaction];
+ target.magnitude = mainAction.magnitude;
+ target.running = subaction.active;
+ if (target.running && target.isContinuous)
+ [controller addRunningTarget:target];
+ }
+ } else if ([NSApplication sharedApplication].isActive
+ && [NSApplication sharedApplication].mainWindow.isVisible) {
+ // joysticks not active, use it to select stuff
+ JSAction *handler = [js handlerForEvent:value];
+ if (!handler)
+ return;
+
+ [controller expandRecursive:handler];
+ [controller->outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:[controller->outlineView rowForItem:handler]] byExtendingSelection: NO];
+ [controller->targetController focusKey];