From 4bce3544dd2f3746f4131d04f0d12bc6d4bfbd05 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Mon, 30 Oct 2023 22:37:48 +0100 Subject: [PATCH] WrapperWidget: handle View.computeScroll() Currently the scrolling is purely visual. --- src/api-impl-jni/widgets/WrapperWidget.c | 28 ++++++++++++++++++++---- src/api-impl-jni/widgets/WrapperWidget.h | 1 + src/api-impl/android/view/View.java | 4 ++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/api-impl-jni/widgets/WrapperWidget.c b/src/api-impl-jni/widgets/WrapperWidget.c index 2634ab95..4553ae5f 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.c +++ b/src/api-impl-jni/widgets/WrapperWidget.c @@ -48,10 +48,25 @@ void skia_draw_func(SKArea *sk_area, sk_canvas_t *canvas, void *user_data) (*env)->ExceptionDescribe(env); } -/*void wrapper_snapshot(GtkWidget* widget, GtkSnapshot* snapshot) +void wrapper_snapshot(GtkWidget* widget, GtkSnapshot* snapshot) { - gtk_widget_snapshot_child(widget, gtk_widget_get_first_child(widget), snapshot); -}*/ + WrapperWidget *wrapper = WRAPPER_WIDGET(widget); + if (wrapper->computeScroll_method) { + JNIEnv *env; + (*wrapper->jvm)->GetEnv(wrapper->jvm, (void**)&env, JNI_VERSION_1_6); + (*env)->CallVoidMethod(env, wrapper->jobj, wrapper->computeScroll_method); + if((*env)->ExceptionCheck(env)) + (*env)->ExceptionDescribe(env); + graphene_point_t translation = { + .x = -(*env)->CallIntMethod(env, wrapper->jobj, handle_cache.view.getScrollX), + .y = -(*env)->CallIntMethod(env, wrapper->jobj, handle_cache.view.getScrollY), + }; + gtk_snapshot_translate(snapshot, &translation); + } + gtk_widget_snapshot_child(widget, wrapper->child, snapshot); + if (wrapper->sk_area) + gtk_widget_snapshot_child(widget, wrapper->sk_area, snapshot); +} static void wrapper_widget_class_init(WrapperWidgetClass *class) @@ -61,7 +76,7 @@ static void wrapper_widget_class_init(WrapperWidgetClass *class) object_class->dispose = wrapper_widget_dispose; -// widget_class->snapshot = wrapper_snapshot; + widget_class->snapshot = wrapper_snapshot; gtk_widget_class_set_layout_manager_type(widget_class, GTK_TYPE_BIN_LAYOUT); } @@ -119,4 +134,9 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job /* use wrapper->child since the jobject may not have the "widget" variable set yet */ _setOnTouchListener(env, jobj, wrapper->child, NULL); } + + jmethodID computeScroll_method = _METHOD(_CLASS(jobj), "computeScroll", "()V"); + if (computeScroll_method != handle_cache.view.computeScroll) { + wrapper->computeScroll_method = computeScroll_method; + } } diff --git a/src/api-impl-jni/widgets/WrapperWidget.h b/src/api-impl-jni/widgets/WrapperWidget.h index fdc60275..d35c39f6 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.h +++ b/src/api-impl-jni/widgets/WrapperWidget.h @@ -16,6 +16,7 @@ struct _WrapperWidget jobject canvas; jmethodID draw_method; jmethodID measure_method; + jmethodID computeScroll_method; }; struct _WrapperWidgetClass diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 27b4c7e1..d43a6917 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -1195,6 +1195,8 @@ public class View extends Object { measure(width | MeasureSpec.EXACTLY, height | MeasureSpec.EXACTLY); } boolean changed = oldWidth != width || oldHeight != height; + if (changed) + onSizeChanged(width, height, oldWidth, oldHeight); onLayout(changed, 0, 0, width, height); oldWidth = width; oldHeight = height; @@ -1526,4 +1528,6 @@ public class View extends Object { public void setLayerType(int layerType, Paint paint) {} public float getZ() {return 0.f;} + + protected void onSizeChanged(int w, int h, int oldw, int oldh) {} }