- (NSDictionary *)serialize {
return @{ @"type": self.class.serializationCode,
@"direction": @(_direction),
- @"speed": @(_speed)
+ @"speed": @(_speed),
+ @"smooth": @(_smooth),
};
}
-+ (NJOutput *)outputDeserialize:(NSDictionary *)serialization
- withMappings:(NSArray *)mappings {
++ (NJOutput *)outputWithSerialization:(NSDictionary *)serialization {
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 !!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 {
- if (!self.speed) {
+ if (!_smooth) {
CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
kCGScrollEventUnitLine,
- 1,
- _direction);
+ 2,
+ [self wheel:1],
+ [self wheel:2]);
CGEventPost(kCGHIDEventTap, scroll);
CFRelease(scroll);
}
}
-- (BOOL)update:(NJDeviceController *)jc {
+- (BOOL)update:(NJInputController *)ic {
if (self.magnitude < 0.05f)
return NO; // dead zone
- int amount = (int)(_speed * self.magnitude * _direction);
CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
kCGScrollEventUnitPixel,
- 1,
- amount);
+ 2,
+ [self wheel:1],
+ [self wheel:2]);
CGEventPost(kCGHIDEventTap, scroll);
CFRelease(scroll);