Scrolling, mouse scope, icon
[enjoyable.git] / TargetMouseMove.m
index 2bcbce3..8cf09d2 100644 (file)
 
 @implementation TargetMouseMove
 
--(void) setInputValue: (int) newIV {
-    NSRect screenRect = [[NSScreen mainScreen] frame];
-    NSInteger height = screenRect.size.height;
-    NSPoint mouseLoc = [NSEvent mouseLocation];
-    if (dir == 0)
-        mouseLoc.x += newIV;
-    else
-        mouseLoc.y += newIV;
-    
-    CGEventRef move = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved,
-                                              CGPointMake(mouseLoc.x, height - mouseLoc.y),
-                                              kCGMouseButtonLeft);
-    CGEventPost(kCGHIDEventTap, move);
-    CFRelease(move);
+-(BOOL) isContinuous {
+    return true;
 }
 
 @synthesize dir;
        return target;
 }
 
--(void) trigger {
+-(void) trigger: (JoystickController *)jc {
     return;
 }
 
--(void) untrigger {
+-(void) untrigger: (JoystickController *)jc {
     return;
 }
 
+-(void) update: (JoystickController *)jc {
+    //printf("Dir %d inputValue %f\n", [self dir], [self inputValue]);
+    if (fabs([self inputValue]) < 0.01)
+        return; // dead zone
+    
+    NSRect screenRect = [[NSScreen mainScreen] frame];
+    NSInteger height = screenRect.size.height;
+    
+    // TODO
+    double speed = 4.0;
+    if ([jc frontWindowOnly])
+        speed = 12.0;
+    double dx = 0.0, dy = 0.0;
+    if ([self dir] == 0)
+        dx = [self inputValue] * speed;
+    else
+        dy = [self inputValue] * speed;
+    NSPoint *mouseLoc = &jc->mouseLoc;
+    mouseLoc->x += dx;
+    mouseLoc->y -= dy;
+    
+    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);
+}
+
 @end