Implemented the new AreaHandler.Key() on Mac OS X.

This commit is contained in:
Pietro Gagliardi 2014-08-21 10:19:08 -04:00
parent d53dba9e38
commit c9f8955758
3 changed files with 31 additions and 24 deletions

View File

@ -140,38 +140,39 @@ func areaView_mouseUp(self C.id, e C.id, data unsafe.Pointer) {
areaMouseEvent(self, e, true, true, data) 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 := (*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 var ke KeyEvent
keyCode := uintptr(C.keyCode(e)) keyCode := uintptr(C.keyCode(e))
ke, ok := fromKeycode(keyCode) ke, ok := fromKeycode(keyCode)
if !ok { if !ok {
// no such key; modifiers by themselves are handled by -[self flagsChanged:] // 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 // either ke.Key or ke.ExtKey will be set at this point
ke.Modifiers = parseModifiers(e) ke.Modifiers = parseModifiers(e)
ke.Up = up ke.Up = up
sendKeyEvent(self, ke, data) return sendKeyEvent(self, ke, data)
} }
//export areaView_keyDown //export areaView_keyDown
func areaView_keyDown(self C.id, e C.id, data unsafe.Pointer) { func areaView_keyDown(self C.id, e C.id, data unsafe.Pointer) C.BOOL {
areaKeyEvent(self, e, false, data) return areaKeyEvent(self, e, false, data)
} }
//export areaView_keyUp //export areaView_keyUp
func areaView_keyUp(self C.id, e C.id, data unsafe.Pointer) { func areaView_keyUp(self C.id, e C.id, data unsafe.Pointer) C.BOOL {
areaKeyEvent(self, e, true, data) return areaKeyEvent(self, e, true, data)
} }
//export areaView_flagsChanged //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 var ke KeyEvent
// Mac OS X sends this event on both key up and key down. // 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)) keyCode := uintptr(C.keyCode(e))
mod, ok := keycodeModifiers[keyCode] // comma-ok form to avoid adding entries mod, ok := keycodeModifiers[keyCode] // comma-ok form to avoid adding entries
if !ok { // unknown modifier; ignore if !ok { // unknown modifier; ignore
return return C.NO
} }
ke.Modifiers = parseModifiers(e) ke.Modifiers = parseModifiers(e)
ke.Up = (ke.Modifiers & mod) == 0 ke.Up = (ke.Modifiers & mod) == 0
ke.Modifier = mod ke.Modifier = mod
// don't include the modifier in ke.Modifiers // don't include the modifier in ke.Modifiers
ke.Modifiers &^= mod ke.Modifiers &^= mod
sendKeyEvent(self, ke, data) return sendKeyEvent(self, ke, data)
} }
func (a *area) id() C.id { func (a *area) id() C.id {

View File

@ -89,9 +89,15 @@ event(otherMouseDown, areaView_mouseDown)
event(mouseUp, areaView_mouseUp) event(mouseUp, areaView_mouseUp)
event(rightMouseUp, areaView_mouseUp) event(rightMouseUp, areaView_mouseUp)
event(otherMouseUp, areaView_mouseUp) event(otherMouseUp, areaView_mouseUp)
event(keyDown, areaView_keyDown)
event(keyUp, areaView_keyUp) #define retevent(m, f) \
event(flagsChanged, areaView_flagsChanged) - (BOOL)m:(NSEvent *)e \
{ \
return f(self, e, self->goarea); \
}
retevent(doKeyDown, areaView_keyDown)
retevent(doKeyUp, areaView_keyUp)
retevent(doFlagsChanged, areaView_flagsChanged)
@end @end

View File

@ -20,6 +20,7 @@ static Class areaClass;
- (void)sendEvent:(NSEvent *)e - (void)sendEvent:(NSEvent *)e
{ {
NSEventType type; NSEventType type;
BOOL handled = NO;
type = [e type]; type = [e type];
if (type == NSKeyDown || type == NSKeyUp || type == NSFlagsChanged) { if (type == NSKeyDown || type == NSKeyUp || type == NSFlagsChanged) {
@ -29,18 +30,17 @@ static Class areaClass;
if (focused != nil && [focused isKindOfClass:areaClass]) if (focused != nil && [focused isKindOfClass:areaClass])
switch (type) { switch (type) {
case NSKeyDown: case NSKeyDown:
[focused keyDown:e]; handled = [focused doKeyDown:e];
return; break;
case NSKeyUp: case NSKeyUp:
[focused keyUp:e]; handled = [focused doKeyUp:e];
return; break;
case NSFlagsChanged: case NSFlagsChanged:
[focused flagsChanged:e]; handled = [focused doFlagsChanged:e];
return; break;
} }
// else fall through
} }
// otherwise, let NSApplication do it if (!handled)
[super sendEvent:e]; [super sendEvent:e];
} }