about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/gtkclass.h14
-rw-r--r--src/tools/gtkclass.c71
-rw-r--r--src/wrapped/wrappedgdk3.c38
-rw-r--r--src/wrapped/wrappedgdkx112.c70
-rw-r--r--src/wrapped/wrappedglib2.c81
-rw-r--r--src/wrapped/wrappedgmodule2_private.h16
-rw-r--r--src/wrapped/wrappedgobject2.c260
-rw-r--r--src/wrapped/wrappedgtk3.c30
-rw-r--r--src/wrapped/wrappedgtkx112.c70
9 files changed, 279 insertions, 371 deletions
diff --git a/src/include/gtkclass.h b/src/include/gtkclass.h
index d948ff87..b79837cb 100644
--- a/src/include/gtkclass.h
+++ b/src/include/gtkclass.h
@@ -2325,20 +2325,6 @@ void bridgeGTKInstance(void* cl, size_t type);
 
 void addRegisteredClass(size_t klass, char* name);
 
-typedef struct my_signal_s {
-    uint64_t sign;  // signature
-    void* data;
-    uintptr_t c_handler;
-    uintptr_t destroy;
-} my_signal_t;
-// some random sign to identify a my_signal_t
-#define SIGN 0xFB3405EB4510AA00LL
-
-my_signal_t* new_mysignal(void* f, void* data, void* destroy);
-void my_signal_delete(my_signal_t* sig);
-int my_signal_is_valid(void* sig);
-int my_signal_cb(void* a, void* b, void* c, void* d);
-
 void my_add_signal_offset(size_t klass, uint32_t offset, int n);
 
 #endif //__GTKCLASS_H__
diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c
index e40dcbb2..05a078bb 100644
--- a/src/tools/gtkclass.c
+++ b/src/tools/gtkclass.c
@@ -5577,74 +5577,3 @@ void SetGTypeParent(void* f)
     g_type_parent = f;
 }
 
-my_signal_t* new_mysignal(void* f, void* data, void* destroy)
-{
-    my_signal_t* sig = (my_signal_t*)box_calloc(1, sizeof(my_signal_t));
-    sig->sign = SIGN;
-    sig->c_handler = (uintptr_t)f;
-    sig->destroy = (uintptr_t)destroy;
-    sig->data = data;
-    int ret;
-    kh_put(signalmap, my_signalmap, (uintptr_t)sig, &ret);
-    return sig;
-}
-void my_signal_delete(my_signal_t* sig)
-{
-    khint_t k = kh_get(signalmap, my_signalmap, (uintptr_t)sig);
-    if(k!=kh_end(my_signalmap)) {
-        kh_del(signalmap, my_signalmap, k);
-    } else {
-        printf_log(LOG_NONE, "Warning, my_signal_delete called with an unrefereced signal!\n");
-    }
-    uintptr_t d = sig->destroy;
-    if(d) {
-        RunFunctionFmt(d, "p", sig->data);
-    }
-    printf_log(LOG_DEBUG, "gtk Data deleted, sig=%p, data=%p, destroy=%p\n", sig, sig->data, (void*)d);
-    box_free(sig);
-}
-int my_signal_is_valid(void* sig)
-{
-    khint_t k = kh_get(signalmap, my_signalmap, (uintptr_t)sig);
-    if(k!=kh_end(my_signalmap)) {
-        /*if(((my_signal_t*)c)->sign == SIGN)
-            return 1;
-        else
-            printf_log(LOG_NONE, "Warning, incohrent my_signal_t structure referenced\n");*/
-        return 1;
-    }
-    return 0;
-}
-
-int my_signal_cb(void* a, void* b, void* c, void* d)
-{
-    // signal can have many signature... so first job is to find the data!
-    // hopefully, no callback have more than 4 arguments...
-    my_signal_t* sig = NULL;
-    int i = 0;
-    if(my_signal_is_valid(a)) {
-        sig = (my_signal_t*)a;
-        i = 1;
-    }
-    if(!sig && my_signal_is_valid(b)) {
-        sig = (my_signal_t*)b;
-        i = 2;
-    }
-    if(!sig && my_signal_is_valid(c)) {
-        sig = (my_signal_t*)c;
-        i = 3;
-    }
-    if(!sig && my_signal_is_valid(d)) {
-        sig = (my_signal_t*)d;
-        i = 4;
-    }
-    printf_log(LOG_DEBUG, "gtk Signal called, sig=%p, NArgs=%d\n", sig, i);
-    switch(i) {
-        case 1: return (int)RunFunctionFmt(sig->c_handler, "p", sig->data);
-        case 2: return (int)RunFunctionFmt(sig->c_handler, "pp", a, sig->data);
-        case 3: return (int)RunFunctionFmt(sig->c_handler, "ppp", a, b, sig->data);
-        case 4: return (int)RunFunctionFmt(sig->c_handler, "pppp", a, b, c, sig->data);
-    }
-    printf_log(LOG_NONE, "Warning, Gtk signal callback but no data found!");
-    return 0;
-}
diff --git a/src/wrapped/wrappedgdk3.c b/src/wrapped/wrappedgdk3.c
index c58d4064..d8c6e7c7 100644
--- a/src/wrapped/wrappedgdk3.c
+++ b/src/wrapped/wrappedgdk3.c
@@ -123,30 +123,38 @@ static void* findGCallbackFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gdk3 generic GCallback\n");
     return NULL;
 }
+// EventHandler
+#define GO(A)   \
+static uintptr_t my_EventHandler_fct_##A = 0;                                       \
+static void* my_EventHandler_##A(void* a, void* b, void* c, void* d, void* e)       \
+{                                                                                   \
+    return (void*)RunFunctionFmt(my_EventHandler_fct_##A, "ppppp", a, b, c, d, e);  \
+}
+SUPER()
+#undef GO
+static void* findEventHandlerFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_EventHandler_fct_##A == (uintptr_t)fct) return my_EventHandler_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_EventHandler_fct_##A == 0) {my_EventHandler_fct_##A = (uintptr_t)fct; return my_EventHandler_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gdk3 generic EventHandler\n");
+    return NULL;
+}
 
 #undef SUPER
 
 
-static void my3_event_handler(void* event, my_signal_t* sig)
-{
-    RunFunctionFmt(sig->c_handler, "pp", event, sig->data)        ;
-}
-
 EXPORT void my3_gdk_event_handler_set(x64emu_t* emu, void* func, void* data, void* notify)
 {
-    if(!func)
-        return my->gdk_event_handler_set(func, data, notify);
-
-    my_signal_t* sig = new_mysignal(func, data, notify);
-    my->gdk_event_handler_set(my3_event_handler, sig, my_signal_delete);
+    return my->gdk_event_handler_set(findEventHandlerFct(func), data, findGDestroyNotifyFct(notify));
 }
 
 
-static void my3_input_function(my_signal_t* sig, int source, int condition)
-{
-    RunFunctionFmt(sig->c_handler, "pii", sig->data, source, condition)       ;
-}
-
 EXPORT void my3_gdk_init(x64emu_t* emu, void* argc, void* argv)
 {
     my->gdk_init(argc, argv);
diff --git a/src/wrapped/wrappedgdkx112.c b/src/wrapped/wrappedgdkx112.c
index 1cb65c63..82b10cfe 100644
--- a/src/wrapped/wrappedgdkx112.c
+++ b/src/wrapped/wrappedgdkx112.c
@@ -103,45 +103,67 @@ static void* findGDestroyNotifyFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gdk2 GDestroyNotify callback\n");
     return NULL;
 }
-
-#undef SUPER
-
-static void my_event_handler(void* event, my_signal_t* sig)
+// EventHandler
+#define GO(A)   \
+static uintptr_t my_EventHandler_fct_##A = 0;               \
+static void my_EventHandler_##A(void* a, void* b)           \
+{                                                           \
+    RunFunctionFmt(my_EventHandler_fct_##A, "pp", a, b);    \
+}
+SUPER()
+#undef GO
+static void* findEventHandlerFct(void* fct)
 {
-    RunFunctionFmt(sig->c_handler, "pp", event, sig->data);
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_EventHandler_fct_##A == (uintptr_t)fct) return my_EventHandler_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_EventHandler_fct_##A == 0) {my_EventHandler_fct_##A = (uintptr_t)fct; return my_EventHandler_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gdk2 EventHandler callback\n");
+    return NULL;
 }
-
-EXPORT void my_gdk_event_handler_set(x64emu_t* emu, void* func, void* data, void* notify)
+// InputEvent
+#define GO(A)   \
+static uintptr_t my_InputEvent_fct_##A = 0;                 \
+static void my_InputEvent_##A(void* a, int b, int c)        \
+{                                                           \
+    RunFunctionFmt(my_InputEvent_fct_##A, "pii", a, b, c);  \
+}
+SUPER()
+#undef GO
+static void* findInputEventFct(void* fct)
 {
-    if(!func)
-        return my->gdk_event_handler_set(func, data, notify);
-
-    my_signal_t* sig = new_mysignal(func, data, notify);
-    my->gdk_event_handler_set(my_event_handler, sig, my_signal_delete);
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_InputEvent_fct_##A == (uintptr_t)fct) return my_InputEvent_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_InputEvent_fct_##A == 0) {my_InputEvent_fct_##A = (uintptr_t)fct; return my_InputEvent_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gdk2 InputEvent callback\n");
+    return NULL;
 }
 
+#undef SUPER
 
-static void my_input_function(my_signal_t* sig, int source, int condition)
+EXPORT void my_gdk_event_handler_set(x64emu_t* emu, void* func, void* data, void* notify)
 {
-    RunFunctionFmt(sig->c_handler, "pii", sig->data, source, condition);
+    return my->gdk_event_handler_set(findEventHandlerFct(func), data, findGDestroyNotifyFct(notify));
 }
 
+
 EXPORT int my_gdk_input_add(x64emu_t* emu, int source, int condition, void* f, void* data)
 {
-    if(!f)
-        return my->gdk_input_add_full(source, condition, f, data, NULL);
-
-    my_signal_t* sig = new_mysignal(f, data, NULL);
-    return my->gdk_input_add_full(source, condition, my_input_function, sig, my_signal_delete);
+    return my->gdk_input_add(source, condition, findInputEventFct(f), data);
 }
 
 EXPORT int my_gdk_input_add_full(x64emu_t* emu, int source, int condition, void* f, void* data, void* notify)
 {
-    if(!f)
-        return my->gdk_input_add_full(source, condition, f, data, notify);
-
-    my_signal_t* sig = new_mysignal(f, data, notify);
-    return my->gdk_input_add_full(source, condition, my_input_function, sig, my_signal_delete);
+    return my->gdk_input_add_full(source, condition, findInputEventFct(f), data, findGDestroyNotifyFct(notify));
 }
 
 EXPORT void my_gdk_init(x64emu_t* emu, void* argc, void* argv)
diff --git a/src/wrapped/wrappedglib2.c b/src/wrapped/wrappedglib2.c
index 0c8bd95b..fbe64e4d 100644
--- a/src/wrapped/wrappedglib2.c
+++ b/src/wrapped/wrappedglib2.c
@@ -48,34 +48,6 @@ typedef void (*vFppippDpDC_t)(void*, void*, int32_t, void*, void*, double, void*
 
 #include "wrappercallback.h"
 
-EXPORT void* my_g_markup_vprintf_escaped(x64emu_t *emu, void* fmt, void* b) {
-    // need to align on arm
-    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1);
-    PREPARE_VALIST;
-    return my->g_markup_vprintf_escaped(fmt, VARARGS);
-}
-
-EXPORT void* my_g_build_filename(x64emu_t* emu, void* first, uintptr_t* b)
-{
-    int n = 0;
-    while (getVArgs(emu, 1, b, n++));
-    void* array[n+1];   // +1 for 1st (NULL terminal already included)
-    array[0] = first;
-    for(int i=0; i<n; ++i)
-        array[i+1] = (void*)getVArgs(emu, 1, b, i);
-    void* ret = my->g_build_filenamev(array);
-    return ret;
-}
-
-static int my_timeout_cb(my_signal_t* sig)
-{
-    return (int)RunFunctionFmt(sig->c_handler, "p", sig->data);
-}
-EXPORT uint32_t my_g_timeout_add(x64emu_t* emu, uint32_t interval, void* func, void* data)
-{
-    my_signal_t *sig = new_mysignal(func, data, NULL);
-    return my->g_timeout_add_full(0, interval, my_timeout_cb, sig, my_signal_delete);
-}
 typedef int (*GSourceFunc) (void* user_data);
 
 typedef struct my_GSourceFuncs_s {
@@ -739,9 +711,55 @@ static void* findGThreadFuncFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for glib2 GThreadFunc callback\n");
     return NULL;
 }
+// TimeOut
+#define GO(A)   \
+static uintptr_t my_TimeOut_fct_##A = 0;            \
+static void my_TimeOut_##A(void* a)                 \
+{                                                   \
+    RunFunctionFmt(my_TimeOut_fct_##A, "p", a);     \
+}
+SUPER()
+#undef GO
+static void* findTimeOutFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_TimeOut_fct_##A == (uintptr_t)fct) return my_TimeOut_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_TimeOut_fct_##A == 0) {my_TimeOut_fct_##A = (uintptr_t)fct; return my_TimeOut_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for glib2 TimeOut callback\n");
+    return NULL;
+}
 
 #undef SUPER
 
+EXPORT void* my_g_markup_vprintf_escaped(x64emu_t *emu, void* fmt, void* b) {
+    // need to align on arm
+    myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1);
+    PREPARE_VALIST;
+    return my->g_markup_vprintf_escaped(fmt, VARARGS);
+}
+
+EXPORT void* my_g_build_filename(x64emu_t* emu, void* first, uintptr_t* b)
+{
+    int n = 0;
+    while (getVArgs(emu, 1, b, n++));
+    void* array[n+1];   // +1 for 1st (NULL terminal already included)
+    array[0] = first;
+    for(int i=0; i<n; ++i)
+        array[i+1] = (void*)getVArgs(emu, 1, b, i);
+    void* ret = my->g_build_filenamev(array);
+    return ret;
+}
+
+EXPORT uint32_t my_g_timeout_add(x64emu_t* emu, uint32_t interval, void* func, void* data)
+{
+    return my->g_timeout_add(interval, findTimeOutFct(func), data);
+}
+
 EXPORT void my_g_list_free_full(x64emu_t* emu, void* list, void* free_func)
 {
     my->g_list_free_full(list, findFreeFct(free_func));
@@ -902,12 +920,7 @@ EXPORT void my_g_main_context_set_poll_func(x64emu_t* emu, void* context, void*
 
 EXPORT uint32_t my_g_idle_add_full(x64emu_t* emu, int priority, void* f, void* data, void* notify)
 {
-    if(!f)
-        return my->g_idle_add_full(priority, f, data, notify);
-
-    my_signal_t *sig = new_mysignal(f, data, notify);
-    printf_log(LOG_DEBUG, "glib2 Idle CB with priority %d created for %p, sig=%p\n", priority, f, sig);
-    return my->g_idle_add_full(priority, my_timeout_cb, sig, my_signal_delete);
+    return my->g_idle_add_full(priority, findTimeOutFct(f), data, findGDestroyNotifyFct(notify));
 }
 
 EXPORT void* my_g_hash_table_new(x64emu_t* emu, void* hash, void* equal)
diff --git a/src/wrapped/wrappedgmodule2_private.h b/src/wrapped/wrappedgmodule2_private.h
index 9aed4516..bc608126 100644
--- a/src/wrapped/wrappedgmodule2_private.h
+++ b/src/wrapped/wrappedgmodule2_private.h
@@ -3,12 +3,12 @@
 #endif
 
 //GO(_fini, 
-GO(g_module_build_path, pFpp)
-GO(g_module_close, iFp)
-GO(g_module_error, pFv)
-GO(g_module_make_resident, vFp)
-GO(g_module_name, pFp)
-GO(g_module_open, pFpu)
-GO(g_module_supported, iFv)
-GO(g_module_symbol, iFppp)
+//GO(g_module_build_path, pFpp)
+//GO(g_module_close, iFp)
+//GO(g_module_error, pFv)
+//GO(g_module_make_resident, vFp)
+//GO(g_module_name, pFp)
+//GO(g_module_open, pFpu)
+//GO(g_module_supported, iFv)
+//GO(g_module_symbol, iFppp)
 //GO(_init, 
diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c
index ab6a5d7f..13e81a93 100644
--- a/src/wrapped/wrappedgobject2.c
+++ b/src/wrapped/wrappedgobject2.c
@@ -46,94 +46,6 @@ static void addGObject2Alternate(library_t* lib);
 
 #include "wrappercallback.h"
 
-static int signal_cb(void* a, void* b, void* c, void* d, void* e)
-{
-    // signal can have many signature... so first job is to find the data!
-    // hopefully, no callback have more than 4 arguments...
-    my_signal_t* sig = NULL;
-    int i = 0;
-    if(my_signal_is_valid(a)) {
-        sig = (my_signal_t*)a;
-        i = 1;
-    }
-    if(!sig && my_signal_is_valid(b)) {
-        sig = (my_signal_t*)b;
-        i = 2;
-    }
-    if(!sig && my_signal_is_valid(c))  {
-        sig = (my_signal_t*)c;
-        i = 3;
-    }
-    if(!sig && my_signal_is_valid(d)) {
-        sig = (my_signal_t*)d;
-        i = 4;
-    }
-    if(!sig && my_signal_is_valid(e)) {
-        sig = (my_signal_t*)e;
-        i = 5;
-        printf_log(LOG_DEBUG, "Warning, GObject2 signal callback with 5 args found, sig=%p!\n", sig);
-    }
-    printf_log(LOG_DEBUG, "gobject2 Signal called, sig=%p, handler=%p, NArgs=%d\n", sig, sig?(void*)sig->c_handler:NULL, i);
-    switch(i) {
-        case 1: return (int)RunFunctionFmt(sig->c_handler, "p", sig->data);
-        case 2: return (int)RunFunctionFmt(sig->c_handler, "pp", a, sig->data);
-        case 3: return (int)RunFunctionFmt(sig->c_handler, "ppp", a, b, sig->data);
-        case 4: return (int)RunFunctionFmt(sig->c_handler, "pppp", a, b, c, sig->data);
-        case 5: return (int)RunFunctionFmt(sig->c_handler, "ppppp", a, b, c, d, sig->data);
-    }
-    printf_log(LOG_NONE, "Warning, GObject2 signal callback but no data found!\n");
-    return 0;
-}
-static int signal_cb_swapped(my_signal_t* sig, void* b, void* c, void* d)
-{
-    // data is in front here...
-    printf_log(LOG_DEBUG, "gobject2 swaped4 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "pppp", sig->data, b, c, d);
-}
-static int signal_cb_5(void* a, void* b, void* c, void* d, my_signal_t* sig)
-{
-    printf_log(LOG_DEBUG, "gobject2 5 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "ppppp", a, b, c, d, sig->data);
-}
-static int signal_cb_swapped_5(my_signal_t* sig, void* b, void* c, void* d, void* e)
-{
-    // data is in front here...
-    printf_log(LOG_DEBUG, "gobject2 swaped5 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "ppppp", sig->data, b, c, d, e);
-}
-static int signal_cb_6(void* a, void* b, void* c, void* d, void* e, my_signal_t* sig)
-{
-    printf_log(LOG_DEBUG, "gobject2 6 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "pppppp", a, b, c, d, e, sig->data);
-}
-static int signal_cb_swapped_6(my_signal_t* sig, void* b, void* c, void* d, void* e, void* f)
-{
-    // data is in front here...
-    printf_log(LOG_DEBUG, "gobject2 swaped6 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "pppppp", sig->data, b, c, d, e, f);
-}
-static int signal_cb_8(void* a, void* b, void* c, void* d, void* e, void* f, void* g, my_signal_t* sig)
-{
-    printf_log(LOG_DEBUG, "gobject2 8 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "pppppppp", a, b, c, d, e, f, g, sig->data);
-}
-static int signal_cb_swapped_8(my_signal_t* sig, void* b, void* c, void* d, void* e, void* f, void* g, void* h)
-{
-    // data is in front here...
-    printf_log(LOG_DEBUG, "gobject2 swaped8 Signal called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "pppppppp", sig->data, b, c, d, e, f, g, h);
-}
-
-static void signal_delete(my_signal_t* sig, void* b)
-{
-    uintptr_t d = sig->destroy;
-    if(d) {
-        RunFunctionFmt(d, "pp", sig->data, b);
-    }
-    printf_log(LOG_DEBUG, "gobject2 Signal deleted, sig=%p, destroy=%p\n", sig, (void*)d);
-    free(sig);
-}
-
 static void addGObject2Alternate(library_t* lib)
 {
     #define GO(A, W) AddAutomaticBridge(lib->w.bridge, W, dlsym(lib->w.lib, #A), 0, #A)
@@ -182,85 +94,8 @@ static void addGObject2Alternate(library_t* lib)
     GO(g_cclosure_marshal_BOOLEAN__FLAGSv,          vFpppppip);
     GO(g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv,    vFpppppip);
     #undef GO
-    #define GO(A, W) AddAutomaticBridge(lib->w.bridge, W, A, 0, #A)
-    GO(signal_cb, iFpppp);
-    GO(signal_cb_swapped, iFpppp);
-    GO(signal_cb_5, iFppppp);
-    GO(signal_cb_swapped_5, iFppppp);
-    GO(signal_cb_6, iFpppppp);
-    GO(signal_cb_swapped_6, iFpppppp);
-    GO(signal_cb_8, iFpppppppp);
-    GO(signal_cb_swapped_8, iFpppppppp);
-    GO(signal_delete, vFpp);
-    #undef GO
-}
-
-EXPORT uintptr_t my_g_signal_connect_data(x64emu_t* emu, void* instance, void* detailed, void* c_handler, void* data, void* closure, uint32_t flags)
-{
-    //TODO: get the type of instance to be more precise below
-
-    my_signal_t *sig = new_mysignal(c_handler, data, closure);
-    uintptr_t ret = 0;
-    #define GO(A, B) if(strcmp((const char*)detailed, A)==0) ret = my->g_signal_connect_data(instance, detailed, (flags&2)?((void*)signal_cb_swapped_##B):((void*)signal_cb_##B), sig, signal_delete, flags);
-    GO("query-tooltip", 6)  // GtkWidget
-    else GO("query_tooltip", 6)
-    else GO("selection-get", 5) //GtkWidget
-    else GO("selection_get", 5)
-    else GO("drag-data-get", 5) //GtkWidget
-    else GO("drag-data-received", 8)    //GtkWidget
-    else GO("drag_data_received", 8)
-    else GO("drag-drop", 6) //GtkWidget
-    else GO("drag_drop", 6)
-    else GO("drag-motion", 6)   //GtkWidget
-    else GO("drag_motion", 6)
-    else GO("expand-collapse-cursor-row", 5)    //GtkTreeView
-    else GO("expand_collapse_cursor_row", 5)
-    else GO("insert-text", 5)   // GtkEditable
-    else GO("insert_text", 5)
-    else GO("move-cursor", 5)   // GtkEntry
-    else GO("move_cursor", 5)
-    else GO("autoplug-select", 5)
-    else GO("autoplug-sort", 5)
-    else
-        ret = my->g_signal_connect_data(instance, detailed, (flags&2)?((void*)signal_cb_swapped):((void*)signal_cb), sig, signal_delete, flags);
-    #undef GO
-    printf_log(LOG_DEBUG, "Connecting gobject2 %p signal \"%s\" with sig=%p to %p, flags=%d\n", instance, (char*)detailed, sig, c_handler, flags);
-    return ret;
-}
-
-
-EXPORT void* my_g_object_connect(x64emu_t* emu, void* object, void* signal_spec, void** b)
-{
-        //gobject2_my_t *my = (gobject2_my_t*)my_lib->w.p2;
-
-    char* spec = (char*)signal_spec;
-    while(spec) {
-        // loop on each triplet...
-        if(strstr(spec, "signal::")==spec) {
-            my_g_signal_connect_data(emu, object, spec+strlen("signal::"), b[0], b[1], NULL, 0);
-            b+=2;
-            spec = (char*)*(b++);
-        } else if(strstr(spec, "swapped_signal::")==spec || strstr(spec, "swapped-signal::")==spec) {
-            my_g_signal_connect_data(emu, object, spec+strlen("swapped_signal::"), b[0], b[1], NULL, 2);
-            b+=2;
-            spec = (char*)*(b++);
-        } else if(strstr(spec, "signal_after::")==spec || strstr(spec, "signal-after::")==spec) {
-            my_g_signal_connect_data(emu, object, spec+strlen("signal_after::"), b[0], b[1], NULL, 1);
-            b+=2;
-            spec = (char*)*(b++);
-        } else if(strstr(spec, "swapped_signal_after::")==spec || strstr(spec, "swapped-signal-after::")==spec) {
-            my_g_signal_connect_data(emu, object, spec+strlen("swapped_signal_after::"), b[0], b[1], NULL, 1|2);
-            b+=2;
-            spec = (char*)*(b++);
-        } else {
-            printf_log(LOG_NONE, "Warning, don't know how to handle signal spec \"%s\" in g_object_connect\n", spec);
-            spec = NULL;
-        }
-    }
-    return object;
 }
 
-
 #define SUPER() \
 GO(0)   \
 GO(1)   \
@@ -623,9 +458,89 @@ static void* findGCallbackFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gobject generic GCallback\n");
     return NULL;
 }
-
+// EmissionHook
+#define GO(A)   \
+static uintptr_t my_EmissionHook_fct_##A = 0;                           \
+static void my_EmissionHook_##A(void* a, uint32_t b, void* c, void* d)  \
+{                                                                       \
+    RunFunctionFmt(my_EmissionHook_fct_##A, "pupp", a, b, c, d);        \
+}
+SUPER()
+#undef GO
+static void* findEmissionHookFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_EmissionHook_fct_##A == (uintptr_t)fct) return my_EmissionHook_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_EmissionHook_fct_##A == 0) {my_EmissionHook_fct_##A = (uintptr_t)fct; return my_EmissionHook_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gobject2 generic EmissionHook callback\n");
+    return NULL;
+}
+// Event
+#define GO(A)   \
+static uintptr_t my_Event_fct_##A = 0;                                                                              \
+static void my_Event_##A(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j)  \
+{                                                                                                                   \
+    RunFunctionFmt(my_Event_fct_##A, "pppppppppp", a, b, c, d, e, f, g, h, i, j);                                   \
+}
+SUPER()
+#undef GO
+static void* findEventFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_Event_fct_##A == (uintptr_t)fct) return my_Event_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_Event_fct_##A == 0) {my_Event_fct_##A = (uintptr_t)fct; return my_Event_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gobject2 generic Event callback\n");
+    return NULL;
+}
 #undef SUPER
 
+EXPORT uintptr_t my_g_signal_connect_data(x64emu_t* emu, void* instance, void* detailed, void* c_handler, void* data, void* closure, uint32_t flags)
+{
+    return my->g_signal_connect_data(instance, detailed, findEventFct(c_handler), data, findGClosureNotify_Fct(closure), flags);
+}
+
+
+EXPORT void* my_g_object_connect(x64emu_t* emu, void* object, void* signal_spec, void** b)
+{
+        //gobject2_my_t *my = (gobject2_my_t*)my_lib->w.p2;
+
+    char* spec = (char*)signal_spec;
+    while(spec) {
+        // loop on each triplet...
+        if(strstr(spec, "signal::")==spec) {
+            my_g_signal_connect_data(emu, object, spec+strlen("signal::"), b[0], b[1], NULL, 0);
+            b+=2;
+            spec = (char*)*(b++);
+        } else if(strstr(spec, "swapped_signal::")==spec || strstr(spec, "swapped-signal::")==spec) {
+            my_g_signal_connect_data(emu, object, spec+strlen("swapped_signal::"), b[0], b[1], NULL, 2);
+            b+=2;
+            spec = (char*)*(b++);
+        } else if(strstr(spec, "signal_after::")==spec || strstr(spec, "signal-after::")==spec) {
+            my_g_signal_connect_data(emu, object, spec+strlen("signal_after::"), b[0], b[1], NULL, 1);
+            b+=2;
+            spec = (char*)*(b++);
+        } else if(strstr(spec, "swapped_signal_after::")==spec || strstr(spec, "swapped-signal-after::")==spec) {
+            my_g_signal_connect_data(emu, object, spec+strlen("swapped_signal_after::"), b[0], b[1], NULL, 1|2);
+            b+=2;
+            spec = (char*)*(b++);
+        } else {
+            printf_log(LOG_NONE, "Warning, don't know how to handle signal spec \"%s\" in g_object_connect\n", spec);
+            spec = NULL;
+        }
+    }
+    return object;
+}
+
 EXPORT uintptr_t my_g_signal_connect_object(x64emu_t* emu, void* instance, void* detailed, void* c_handler, void* object, uint32_t flags)
 {
     //TODO: get the type of instance to be more precise below
@@ -751,20 +666,9 @@ EXPORT void my_g_value_register_transform_func(x64emu_t* emu, size_t src, size_t
     my->g_value_register_transform_func(src, dst, findValueTransformFct(f));
 }
 
-static int my_signal_emission_hook(void* ihint, uint32_t n, void* values, my_signal_t* sig)
-{
-    printf_log(LOG_DEBUG, "gobject2 Signal Emission Hook called, sig=%p\n", sig);
-    return (int)RunFunctionFmt(sig->c_handler, "pupp", ihint, n, values, sig->data);
-}
 EXPORT unsigned long my_g_signal_add_emission_hook(x64emu_t* emu, uint32_t signal, uint32_t detail, void* f, void* data, void* notify)
 {
-    // there can be many signals connected, so something "light" is needed here
-
-    if(!f)
-        return my->g_signal_add_emission_hook(signal, detail, f, data, notify);
-    my_signal_t* sig = new_mysignal(f, data, notify);
-    printf_log(LOG_DEBUG, "gobject2 Signal Emission Hook for signal %d created for %p, sig=%p\n", signal, f, sig);
-    return my->g_signal_add_emission_hook(signal, detail, my_signal_emission_hook, sig, my_signal_delete);
+    return my->g_signal_add_emission_hook(signal, detail, findEmissionHookFct(f), data, findDestroyFct(notify));
 }
 
 EXPORT size_t my_g_type_register_static_simple(x64emu_t* emu, size_t parent, void* name, uint32_t class_size, void* class_init, uint32_t instance_size, void* instance_init, uint32_t flags)
diff --git a/src/wrapped/wrappedgtk3.c b/src/wrapped/wrappedgtk3.c
index 99f74990..1a3ce3d5 100644
--- a/src/wrapped/wrappedgtk3.c
+++ b/src/wrapped/wrappedgtk3.c
@@ -511,6 +511,28 @@ static void* findGtkListBoxUpdateHeaderFunc(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gtk-3 GtkListBoxUpdateHeaderFunc callback\n");
     return NULL;
 }
+// TranslateEvent
+#define GO(A)   \
+static uintptr_t my_TranslateEvent_fct_##A = 0;             \
+static void my_TranslateEvent_##A(void* a, void* b)         \
+{                                                           \
+    RunFunctionFmt(my_TranslateEvent_fct_##A, "pp", a, b);  \
+}
+SUPER()
+#undef GO
+static void* findTranslateEvent(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_TranslateEvent_fct_##A == (uintptr_t)fct) return my_TranslateEvent_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_TranslateEvent_fct_##A == 0) {my_TranslateEvent_fct_##A = (uintptr_t)fct; return my_TranslateEvent_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gtk-3 TranslateEvent callback\n");
+    return NULL;
+}
 
 #undef SUPER
 
@@ -597,15 +619,9 @@ EXPORT int my3_gtk_clipboard_set_with_owner(x64emu_t* emu, void* clipboard, void
     return my->gtk_clipboard_set_with_owner(clipboard, target, n, findClipboadGetFct(f_get), findClipboadClearFct(f_clear), data);
 }
 
-static void* my_translate_func(void* path, my_signal_t* sig)
-{
-    return (void*)RunFunctionFmt(sig->c_handler, "pp", path, sig->data)       ;
-}
-
 EXPORT void my3_gtk_stock_set_translate_func(x64emu_t* emu, void* domain, void* f, void* data, void* notify)
 {
-    my_signal_t *sig = new_mysignal(f, data, notify);
-    my->gtk_stock_set_translate_func(domain, my_translate_func, sig, my_signal_delete);
+    my->gtk_stock_set_translate_func(domain, findTranslateEvent(f), data, findGDestroyNotifyFct(notify));
 }
 
 EXPORT void my3_gtk_container_forall(x64emu_t* emu, void* container, void* f, void* data)
diff --git a/src/wrapped/wrappedgtkx112.c b/src/wrapped/wrappedgtkx112.c
index 98cde252..0d13ce1a 100644
--- a/src/wrapped/wrappedgtkx112.c
+++ b/src/wrapped/wrappedgtkx112.c
@@ -93,19 +93,6 @@ typedef unsigned long (*LFpppppi_t)(void*, void*, void*, void*, void*, int);
 
 #include "wrappercallback.h"
 
-static box64context_t* context = NULL;
-
-EXPORT uintptr_t my_gtk_signal_connect_full(x64emu_t* emu, void* object, void* name, void* c_handler, void* unsupported, void* data, void* closure, uint32_t signal, int after)
-{
-    if(!context)
-        context = emu->context;
-
-    my_signal_t *sig = new_mysignal(c_handler, data, closure);
-    uintptr_t ret = my->gtk_signal_connect_full(object, name, my_signal_cb, NULL, sig, my_signal_delete, signal, after);
-    printf_log(LOG_DEBUG, "Connecting gtk signal \"%s\" with cb=%p\n", (char*)name, sig);
-    return ret;
-}
-
 // this is quite ineficient, but GCallback is often used, so create a large pool here...
 #define SUPER() \
 GO(0)   \
@@ -731,9 +718,58 @@ static void* find_GtkKeySnoopFunc_Fct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gtk-2 GtkKeySnoopFunc callback\n");
     return NULL;
 }
+// Event
+#define GO(A)   \
+static uintptr_t my_Event_fct_##A = 0;                                                                              \
+static void my_Event_##A(void* a, void* b, void* c, void* d, void* e, void* f, void* g, void* h, void* i, void* j)  \
+{                                                                                                                   \
+    RunFunctionFmt(my_Event_fct_##A, "pppppppppp", a, b, c, d, e, f, g, h, i, j);                                   \
+}
+SUPER()
+#undef GO
+static void* findEventFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_Event_fct_##A == (uintptr_t)fct) return my_Event_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_Event_fct_##A == 0) {my_Event_fct_##A = (uintptr_t)fct; return my_Event_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gtk2 generic Event callback\n");
+    return NULL;
+}
+// TranslateEvent
+#define GO(A)   \
+static uintptr_t my_TranslateEvent_fct_##A = 0;             \
+static void my_TranslateEvent_##A(void* a, void* b)         \
+{                                                           \
+    RunFunctionFmt(my_TranslateEvent_fct_##A, "pp", a, b);  \
+}
+SUPER()
+#undef GO
+static void* findTranslateEvent(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_TranslateEvent_fct_##A == (uintptr_t)fct) return my_TranslateEvent_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_TranslateEvent_fct_##A == 0) {my_TranslateEvent_fct_##A = (uintptr_t)fct; return my_TranslateEvent_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gtk-2 TranslateEvent callback\n");
+    return NULL;
+}
 
 #undef SUPER
 
+EXPORT uintptr_t my_gtk_signal_connect_full(x64emu_t* emu, void* object, void* name, void* c_handler, void* unsupported, void* data, void* closure, uint32_t signal, int after)
+{
+    return my->gtk_signal_connect_full(object, name, findEventFct(c_handler), unsupported, data, findGDestroyNotifyFct(closure), signal, after);
+}
+
 EXPORT void my_gtk_dialog_add_buttons(x64emu_t* emu, void* dialog, void* first, uintptr_t* b)
 {
     void* btn = first;
@@ -855,15 +891,9 @@ EXPORT int my_gtk_clipboard_set_with_owner(x64emu_t* emu, void* clipboard, void*
     return my->gtk_clipboard_set_with_owner(clipboard, target, n, findClipboadGetFct(f_get), findClipboadClearFct(f_clear), data);
 }
 
-static void* my_translate_func(void* path, my_signal_t* sig)
-{
-    return (void*)RunFunctionFmt(sig->c_handler, "pp", path, sig->data)       ;
-}
-
 EXPORT void my_gtk_stock_set_translate_func(x64emu_t* emu, void* domain, void* f, void* data, void* notify)
 {
-    my_signal_t *sig = new_mysignal(f, data, notify);
-    my->gtk_stock_set_translate_func(domain, my_translate_func, sig, my_signal_delete);
+    my->gtk_stock_set_translate_func(domain, findTranslateEvent(f), data, findGDestroyNotifyFct(notify));
 }
 
 EXPORT void my_gtk_container_forall(x64emu_t* emu, void* container, void* f, void* data)