202 lines
4.4 KiB
Go
202 lines
4.4 KiB
Go
|
//+build !darwin
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"time"
|
||
|
|
||
|
"github.com/xlab/android-go/android"
|
||
|
"github.com/xlab/android-go/app"
|
||
|
gl "github.com/xlab/android-go/gles31"
|
||
|
|
||
|
//"github.com/golang-ui/nuklear/nk"
|
||
|
"gitlab.wow.st/gmp/nuklear/nk"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
datadir = "/storage/emulated/0/Android/data/st.wow.gitlab.gmp.commute/"
|
||
|
fontSize = 64
|
||
|
)
|
||
|
|
||
|
func platformInit() {
|
||
|
gl.Enable(gl.CULL_FACE)
|
||
|
gl.Disable(gl.DEPTH_TEST)
|
||
|
app.SetLogTag("Commute")
|
||
|
}
|
||
|
|
||
|
func mkWin() {
|
||
|
}
|
||
|
|
||
|
func Terminate() {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func PollEvents() {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func GetSize() (width, height int) {
|
||
|
handle := nk.NkPlatformDisplayHandle()
|
||
|
return handle.Width, handle.Height
|
||
|
}
|
||
|
|
||
|
func SwapBuffers() {
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
nativeWindowEvents chan app.NativeWindowEvent
|
||
|
inputQueueEvents chan app.InputQueueEvent
|
||
|
inputQueueChan chan *android.InputQueue
|
||
|
backPressed bool
|
||
|
)
|
||
|
|
||
|
func eventloop() {
|
||
|
nativeWindowEvents = make(chan app.NativeWindowEvent, 1)
|
||
|
inputQueueEvents = make(chan app.InputQueueEvent, 1)
|
||
|
inputQueueChan = make(chan *android.InputQueue, 1)
|
||
|
|
||
|
app.Main(appmain)
|
||
|
log(Info,"app.Main returned")
|
||
|
}
|
||
|
|
||
|
func appmain(a app.NativeActivity) {
|
||
|
log(Info,"appmain() start")
|
||
|
fpsTicker := time.NewTicker(frametime)
|
||
|
a.HandleNativeWindowEvents(nativeWindowEvents)
|
||
|
a.HandleInputQueueEvents(inputQueueEvents)
|
||
|
log(Info,"appmain() launching init thread")
|
||
|
inputs := make(chan struct{},64)
|
||
|
go app.HandleInputQueues(inputQueueChan, func() {
|
||
|
a.InputQueueHandled()
|
||
|
}, func(ev *android.InputEvent) {
|
||
|
switch android.InputEventGetType(ev) {
|
||
|
case android.InputEventTypeKey:
|
||
|
key := android.KeyEventGetKeyCode(ev)
|
||
|
action := android.KeyEventGetAction(ev)
|
||
|
meta := android.KeyEventGetMetaState(ev)
|
||
|
switch action {
|
||
|
case android.KeyEventActionDown:
|
||
|
if key == android.KeycodeBack {
|
||
|
backPressed = true
|
||
|
inputs<- struct{}{}
|
||
|
return
|
||
|
}
|
||
|
fallthrough
|
||
|
case android.KeyEventActionUp:
|
||
|
nk.NkPlatformInput(nil, &nk.PlatformKeyEvent{
|
||
|
Activity: a.NativeActivity(),
|
||
|
Action: action,
|
||
|
KeyCode: key,
|
||
|
MetaState: meta,
|
||
|
})
|
||
|
inputs<- struct{}{}
|
||
|
}
|
||
|
case android.InputEventTypeMotion:
|
||
|
action := android.MotionEventGetAction(ev)
|
||
|
switch action {
|
||
|
case android.MotionEventActionDown,
|
||
|
android.MotionEventActionMove,
|
||
|
android.MotionEventActionUp:
|
||
|
x := android.MotionEventGetX(ev, 0)
|
||
|
y := android.MotionEventGetY(ev, 0)
|
||
|
nk.NkPlatformInput(&nk.PlatformTouchEvent{
|
||
|
Action: action,
|
||
|
X: int32(x),
|
||
|
Y: int32(y),
|
||
|
}, nil)
|
||
|
inputs<- struct{}{}
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
a.InitDone()
|
||
|
log(Info,"appmain() starting event loop")
|
||
|
for {
|
||
|
select {
|
||
|
case event := <-a.LifecycleEvents():
|
||
|
log(Info,"appmain(): lifecycle ", event)
|
||
|
case event := <-inputQueueEvents:
|
||
|
log(Debug,"appmain(): inputQueueEvent ", event)
|
||
|
switch event.Kind {
|
||
|
case app.QueueCreated:
|
||
|
inputQueueChan <- event.Queue
|
||
|
case app.QueueDestroyed:
|
||
|
inputQueueChan <- nil
|
||
|
}
|
||
|
if ctx != nil {
|
||
|
gfxMain()
|
||
|
}
|
||
|
case <-fpsTicker.C:
|
||
|
log(DebugGfx,"appmain(): fpsTicker")
|
||
|
if ctx != nil {
|
||
|
log(DebugGfx,"gfxMain()")
|
||
|
fpsTicker.Stop()
|
||
|
gfxMain()
|
||
|
fpsTicker = newTicker()
|
||
|
}
|
||
|
case <-inputs:
|
||
|
log(Debug,"appmain(): inputs queue")
|
||
|
if ctx != nil {
|
||
|
fpsTicker.Stop()
|
||
|
gfxMain()
|
||
|
fpsTicker = newFastTicker()
|
||
|
}
|
||
|
case event := <-nativeWindowEvents:
|
||
|
log(Info,"appmain(): nativeWindowEvents", event)
|
||
|
switch event.Kind {
|
||
|
case app.NativeWindowRedrawNeeded:
|
||
|
log(Info,"appmain(): redraw")
|
||
|
fpsTicker.Stop()
|
||
|
gfxMain()
|
||
|
a.NativeWindowRedrawDone()
|
||
|
fpsTicker = newTicker()
|
||
|
case app.NativeWindowCreated:
|
||
|
log(Info,"appmain(): window created")
|
||
|
ctx = nk.NkPlatformInit(event.Window, nk.PlatformInstallCallbacks)
|
||
|
log(Info,"appmain(): init returned")
|
||
|
if ctx == nil {
|
||
|
log(Fatal,"Nuklear failed to init")
|
||
|
}
|
||
|
loadFont()
|
||
|
fpsTicker = newTicker()
|
||
|
log(Info,"appmain(): done with create window")
|
||
|
case app.NativeWindowDestroyed:
|
||
|
log(Info,"appmain(): window destroyed")
|
||
|
//refresh = true
|
||
|
fpsTicker.Stop()
|
||
|
nk.NkPlatformShutdown()
|
||
|
Drain:
|
||
|
for {
|
||
|
select {
|
||
|
case <-inputs:
|
||
|
default:
|
||
|
break Drain
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
backPressed = false
|
||
|
}
|
||
|
log(Info,"appmain: returning")
|
||
|
}
|
||
|
|
||
|
func newFastTicker() *time.Ticker {
|
||
|
return time.NewTicker(time.Second / 60)
|
||
|
}
|
||
|
|
||
|
func newTicker() *time.Ticker {
|
||
|
if y != lastY {
|
||
|
return time.NewTicker(time.Second / 60)
|
||
|
} else {
|
||
|
return time.NewTicker(time.Second)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BackButton(string) bool {
|
||
|
return backPressed
|
||
|
}
|
||
|
|
||
|
func Clip(x string) {
|
||
|
|
||
|
}
|
||
|
|