// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // +build darwin package app // Simple on-screen app debugging for OS X. Not an officially supported // development target for apps, as screens with mice are very different // than screens with touch panels. /* #cgo CFLAGS: -x objective-c #cgo LDFLAGS: -framework Cocoa -framework OpenGL -framework QuartzCore #import #import void glGenVertexArrays(GLsizei n, GLuint* array); void glBindVertexArray(GLuint array); void runApp(void); void lockContext(GLintptr); void unlockContext(GLintptr); double backingScaleFactor(); */ import "C" import ( "runtime" "sync" "code.google.com/p/go.mobile/event" "code.google.com/p/go.mobile/geom" "code.google.com/p/go.mobile/gl" ) func init() { runtime.LockOSThread() } func run(callbacks Callbacks) { cb = callbacks C.runApp() } //export setGeom func setGeom(scale, width, height float64) { // Macs default to 72 DPI, so scales are equivalent. geom.Scale = float32(scale) geom.Width = geom.Pt(width) geom.Height = geom.Pt(height) } func initGL() { // Using attribute arrays in OpenGL 3.3 requires the use of a VBA. // But VBAs don't exist in ES 2. So we bind one default one. var id C.GLuint C.glGenVertexArrays(1, &id) C.glBindVertexArray(id) } var cb Callbacks var initGLOnce sync.Once var events = make(chan event.Touch, 1<<6) func sendTouch(ty event.TouchType, x, y float32) { events <- event.Touch{ Type: ty, Loc: geom.Point{ X: geom.Pt(x), Y: geom.Height - geom.Pt(y), }, } } //export eventMouseDown func eventMouseDown(x, y float32) { sendTouch(event.TouchStart, x, y) } //export eventMouseMove func eventMouseMove(x, y float32) { sendTouch(event.TouchMove, x, y) } //export eventMouseEnd func eventMouseEnd(x, y float32) { sendTouch(event.TouchEnd, x, y) } //export drawgl func drawgl(ctx C.GLintptr) { runtime.LockOSThread() C.lockContext(ctx) initGLOnce.Do(initGL) loop: for { select { case e := <-events: if cb.Touch != nil { cb.Touch(e) } default: break loop } } // TODO: is the library or the app responsible for clearing the buffers? gl.ClearColor(0, 0, 0, 1) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) if cb.Draw != nil { cb.Draw() } C.unlockContext(ctx) runtime.UnlockOSThread() }