about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedlibxtst.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-25 13:26:02 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-25 13:26:02 +0100
commit348bd64449843f70e08dd591c867973d83ea87eb (patch)
tree831a18b17437f0d3d29f4097a5b3487aea3b8b01 /src/wrapped/wrappedlibxtst.c
parentb36eca9792b55ccf038407470e480edc80daf543 (diff)
downloadbox64-348bd64449843f70e08dd591c867973d83ea87eb.tar.gz
box64-348bd64449843f70e08dd591c867973d83ea87eb.zip
Added a bunch of X11 related wrapped libs
Diffstat (limited to 'src/wrapped/wrappedlibxtst.c')
-rwxr-xr-xsrc/wrapped/wrappedlibxtst.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/wrapped/wrappedlibxtst.c b/src/wrapped/wrappedlibxtst.c
new file mode 100755
index 00000000..4fae5d30
--- /dev/null
+++ b/src/wrapped/wrappedlibxtst.c
@@ -0,0 +1,107 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "callback.h"
+#include "librarian.h"
+#include "box64context.h"
+#include "emu/x64emu_private.h"
+
+const char* libxtstName = "libXtst.so.6";
+#define LIBNAME libxtst
+
+typedef int (*iFpppp_t)(void*, void*, void*, void*);
+
+#define SUPER() \
+    GO(XRecordEnableContextAsync, iFpppp_t) \
+    GO(XRecordEnableContext, iFpppp_t)      \
+
+typedef struct libxtst_my_s {
+    #define GO(A, B)    B   A;
+    SUPER()
+    #undef GO
+    // functions
+} libxtst_my_t;
+
+void* getXtstMy(library_t* lib)
+{
+    libxtst_my_t* my = (libxtst_my_t*)calloc(1, sizeof(libxtst_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    SUPER()
+    #undef GO
+    return my;
+}
+#undef SUPER
+
+void freeXtstMy(void* lib)
+{
+    //libxtst_my_t *my = (libxtst_my_t *)lib;
+}
+
+#define SUPER() \
+GO(0)   \
+GO(1)   \
+GO(2)   \
+GO(3)   \
+GO(4)
+
+// XRecordInterceptProc ...
+#define GO(A)   \
+static uintptr_t my_XRecordInterceptProc_fct_##A = 0;                   \
+static void my_XRecordInterceptProc_##A(void* a, void* b)               \
+{                                                                       \
+    RunFunction(my_context, my_XRecordInterceptProc_fct_##A, 2, a, b);  \
+}
+SUPER()
+#undef GO
+static void* find_XRecordInterceptProc_Fct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_XRecordInterceptProc_fct_##A == (uintptr_t)fct) return my_XRecordInterceptProc_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_XRecordInterceptProc_fct_##A == 0) {my_XRecordInterceptProc_fct_##A = (uintptr_t)fct; return my_XRecordInterceptProc_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for libxtst XRecordInterceptProc callback\n");
+    return NULL;
+}
+
+EXPORT int my_XRecordEnableContextAsync(x64emu_t* emu, void* display, void* context, void* cb, void* closure)
+{
+    library_t* lib = GetLibInternal(libxtstName);
+    libxtst_my_t* my = (libxtst_my_t*)lib->priv.w.p2;
+    return my->XRecordEnableContextAsync(display, context, find_XRecordInterceptProc_Fct(cb), closure);
+}
+
+EXPORT int my_XRecordEnableContext(x64emu_t* emu, void* display, void* context, void* cb, void* closure)
+{
+    library_t* lib = GetLibInternal(libxtstName);
+    libxtst_my_t* my = (libxtst_my_t*)lib->priv.w.p2;
+    return my->XRecordEnableContext(display, context, find_XRecordInterceptProc_Fct(cb), closure);
+}
+
+#define CUSTOM_INIT \
+    lib->priv.w.p2 = getXtstMy(lib);   \
+    lib->priv.w.needed = 2; \
+    lib->priv.w.neededlibs = (char**)calloc(lib->priv.w.needed, sizeof(char*)); \
+    lib->priv.w.neededlibs[0] = strdup("libX11.so.6"); \
+    lib->priv.w.neededlibs[1] = strdup("libXext.so.6");
+
+#define CUSTOM_FINI \
+    freeXtstMy(lib->priv.w.p2); \
+    free(lib->priv.w.p2);
+
+#include "wrappedlib_init.h"
+