diff options
Diffstat (limited to 'src/wrapped/wrappedlibxt.c')
| -rwxr-xr-x | src/wrapped/wrappedlibxt.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/src/wrapped/wrappedlibxt.c b/src/wrapped/wrappedlibxt.c index f35265e9..d432e50a 100755 --- a/src/wrapped/wrappedlibxt.c +++ b/src/wrapped/wrappedlibxt.c @@ -29,8 +29,10 @@ typedef struct libxt_my_s { #undef GO } libxt_my_t; +static library_t* my_lib = NULL; void* getXtMy(library_t* lib) { + my_lib = lib; libxt_my_t* my = (libxt_my_t*)calloc(1, sizeof(libxt_my_t)); #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A); SUPER() @@ -41,6 +43,7 @@ void* getXtMy(library_t* lib) void freeXtMy(void* lib) { + my_lib = NULL; (void)lib; //libxt_my_t *my = (libxt_my_t *)lib; } @@ -55,6 +58,7 @@ GO(5) \ GO(6) \ GO(7) +// Event #define GO(A) \ static uintptr_t my_Event_fct_##A = 0; \ static void my_Event_##A(void* w, void* data, void* event) \ @@ -66,6 +70,7 @@ SUPER() static void* findEventFct(void* fct) { if(!fct) return NULL; + 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 @@ -75,6 +80,50 @@ static void* findEventFct(void* fct) printf_log(LOG_NONE, "Warning, no more slot for libXt Event callback\n"); return NULL; } +// WorkProc +#define GO(A) \ +static uintptr_t my_WorkProc_fct_##A = 0; \ +static int my_WorkProc_##A(void* p) \ +{ \ + return (int)RunFunction(my_context, my_WorkProc_fct_##A, 1, p);\ +} +SUPER() +#undef GO +static void* findWorkProcFct(void* fct) +{ + if(!fct) return NULL; + if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct); + #define GO(A) if(my_WorkProc_fct_##A == (uintptr_t)fct) return my_WorkProc_##A; + SUPER() + #undef GO + #define GO(A) if(my_WorkProc_fct_##A == 0) {my_WorkProc_fct_##A = (uintptr_t)fct; return my_WorkProc_##A; } + SUPER() + #undef GO + printf_log(LOG_NONE, "Warning, no more slot for libXt WorkProc callback\n"); + return NULL; +} +// InputCallback +#define GO(A) \ +static uintptr_t my_InputCallback_fct_##A = 0; \ +static void my_InputCallback_##A(void* p, void* s, void* id) \ +{ \ + RunFunction(my_context, my_InputCallback_fct_##A, 3, p, s, id); \ +} +SUPER() +#undef GO +static void* findInputCallbackFct(void* fct) +{ + if(!fct) return NULL; + if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct); + #define GO(A) if(my_InputCallback_fct_##A == (uintptr_t)fct) return my_InputCallback_##A; + SUPER() + #undef GO + #define GO(A) if(my_InputCallback_fct_##A == 0) {my_InputCallback_fct_##A = (uintptr_t)fct; return my_InputCallback_##A; } + SUPER() + #undef GO + printf_log(LOG_NONE, "Warning, no more slot for libXt InputCallback callback\n"); + return NULL; +} #undef SUPER @@ -82,12 +131,27 @@ EXPORT void my_XtAddEventHandler(x64emu_t* emu, void* w, uint32_t mask, int32_t { (void)emu; void* fct = findEventFct(cb); - library_t* lib = GetLibInternal(libxtName); - libxt_my_t* my = (libxt_my_t*)lib->priv.w.p2; + libxt_my_t* my = (libxt_my_t*)my_lib->priv.w.p2; my->XtAddEventHandler(w, mask, maskable, fct, data); } +EXPORT long my_XtAppAddWorkProc(x64emu_t* emu, void* context, void* proc, void* data) +{ + (void)emu; + libxt_my_t* my = (libxt_my_t*)my_lib->priv.w.p2; + + return my->XtAppAddWorkProc(context, findWorkProcFct(proc), data); +} + +EXPORT long my_XtAppAddInput(x64emu_t* emu, void* context, int source, void* cond, void* proc, void* data) +{ + (void)emu; + libxt_my_t* my = (libxt_my_t*)my_lib->priv.w.p2; + + return my->XtAppAddInput(context, source, cond, findInputCallbackFct(proc), data); +} + #define CUSTOM_INIT \ lib->priv.w.p2 = getXtMy(lib); \ lib->priv.w.needed = 2; \ |