2 // NJOutputMouseButton.m
5 // Created by Yifeng Huang on 7/27/12.
8 #import "NJOutputMouseButton.h"
10 @implementation NJOutputMouseButton {
15 + (NSTimeInterval)doubleClickInterval {
16 static NSTimeInterval s_doubleClickThreshold;
17 if (!s_doubleClickThreshold) {
18 s_doubleClickThreshold = [[NSUserDefaults.standardUserDefaults
19 objectForKey:@"com.apple.mouse.doubleClickThreshold"] floatValue];
20 if (s_doubleClickThreshold <= 0)
21 s_doubleClickThreshold = 1.0;
23 return s_doubleClickThreshold;
26 + (NSDate *)dateWithClickInterval {
27 return [[NSDate alloc] initWithTimeIntervalSinceNow:self.doubleClickInterval];
30 + (NSString *)serializationCode {
31 return @"mouse button";
34 - (NSDictionary *)serialize {
35 return @{ @"type": self.class.serializationCode, @"button": @(_button) };
38 + (NJOutput *)outputDeserialize:(NSDictionary *)serialization
39 withMappings:(NSArray *)mappings {
40 NJOutputMouseButton *output = [[NJOutputMouseButton alloc] init];
41 output.button = [serialization[@"button"] intValue];
46 CGFloat height = NSScreen.mainScreen.frame.size.height;
47 NSPoint mouseLoc = NSEvent.mouseLocation;
48 CGEventType eventType = (_button == kCGMouseButtonLeft) ? kCGEventLeftMouseDown : kCGEventRightMouseDown;
49 CGEventRef click = CGEventCreateMouseEvent(NULL,
51 CGPointMake(mouseLoc.x, height - mouseLoc.y),
54 NSLog(@"%@\n%@", upTime, [NSDate date]);
55 if (clickCount >= 3 || [upTime compare:[NSDate date]] == NSOrderedAscending)
59 CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
61 CGEventPost(kCGHIDEventTap, click);
66 CGFloat height = NSScreen.mainScreen.frame.size.height;
67 NSPoint mouseLoc = NSEvent.mouseLocation;
68 CGEventType eventType = (_button == kCGMouseButtonLeft) ? kCGEventLeftMouseUp : kCGEventRightMouseUp;
69 CGEventRef click = CGEventCreateMouseEvent(NULL,
71 CGPointMake(mouseLoc.x, height - mouseLoc.y),
73 CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
74 CGEventPost(kCGHIDEventTap, click);
76 upTime = [NJOutputMouseButton dateWithClickInterval];