about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedlibxt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wrapped/wrappedlibxt.c')
-rwxr-xr-xsrc/wrapped/wrappedlibxt.c68
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; \