summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--darwintest/runtimetest.go50
1 files changed, 49 insertions, 1 deletions
diff --git a/darwintest/runtimetest.go b/darwintest/runtimetest.go
index 04a10c1..be6357f 100644
--- a/darwintest/runtimetest.go
+++ b/darwintest/runtimetest.go
@@ -6,14 +6,21 @@ import (
"unsafe"
)
-// #cgo LDFLAGS: -lobjc -framework Foundation
+// #cgo LDFLAGS: -lobjc -framework Foundation -framework AppKit
// #include <stdlib.h>
// #include <objc/message.h>
// #include <objc/objc.h>
// #include <objc/runtime.h>
+// /* TODO <objc/NSObjCRuntime.h not found?!?! */
+// /* TODO this HAS to be unsafe */
+// typedef unsigned long NSUInteger;
+// /* avoid depending on Objective-C */
+// #include <CoreGraphics/CGGeometry.h>
// /* cgo doesn't handle ... */
// id objc_msgSend_noargs(id obj, SEL sel) { return objc_msgSend(obj, sel); }
// id objc_msgSend_strarg(id obj, SEL sel, char *a) { return objc_msgSend(obj, sel, a); }
+// id objc_msgSend_NSRect_uint_uint_bool(id obj, SEL sel, CGRect a, NSUInteger b, NSUInteger c, BOOL d) { return objc_msgSend(obj, sel, a, b, c, d); }
+// id objc_msgSend_id(id obj, SEL sel, id a) { return objc_msgSend(obj, sel, a); }
import "C"
func objc_getClass(class string) C.id {
@@ -30,7 +37,48 @@ func sel_getUid(sel string) C.SEL {
return C.sel_getUid(csel)
}
+const (
+ NSBorderlessWindowMask = 0
+ NSTitledWindowMask = 1 << 0
+ NSClosableWindowMask = 1 << 1
+ NSMiniaturizableWindowMask = 1 << 2
+ NSResizableWindowMask = 1 << 3
+ NSTexturedBackgroundWindowMask = 1 << 8
+)
+
+const (
+// NSBackingStoreRetained = 0 // "You should not use this mode."
+// NSBackingStoreNonretained = 1 // "You should not use this mode."
+ NSBackingStoreBuffered = 2
+)
+
+var alloc = sel_getUid("alloc")
+
func main() {
+ NSWindow := objc_getClass("NSWindow")
+ NSWindowinit :=
+ sel_getUid("initWithContentRect:styleMask:backing:defer:")
+ makeKeyAndOrderFront := sel_getUid("makeKeyAndOrderFront:")
+
+ // need an NSApplication first - see https://github.com/TooTallNate/NodObjC/issues/21
+ NSApplication := objc_getClass("NSApplication")
+ sharedApplication := sel_getUid("sharedApplication")
+ C.objc_msgSend_noargs(NSApplication, sharedApplication)
+
+ rect := C.CGRect{
+ origin: C.CGPoint{100, 100},
+ size: C.CGSize{320, 240},
+ }
+ style := C.NSUInteger(NSTitledWindowMask | NSClosableWindowMask)
+ backing := C.NSUInteger(NSBackingStoreBuffered)
+ deferx := C.BOOL(C.YES)
+ window := C.objc_msgSend_noargs(NSWindow, alloc)
+ window = C.objc_msgSend_NSRect_uint_uint_bool(window, NSWindowinit, rect, style, backing, deferx)
+ C.objc_msgSend_id(window, makeKeyAndOrderFront, window)
+ select{}
+}
+
+func helloworld() {
_hello := C.CString("hello, world\n")
defer C.free(unsafe.Pointer(_hello))