summaryrefslogtreecommitdiff
path: root/darwintest/newtypes.go
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-02-28 21:30:32 -0500
committerPietro Gagliardi <[email protected]>2014-02-28 21:30:32 -0500
commit1c6d4e915177caa65c542619763d73ca704b52bb (patch)
tree452e9621493d9f159703ce072db4531b57e05dfa /darwintest/newtypes.go
parent4e1b0b12724581d416325a2ca5ca7a91e2703cd3 (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.go54
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)
-}