Also store the mouse location and don't double-click if it moved.
[enjoyable.git] / Classes / NJOutputMouseButton.m
index d5b1f16..bc286bd 100644 (file)
@@ -7,7 +7,26 @@
 
 #import "NJOutputMouseButton.h"
 
-@implementation NJOutputMouseButton
+@implementation NJOutputMouseButton {
+    NSDate *upTime;
+    int clickCount;
+    NSPoint clickPosition;
+}
+
++ (NSTimeInterval)doubleClickInterval {
+    static NSTimeInterval s_doubleClickThreshold;
+    if (!s_doubleClickThreshold) {
+        s_doubleClickThreshold = [[NSUserDefaults.standardUserDefaults
+                                 objectForKey:@"com.apple.mouse.doubleClickThreshold"] floatValue];
+        if (s_doubleClickThreshold <= 0)
+            s_doubleClickThreshold = 1.0;
+    }
+    return s_doubleClickThreshold;
+}
+
++ (NSDate *)dateWithClickInterval {
+    return [[NSDate alloc] initWithTimeIntervalSinceNow:self.doubleClickInterval];
+}
 
 + (NSString *)serializationCode {
     return @"mouse button";
                                                eventType,
                                                CGPointMake(mouseLoc.x, height - mouseLoc.y),
                                                _button);
+
+    if (clickCount >= 3 || [upTime compare:[NSDate date]] == NSOrderedAscending
+        || !CGPointEqualToPoint(NSEvent.mouseLocation, clickPosition))
+        clickCount = 1;
+    else
+        ++clickCount;
+    CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
+    
     CGEventPost(kCGHIDEventTap, click);
     CFRelease(click);
 }
 
 - (void)untrigger {
+    upTime = [NJOutputMouseButton dateWithClickInterval];
+    clickPosition = NSEvent.mouseLocation;
     CGFloat height = NSScreen.mainScreen.frame.size.height;
-    NSPoint mouseLoc = NSEvent.mouseLocation;
     CGEventType eventType = (_button == kCGMouseButtonLeft) ? kCGEventLeftMouseUp : kCGEventRightMouseUp;
     CGEventRef click = CGEventCreateMouseEvent(NULL,
                                                eventType,
-                                               CGPointMake(mouseLoc.x, height - mouseLoc.y),
+                                               CGPointMake(clickPosition.x, height - clickPosition.y),
                                                _button);
+    CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
     CGEventPost(kCGHIDEventTap, click);
     CFRelease(click);
 }