diff --git a/meson.build b/meson.build index 297b363f..b4a45151 100644 --- a/meson.build +++ b/meson.build @@ -94,6 +94,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [ 'src/api-impl-jni/widgets/android_widget_TextView.c', 'src/api-impl-jni/widgets/android_widget_LinearLayout.c', 'src/api-impl-jni/widgets/android_view_SurfaceView.c', + 'src/api-impl-jni/views/AndroidLayout.c', 'src/api-impl-jni/views/android_view_View.c', 'src/api-impl-jni/views/android_view_ViewGroup.c', 'src/api-impl-jni/android_graphics_Bitmap.c', diff --git a/src/api-impl-jni/views/AndroidLayout.c b/src/api-impl-jni/views/AndroidLayout.c new file mode 100644 index 00000000..5d06b172 --- /dev/null +++ b/src/api-impl-jni/views/AndroidLayout.c @@ -0,0 +1,51 @@ +#include + +#include "../util.h" +#include "AndroidLayout.h" + +static void android_layout_measure(GtkLayoutManager *layout_manager, GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) +{ + AndroidLayout *layout = ATL_ANDROID_LAYOUT(layout_manager); + JNIEnv *env = get_jni_env(); + + if (orientation == GTK_ORIENTATION_HORIZONTAL) { + *minimum = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getSuggestedMinimumWidth); + *natural = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getMeasuredWidth); + } + if (orientation == GTK_ORIENTATION_VERTICAL) { + *minimum = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getSuggestedMinimumHeight); + *natural = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getMeasuredHeight); + } + if (*natural < *minimum) + *natural = *minimum; + + *minimum_baseline = -1; + *natural_baseline = -1; +} + +static void android_layout_allocate(GtkLayoutManager *layout_manager, GtkWidget *widget, int width, int height, int baseline) +{ + AndroidLayout *layout = ATL_ANDROID_LAYOUT(layout_manager); + JNIEnv *env = get_jni_env(); + + (*env)->CallVoidMethod(env, layout->view, handle_cache.view.layoutInternal, width, height); + if((*env)->ExceptionCheck(env)) + (*env)->ExceptionDescribe(env); +} + +static void android_layout_class_init(AndroidLayoutClass *klass) +{ + klass->parent_class.measure = android_layout_measure; + klass->parent_class.allocate = android_layout_allocate; +} + +static void android_layout_init(AndroidLayout *self) {} + +G_DEFINE_TYPE(AndroidLayout, android_layout, GTK_TYPE_LAYOUT_MANAGER) + +GtkLayoutManager *android_layout_new(jobject view) +{ + AndroidLayout *layout = g_object_new(android_layout_get_type(), NULL); + layout->view = view; + return &layout->parent_instance; +} diff --git a/src/api-impl-jni/views/AndroidLayout.h b/src/api-impl-jni/views/AndroidLayout.h new file mode 100644 index 00000000..8be2dd96 --- /dev/null +++ b/src/api-impl-jni/views/AndroidLayout.h @@ -0,0 +1,16 @@ +#ifndef ANDROID_LAYOUT_H +#define ANDROID_LAYOUT_H + +#include +#include + +G_DECLARE_FINAL_TYPE(AndroidLayout, android_layout, ATL, ANDROID_LAYOUT, GtkLayoutManager); + +struct _AndroidLayout { + GtkLayoutManager parent_instance; + jobject view; +}; + +GtkLayoutManager *android_layout_new(jobject view); + +#endif // ANDROID_LAYOUT_H \ No newline at end of file diff --git a/src/api-impl-jni/views/android_view_ViewGroup.c b/src/api-impl-jni/views/android_view_ViewGroup.c index 4ec82eeb..043d7679 100644 --- a/src/api-impl-jni/views/android_view_ViewGroup.c +++ b/src/api-impl-jni/views/android_view_ViewGroup.c @@ -4,62 +4,13 @@ #include "../util.h" #include "../widgets/WrapperWidget.h" +#include "../views/AndroidLayout.h" #include "../generated_headers/android_view_ViewGroup.h" #include "../generated_headers/android_view_View.h" #define SOURCE_CLASS_POINTER 0x2 -struct _AndroidLayout { - GtkLayoutManager parent_instance; - jobject view; -}; -G_DECLARE_FINAL_TYPE(AndroidLayout, android_layout, ATL, ANDROID_LAYOUT, GtkLayoutManager); - -static void android_layout_measure(GtkLayoutManager *layout_manager, GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) { - AndroidLayout *layout = ATL_ANDROID_LAYOUT(layout_manager); - JNIEnv *env = get_jni_env(); - - if (orientation == GTK_ORIENTATION_HORIZONTAL) { - *minimum = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getSuggestedMinimumWidth); - *natural = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getMeasuredWidth); - } - if (orientation == GTK_ORIENTATION_VERTICAL) { - *minimum = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getSuggestedMinimumHeight); - *natural = (*env)->CallIntMethod(env, layout->view, handle_cache.view.getMeasuredHeight); - } - if (*natural < *minimum) - *natural = *minimum; - - *minimum_baseline = -1; - *natural_baseline = -1; -} - -static void android_layout_allocate(GtkLayoutManager *layout_manager, GtkWidget *widget, int width, int height, int baseline) { - AndroidLayout *layout = ATL_ANDROID_LAYOUT(layout_manager); - JNIEnv *env = get_jni_env(); - - (*env)->CallVoidMethod(env, layout->view, handle_cache.view.layoutInternal, width, height); - if((*env)->ExceptionCheck(env)) - (*env)->ExceptionDescribe(env); -} - -static void android_layout_class_init(AndroidLayoutClass *klass) { - klass->parent_class.measure = android_layout_measure; - klass->parent_class.allocate = android_layout_allocate; -} - -static void android_layout_init(AndroidLayout *self) { -} - -G_DEFINE_TYPE(AndroidLayout, android_layout, GTK_TYPE_LAYOUT_MANAGER) - -static GtkLayoutManager *android_layout_new(jobject view) { - AndroidLayout *layout = g_object_new(android_layout_get_type(), NULL); - layout->view = view; - return &layout->parent_instance; -} - #define MAGIC_SCROLL_FACTOR 32 static gboolean scroll_cb(GtkEventControllerScroll* self, gdouble dx, gdouble dy, jobject this)