From 7337c06daf5155578566c2348993dec7e1753e47 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 4 Dec 2024 18:12:00 +0100 Subject: [PATCH] app: [macOS] send keypress events for modifier keys This change generates keypress and release events for modifier keys in macOS. Specifically the Control, Alt, Shift and Command keys. Signed-off-by: Jeff Williams --- app/os_macos.go | 27 +++++++++++++++++++++++++++ app/os_macos.m | 4 ++++ 2 files changed, 31 insertions(+) diff --git a/app/os_macos.go b/app/os_macos.go index 7aa086cf..2a0eec21 100644 --- a/app/os_macos.go +++ b/app/os_macos.go @@ -346,6 +346,7 @@ type window struct { cursor pointer.Cursor pointerBtns pointer.Buttons loop *eventLoop + lastMods C.NSUInteger scale float32 config Config @@ -601,6 +602,32 @@ func (w *window) commandKey(k rune, ti C.double, mods C.NSUInteger) bool { return true } +//export gio_onFlagsChanged +func gio_onFlagsChanged(h C.uintptr_t, curMods C.NSUInteger) { + w := windowFor(h) + + mods := []C.NSUInteger{C.NSControlKeyMask, C.NSAlternateKeyMask, C.NSShiftKeyMask, C.NSCommandKeyMask} + keys := []key.Name{key.NameCtrl, key.NameAlt, key.NameShift, key.NameCommand} + + for i, mod := range mods { + wasPressed := w.lastMods&mod != 0 + isPressed := curMods&mod != 0 + + if wasPressed != isPressed { + st := key.Release + if isPressed { + st = key.Press + } + w.ProcessEvent(key.Event{ + Name: keys[i], + State: st, + }) + } + } + + w.lastMods = curMods +} + //export gio_onText func gio_onText(h C.uintptr_t, cstr C.CFTypeRef) { str := nsstringToString(cstr) diff --git a/app/os_macos.m b/app/os_macos.m index 9a3858b7..8d7c7493 100644 --- a/app/os_macos.m +++ b/app/os_macos.m @@ -140,6 +140,10 @@ static void handleMouse(GioView *view, NSEvent *event, int typ, CGFloat dx, CGFl NSString *keys = [event charactersIgnoringModifiers]; gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], true); } +- (void)flagsChanged:(NSEvent *)event { + [self interpretKeyEvents:[NSArray arrayWithObject:event]]; + gio_onFlagsChanged(self.handle, [event modifierFlags]); +} - (void)keyUp:(NSEvent *)event { NSString *keys = [event charactersIgnoringModifiers]; gio_onKeys(self.handle, (__bridge CFTypeRef)keys, [event timestamp], [event modifierFlags], false);