diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/gtkclass.h | 14 | ||||
| -rw-r--r-- | src/tools/gtkclass.c | 71 | ||||
| -rw-r--r-- | src/wrapped/wrappedgdk3.c | 38 | ||||
| -rw-r--r-- | src/wrapped/wrappedgdkx112.c | 70 | ||||
| -rw-r--r-- | src/wrapped/wrappedglib2.c | 81 | ||||
| -rw-r--r-- | src/wrapped/wrappedgmodule2_private.h | 16 | ||||
| -rw-r--r-- | src/wrapped/wrappedgobject2.c | 260 | ||||
| -rw-r--r-- | src/wrapped/wrappedgtk3.c | 30 | ||||
| -rw-r--r-- | src/wrapped/wrappedgtkx112.c | 70 |
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) |