summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--redo/area_darwin.go25
-rw-r--r--redo/area_darwin.m12
-rw-r--r--redo/uitask_darwin.m18
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.