View: replace custom isAttachedToWindow tracking with GTK signals

This commit is contained in:
Julian Winkler
2025-10-10 12:00:47 +02:00
parent 2288f2bce9
commit d4aca99823
8 changed files with 37 additions and 53 deletions

View File

@@ -415,6 +415,14 @@ JNIEXPORT jboolean JNICALL Java_android_view_View_nativeIsFocused
JNIEXPORT jboolean JNICALL Java_android_view_View_native_1getMatrix
(JNIEnv *, jobject, jlong, jlong);
/*
* Class: android_view_View
* Method: nativeIsAttachedToWindow
* Signature: (J)Z
*/
JNIEXPORT jboolean JNICALL Java_android_view_View_nativeIsAttachedToWindow
(JNIEnv *, jobject, jlong);
/*
* Class: android_view_View
* Method: native_keep_screen_on

View File

@@ -85,6 +85,8 @@ void set_up_handle_cache(JNIEnv *env)
handle_cache.view.getAllSuperClasses = _METHOD(handle_cache.view.class, "getAllSuperClasses", "()Ljava/lang/String;");
handle_cache.view.dispatchKeyEvent = _METHOD(handle_cache.view.class, "dispatchKeyEvent", "(Landroid/view/KeyEvent;)Z");
handle_cache.view.onKeyDown = _METHOD(handle_cache.view.class, "onKeyDown", "(ILandroid/view/KeyEvent;)Z");
handle_cache.view.onAttachedToWindow = _METHOD(handle_cache.view.class, "onAttachedToWindow", "()V");
handle_cache.view.onDetachedFromWindow = _METHOD(handle_cache.view.class, "onDetachedFromWindow", "()V");
handle_cache.view_group.class = _REF((*env)->FindClass(env, "android/view/ViewGroup"));
handle_cache.view_group.dispatchTouchEvent = _METHOD(handle_cache.view_group.class, "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z");

View File

@@ -84,6 +84,8 @@ struct handle_cache {
jmethodID getAllSuperClasses;
jmethodID dispatchKeyEvent;
jmethodID onKeyDown;
jmethodID onAttachedToWindow;
jmethodID onDetachedFromWindow;
} view;
struct {
jclass class;

View File

@@ -505,6 +505,13 @@ static void java_widget_class_init(JavaWidgetClass *class) {
}
G_DEFINE_TYPE(JavaWidget, java_widget, GTK_TYPE_WIDGET)
static void java_method_cb(WrapperWidget *wrapper, jmethodID method) {
JNIEnv *env = get_jni_env();
(*env)->CallVoidMethod(env, wrapper->jobj, method);
if ((*env)->ExceptionCheck(env))
(*env)->ExceptionDescribe(env);
}
JNIEXPORT jlong JNICALL Java_android_view_View_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs)
{
WrapperWidget *wrapper = g_object_ref(WRAPPER_WIDGET(wrapper_widget_new()));
@@ -527,6 +534,11 @@ JNIEXPORT jlong JNICALL Java_android_view_View_native_1constructor(JNIEnv *env,
gtk_widget_add_controller(widget, controller);
}
if (_METHOD(class, "onAttachedToWindow", "()V") != handle_cache.view.onAttachedToWindow)
g_signal_connect(wrapper, "map", G_CALLBACK(java_method_cb), handle_cache.view.onAttachedToWindow);
if (_METHOD(class, "onDetachedFromWindow", "()V") != handle_cache.view.onDetachedFromWindow)
g_signal_connect(wrapper, "unmap", G_CALLBACK(java_method_cb), handle_cache.view.onDetachedFromWindow);
return _INTPTR(widget);
}
@@ -841,3 +853,9 @@ JNIEXPORT void JNICALL Java_android_view_View_native_1keep_1screen_1on(JNIEnv *e
g_object_set_data(G_OBJECT(widget), "keep-screen-on-cookie", GINT_TO_POINTER(cookie));
}
}
JNIEXPORT jboolean JNICALL Java_android_view_View_nativeIsAttachedToWindow(JNIEnv *env, jobject this, jlong widget_ptr)
{
GtkWidget *widget = GTK_WIDGET(_PTR(widget_ptr));
return gtk_widget_get_mapped(widget);
}