2023-08-22 13:55:56 +02:00
|
|
|
#include <gtk/gtk.h>
|
|
|
|
|
|
|
|
|
|
#include "../defines.h"
|
|
|
|
|
#include "../util.h"
|
|
|
|
|
|
|
|
|
|
#include "WrapperWidget.h"
|
|
|
|
|
|
|
|
|
|
#include "../generated_headers/android_widget_EditText.h"
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jlong JNICALL Java_android_widget_EditText_native_1constructor(JNIEnv *env, jobject this, jobject context, jobject attrs)
|
|
|
|
|
{
|
|
|
|
|
GtkWidget *wrapper = g_object_ref(wrapper_widget_new());
|
|
|
|
|
GtkWidget *entry = gtk_entry_new();
|
|
|
|
|
wrapper_widget_set_child(WRAPPER_WIDGET(wrapper), entry);
|
|
|
|
|
return _INTPTR(entry);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT jstring JNICALL Java_android_widget_EditText_native_1getText(JNIEnv *env, jobject this, jlong widget_ptr)
|
|
|
|
|
{
|
|
|
|
|
GtkEntry *entry = GTK_ENTRY(_PTR(widget_ptr));
|
|
|
|
|
const char *text = gtk_entry_buffer_get_text(gtk_entry_get_buffer(entry));
|
|
|
|
|
return _JSTRING(text);
|
|
|
|
|
}
|
2023-09-01 13:03:40 +02:00
|
|
|
|
|
|
|
|
struct changed_callback_data {
|
|
|
|
|
jobject this;
|
|
|
|
|
jobject listener;
|
|
|
|
|
jmethodID listener_method;
|
|
|
|
|
jmethodID getText;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void changed_cb(GtkEditable* self, struct changed_callback_data *d) {
|
|
|
|
|
JNIEnv *env = get_jni_env();
|
|
|
|
|
|
|
|
|
|
jobject text = (*env)->CallObjectMethod(env, d->this, d->getText);
|
|
|
|
|
(*env)->CallVoidMethod(env, d->listener, d->listener_method, text);
|
|
|
|
|
if((*env)->ExceptionCheck(env))
|
|
|
|
|
(*env)->ExceptionDescribe(env);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_android_widget_EditText_native_1addTextChangedListener(JNIEnv *env, jobject this, jlong widget_ptr, jobject listener) {
|
|
|
|
|
GtkEntry *entry = GTK_ENTRY(_PTR(widget_ptr));
|
|
|
|
|
|
|
|
|
|
struct changed_callback_data *callback_data = malloc(sizeof(struct changed_callback_data));
|
|
|
|
|
callback_data->this = _REF(this);
|
|
|
|
|
callback_data->listener = _REF(listener);
|
|
|
|
|
callback_data->listener_method = _METHOD(_CLASS(listener), "afterTextChanged", "(Landroid/text/Editable;)V");
|
|
|
|
|
callback_data->getText = _METHOD(_CLASS(this), "getText", "()Landroid/text/Editable;");
|
|
|
|
|
|
|
|
|
|
g_signal_connect(GTK_EDITABLE(entry), "changed", G_CALLBACK(changed_cb), callback_data);
|
|
|
|
|
}
|
2023-11-08 18:00:31 +01:00
|
|
|
|
|
|
|
|
#define IME_ACTION_SEARCH 3
|
|
|
|
|
#define KEYCODE_ENTER 66
|
|
|
|
|
|
|
|
|
|
static void on_activate(GtkEntry *entry, struct changed_callback_data *d)
|
|
|
|
|
{
|
|
|
|
|
JNIEnv *env = get_jni_env();
|
|
|
|
|
|
|
|
|
|
jobject key_event = (*env)->NewObject(env, handle_cache.key_event.class, handle_cache.key_event.constructor, IME_ACTION_SEARCH, KEYCODE_ENTER);
|
|
|
|
|
(*env)->CallBooleanMethod(env, d->listener, d->listener_method, d->this, 0, key_event);
|
|
|
|
|
if((*env)->ExceptionCheck(env))
|
|
|
|
|
(*env)->ExceptionDescribe(env);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_android_widget_EditText_native_1setOnEditorActionListener(JNIEnv *env, jobject this, jlong widget_ptr, jobject listener)
|
|
|
|
|
{
|
|
|
|
|
GtkEntry *entry = GTK_ENTRY(_PTR(widget_ptr));
|
|
|
|
|
|
|
|
|
|
if (!listener)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
struct changed_callback_data *callback_data = malloc(sizeof(struct changed_callback_data));
|
|
|
|
|
callback_data->this = _REF(this);
|
|
|
|
|
callback_data->listener = _REF(listener);
|
|
|
|
|
callback_data->listener_method = _METHOD(_CLASS(listener), "onEditorAction", "(Landroid/widget/TextView;ILandroid/view/KeyEvent;)Z");
|
|
|
|
|
|
|
|
|
|
g_signal_connect(entry, "activate", G_CALLBACK(on_activate), callback_data);
|
|
|
|
|
}
|