package ui import ( "log" "unsafe" "github.com/jordanorelli/dws/events" ) /* #cgo CFLAGS: -x objective-c #cgo LDFLAGS: -framework Cocoa #include #include "ui_darwin.h" */ import "C" var desktopUI *cocoaUI func Desktop() UI { if desktopUI != nil { return desktopUI } log.Println("Creating new Cocoa UI") C.initialize() desktopUI = new(cocoaUI) return desktopUI } type cocoaUI struct { in chan events.BackgroundEvent out chan events.UserEvent } func (ui *cocoaUI) Run(out chan events.UserEvent, in chan events.BackgroundEvent) error { log.Println("Running Desktop UI") ui.in = in ui.out = out go ui.forwardEvents() C.run() return nil } func (ui *cocoaUI) forwardEvent(e events.BackgroundEvent) { switch v := e.(type) { case events.SigIntEvent: log.Println("Cocoa UI sees sig int, forwarding to NSApp") C.shutdown() case events.SetRootEvent: cpath := C.CString(v.Path) defer C.free(unsafe.Pointer(cpath)) C.set_root(cpath) case events.BeginRequestEvent: cpath := C.CString(v.Path) defer C.free(unsafe.Pointer(cpath)) req := &C.struct_RequestMeta{ path: cpath, } C.begin_request(req) case events.EndRequestEvent: C.end_request() } } func (ui *cocoaUI) forwardEvents() { for e := range ui.in { ui.forwardEvent(e) } } //export selectDirectory func selectDirectory(cpath *C.char) { path := C.GoString(cpath) desktopUI.out <- events.UserSelectedDirectory{Path: path} }