mirror of
https://github.com/go-i2p/gomobile-java.git
synced 2025-07-13 11:54:44 -04:00

More than a name change, the painting model changes so that the app, not the library, is responsible for driving painting. If the app is animating and wants paint events at 60 Hz, it has to ask for that. If the app is not animating and doesn't need to update its screen, it shouldn't get any paint events. Plenty of TODOs, and this CL doesn't get us to a perfect place, but it is a checkpoint along the way. The darwin_*.go code changes were minimal. I don't even have a Mac or iOS device to test that this even builds. Even so, the TODOs about not sending paint.Events unconditionally are important TODOs. That's the whole point of switching to this model. I'll leave the actual implementation to you (crawshaw). Out of all the example apps, the change to example/network/main.go is probably the most interesting. It seems like there ought to be some way to reduce the copy/paste between all of the example app code, but I'll leave that for future CLs. Change-Id: I17e11c06174110c68e17f7183b2d8af19b6a170e Reviewed-on: https://go-review.googlesource.com/14300 Reviewed-by: David Crawshaw <crawshaw@golang.org>
124 lines
2.6 KiB
Go
124 lines
2.6 KiB
Go
// 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 linux,!android
|
|
|
|
package app
|
|
|
|
/*
|
|
Simple on-screen app debugging for X11. Not an officially supported
|
|
development target for apps, as screens with mice are very different
|
|
than screens with touch panels.
|
|
|
|
On Ubuntu 14.04 'Trusty', you may have to install these libraries:
|
|
sudo apt-get install libegl1-mesa-dev libgles2-mesa-dev libx11-dev
|
|
*/
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lEGL -lGLESv2 -lX11
|
|
|
|
void createWindow(void);
|
|
void processEvents(void);
|
|
void swapBuffers(void);
|
|
*/
|
|
import "C"
|
|
import (
|
|
"runtime"
|
|
"time"
|
|
|
|
"golang.org/x/mobile/event/lifecycle"
|
|
"golang.org/x/mobile/event/paint"
|
|
"golang.org/x/mobile/event/size"
|
|
"golang.org/x/mobile/event/touch"
|
|
"golang.org/x/mobile/geom"
|
|
"golang.org/x/mobile/gl"
|
|
)
|
|
|
|
func init() {
|
|
registerGLViewportFilter()
|
|
}
|
|
|
|
func main(f func(App)) {
|
|
runtime.LockOSThread()
|
|
C.createWindow()
|
|
|
|
// TODO: send lifecycle events when e.g. the X11 window is iconified or moved off-screen.
|
|
sendLifecycle(lifecycle.StageFocused)
|
|
|
|
// TODO: translate X11 expose events to shiny paint events, instead of
|
|
// sending this synthetic paint event as a hack.
|
|
eventsIn <- paint.Event{}
|
|
|
|
donec := make(chan struct{})
|
|
go func() {
|
|
f(app{})
|
|
close(donec)
|
|
}()
|
|
|
|
// TODO: can we get the actual vsync signal?
|
|
ticker := time.NewTicker(time.Second / 60)
|
|
defer ticker.Stop()
|
|
var tc <-chan time.Time
|
|
|
|
for {
|
|
select {
|
|
case <-donec:
|
|
return
|
|
case <-gl.WorkAvailable:
|
|
gl.DoWork()
|
|
case <-publish:
|
|
C.swapBuffers()
|
|
tc = ticker.C
|
|
case <-tc:
|
|
tc = nil
|
|
publishResult <- PublishResult{}
|
|
}
|
|
C.processEvents()
|
|
}
|
|
}
|
|
|
|
//export onResize
|
|
func onResize(w, h int) {
|
|
// TODO(nigeltao): don't assume 72 DPI. DisplayWidth and DisplayWidthMM
|
|
// is probably the best place to start looking.
|
|
pixelsPerPt := float32(1)
|
|
eventsIn <- size.Event{
|
|
WidthPx: w,
|
|
HeightPx: h,
|
|
WidthPt: geom.Pt(w),
|
|
HeightPt: geom.Pt(h),
|
|
PixelsPerPt: pixelsPerPt,
|
|
}
|
|
}
|
|
|
|
func sendTouch(t touch.Type, x, y float32) {
|
|
eventsIn <- touch.Event{
|
|
X: x,
|
|
Y: y,
|
|
Sequence: 0, // TODO: button??
|
|
Type: t,
|
|
}
|
|
}
|
|
|
|
//export onTouchBegin
|
|
func onTouchBegin(x, y float32) { sendTouch(touch.TypeBegin, x, y) }
|
|
|
|
//export onTouchMove
|
|
func onTouchMove(x, y float32) { sendTouch(touch.TypeMove, x, y) }
|
|
|
|
//export onTouchEnd
|
|
func onTouchEnd(x, y float32) { sendTouch(touch.TypeEnd, x, y) }
|
|
|
|
var stopped bool
|
|
|
|
//export onStop
|
|
func onStop() {
|
|
if stopped {
|
|
return
|
|
}
|
|
stopped = true
|
|
sendLifecycle(lifecycle.StageDead)
|
|
eventsIn <- stopPumping{}
|
|
}
|