diff options
| author | Pietro Gagliardi <[email protected]> | 2014-02-28 21:30:32 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2014-02-28 21:30:32 -0500 |
| commit | 1c6d4e915177caa65c542619763d73ca704b52bb (patch) | |
| tree | 452e9621493d9f159703ce072db4531b57e05dfa /darwintest/newtypes.go | |
| parent | 4e1b0b12724581d416325a2ca5ca7a91e2703cd3 (diff) | |
Split the actual delegate into a separate file; this simplifies even more things. I think we're as clean as we can go... should probably start writing the real backend now :D
Diffstat (limited to 'darwintest/newtypes.go')
| -rw-r--r-- | darwintest/newtypes.go | 54 |
1 files changed, 8 insertions, 46 deletions
diff --git a/darwintest/newtypes.go b/darwintest/newtypes.go index f054a54..97c1d82 100644 --- a/darwintest/newtypes.go +++ b/darwintest/newtypes.go @@ -2,19 +2,14 @@ package main import ( - "fmt" "unsafe" ) -// #cgo CFLAGS: -Dqqq // #cgo LDFLAGS: -lobjc -framework Foundation // #include <stdlib.h> // #include "objc_darwin.h" -// extern void windowShouldClose(id, SEL, id); -// extern void buttonClicked(id, SEL, id); -// extern void gotNotification(id, SEL, id); // /* because cgo doesn't like Nil */ -// extern Class NilClass; /* defined in runtimetest.go due to cgo limitations */ +// Class NilClass = Nil; import "C" var ( @@ -29,56 +24,23 @@ func newClass(name string) C.Class { if c == C.NilClass { panic("unable to create Objective-C class " + name) } + C.objc_registerClassPair(c) return c } -// TODO move these around later -var ( - _stop = sel_getUid("stop:") -) - -//export windowShouldClose -func windowShouldClose(self C.id, sel C.SEL, sender C.id) { - fmt.Println("-[hello windowShouldClose:]") - C.objc_msgSend_id(NSApp, _stop, sender) -} - -//export buttonClicked -func buttonClicked(self C.id, sel C.SEL, sender C.id) { - fmt.Println("button clicked; sending notification...") - notify("button") -} - -//export gotNotification -func gotNotification(self C.id, sel C.SEL, object C.id) { - fmt.Printf("got notification from %s\n", fromNSString(object)) -} - -func addOurMethod(class C.Class, sel C.SEL, imp C.IMP) { -// ty := []C.char{'v', '@', ':', 0} // according to the example for class_addMethod() +// according to errors spit out by cgo, C function pointers are unsafe.Pointer +func addDelegateMethod(class C.Class, sel C.SEL, imp unsafe.Pointer) { + // maps to void (*)(id, SEL, id) ty := []C.char{'v', '@', ':', '@', 0} // clas methods get stored in the metaclass; the objc_allocateClassPair() docs say this will work -// metaclass := C.object_getClass(C.id(unsafe.Pointer(class))) -// ok := C.class_addMethod(metaclass, + // metaclass := C.object_getClass(C.id(unsafe.Pointer(class))) + // we're adding instance methods, so just class will do ok := C.class_addMethod(class, sel, - imp, + C.IMP(imp), &ty[0]) if ok == C.BOOL(C.NO) { panic("unable to add ourMethod") } } - -func mk(name string, selW C.SEL, selB C.SEL, selN C.SEL) C.id { - class := newClass(name) - addOurMethod(class, selW, - // using &C.ourMethod causes faults for some reason - C.IMP(unsafe.Pointer(C.windowShouldClose))) - C.objc_registerClassPair(class) - addOurMethod(class, selB, - C.IMP(unsafe.Pointer(C.buttonClicked))) - addOurMethod(class, selN, - C.IMP(unsafe.Pointer(C.gotNotification))) - return objc_getClass(name) -} |
