You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
Button/ImageButton: consume touch events
Androids button consumes touch events, while GTKs button lets touch events propagate to the parent. This previously caused some glitches with buttons inside a CoordinatorLayout.
This commit is contained in:
@@ -224,3 +224,27 @@ void wrapper_widget_set_background(WrapperWidget *wrapper, GdkPaintable *paintab
|
|||||||
}
|
}
|
||||||
gtk_picture_set_paintable(GTK_PICTURE(wrapper->background), paintable);
|
gtk_picture_set_paintable(GTK_PICTURE(wrapper->background), paintable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean on_touch_event_consume(GtkEventControllerLegacy *controller, GdkEvent *event) {
|
||||||
|
switch(gdk_event_get_event_type(event)) {
|
||||||
|
case GDK_BUTTON_PRESS:
|
||||||
|
case GDK_TOUCH_BEGIN:
|
||||||
|
case GDK_BUTTON_RELEASE:
|
||||||
|
case GDK_TOUCH_END:
|
||||||
|
case GDK_MOTION_NOTIFY:
|
||||||
|
case GDK_TOUCH_UPDATE:
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add default on touch listener, which just consumes all events to prevent bubbling to the parent
|
||||||
|
void wrapper_widget_consume_touch_events(WrapperWidget *wrapper)
|
||||||
|
{
|
||||||
|
GtkEventController *controller = GTK_EVENT_CONTROLLER(gtk_event_controller_legacy_new());
|
||||||
|
g_signal_connect(controller, "event", G_CALLBACK(on_touch_event_consume), NULL);
|
||||||
|
gtk_widget_add_controller(GTK_WIDGET(wrapper), controller);
|
||||||
|
g_object_set_data(G_OBJECT(wrapper), "on_touch_listener", controller);
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job
|
|||||||
void wrapper_widget_queue_draw(WrapperWidget *wrapper);
|
void wrapper_widget_queue_draw(WrapperWidget *wrapper);
|
||||||
void wrapper_widget_set_layout_params(WrapperWidget *wrapper, int width, int height);
|
void wrapper_widget_set_layout_params(WrapperWidget *wrapper, int width, int height);
|
||||||
void wrapper_widget_set_background(WrapperWidget *wrapper, GdkPaintable *paintable);
|
void wrapper_widget_set_background(WrapperWidget *wrapper, GdkPaintable *paintable);
|
||||||
|
void wrapper_widget_consume_touch_events(WrapperWidget *wrapper);
|
||||||
|
|
||||||
void _setOnTouchListener(JNIEnv *env, jobject this, GtkWidget *widget, jobject on_touch_listener);
|
void _setOnTouchListener(JNIEnv *env, jobject this, GtkWidget *widget, jobject on_touch_listener);
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ JNIEXPORT jlong JNICALL Java_android_widget_Button_native_1constructor(JNIEnv *e
|
|||||||
GtkWidget *wrapper = g_object_ref(wrapper_widget_new());
|
GtkWidget *wrapper = g_object_ref(wrapper_widget_new());
|
||||||
GtkWidget *label = gtk_button_new_with_label(text);
|
GtkWidget *label = gtk_button_new_with_label(text);
|
||||||
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), label);
|
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), label);
|
||||||
|
wrapper_widget_consume_touch_events(WRAPPER_WIDGET(wrapper)); // Android button consumes touch events
|
||||||
return _INTPTR(label);
|
return _INTPTR(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ JNIEXPORT jlong JNICALL Java_android_widget_ImageButton_native_1constructor(JNIE
|
|||||||
GtkWidget *image = gtk_picture_new_for_resource("/org/gtk/libgtk/icons/16x16/status/image-missing.png"); // show "broken image" icon
|
GtkWidget *image = gtk_picture_new_for_resource("/org/gtk/libgtk/icons/16x16/status/image-missing.png"); // show "broken image" icon
|
||||||
gtk_button_set_child(GTK_BUTTON(button), image);
|
gtk_button_set_child(GTK_BUTTON(button), image);
|
||||||
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), button);
|
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), button);
|
||||||
|
wrapper_widget_consume_touch_events(WRAPPER_WIDGET(wrapper)); // Android button consumes touch events
|
||||||
wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this);
|
wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this);
|
||||||
|
|
||||||
return _INTPTR(button);
|
return _INTPTR(button);
|
||||||
|
|||||||
Reference in New Issue
Block a user