diff --git a/src/api-impl-jni/util.c b/src/api-impl-jni/util.c index 80f078ca..8fa829df 100644 --- a/src/api-impl-jni/util.c +++ b/src/api-impl-jni/util.c @@ -141,6 +141,7 @@ void set_up_handle_cache(JNIEnv *env) handle_cache.view.getIdName = _METHOD(handle_cache.view.class, "getIdName", "()Ljava/lang/String;"); handle_cache.view.getAllSuperClasses = _METHOD(handle_cache.view.class, "getAllSuperClasses", "()Ljava/lang/String;"); handle_cache.view.dispatchKeyEvent = _METHOD(handle_cache.view.class, "dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z"); + handle_cache.view.onKeyDown = _METHOD(handle_cache.view.class, "onKeyDown", "(ILandroid/view/KeyEvent;)Z"); handle_cache.asset_manager.class = _REF((*env)->FindClass(env, "android/content/res/AssetManager")); handle_cache.asset_manager.extractFromAPK = _STATIC_METHOD(handle_cache.asset_manager.class, "extractFromAPK", "(Ljava/lang/String;Ljava/lang/String;)V"); diff --git a/src/api-impl-jni/util.h b/src/api-impl-jni/util.h index 98224a91..a8f92048 100644 --- a/src/api-impl-jni/util.h +++ b/src/api-impl-jni/util.h @@ -86,6 +86,7 @@ struct handle_cache { jmethodID getIdName; jmethodID getAllSuperClasses; jmethodID dispatchKeyEvent; + jmethodID onKeyDown; } view; struct { jclass class; diff --git a/src/api-impl-jni/widgets/WrapperWidget.c b/src/api-impl-jni/widgets/WrapperWidget.c index 2e8aad4a..0fa1ab21 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.c +++ b/src/api-impl-jni/widgets/WrapperWidget.c @@ -272,6 +272,16 @@ static bool on_click(GtkGestureClick *gesture, int n_press, double x, double y, return ret; } +#define KEYCODE_0 7 +#define KEYCODE_1 8 +#define KEYCODE_2 9 +#define KEYCODE_3 10 +#define KEYCODE_4 11 +#define KEYCODE_5 12 +#define KEYCODE_6 13 +#define KEYCODE_7 14 +#define KEYCODE_8 15 +#define KEYCODE_9 16 #define KEYCODE_DPAD_UP 19 #define KEYCODE_DPAD_DOWN 20 #define KEYCODE_DPAD_LEFT 21 @@ -296,6 +306,26 @@ static int map_key_code(int key_code) { return KEYCODE_DEL; case GDK_KEY_Delete: return KEYCODE_FORWARD_DEL; + case GDK_KEY_0: + return KEYCODE_0; + case GDK_KEY_1: + return KEYCODE_1; + case GDK_KEY_2: + return KEYCODE_2; + case GDK_KEY_3: + return KEYCODE_3; + case GDK_KEY_4: + return KEYCODE_4; + case GDK_KEY_5: + return KEYCODE_5; + case GDK_KEY_6: + return KEYCODE_6; + case GDK_KEY_7: + return KEYCODE_7; + case GDK_KEY_8: + return KEYCODE_8; + case GDK_KEY_9: + return KEYCODE_9; default: return key_code; } @@ -367,7 +397,8 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job } jmethodID dispatch_key_event_method = _METHOD(_CLASS(jobj), "dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z"); - if (dispatch_key_event_method != handle_cache.view.dispatchKeyEvent) { + jmethodID on_key_down_method = _METHOD(_CLASS(jobj), "onKeyDown", "(ILandroid/view/KeyEvent;)Z"); + if (dispatch_key_event_method != handle_cache.view.dispatchKeyEvent || on_key_down_method != handle_cache.view.onKeyDown) { GtkEventController *controller = GTK_EVENT_CONTROLLER(gtk_event_controller_key_new()); g_signal_connect(controller, "key-pressed", G_CALLBACK(on_key_pressed), wrapper); g_signal_connect(controller, "key-released", G_CALLBACK(on_key_released), wrapper); diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index f832cc8c..3ba0529d 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -2108,7 +2108,16 @@ public class View implements Drawable.Callback { public boolean requestRectangleOnScreen(Rect rectangle) {return false;} - public boolean dispatchKeyEvent(KeyEvent event) {return false;} + public boolean onKeyDown(int keyCode, KeyEvent event) { + return false; + } + + public boolean dispatchKeyEvent(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) + return onKeyDown(event.getKeyCode(), event); + else + return false; + } public WindowInsets getRootWindowInsets() {return null;}