// // TargetMouseMove.m // Enjoy // // Created by Yifeng Huang on 7/26/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import "TargetMouseMove.h" #import "JoystickController.h" @implementation TargetMouseMove -(BOOL) isContinuous { return true; } @synthesize dir; + (NSString *)serializationCode { return @"mmove"; } - (NSDictionary *)serialize { return @{ @"type": @"mmove", @"dir": @(self.dir) }; } + (Target *)targetDeserialize:(NSDictionary *)serialization withConfigs:(NSArray *)configs { TargetMouseMove *target = [[TargetMouseMove alloc] init]; target.dir = [serialization[@"dir"] intValue]; return target; } - (BOOL)update:(JoystickController *)jc { //printf("Dir %d inputValue %f\n", [self dir], [self inputValue]); if (fabs(self.magnitude) < 0.01) return NO; // dead zone NSRect screenRect = [[NSScreen mainScreen] frame]; NSInteger height = screenRect.size.height; // TODO float speed = 4.0; if ([jc frontWindowOnly]) speed = 12.0; float dx = 0.0, dy = 0.0; if ([self dir] == 0) dx = self.magnitude * speed; else dy = self.magnitude * speed; NSPoint mouseLoc = jc.mouseLoc; mouseLoc.x += dx; mouseLoc.y -= dy; jc.mouseLoc = mouseLoc; CGEventRef move = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, CGPointMake(mouseLoc.x, height - mouseLoc.y), 0); CGEventSetType(move, kCGEventMouseMoved); CGEventSetIntegerValueField(move, kCGMouseEventDeltaX, dx); CGEventSetIntegerValueField(move, kCGMouseEventDeltaY, dy); if ([jc frontWindowOnly]) { ProcessSerialNumber psn; GetFrontProcess(&psn); CGEventPostToPSN(&psn, move); } else { CGEventPost(kCGHIDEventTap, move); } CFRelease(move); return dx || dy; } @end