Implemented the new AreaHandler.Key() on Mac OS X.
This commit is contained in:
parent
d53dba9e38
commit
c9f8955758
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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,19 +30,18 @@ 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];
|
||||||
}
|
}
|
||||||
|
|
||||||
// ok AppKit, wanna play hardball? let's play hardball.
|
// ok AppKit, wanna play hardball? let's play hardball.
|
||||||
|
|
Loading…
Reference in New Issue