summaryrefslogtreecommitdiff
path: root/area_darwin.go
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-04-04 21:32:10 -0400
committerPietro Gagliardi <[email protected]>2014-04-04 21:32:10 -0400
commit7ea493873cb2be2eac1e6bb08c66a119e489b38e (patch)
tree1a4dc504e7d699374c3e17752b0c3abb46629669 /area_darwin.go
parentdd20d56f257b001fe58783e86c113c11de58ca53 (diff)
Changed the Area class on Mac OS X to use the new class creation code. This gets rid of ALL the class creation code from delegate_darwin.go.
Diffstat (limited to 'area_darwin.go')
-rw-r--r--area_darwin.go103
1 files changed, 37 insertions, 66 deletions
diff --git a/area_darwin.go b/area_darwin.go
index 45675b9..5353607 100644
--- a/area_darwin.go
+++ b/area_darwin.go
@@ -28,62 +28,56 @@ const (
var (
_goArea C.id
+ _NSView = objc_getClass("NSView")
_drawRect = sel_getUid("drawRect:")
- _isFlipped = sel_getUid("isFlipped")
- _acceptsFirstResponder = sel_getUid("acceptsFirstResponder")
)
-// uintptr due to a bug; see https://code.google.com/p/go/issues/detail?id=7665
-type eventMethod struct {
- sel string
- m uintptr
-}
-var eventMethods = []eventMethod{
- eventMethod{"mouseMoved:", uintptr(C.areaView_mouseMoved)},
- eventMethod{"mouseDown:", uintptr(C.areaView_mouseDown_mouseDragged)},
- eventMethod{"mouseDragged:", uintptr(C.areaView_mouseDown_mouseDragged)},
- eventMethod{"mouseUp:", uintptr(C.areaView_mouseUp)},
- eventMethod{"rightMouseDown:", uintptr(C.areaView_mouseDown_mouseDragged)},
- eventMethod{"rightMouseDragged:", uintptr(C.areaView_mouseDown_mouseDragged)},
- eventMethod{"rightMouseUp:", uintptr(C.areaView_mouseUp)},
- 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)},
+var goAreaSels = []selector{
+ selector{"isFlipped", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
+ "ensuring that an Area's coordinate system has (0,0) at the top-left corner"},
+ selector{"acceptsFirstResponder", uintptr(C.areaView_isFlipped_acceptsFirstResponder), sel_bool,
+ "registering that Areas are to receive events"},
+ selector{"mouseMoved:", uintptr(C.areaView_mouseMoved), sel_void_id,
+ "handling mouse movements in Area"},
+ selector{"mouseDown:", uintptr(C.areaView_mouseDown_mouseDragged), sel_void_id,
+ "handling mouse button 1 presses in Area"},
+ selector{"mouseDragged:", uintptr(C.areaView_mouseDown_mouseDragged), sel_void_id,
+ "handling mouse button 1 dragging in Area"},
+ selector{"mouseUp:", uintptr(C.areaView_mouseUp), sel_void_id,
+ "handling mouse button 1 releases in Area"},
+ selector{"rightMouseDown:", uintptr(C.areaView_mouseDown_mouseDragged), sel_void_id,
+ "handling mouse button 3 presses in Area"},
+ selector{"rightMouseDragged:", uintptr(C.areaView_mouseDown_mouseDragged), sel_void_id,
+ "handling mouse button 3 dragging in Area"},
+ selector{"rightMouseUp:", uintptr(C.areaView_mouseUp), sel_void_id,
+ "handling mouse button 3 releases in Area"},
+ selector{"otherMouseDown:", uintptr(C.areaView_mouseDown_mouseDragged), sel_void_id,
+ "handling mouse button 2 (and 4 and higher) presses in Area"},
+ selector{"otherMouseDragged:", uintptr(C.areaView_mouseDown_mouseDragged), sel_void_id,
+ "handling mouse button 2 (and 4 and higher) dragging in Area"},
+ selector{"otherMouseUp:", uintptr(C.areaView_mouseUp), sel_void_id,
+ "handling mouse button 2 (and 4 and higher) releases in Area"},
+ selector{"keyDown:", uintptr(C.areaView_keyDown), sel_void_id,
+ "handling key presses in Area"},
+ selector{"keyUp:", uintptr(C.areaView_keyUp), sel_void_id,
+ "handling key releases in Area"},
+ selector{"flagsChanged:", uintptr(C.areaView_flagsChanged), sel_void_id,
+ "handling Modifiers presses and releases in Area"},
}
func mkAreaClass() error {
- areaclass, err := makeAreaClass(__goArea)
+ id, class, err := makeClass(__goArea, _NSView, goAreaSels,
+ "the implementation of Area on Mac OS X")
if err != nil {
- return fmt.Errorf("error creating Area backend class: %v", err)
+ return err
}
// addAreaViewDrawMethod() is in bleh_darwin.m
- ok := C.addAreaViewDrawMethod(areaclass)
+ ok := C.addAreaViewDrawMethod(class)
if ok != C.BOOL(C.YES) {
return fmt.Errorf("error overriding Area drawRect: method; reason unknown")
}
- // TODO rename this function (it overrides anyway)
- err = addDelegateMethod(areaclass, _isFlipped,
- C.areaView_isFlipped_acceptsFirstResponder, area_boolret)
- if err != nil {
- return fmt.Errorf("error overriding Area isFlipped method: %v", err)
- }
- err = addDelegateMethod(areaclass, _acceptsFirstResponder,
- C.areaView_isFlipped_acceptsFirstResponder, area_boolret)
- if err != nil {
- return fmt.Errorf("error overriding Area acceptsFirstResponder method: %v", err)
- }
- for _, m := range eventMethods {
- err = addDelegateMethod(areaclass, sel_getUid(m.sel),
- unsafe.Pointer(m.m), delegate_void)
- if err != nil {
- return fmt.Errorf("error overriding Area %s method: %v", m.sel, err)
- }
- }
- _goArea = objc_getClass(__goArea)
+ _goArea = id
return nil
}
@@ -298,26 +292,3 @@ func makeArea(parentWindow C.id, alternate bool) C.id {
addControl(parentWindow, area)
return area
}
-
-// TODO combine the below with the delegate stuff
-
-var (
- _NSView = objc_getClass("NSView")
- _NSView_Class = C.Class(unsafe.Pointer(_NSView))
-)
-
-func makeAreaClass(name string) (C.Class, error) {
- cname := C.CString(name)
- defer C.free(unsafe.Pointer(cname))
-
- c := C.objc_allocateClassPair(_NSView_Class, cname, 0)
- if c == C.NilClass {
- return C.NilClass, fmt.Errorf("unable to create Objective-C class %s for Area; reason unknown", name)
- }
- C.objc_registerClassPair(c)
- return c, nil
-}
-
-var (
- area_boolret = []C.char{'c', '@', ':', 0} // BOOL (*)(id, SEL)
-)