diff options
| -rw-r--r-- | redo/area_darwin.go | 25 | ||||
| -rw-r--r-- | redo/area_darwin.m | 12 | ||||
| -rw-r--r-- | redo/uitask_darwin.m | 18 |
3 files changed, 31 insertions, 24 deletions
diff --git a/redo/area_darwin.go b/redo/area_darwin.go index c4c3d26..509c05d 100644 --- a/redo/area_darwin.go +++ b/redo/area_darwin.go @@ -140,38 +140,39 @@ func areaView_mouseUp(self C.id, e C.id, data unsafe.Pointer) { areaMouseEvent(self, e, true, true, data) } -func sendKeyEvent(self C.id, ke KeyEvent, data unsafe.Pointer) { +func sendKeyEvent(self C.id, ke KeyEvent, data unsafe.Pointer) C.BOOL { a := (*area)(data) - a.handler.Key(ke) + handled := a.handler.Key(ke) + return toBOOL(handled) } -func areaKeyEvent(self C.id, e C.id, up bool, data unsafe.Pointer) { +func areaKeyEvent(self C.id, e C.id, up bool, data unsafe.Pointer) C.BOOL { var ke KeyEvent keyCode := uintptr(C.keyCode(e)) ke, ok := fromKeycode(keyCode) if !ok { // no such key; modifiers by themselves are handled by -[self flagsChanged:] - return + return C.NO } // either ke.Key or ke.ExtKey will be set at this point ke.Modifiers = parseModifiers(e) ke.Up = up - sendKeyEvent(self, ke, data) + return sendKeyEvent(self, ke, data) } //export areaView_keyDown -func areaView_keyDown(self C.id, e C.id, data unsafe.Pointer) { - areaKeyEvent(self, e, false, data) +func areaView_keyDown(self C.id, e C.id, data unsafe.Pointer) C.BOOL { + return areaKeyEvent(self, e, false, data) } //export areaView_keyUp -func areaView_keyUp(self C.id, e C.id, data unsafe.Pointer) { - areaKeyEvent(self, e, true, data) +func areaView_keyUp(self C.id, e C.id, data unsafe.Pointer) C.BOOL { + return areaKeyEvent(self, e, true, data) } //export areaView_flagsChanged -func areaView_flagsChanged(self C.id, e C.id, data unsafe.Pointer) { +func areaView_flagsChanged(self C.id, e C.id, data unsafe.Pointer) C.BOOL { var ke KeyEvent // Mac OS X sends this event on both key up and key down. @@ -179,14 +180,14 @@ func areaView_flagsChanged(self C.id, e C.id, data unsafe.Pointer) { keyCode := uintptr(C.keyCode(e)) mod, ok := keycodeModifiers[keyCode] // comma-ok form to avoid adding entries if !ok { // unknown modifier; ignore - return + return C.NO } ke.Modifiers = parseModifiers(e) ke.Up = (ke.Modifiers & mod) == 0 ke.Modifier = mod // don't include the modifier in ke.Modifiers ke.Modifiers &^= mod - sendKeyEvent(self, ke, data) + return sendKeyEvent(self, ke, data) } func (a *area) id() C.id { diff --git a/redo/area_darwin.m b/redo/area_darwin.m index f99737f..d76f3a1 100644 --- a/redo/area_darwin.m +++ b/redo/area_darwin.m @@ -89,9 +89,15 @@ event(otherMouseDown, areaView_mouseDown) event(mouseUp, areaView_mouseUp) event(rightMouseUp, areaView_mouseUp) event(otherMouseUp, areaView_mouseUp) -event(keyDown, areaView_keyDown) -event(keyUp, areaView_keyUp) -event(flagsChanged, areaView_flagsChanged) + +#define retevent(m, f) \ + - (BOOL)m:(NSEvent *)e \ + { \ + return f(self, e, self->goarea); \ + } +retevent(doKeyDown, areaView_keyDown) +retevent(doKeyUp, areaView_keyUp) +retevent(doFlagsChanged, areaView_flagsChanged) @end diff --git a/redo/uitask_darwin.m b/redo/uitask_darwin.m index 86de4ce..4a2173f 100644 --- a/redo/uitask_darwin.m +++ b/redo/uitask_darwin.m @@ -20,6 +20,7 @@ static Class areaClass; - (void)sendEvent:(NSEvent *)e { NSEventType type; + BOOL handled = NO; type = [e type]; if (type == NSKeyDown || type == NSKeyUp || type == NSFlagsChanged) { @@ -29,19 +30,18 @@ static Class areaClass; if (focused != nil && [focused isKindOfClass:areaClass]) switch (type) { case NSKeyDown: - [focused keyDown:e]; - return; + handled = [focused doKeyDown:e]; + break; case NSKeyUp: - [focused keyUp:e]; - return; + handled = [focused doKeyUp:e]; + break; case NSFlagsChanged: - [focused flagsChanged:e]; - return; + handled = [focused doFlagsChanged:e]; + break; } - // else fall through } - // otherwise, let NSApplication do it - [super sendEvent:e]; + if (!handled) + [super sendEvent:e]; } // ok AppKit, wanna play hardball? let's play hardball. |
