WrapperWidget: handle View.computeScroll()

Currently the scrolling is purely visual.
This commit is contained in:
Julian Winkler
2023-10-30 22:37:48 +01:00
committed by Mis012
parent 0a8b8a3874
commit 4bce3544dd
3 changed files with 29 additions and 4 deletions

View File

@@ -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;
}
}

View File

@@ -16,6 +16,7 @@ struct _WrapperWidget
jobject canvas;
jmethodID draw_method;
jmethodID measure_method;
jmethodID computeScroll_method;
};
struct _WrapperWidgetClass

View File

@@ -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) {}
}