#include #include "../defines.h" #include "../util.h" #include "WrapperWidget.h" #include "../generated_headers/android_widget_ImageButton.h" JNIEXPORT jlong JNICALL Java_android_widget_ImageButton_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs) { GtkWidget *wrapper = g_object_ref(wrapper_widget_new()); GtkWidget *button = gtk_button_new(); GtkWidget *image = gtk_picture_new_for_resource("/org/gtk/libgtk/icons/16x16/status/image-missing.png"); // show "broken image" icon gtk_button_set_child(GTK_BUTTON(button), image); wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), button); wrapper_widget_set_jobject(WRAPPER_WIDGET(wrapper), env, this); return _INTPTR(button); } JNIEXPORT void JNICALL Java_android_widget_ImageButton_native_1setPixbuf(JNIEnv *env, jobject this, jlong pixbuf_ptr) { GtkButton *button = _PTR(_GET_LONG_FIELD(this, "widget")); GtkWidget *image = gtk_button_get_child(GTK_BUTTON(button)); GdkPixbuf *pixbuf = _PTR(pixbuf_ptr); gtk_picture_set_pixbuf(GTK_PICTURE(image), pixbuf); } struct touch_callback_data { JavaVM *jvm; jobject this; jobject listener; jmethodID listener_method; }; static void clicked_cb(GtkWidget *button, struct touch_callback_data *d) { printf("clicked_cb\n"); JNIEnv *env; (*d->jvm)->GetEnv(d->jvm, (void**)&env, JNI_VERSION_1_6); (*env)->CallBooleanMethod(env, d->listener, d->listener_method, d->this); if((*env)->ExceptionCheck(env)) (*env)->ExceptionDescribe(env); } JNIEXPORT void JNICALL Java_android_widget_ImageButton_native_1setOnClickListener(JNIEnv *env, jobject this, jlong widget_ptr, jobject on_click_listener) { GtkWidget *button = GTK_WIDGET(_PTR(widget_ptr)); if (!on_click_listener) return; JavaVM *jvm; (*env)->GetJavaVM(env, &jvm); struct touch_callback_data *callback_data = malloc(sizeof(struct touch_callback_data)); callback_data->jvm = jvm; callback_data->this = _REF(this); callback_data->listener = _REF(on_click_listener); callback_data->listener_method = _METHOD(_CLASS(on_click_listener), "onClick", "(Landroid/view/View;)V"); g_signal_connect(button, "clicked", G_CALLBACK(clicked_cb), callback_data); }