Add support for horizontal directions to scrolling. Rework UI to make the relationshi...
[enjoyable.git] / Classes / NJOutputMouseScroll.m
index 99cec4a..b97a3e7 100644 (file)
@@ -16,7 +16,8 @@
 - (NSDictionary *)serialize {
     return @{ @"type": self.class.serializationCode,
               @"direction": @(_direction),
 - (NSDictionary *)serialize {
     return @{ @"type": self.class.serializationCode,
               @"direction": @(_direction),
-              @"speed": @(_speed)
+              @"speed": @(_speed),
+              @"smooth": @(_smooth),
               };
 }
 
               };
 }
 
     NJOutputMouseScroll *output = [[NJOutputMouseScroll alloc] init];
     output.direction = [serialization[@"direction"] intValue];
     output.speed = [serialization[@"speed"] floatValue];
     NJOutputMouseScroll *output = [[NJOutputMouseScroll alloc] init];
     output.direction = [serialization[@"direction"] intValue];
     output.speed = [serialization[@"speed"] floatValue];
+    output.smooth = [serialization[@"smooth"] boolValue];
     return output;
 }
 
 - (BOOL)isContinuous {
     return output;
 }
 
 - (BOOL)isContinuous {
-    return !!self.speed;
+    return _smooth;
+}
+
+- (int)wheel:(int)n {
+    int amount =  abs(_direction) == n ? _direction / n : 0;
+    if (self.smooth)
+        amount *= _speed * self.magnitude;
+    return amount;
 }
 
 - (void)trigger {
 }
 
 - (void)trigger {
-    if (!self.speed) {
+    if (!_smooth) {
         CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                           kCGScrollEventUnitLine,
         CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                           kCGScrollEventUnitLine,
-                                                          1,
-                                                          _direction);
+                                                          2,
+                                                          [self wheel:1],
+                                                          [self wheel:2]);
         CGEventPost(kCGHIDEventTap, scroll);
         CFRelease(scroll);
     }
         CGEventPost(kCGHIDEventTap, scroll);
         CFRelease(scroll);
     }
     if (self.magnitude < 0.05f)
         return NO; // dead zone
     
     if (self.magnitude < 0.05f)
         return NO; // dead zone
     
-    int amount = (int)(_speed * self.magnitude * _direction);
     CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                       kCGScrollEventUnitPixel,
     CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
                                                       kCGScrollEventUnitPixel,
-                                                      1,
-                                                      amount);
+                                                      2,
+                                                      [self wheel:1],
+                                                      [self wheel:2]);
     CGEventPost(kCGHIDEventTap, scroll);
     CFRelease(scroll);
 
     CGEventPost(kCGHIDEventTap, scroll);
     CFRelease(scroll);