You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
1.5 KiB
Go
87 lines
1.5 KiB
Go
package ui
|
|
|
|
import (
|
|
"log"
|
|
"unsafe"
|
|
|
|
"github.com/jordanorelli/dws/events"
|
|
)
|
|
|
|
/*
|
|
#cgo CFLAGS: -x objective-c
|
|
#cgo LDFLAGS: -framework Cocoa
|
|
#include <stdlib.h>
|
|
#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{
|
|
seq: C.int(v.Seq),
|
|
path: cpath,
|
|
}
|
|
|
|
C.received_request(req)
|
|
|
|
case events.EndRequestEvent:
|
|
C.sent_response(&C.struct_ResponseMeta{
|
|
seq: C.int(v.Seq),
|
|
status: C.int(v.Status),
|
|
bytes: C.int(v.Bytes),
|
|
})
|
|
}
|
|
}
|
|
|
|
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}
|
|
}
|