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 // #include // #include // #include +// /* TODO // /* 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))