From 59e4b3007c96fcf8b0448dbef10749c205d30c8b Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sun, 18 Jan 2026 06:30:33 -0800 Subject: [PATCH] Add: add mac special click support --- mouse/mouse_c.h | 4 ++-- robotgo.go | 21 +++++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/mouse/mouse_c.h b/mouse/mouse_c.h index b252623..18fe1ae 100644 --- a/mouse/mouse_c.h +++ b/mouse/mouse_c.h @@ -201,7 +201,7 @@ int clickMouse(MMMouseButton button){ } /* Special function for sending double clicks, needed for MacOS. */ -int doubleClick(MMMouseButton button){ +int doubleClick(MMMouseButton button, int count){ #if defined(IS_MACOSX) /* Double click for Mac. */ const CGPoint currentPos = CGPointFromMMPointInt32(location()); @@ -216,7 +216,7 @@ int doubleClick(MMMouseButton button){ } /* Set event to double click. */ - CGEventSetIntegerValueField(event, kCGMouseEventClickState, 2); + CGEventSetIntegerValueField(event, kCGMouseEventClickState, count); CGEventPost(kCGHIDEventTap, event); CGEventSetType(event, mouseTypeUP); diff --git a/robotgo.go b/robotgo.go index aebd38c..ebd60f1 100644 --- a/robotgo.go +++ b/robotgo.go @@ -685,7 +685,7 @@ func ClickV1(args ...interface{}) { if !double { C.clickMouse(button) } else { - C.doubleClick(button) + C.doubleClick(button, 2) } MilliSleep(MouseSleep) @@ -735,7 +735,7 @@ func Click(args ...interface{}) error { return formatClickError(int(code), button, "up", count) } } else { - if code := C.doubleClick(button); code != 0 { + if code := C.doubleClick(button, 2); code != 0 { return formatClickError(int(code), button, "double", 2) } } @@ -745,13 +745,18 @@ func Click(args ...interface{}) error { // MultiClick performs multiple clicks and returns error // // robotgo.MultiClick(button string, count int) -func MultiClick(button string, count int) error { +func MultiClick(button string, count int, click ...bool) error { if count < 1 { return nil } btn := CheckMouse(button) defer MilliSleep(MouseSleep) + if runtime.GOOS == "darwin" && len(click) <= 0 { + code := C.doubleClick(btn, C.int(count)) + return formatClickError(int(code), btn, "down", count) + } + for i := 0; i < count; i++ { if err := Click(btn, false, count); err != nil { return err @@ -761,6 +766,9 @@ func MultiClick(button string, count int) error { } func formatClickError(code int, button C.MMMouseButton, stage string, count int) error { + if code == 0 { + return nil + } btnName := MouseButtonString(button) detail := "" @@ -840,15 +848,12 @@ func Toggle(key ...interface{}) error { if len(key) > 1 && key[1].(string) == "up" { down = false } - code := C.toggleMouse(C.bool(down), button) - if code != 0 { - return formatClickError(int(code), button, "down", 1) - } + code := C.toggleMouse(C.bool(down), button) if len(key) > 2 { MilliSleep(MouseSleep) } - return nil + return formatClickError(int(code), button, "down", 1) } // MouseDown send mouse down event