From fc55c6ee5c2f016fd458f56e8a42a5771df931e4 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 2 Apr 2019 21:04:48 +0200 Subject: [PATCH] ui/app: implement Command for system events And add CommandBack for the Android back button. Signed-off-by: Elias Naur --- ui/app/GioActivity.java | 5 +++++ ui/app/GioView.java | 5 +++++ ui/app/app.go | 23 +++++++++++++++++++---- ui/app/os_android.c | 5 +++++ ui/app/os_android.go | 11 +++++++++++ ui/app/window.go | 3 +++ 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/ui/app/GioActivity.java b/ui/app/GioActivity.java index c97830db..669292a4 100644 --- a/ui/app/GioActivity.java +++ b/ui/app/GioActivity.java @@ -50,4 +50,9 @@ public class GioActivity extends Activity { super.onLowMemory(); view.lowMemory(); } + + @Override public void onBackPressed() { + if (!view.backPressed()) + super.onBackPressed(); + } } diff --git a/ui/app/GioView.java b/ui/app/GioView.java index 908e5ab2..f4f1900b 100644 --- a/ui/app/GioView.java +++ b/ui/app/GioView.java @@ -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; diff --git a/ui/app/app.go b/ui/app/app.go index 814f4392..7342976e 100644 --- a/ui/app/app.go +++ b/ui/app/app.go @@ -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, "|") diff --git a/ui/app/os_android.c b/ui/app/os_android.c index 0d2ae49c..f67cf627 100644 --- a/ui/app/os_android.c +++ b/ui/app/os_android.c @@ -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) { diff --git a/ui/app/os_android.go b/ui/app/os_android.go index 52af6ccc..afa883b7 100644 --- a/ui/app/os_android.go +++ b/ui/app/os_android.go @@ -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) diff --git a/ui/app/window.go b/ui/app/window.go index 18ab025a..829adb9d 100644 --- a/ui/app/window.go +++ b/ui/app/window.go @@ -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 {