From 8a3ff4abcb74464f924a0059b0dc0f98ab55a2a0 Mon Sep 17 00:00:00 2001 From: Raffaele Sena Date: Fri, 20 Nov 2020 13:46:24 -0800 Subject: [PATCH] app/internal/window: implement key.Press and key.Release on macOS Update key.State documentation and add State.String while here. Also update Event.String to include State. Signed-off-by: Raffaele Sena --- app/internal/window/gl_macos.m | 6 +++++- app/internal/window/os_macos.go | 7 ++++++- io/key/key.go | 16 ++++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/internal/window/gl_macos.m b/app/internal/window/gl_macos.m index 0d7f772b..576aa40e 100644 --- a/app/internal/window/gl_macos.m +++ b/app/internal/window/gl_macos.m @@ -76,9 +76,13 @@ static void handleMouse(NSView *view, NSEvent *event, int typ, CGFloat dx, CGFlo } - (void)keyDown:(NSEvent *)event { NSString *keys = [event charactersIgnoringModifiers]; - gio_onKeys((__bridge CFTypeRef)self, (char *)[keys UTF8String], [event timestamp], [event modifierFlags]); + gio_onKeys((__bridge CFTypeRef)self, (char *)[keys UTF8String], [event timestamp], [event modifierFlags], true); [self interpretKeyEvents:[NSArray arrayWithObject:event]]; } +- (void)keyUp:(NSEvent *)event { + NSString *keys = [event charactersIgnoringModifiers]; + gio_onKeys((__bridge CFTypeRef)self, (char *)[keys UTF8String], [event timestamp], [event modifierFlags], false); +} - (void)insertText:(id)string { const char *utf8 = [string UTF8String]; gio_onText((__bridge CFTypeRef)self, (char *)utf8); diff --git a/app/internal/window/os_macos.go b/app/internal/window/os_macos.go index ef95b704..1afec6f7 100644 --- a/app/internal/window/os_macos.go +++ b/app/internal/window/os_macos.go @@ -151,15 +151,20 @@ func (w *window) setStage(stage system.Stage) { } //export gio_onKeys -func gio_onKeys(view C.CFTypeRef, cstr *C.char, ti C.double, mods C.NSUInteger) { +func gio_onKeys(view C.CFTypeRef, cstr *C.char, ti C.double, mods C.NSUInteger, keyDown C.bool) { str := C.GoString(cstr) kmods := convertMods(mods) + ks := key.Release + if keyDown { + ks = key.Press + } w := mustView(view) for _, k := range str { if n, ok := convertKey(k); ok { w.w.Event(key.Event{ Name: n, Modifiers: kmods, + State: ks, }) } } diff --git a/io/key/key.go b/io/key/key.go index 07892e99..365bb790 100644 --- a/io/key/key.go +++ b/io/key/key.go @@ -10,6 +10,7 @@ events. package key import ( + "fmt" "strings" "gioui.org/internal/opconst" @@ -64,7 +65,7 @@ const ( // Release is the state of a key that has been released. // // Note: release events are only implemented on the following platforms: - // Linux, Windows, WebAssembly. + // macOS, Linux, Windows, WebAssembly. Release ) @@ -129,7 +130,7 @@ func (Event) ImplementsEvent() {} func (FocusEvent) ImplementsEvent() {} func (e Event) String() string { - return "{" + string(e.Name) + " " + e.Modifiers.String() + "}" + return fmt.Sprintf("%v %v %v}", e.Name, e.Modifiers, e.State) } func (m Modifiers) String() string { @@ -151,3 +152,14 @@ func (m Modifiers) String() string { } return strings.Join(strs, "|") } + +func (s State) String() string { + switch s { + case Press: + return "Press" + case Release: + return "Release" + default: + panic("invalid State") + } +}