From c5e0f8a7fdcb0e86d61ff4b36aa5724021fca417 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Sun, 26 May 2024 15:53:24 +0200 Subject: [PATCH] View.draw(): draw background, content, children in same order as AOSP --- .../generated_headers/android_view_View.h | 24 ++++++++++++------- .../android_view_ViewGroup.h | 8 +++++++ src/api-impl-jni/views/android_view_View.c | 13 ++++++++-- .../views/android_view_ViewGroup.c | 7 ++++++ src/api-impl-jni/widgets/WrapperWidget.c | 17 +++++-------- src/api-impl-jni/widgets/WrapperWidget.h | 1 - src/api-impl/android/view/View.java | 11 +++++++-- src/api-impl/android/view/ViewGroup.java | 4 ++++ 8 files changed, 61 insertions(+), 24 deletions(-) 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 7b58275a..55c14e95 100644 --- a/src/api-impl-jni/generated_headers/android_view_View.h +++ b/src/api-impl-jni/generated_headers/android_view_View.h @@ -199,14 +199,6 @@ extern "C" { #define android_view_View_TEXT_DIRECTION_LTR 3L #undef android_view_View_TEXT_DIRECTION_RTL #define android_view_View_TEXT_DIRECTION_RTL 4L -/* - * Class: android_view_View - * Method: native_onDraw - * Signature: (JJ)V - */ -JNIEXPORT void JNICALL Java_android_view_View_native_1onDraw - (JNIEnv *, jobject, jlong, jlong); - /* * Class: android_view_View * Method: setOnTouchListener @@ -303,6 +295,22 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1setBackgroundDrawable JNIEXPORT void JNICALL Java_android_view_View_native_1queueAllocate (JNIEnv *, jobject, jlong); +/* + * Class: android_view_View + * Method: native_drawBackground + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_android_view_View_native_1drawBackground + (JNIEnv *, jobject, jlong, jlong); + +/* + * Class: android_view_View + * Method: native_drawContent + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_android_view_View_native_1drawContent + (JNIEnv *, jobject, jlong, jlong); + /* * Class: android_view_View * Method: nativeInvalidate diff --git a/src/api-impl-jni/generated_headers/android_view_ViewGroup.h b/src/api-impl-jni/generated_headers/android_view_ViewGroup.h index 28f2479f..7b6adfd1 100644 --- a/src/api-impl-jni/generated_headers/android_view_ViewGroup.h +++ b/src/api-impl-jni/generated_headers/android_view_ViewGroup.h @@ -215,6 +215,14 @@ JNIEXPORT void JNICALL Java_android_view_ViewGroup_native_1addView JNIEXPORT void JNICALL Java_android_view_ViewGroup_native_1removeView (JNIEnv *, jobject, jlong, jlong); +/* + * Class: android_view_ViewGroup + * Method: native_drawChildren + * Signature: (JJ)V + */ +JNIEXPORT void JNICALL Java_android_view_ViewGroup_native_1drawChildren + (JNIEnv *, jobject, jlong, jlong); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/views/android_view_View.c b/src/api-impl-jni/views/android_view_View.c index 12163e06..7e1efdca 100644 --- a/src/api-impl-jni/views/android_view_View.c +++ b/src/api-impl-jni/views/android_view_View.c @@ -584,8 +584,17 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1queueAllocate(JNIEnv *env, gtk_widget_queue_allocate(GTK_WIDGET(_PTR(widget_ptr))); } -JNIEXPORT void JNICALL Java_android_view_View_native_1onDraw(JNIEnv *env, jobject this, jlong widget_ptr, jlong snapshot_ptr) +JNIEXPORT void JNICALL Java_android_view_View_native_1drawBackground(JNIEnv *env, jobject this, jlong widget_ptr, jlong snapshot_ptr) { WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(_PTR(widget_ptr)))); - wrapper_widget_draw_children(wrapper, GDK_SNAPSHOT(_PTR(snapshot_ptr))); + GdkSnapshot *snapshot = GDK_SNAPSHOT(_PTR(snapshot_ptr)); + if (wrapper->background) + gtk_widget_snapshot_child(&wrapper->parent_instance, wrapper->background, snapshot); +} + +JNIEXPORT void JNICALL Java_android_view_View_native_1drawContent(JNIEnv *env, jobject this, jlong widget_ptr, jlong snapshot_ptr) +{ + WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(_PTR(widget_ptr)))); + GdkSnapshot *snapshot = GDK_SNAPSHOT(_PTR(snapshot_ptr)); + gtk_widget_snapshot_child(&wrapper->parent_instance, wrapper->child, snapshot); } diff --git a/src/api-impl-jni/views/android_view_ViewGroup.c b/src/api-impl-jni/views/android_view_ViewGroup.c index cd3e12c6..95301161 100644 --- a/src/api-impl-jni/views/android_view_ViewGroup.c +++ b/src/api-impl-jni/views/android_view_ViewGroup.c @@ -47,3 +47,10 @@ JNIEXPORT void JNICALL Java_android_view_ViewGroup_native_1removeView(JNIEnv *en { gtk_widget_unparent(gtk_widget_get_parent(GTK_WIDGET(_PTR(child)))); } + +JNIEXPORT void JNICALL Java_android_view_ViewGroup_native_1drawChildren(JNIEnv *env, jobject this, jlong widget_ptr, jlong snapshot_ptr) +{ + WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(_PTR(widget_ptr)))); + GdkSnapshot *snapshot = GDK_SNAPSHOT(_PTR(snapshot_ptr)); + gtk_widget_snapshot_child(&wrapper->parent_instance, wrapper->child, snapshot); +} diff --git a/src/api-impl-jni/widgets/WrapperWidget.c b/src/api-impl-jni/widgets/WrapperWidget.c index 85eb8ad1..8ff0570e 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.c +++ b/src/api-impl-jni/widgets/WrapperWidget.c @@ -94,16 +94,6 @@ void wrapper_widget_allocate(GtkWidget *widget, int width, int height, int basel gtk_widget_size_allocate(wrapper->background, &allocation, baseline); } -void wrapper_widget_draw_children(WrapperWidget *wrapper, GdkSnapshot *snapshot) -{ - GtkWidget *widget = &wrapper->parent_instance; - GtkWidget *child = gtk_widget_get_first_child(widget); - while (child) { - gtk_widget_snapshot_child(widget, child, snapshot); - child = gtk_widget_get_next_sibling(child); - } -} - static void wrapper_widget_snapshot(GtkWidget *widget, GdkSnapshot *snapshot) { WrapperWidget *wrapper = WRAPPER_WIDGET(widget); @@ -117,7 +107,12 @@ static void wrapper_widget_snapshot(GtkWidget *widget, GdkSnapshot *snapshot) if ((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); } else { - wrapper_widget_draw_children(wrapper, snapshot); + GtkWidget *widget = &wrapper->parent_instance; + GtkWidget *child = gtk_widget_get_first_child(widget); + while (child) { + gtk_widget_snapshot_child(widget, child, snapshot); + child = gtk_widget_get_next_sibling(child); + } } if (wrapper->real_height > 0 && wrapper->real_width > 0) { gtk_snapshot_pop(snapshot); diff --git a/src/api-impl-jni/widgets/WrapperWidget.h b/src/api-impl-jni/widgets/WrapperWidget.h index 49fa06ea..2a9d72d1 100644 --- a/src/api-impl-jni/widgets/WrapperWidget.h +++ b/src/api-impl-jni/widgets/WrapperWidget.h @@ -35,7 +35,6 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job void wrapper_widget_queue_draw(WrapperWidget *wrapper); void wrapper_widget_set_layout_params(WrapperWidget *wrapper, int width, int height); void wrapper_widget_set_background(WrapperWidget *wrapper, GdkPaintable *paintable); -void wrapper_widget_draw_children(WrapperWidget *wrapper, GdkSnapshot *snapshot); void _setOnTouchListener(JNIEnv *env, jobject this, GtkWidget *widget, jobject on_touch_listener); diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index a085b68f..cde75332 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -900,13 +900,16 @@ public class View implements Drawable.Callback { return null; } - protected native void native_onDraw(long widget, long snapshot); public void onDraw(Canvas canvas) { if (canvas instanceof GskCanvas) - native_onDraw(widget, ((GskCanvas)canvas).snapshot); + native_drawContent(widget, ((GskCanvas)canvas).snapshot); } public void draw(Canvas canvas) { + if (canvas instanceof GskCanvas) + native_drawBackground(widget, ((GskCanvas)canvas).snapshot); onDraw(canvas); + if (canvas instanceof GskCanvas) + native_drawChildren(widget, ((GskCanvas)canvas).snapshot); } public View(Context context) { @@ -982,6 +985,10 @@ public class View implements Drawable.Callback { protected native void native_setBackgroundDrawable(long widget, long paintable); protected native void native_queueAllocate(long widget); + protected native void native_drawBackground(long widget, long snapshot); + protected native void native_drawContent(long widget, long snapshot); + protected void native_drawChildren(long widget, long snapshot) {} // override in ViewGroup + // --- stubs public void setContentDescription(CharSequence contentDescription) {} diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index f4c04685..4a8636d1 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -133,6 +133,10 @@ public class ViewGroup extends View implements ViewParent, ViewManager { protected native void native_addView(long widget, long child, int index, LayoutParams params); protected native void native_removeView(long widget, long child); + @Override + protected native void native_drawChildren(long widget, long snapshot); + @Override + protected void native_drawContent(long widget, long snapshot) {} public View getChildAt(int index) { try {