Analog mouse scrolling.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Fri, 1 Mar 2013 18:58:26 +0000 (19:58 +0100)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Fri, 1 Mar 2013 18:58:26 +0000 (19:58 +0100)
TargetMouseScroll.m

index d840ba1069bfe2539a50cbd44d79e8d7bda40dd2..6595628002913477619858d8264a941826ab34ad 100644 (file)
@@ -7,7 +7,9 @@
 
 #import "TargetMouseScroll.h"
 
-@implementation TargetMouseScroll
+@implementation TargetMouseScroll {
+    int sign;
+}
 
 + (NSString *)serializationCode {
     return @"mscroll";
     target.amount = [serialization[@"amount"] intValue];
        return target;
 }
--(void) trigger {
+
+- (void)trigger {
+    if (!self.magnitude) {
+        CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
+                                                          kCGScrollEventUnitLine,
+                                                          1,
+                                                          _amount);
+        CGEventPost(kCGHIDEventTap, scroll);
+        CFRelease(scroll);
+    }
+}
+
+- (BOOL)update:(JoystickController *)jc {
+    if (fabsf(self.magnitude) < 0.01f) {
+        sign = 0;
+        return NO; // dead zone
+    }
+    
+    // If the action crossed over High/Low, this target is done.
+    if (!sign)
+        sign = self.magnitude < 0 ? -1 : 1;
+    else if (sign / self.magnitude < 0) {
+        sign = 0;
+        return NO;
+    }
+
+    int amount = (int)(16.f * fabsf(self.magnitude) * _amount);
     CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
-                                                      kCGScrollEventUnitLine,
+                                                      kCGScrollEventUnitPixel,
                                                       1,
-                                                      _amount);
+                                                      amount);
     CGEventPost(kCGHIDEventTap, scroll);
     CFRelease(scroll);
+
+    return YES;
+}
+
+- (BOOL)isContinuous {
+    return YES;
 }
 
 @end