From efa61afc713e86e99b9f45f56dc4736be90967be Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Tue, 27 Feb 2024 06:57:22 +0100 Subject: [PATCH] implement View.OnLongClickListener as GtkGestureLongPress --- .../generated_headers/android_view_View.h | 8 ++++ src/api-impl-jni/views/android_view_View.c | 40 +++++++++++++++++++ src/api-impl/android/view/View.java | 2 +- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/api-impl-jni/generated_headers/android_view_View.h b/src/api-impl-jni/generated_headers/android_view_View.h index ecbc2e89..423d9db9 100644 --- a/src/api-impl-jni/generated_headers/android_view_View.h +++ b/src/api-impl-jni/generated_headers/android_view_View.h @@ -311,6 +311,14 @@ JNIEXPORT void JNICALL Java_android_view_View_setBackgroundColor JNIEXPORT void JNICALL Java_android_view_View_native_1setVisibility (JNIEnv *, jobject, jlong, jint, jfloat); +/* + * Class: android_view_View + * Method: setOnLongClickListener + * Signature: (Landroid/view/View/OnLongClickListener;)V + */ +JNIEXPORT void JNICALL Java_android_view_View_setOnLongClickListener + (JNIEnv *, jobject, jobject); + /* * Class: android_view_View * Method: native_getGlobalVisibleRect diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index db9b5da8..4d8ec910 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -463,3 +463,43 @@ JNIEXPORT jboolean JNICALL Java_android_view_View_native_1getGlobalVisibleRect(J _SET_INT_FIELD(rect, "bottom", point_out.y - off_y); return true; } + +static void on_long_click(GtkGestureLongPress *gesture, double x, double y, struct touch_callback_data *d) +{ + JNIEnv *env; + (*d->jvm)->GetEnv(d->jvm, (void**)&env, JNI_VERSION_1_6); + + bool ret =(*env)->CallBooleanMethod(env, d->on_touch_listener, _METHOD(d->on_touch_listener_class, "onLongClick", "(Landroid/view/View;)Z"), d->this); + + if((*env)->ExceptionCheck(env)) + (*env)->ExceptionDescribe(env); + + if (ret) + gtk_gesture_set_state(GTK_GESTURE(gesture), GTK_EVENT_SEQUENCE_CLAIMED); +} + +JNIEXPORT void JNICALL Java_android_view_View_setOnLongClickListener(JNIEnv *env, jobject this, jobject on_long_click_listener) +{ + GtkWidget *widget = GTK_WIDGET(_PTR(_GET_LONG_FIELD(this, "widget"))); + if (!on_long_click_listener) + return; + + JavaVM *jvm; + (*env)->GetJavaVM(env, &jvm); + + struct touch_callback_data *callback_data = malloc(sizeof(struct touch_callback_data)); + callback_data->jvm = jvm; + callback_data->this = _REF(this); + callback_data->on_touch_listener = _REF(on_long_click_listener); + callback_data->on_touch_listener_class = _REF(_CLASS(callback_data->on_touch_listener)); + + GtkEventController *old_controller = g_object_get_data(G_OBJECT(widget), "on_long_click_listener"); + if(old_controller) + gtk_widget_remove_controller(widget, old_controller); + + GtkEventController *controller = GTK_EVENT_CONTROLLER(gtk_gesture_long_press_new()); + + g_signal_connect(controller, "pressed", G_CALLBACK(on_long_click), callback_data); + gtk_widget_add_controller(widget, controller); + g_object_set_data(G_OBJECT(widget), "on_long_click_listener", controller); +} diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 193e1d42..3eb56e78 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -1137,7 +1137,7 @@ public class View extends Object { return null; } - public void setOnLongClickListener(OnLongClickListener listener) {} + public native void setOnLongClickListener(OnLongClickListener listener); public void setLongClickable(boolean longClickable) {}