From 2c64b6b345afe188d8045f809dc38400c5777c74 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sun, 5 Oct 2025 15:48:53 +0200 Subject: [PATCH] atl_propagate_synthetic_motionevent: prevent infinite self propagation --- src/api-impl-jni/views/android_view_ViewGroup.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/api-impl-jni/views/android_view_ViewGroup.c b/src/api-impl-jni/views/android_view_ViewGroup.c index 957c8357..dcbdd3fa 100644 --- a/src/api-impl-jni/views/android_view_ViewGroup.c +++ b/src/api-impl-jni/views/android_view_ViewGroup.c @@ -68,13 +68,17 @@ JNIEXPORT void JNICALL Java_android_view_ViewGroup_native_1drawChild(JNIEnv *env G_DECLARE_FINAL_TYPE(JavaWidget, java_widget, JAVA, WIDGET, GtkWidget) bool view_dispatch_motionevent(JNIEnv *env, WrapperWidget *wrapper, GtkPropagationPhase phase, jobject motion_event, gpointer event, int action); -static bool dispatch_motionevent_if_JavaWidget(GtkWidget *widget, GtkPropagationPhase phase, jobject motion_event) +static bool dispatch_motionevent_if_JavaWidget(GtkWidget *widget, GtkPropagationPhase phase, jobject motion_event, GtkWidget *toplevel) { if(!JAVA_IS_WIDGET(widget)) return false; JNIEnv *env = get_jni_env(); WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(widget)); + if (widget == toplevel && wrapper->custom_dispatch_touch) { + // don't self propagate if the widget already had its chance to handle the event + return false; + } int action = _GET_INT_FIELD(motion_event, "action"); return view_dispatch_motionevent(env, wrapper, phase, motion_event, motion_event, action); } @@ -116,7 +120,7 @@ bool atl_propagate_synthetic_motionevent(GtkWidget *widget, jobject motionevent, if (!gtk_widget_is_sensitive(widget)) { handled_event = true; } else if (gtk_widget_get_realized(widget)) - handled_event = dispatch_motionevent_if_JavaWidget(widget, GTK_PHASE_CAPTURE, motionevent); + handled_event = dispatch_motionevent_if_JavaWidget(widget, GTK_PHASE_CAPTURE, motionevent, toplevel); handled_event |= !gtk_widget_get_realized(widget); @@ -146,7 +150,7 @@ bool atl_propagate_synthetic_motionevent(GtkWidget *widget, jobject motionevent, if (!gtk_widget_is_sensitive(widget)) handled_event = true; else if (gtk_widget_get_realized(widget)) - handled_event = dispatch_motionevent_if_JavaWidget(widget, GTK_PHASE_BUBBLE, motionevent); + handled_event = dispatch_motionevent_if_JavaWidget(widget, GTK_PHASE_BUBBLE, motionevent, toplevel); handled_event |= !gtk_widget_get_realized(widget);