ui/app: implement Command for system events

And add CommandBack for the Android back button.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-04-02 21:04:48 +02:00
parent 6bd5b73154
commit fc55c6ee5c
6 changed files with 48 additions and 4 deletions
+5
View File
@@ -50,4 +50,9 @@ public class GioActivity extends Activity {
super.onLowMemory();
view.lowMemory();
}
@Override public void onBackPressed() {
if (!view.backPressed())
super.onBackPressed();
}
}
+5
View File
@@ -163,6 +163,10 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
onLowMemory();
}
boolean backPressed() {
return onBack(nhandle);
}
static private native long onCreateView(GioView view);
static private native void onDestroyView(long handle);
static private native void onStartView(long handle);
@@ -174,6 +178,7 @@ public class GioView extends SurfaceView implements Choreographer.FrameCallback
static private native void onTouchEvent(long handle, int action, int pointerID, int tool, float x, float y, long time);
static private native void onKeyEvent(long handle, int code, int character, long time);
static private native void onFrameCallback(long handle, long nanos);
static private native boolean onBack(long handle);
private static class InputConnection extends BaseInputConnection {
private final Editable editable;
+19 -4
View File
@@ -10,6 +10,10 @@ import (
"gioui.org/ui"
)
type Event interface {
ImplementsEvent()
}
type Draw struct {
Config *ui.Config
Size image.Point
@@ -23,12 +27,16 @@ type ChangeStage struct {
Stage Stage
}
type Stage uint8
type Event interface {
ImplementsEvent()
// Command is a system event.
type Command struct {
Type CommandType
// Suppress the default action of the command.
Cancel bool
}
type Stage uint8
type CommandType uint8
type Input interface {
ImplementsInput()
}
@@ -39,6 +47,12 @@ const (
StageVisible
)
const (
// CommandBack is the command for a back action
// such as the Android back button.
CommandBack CommandType = iota
)
const (
inchPrDp = 1.0 / 160
mmPrDp = 25.4 / 160
@@ -98,6 +112,7 @@ func (l Stage) String() string {
func (_ Draw) ImplementsEvent() {}
func (_ ChangeStage) ImplementsEvent() {}
func (_ *Command) ImplementsEvent() {}
func init() {
args := strings.Split(extraArgs, "|")
+5
View File
@@ -72,6 +72,11 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserver) {
.name = "onFrameCallback",
.signature = "(JJ)V",
.fnPtr = onFrameCallback
},
{
.name = "onBack",
.signature = "(J)Z",
.fnPtr = onBack
}
};
if ((*env)->RegisterNatives(env, viewClass, methods, sizeof(methods)/sizeof(methods[0])) != 0) {
+11
View File
@@ -180,6 +180,17 @@ func onFrameCallback(env *C.JNIEnv, class C.jclass, view C.jlong, nanos C.jlong)
}
}
//export onBack
func onBack(env *C.JNIEnv, class C.jclass, view C.jlong) C.jboolean {
w := views[view]
ev := &Command{Type: CommandBack}
w.event(ev)
if ev.Cancel {
return C.JNI_TRUE
}
return C.JNI_FALSE
}
func (w *window) setVisible() {
win := w.aNativeWindow()
width, height := C.ANativeWindow_getWidth(win), C.ANativeWindow_getHeight(win)
+3
View File
@@ -206,6 +206,9 @@ func (w *Window) event(e Event) {
needRedraw = true
case key.Event:
needRedraw = true
case *Command:
needAck = true
needRedraw = true
case ChangeStage:
w.stage = e.Stage
if w.stage > StageDead {