diff options
| author | Pietro Gagliardi <[email protected]> | 2014-03-30 19:53:44 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-03-30 19:53:44 -0400 |
| commit | 6a7cb73ddaa92a87fb4df77a7a3f3c2332f8761f (patch) | |
| tree | aec15845b480cee8528f104a5685fccf54327780 /area_darwin.go | |
| parent | 41a7e3dab8193d8c19aa43eac344eb274deef5a8 (diff) | |
Added key events to Mac OS X Areas. Now Area is feature-complete (but buggy) on all platforms :D Also more TODOs.
Diffstat (limited to 'area_darwin.go')
| -rw-r--r-- | area_darwin.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/area_darwin.go b/area_darwin.go index c5c3845..2f93614 100644 --- a/area_darwin.go +++ b/area_darwin.go @@ -17,6 +17,9 @@ import ( // extern void areaView_mouseMoved(id, SEL, id); // extern void areaView_mouseDown_mouseDragged(id, SEL, id); // extern void areaView_mouseUp(id, SEL, id); +// extern void areaView_keyDown(id, SEL, id); +// extern void areaView_keyUp(id, SEL, id); +// extern void areaView_flagsChanged(id, SEL, id); import "C" const ( @@ -47,6 +50,9 @@ var eventMethods = []eventMethod{ eventMethod{"otherMouseDown:", uintptr(C.areaView_mouseDown_mouseDragged)}, eventMethod{"otherMouseDragged:", uintptr(C.areaView_mouseDown_mouseDragged)}, eventMethod{"otherMouseUp:", uintptr(C.areaView_mouseUp)}, + eventMethod{"keyDown:", uintptr(C.areaView_keyDown)}, + eventMethod{"keyUp:", uintptr(C.areaView_keyUp)}, + eventMethod{"flagsChanged:", uintptr(C.areaView_flagsChanged)}, } func mkAreaClass() error { @@ -202,6 +208,68 @@ func areaView_mouseUp(self C.id, sel C.SEL, e C.id) { areaMouseEvent(self, e, true, true) } +var ( + _keyCode = sel_getUid("keyCode") +) + +func handleKeyEvent(self C.id) { + // TODO +} + +func sendKeyEvent(self C.id, ke KeyEvent) { + s := getSysData(self) + handled, repaint := s.handler.Key(ke) + if repaint { + C.objc_msgSend_noargs(self, _display) + } + if !handled { + handleKeyEvent(self) + } +} + +func areaKeyEvent(self C.id, e C.id, up bool) { + var ke KeyEvent + + keyCode := uintptr(C.objc_msgSend_ushortret_noargs(e, _keyCode)) + ke, ok := fromKeycode(keyCode) + if !ok { + // no such key; modifiers by themselves are handled by -[self flagsChanged:] + handleKeyEvent(self) + return + } + // either ke.Key or ke.ExtKey will be set at this point + ke.Modifiers = parseModifiers(e) + ke.Up = up + sendKeyEvent(self, ke) +} + +//export areaView_keyDown +func areaView_keyDown(self C.id, sel C.SEL, e C.id) { + areaKeyEvent(self, e, false) +} + +//export areaView_keyUp +func areaView_keyUp(self C.id, sel C.SEL, e C.id) { + areaKeyEvent(self, e, true) +} + +//export areaView_flagsChanged +func areaView_flagsChanged(self C.id, sel C.SEL, e C.id) { + var ke KeyEvent + + // Mac OS X sends this event on both key up and key down. + // Fortunately -[e keyCode] IS valid here, so we can simply map from key code to Modifiers, get the value of [e modifierFlags], the respective bit is set or not — that will give us the up/down state + keyCode := uintptr(C.objc_msgSend_ushortret_noargs(e, _keyCode)) + mod, ok := keycodeModifiers[keyCode] // comma-ok form to avoid adding entries + if !ok { // unknown modifier; ignore + handleKeyEvent(self) + return + } + ke.Modifiers = parseModifiers(e) + ke.Up = (ke.Modifiers & mod) == 0 + sendKeyEvent(self, ke) +} + // TODO combine these with the listbox functions? func newAreaScrollView(area C.id) C.id { |
