Split NJMappingController view handling off into NJMappingViewController. This is...
[enjoyable.git] / Classes / NJOutputMouseButton.m
1 //
2 // NJOutputMouseButton.m
3 // Enjoy
4 //
5 // Created by Yifeng Huang on 7/27/12.
6 //
7
8 #import "NJOutputMouseButton.h"
9
10 @implementation NJOutputMouseButton {
11 NSDate *upTime;
12 int clickCount;
13 NSPoint clickPosition;
14 }
15
16 + (NSTimeInterval)doubleClickInterval {
17 static NSTimeInterval s_doubleClickThreshold;
18 if (!s_doubleClickThreshold) {
19 s_doubleClickThreshold = [[NSUserDefaults.standardUserDefaults
20 objectForKey:@"com.apple.mouse.doubleClickThreshold"] floatValue];
21 if (s_doubleClickThreshold <= 0)
22 s_doubleClickThreshold = 1.0;
23 }
24 return s_doubleClickThreshold;
25 }
26
27 + (NSDate *)dateWithClickInterval {
28 return [[NSDate alloc] initWithTimeIntervalSinceNow:self.doubleClickInterval];
29 }
30
31 + (NSString *)serializationCode {
32 return @"mouse button";
33 }
34
35 - (NSDictionary *)serialize {
36 return @{ @"type": self.class.serializationCode, @"button": @(_button) };
37 }
38
39 + (NJOutput *)outputDeserialize:(NSDictionary *)serialization
40 withMappings:(id <NSFastEnumeration>)mappings {
41 NJOutputMouseButton *output = [[NJOutputMouseButton alloc] init];
42 output.button = [serialization[@"button"] intValue];
43 return output;
44 }
45
46 - (void)trigger {
47 CGFloat height = NSScreen.mainScreen.frame.size.height;
48 NSPoint mouseLoc = NSEvent.mouseLocation;
49 CGEventType eventType = _button == kCGMouseButtonLeft ? kCGEventLeftMouseDown
50 : _button == kCGMouseButtonRight ? kCGEventRightMouseDown
51 : kCGEventOtherMouseDown;
52 CGEventRef click = CGEventCreateMouseEvent(NULL,
53 eventType,
54 CGPointMake(mouseLoc.x, height - mouseLoc.y),
55 _button);
56
57 if (clickCount >= 3 || [upTime compare:[NSDate date]] == NSOrderedAscending
58 || !CGPointEqualToPoint(mouseLoc, clickPosition))
59 clickCount = 1;
60 else
61 ++clickCount;
62 CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
63 CGEventPost(kCGHIDEventTap, click);
64 CFRelease(click);
65 clickPosition = mouseLoc;
66 }
67
68 - (void)untrigger {
69 upTime = [NJOutputMouseButton dateWithClickInterval];
70 NSPoint mouseLoc = NSEvent.mouseLocation;
71 CGFloat height = NSScreen.mainScreen.frame.size.height;
72 CGEventType eventType = _button == kCGMouseButtonLeft ? kCGEventLeftMouseUp
73 : _button == kCGMouseButtonRight ? kCGEventRightMouseUp
74 : kCGEventOtherMouseUp;
75 CGEventRef click = CGEventCreateMouseEvent(NULL,
76 eventType,
77 CGPointMake(mouseLoc.x, height - mouseLoc.y),
78 _button);
79 CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
80 CGEventPost(kCGHIDEventTap, click);
81 CFRelease(click);
82 }
83
84 @end