GskCanavas: draw default content when custom View calls super.onDraw()

This commit is contained in:
Julian Winkler
2024-05-25 19:58:55 +02:00
committed by Mis012
parent 6575fef58e
commit 6f02565920
9 changed files with 54 additions and 8 deletions

View File

@@ -31,6 +31,14 @@ JNIEXPORT jlong JNICALL Java_android_graphics_drawable_Drawable_native_1construc
JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate
(JNIEnv *, jobject, jlong);
/*
* Class: android_graphics_drawable_Drawable
* Method: native_draw
* Signature: (JJII)V
*/
JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1draw
(JNIEnv *, jobject, jlong, jlong, jint, jint);
#ifdef __cplusplus
}
#endif

View File

@@ -199,6 +199,14 @@ 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

View File

@@ -89,3 +89,9 @@ JNIEXPORT jlong JNICALL Java_android_graphics_drawable_Drawable_native_1construc
JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1invalidate(JNIEnv *env, jobject this, jlong paintable_ptr) {
gdk_paintable_invalidate_contents(GDK_PAINTABLE(_PTR(paintable_ptr)));
}
JNIEXPORT void JNICALL Java_android_graphics_drawable_Drawable_native_1draw(JNIEnv *env, jobject this, jlong paintable_ptr, jlong snapshot_ptr, jint width, jint height) {
GdkSnapshot *snapshot = (GdkSnapshot *)_PTR(snapshot_ptr);
GdkPaintable *paintable = GDK_PAINTABLE(_PTR(paintable_ptr));
gdk_paintable_snapshot(paintable, snapshot, width, height);
}

View File

@@ -583,3 +583,9 @@ 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)
{
WrapperWidget *wrapper = WRAPPER_WIDGET(gtk_widget_get_parent(GTK_WIDGET(_PTR(widget_ptr))));
wrapper_widget_draw_children(wrapper, GDK_SNAPSHOT(_PTR(snapshot_ptr)));
}

View File

@@ -94,23 +94,30 @@ 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);
if (wrapper->real_height > 0 && wrapper->real_width > 0) {
gtk_snapshot_push_clip(snapshot, &GRAPHENE_RECT_INIT(0, 0, wrapper->real_width, wrapper->real_height));
}
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->draw_method) {
JNIEnv *env = get_jni_env();
_SET_LONG_FIELD(wrapper->canvas, "snapshot", _INTPTR(snapshot));
(*env)->CallVoidMethod(env, wrapper->jobj, wrapper->draw_method, wrapper->canvas);
if ((*env)->ExceptionCheck(env))
(*env)->ExceptionDescribe(env);
} else {
wrapper_widget_draw_children(wrapper, snapshot);
}
if (wrapper->real_height > 0 && wrapper->real_width > 0) {
gtk_snapshot_pop(snapshot);

View File

@@ -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_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);