X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=Classes%2FNJOutputMouseButton.m;h=5ddb69d52ac5e0e1737544609e8eff2f35aab1b7;hp=d5b1f16e940baade744c9dddcaed2699decf49a3;hb=5f3311b43f99187a9bfe2c0b38da7e64d6986da1;hpb=0064c1fbff36795885a9724081af2a17d83c20a3 diff --git a/Classes/NJOutputMouseButton.m b/Classes/NJOutputMouseButton.m index d5b1f16..5ddb69d 100644 --- a/Classes/NJOutputMouseButton.m +++ b/Classes/NJOutputMouseButton.m @@ -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"; @@ -27,23 +46,37 @@ - (void)trigger { CGFloat height = NSScreen.mainScreen.frame.size.height; NSPoint mouseLoc = NSEvent.mouseLocation; - CGEventType eventType = (_button == kCGMouseButtonLeft) ? kCGEventLeftMouseDown : kCGEventRightMouseDown; + CGEventType eventType = _button == kCGMouseButtonLeft ? kCGEventLeftMouseDown + : _button == kCGMouseButtonRight ? kCGEventRightMouseDown + : kCGEventOtherMouseDown; CGEventRef click = CGEventCreateMouseEvent(NULL, eventType, CGPointMake(mouseLoc.x, height - mouseLoc.y), _button); + + if (clickCount >= 3 || [upTime compare:[NSDate date]] == NSOrderedAscending + || !CGPointEqualToPoint(mouseLoc, clickPosition)) + clickCount = 1; + else + ++clickCount; + CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount); CGEventPost(kCGHIDEventTap, click); CFRelease(click); + clickPosition = mouseLoc; } - (void)untrigger { - CGFloat height = NSScreen.mainScreen.frame.size.height; + upTime = [NJOutputMouseButton dateWithClickInterval]; NSPoint mouseLoc = NSEvent.mouseLocation; - CGEventType eventType = (_button == kCGMouseButtonLeft) ? kCGEventLeftMouseUp : kCGEventRightMouseUp; + CGFloat height = NSScreen.mainScreen.frame.size.height; + CGEventType eventType = _button == kCGMouseButtonLeft ? kCGEventLeftMouseUp + : _button == kCGMouseButtonRight ? kCGEventRightMouseUp + : kCGEventOtherMouseUp; CGEventRef click = CGEventCreateMouseEvent(NULL, eventType, CGPointMake(mouseLoc.x, height - mouseLoc.y), _button); + CGEventSetIntegerValueField(click, kCGMouseEventClickState, clickCount); CGEventPost(kCGHIDEventTap, click); CFRelease(click); }