Send single/double/triple click information with mouse events.
[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 }
14
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;
22 }
23 return s_doubleClickThreshold;
24 }
25
26 + (NSDate *)dateWithClickInterval {
27 return [[NSDate alloc] initWithTimeIntervalSinceNow:self.doubleClickInterval];
28 }
29
30 + (NSString *)serializationCode {
31 return @"mouse button";
32 }
33
34 - (NSDictionary *)serialize {
35 return @{ @"type": self.class.serializationCode, @"button": @(_button) };
36 }
37
38 + (NJOutput *)outputDeserialize:(NSDictionary *)serialization
39 withMappings:(NSArray *)mappings {
40 NJOutputMouseButton *output = [[NJOutputMouseButton alloc] init];
41 output.button = [serialization[@"button"] intValue];
42 return output;
43 }
44
45 - (void)trigger {
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,
50 eventType,
51 CGPointMake(mouseLoc.x, height - mouseLoc.y),
52 _button);
53
54 NSLog(@"%@\n%@", upTime, [NSDate date]);
55 if (clickCount >= 3 || [upTime compare:[NSDate date]] == NSOrderedAscending)
56 clickCount = 1;
57 else
58 ++clickCount;
59 CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
60
61 CGEventPost(kCGHIDEventTap, click);
62 CFRelease(click);
63 }
64
65 - (void)untrigger {
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,
70 eventType,
71 CGPointMake(mouseLoc.x, height - mouseLoc.y),
72 _button);
73 CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount);
74 CGEventPost(kCGHIDEventTap, click);
75 CFRelease(click);
76 upTime = [NJOutputMouseButton dateWithClickInterval];
77 }
78
79 @end