about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-11 16:59:43 +0100
committerGitHub <noreply@github.com>2022-03-11 16:59:43 +0100
commitace28039283d0b256e0d6773561778c4baf6ae77 (patch)
treebbc12dc17cc409fe818ebf9014640c2703589787 /src
parent8073bb279f5370ca58e283bbee0aff9aaa92ce24 (diff)
parent7943858290281e0fc506bd530d16427c5e93b011 (diff)
downloadbox64-ace28039283d0b256e0d6773561778c4baf6ae77.tar.gz
box64-ace28039283d0b256e0d6773561778c4baf6ae77.zip
Merge pull request #253 from wannacu/main
Add some function wrapper of libx11
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/generated/functions_list.txt8
-rw-r--r--src/wrapped/generated/wrappedlibx11types.h6
-rw-r--r--src/wrapped/generated/wrapper.c4
-rw-r--r--src/wrapped/generated/wrapper.h2
-rwxr-xr-xsrc/wrapped/wrappedlibx11.c223
-rwxr-xr-xsrc/wrapped/wrappedlibx11_private.h8
6 files changed, 217 insertions, 34 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 10080772..91688a6a 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -2019,7 +2019,6 @@
 #() iFpppppppppppppppp
 #() pFpuuWWWWWWwwCCCuu
 #() pFppipipipipipipip
-#() pFpppppppppppppppp
 #() vFppiiiiddddiiiiiuu
 #() pFppippipipipipipip
 #() vFppuiiiiipuiiiiiiii
@@ -2031,7 +2030,6 @@
 #() pFiiiippppppppppppppp
 #() pFpippppppppppppppppp
 #() iFpppppppppppppppppppppp
-#() pFipppppppppppppppppppppp
 #() iFpppppppppppppppppppppppppppppppppp
 #defined(HAVE_LD80BITS) DFD
 #defined(HAVE_LD80BITS) vFppippDDC
@@ -3118,10 +3116,16 @@ wrappedlibx11:
   - XSetIOErrorHandler
 - vFpp:
   - _XDeqAsyncHandler
+- pFiV:
+  - XVaCreateNestedList
 - pFpi:
   - XSynchronize
 - pFpp:
   - XSetAfterFunction
+- pFpV:
+  - XCreateIC
+  - XSetICValues
+  - XSetIMValues
 - iFppp:
   - XAddConnectionWatch
   - XRemoveConnectionWatch
diff --git a/src/wrapped/generated/wrappedlibx11types.h b/src/wrapped/generated/wrappedlibx11types.h
index 957fdf17..81b59847 100644
--- a/src/wrapped/generated/wrappedlibx11types.h
+++ b/src/wrapped/generated/wrappedlibx11types.h
@@ -14,8 +14,10 @@
 typedef int64_t (*iFp_t)(void*);
 typedef void* (*pFp_t)(void*);
 typedef void (*vFpp_t)(void*, void*);
+typedef void* (*pFiV_t)(int64_t, ...);
 typedef void* (*pFpi_t)(void*, int64_t);
 typedef void* (*pFpp_t)(void*, void*);
+typedef void* (*pFpV_t)(void*, ...);
 typedef int64_t (*iFppp_t)(void*, void*, void*);
 typedef void* (*pFpip_t)(void*, int64_t, void*);
 typedef int64_t (*iFpppp_t)(void*, void*, void*, void*);
@@ -33,8 +35,12 @@ typedef void* (*pFppiiuuuipii_t)(void*, void*, int64_t, int64_t, uint64_t, uint6
 	GO(XSetErrorHandler, pFp_t) \
 	GO(XSetIOErrorHandler, pFp_t) \
 	GO(_XDeqAsyncHandler, vFpp_t) \
+	GO(XVaCreateNestedList, pFiV_t) \
 	GO(XSynchronize, pFpi_t) \
 	GO(XSetAfterFunction, pFpp_t) \
+	GO(XCreateIC, pFpV_t) \
+	GO(XSetICValues, pFpV_t) \
+	GO(XSetIMValues, pFpV_t) \
 	GO(XAddConnectionWatch, iFppp_t) \
 	GO(XRemoveConnectionWatch, iFppp_t) \
 	GO(XESetCloseDisplay, pFpip_t) \
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 432b0b82..738e1395 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -2053,7 +2053,6 @@ typedef void (*vFpppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, v
 typedef int64_t (*iFpppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
 typedef void* (*pFpuuWWWWWWwwCCCuu_t)(void*, uint64_t, uint64_t, uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, int16_t, int16_t, uint8_t, uint8_t, uint8_t, uint64_t, uint64_t);
 typedef void* (*pFppipipipipipipip_t)(void*, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*);
-typedef void* (*pFpppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
 typedef void (*vFppiiiiddddiiiiiuu_t)(void*, void*, int64_t, int64_t, int64_t, int64_t, double, double, double, double, int64_t, int64_t, int64_t, int64_t, int64_t, uint64_t, uint64_t);
 typedef void* (*pFppippipipipipipip_t)(void*, void*, int64_t, void*, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*, int64_t, void*);
 typedef void (*vFppuiiiiipuiiiiiiii_t)(void*, void*, uint64_t, int64_t, int64_t, int64_t, int64_t, int64_t, void*, uint64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t);
@@ -2065,7 +2064,6 @@ typedef void (*vFpiiiiiiiiiiiiiiiiii_t)(void*, int64_t, int64_t, int64_t, int64_
 typedef void* (*pFiiiippppppppppppppp_t)(int64_t, int64_t, int64_t, int64_t, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
 typedef void* (*pFpippppppppppppppppp_t)(void*, int64_t, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
 typedef int64_t (*iFpppppppppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
-typedef void* (*pFipppppppppppppppppppppp_t)(int64_t, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
 typedef int64_t (*iFpppppppppppppppppppppppppppppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*);
 
 #if defined(HAVE_LD80BITS)
@@ -4113,7 +4111,6 @@ void vFpppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { vFpppppppppppppppp_t fn
 void iFpppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { iFpppppppppppppppp_t fn = (iFpppppppppppppppp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); }
 void pFpuuWWWWWWwwCCCuu(x64emu_t *emu, uintptr_t fcn) { pFpuuWWWWWWwwCCCuu_t fn = (pFpuuWWWWWWwwCCCuu_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint16_t)R_RCX, (uint16_t)R_R8, (uint16_t)R_R9, *(uint16_t*)(R_RSP + 8), *(uint16_t*)(R_RSP + 16), *(uint16_t*)(R_RSP + 24), *(int16_t*)(R_RSP + 32), *(int16_t*)(R_RSP + 40), *(uint8_t*)(R_RSP + 48), *(uint8_t*)(R_RSP + 56), *(uint8_t*)(R_RSP + 64), *(uint64_t*)(R_RSP + 72), *(uint64_t*)(R_RSP + 80)); }
 void pFppipipipipipipip(x64emu_t *emu, uintptr_t fcn) { pFppipipipipipipip_t fn = (pFppipipipipipipip_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (void*)R_RCX, (int64_t)R_R8, (void*)R_R9, *(int64_t*)(R_RSP + 8), *(void**)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(void**)(R_RSP + 32), *(int64_t*)(R_RSP + 40), *(void**)(R_RSP + 48), *(int64_t*)(R_RSP + 56), *(void**)(R_RSP + 64), *(int64_t*)(R_RSP + 72), *(void**)(R_RSP + 80)); }
-void pFpppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFpppppppppppppppp_t fn = (pFpppppppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80)); }
 void vFppiiiiddddiiiiiuu(x64emu_t *emu, uintptr_t fcn) { vFppiiiiddddiiiiiuu_t fn = (vFppiiiiddddiiiiiuu_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], *(int64_t*)(R_RSP + 8), *(int64_t*)(R_RSP + 16), *(int64_t*)(R_RSP + 24), *(int64_t*)(R_RSP + 32), *(int64_t*)(R_RSP + 40), *(uint64_t*)(R_RSP + 48), *(uint64_t*)(R_RSP + 56)); }
 void pFppippipipipipipip(x64emu_t *emu, uintptr_t fcn) { pFppippipipipipipip_t fn = (pFppippipipipipipip_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (void*)R_RCX, (void*)R_R8, (int64_t)R_R9, *(void**)(R_RSP + 8), *(int64_t*)(R_RSP + 16), *(void**)(R_RSP + 24), *(int64_t*)(R_RSP + 32), *(void**)(R_RSP + 40), *(int64_t*)(R_RSP + 48), *(void**)(R_RSP + 56), *(int64_t*)(R_RSP + 64), *(void**)(R_RSP + 72), *(int64_t*)(R_RSP + 80), *(void**)(R_RSP + 88)); }
 void vFppuiiiiipuiiiiiiii(x64emu_t *emu, uintptr_t fcn) { vFppuiiiiipuiiiiiiii_t fn = (vFppuiiiiipuiiiiiiii_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (uint64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9, *(int64_t*)(R_RSP + 8), *(int64_t*)(R_RSP + 16), *(void**)(R_RSP + 24), *(uint64_t*)(R_RSP + 32), *(int64_t*)(R_RSP + 40), *(int64_t*)(R_RSP + 48), *(int64_t*)(R_RSP + 56), *(int64_t*)(R_RSP + 64), *(int64_t*)(R_RSP + 72), *(int64_t*)(R_RSP + 80), *(int64_t*)(R_RSP + 88), *(int64_t*)(R_RSP + 96)); }
@@ -4125,7 +4122,6 @@ void vFpiiiiiiiiiiiiiiiiii(x64emu_t *emu, uintptr_t fcn) { vFpiiiiiiiiiiiiiiiiii
 void pFiiiippppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFiiiippppppppppppppp_t fn = (pFiiiippppppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80), *(void**)(R_RSP + 88), *(void**)(R_RSP + 96), *(void**)(R_RSP + 104)); }
 void pFpippppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFpippppppppppppppppp_t fn = (pFpippppppppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (int64_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80), *(void**)(R_RSP + 88), *(void**)(R_RSP + 96), *(void**)(R_RSP + 104)); }
 void iFpppppppppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { iFpppppppppppppppppppppp_t fn = (iFpppppppppppppppppppppp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80), *(void**)(R_RSP + 88), *(void**)(R_RSP + 96), *(void**)(R_RSP + 104), *(void**)(R_RSP + 112), *(void**)(R_RSP + 120), *(void**)(R_RSP + 128)); }
-void pFipppppppppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { pFipppppppppppppppppppppp_t fn = (pFipppppppppppppppppppppp_t)fcn; R_RAX=(uintptr_t)fn((int64_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80), *(void**)(R_RSP + 88), *(void**)(R_RSP + 96), *(void**)(R_RSP + 104), *(void**)(R_RSP + 112), *(void**)(R_RSP + 120), *(void**)(R_RSP + 128), *(void**)(R_RSP + 136)); }
 void iFpppppppppppppppppppppppppppppppppp(x64emu_t *emu, uintptr_t fcn) { iFpppppppppppppppppppppppppppppppppp_t fn = (iFpppppppppppppppppppppppppppppppppp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40), *(void**)(R_RSP + 48), *(void**)(R_RSP + 56), *(void**)(R_RSP + 64), *(void**)(R_RSP + 72), *(void**)(R_RSP + 80), *(void**)(R_RSP + 88), *(void**)(R_RSP + 96), *(void**)(R_RSP + 104), *(void**)(R_RSP + 112), *(void**)(R_RSP + 120), *(void**)(R_RSP + 128), *(void**)(R_RSP + 136), *(void**)(R_RSP + 144), *(void**)(R_RSP + 152), *(void**)(R_RSP + 160), *(void**)(R_RSP + 168), *(void**)(R_RSP + 176), *(void**)(R_RSP + 184), *(void**)(R_RSP + 192), *(void**)(R_RSP + 200), *(void**)(R_RSP + 208), *(void**)(R_RSP + 216), *(void**)(R_RSP + 224)); }
 
 #if defined(HAVE_LD80BITS)
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 7e947327..85134c1f 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -2052,7 +2052,6 @@ void vFpppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 void iFpppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 void pFpuuWWWWWWwwCCCuu(x64emu_t *emu, uintptr_t fnc);
 void pFppipipipipipipip(x64emu_t *emu, uintptr_t fnc);
-void pFpppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 void vFppiiiiddddiiiiiuu(x64emu_t *emu, uintptr_t fnc);
 void pFppippipipipipipip(x64emu_t *emu, uintptr_t fnc);
 void vFppuiiiiipuiiiiiiii(x64emu_t *emu, uintptr_t fnc);
@@ -2064,7 +2063,6 @@ void vFpiiiiiiiiiiiiiiiiii(x64emu_t *emu, uintptr_t fnc);
 void pFiiiippppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 void pFpippppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 void iFpppppppppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
-void pFipppppppppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 void iFpppppppppppppppppppppppppppppppppp(x64emu_t *emu, uintptr_t fnc);
 
 #if defined(HAVE_LD80BITS)
diff --git a/src/wrapped/wrappedlibx11.c b/src/wrapped/wrappedlibx11.c
index 6f9a87b1..2775e88f 100755
--- a/src/wrapped/wrappedlibx11.c
+++ b/src/wrapped/wrappedlibx11.c
@@ -534,7 +534,207 @@ void my_XDestroyImage(x64emu_t* emu, void* image);
 void* my_XLoadQueryFont(x64emu_t* emu, void* d, void* name);
 #endif
 
-void* my_XVaCreateNestedList(int dummy, void* p);
+typedef void (*XIMProc)(void*, void*, void*);
+typedef int (*XICProc)(void*, void*, void*);
+typedef struct {
+    void* client_data;
+    XIMProc callback;
+} XIMCallback;
+
+typedef struct {
+    void* client_data;
+    XICProc callback;
+} XICCallback;
+
+#define XNGeometryCallback "geometryCallback"
+#define XNDestroyCallback "destroyCallback"
+#define XNPreeditStartCallback "preeditStartCallback"
+#define XNPreeditDoneCallback "preeditDoneCallback"
+#define XNPreeditDrawCallback "preeditDrawCallback"
+#define XNPreeditCaretCallback "preeditCaretCallback"
+#define XNPreeditStateNotifyCallback "preeditStateNotifyCallback"
+#define XNStatusStartCallback "statusStartCallback"
+#define XNStatusDoneCallback "statusDoneCallback"
+#define XNStatusDrawCallback "statusDrawCallback"
+#define XNR6PreeditCallback "r6PreeditCallback"
+#define XNStringConversionCallback "stringConversionCallback"
+
+#define SUPER()                     \
+GO(XNGeometryCallback)              \
+GO(XNDestroyCallback)               \
+GO(XNPreeditStartCallback)          \
+GO(XNPreeditDoneCallback)           \
+GO(XNPreeditDrawCallback)           \
+GO(XNPreeditCaretCallback)          \
+GO(XNPreeditStateNotifyCallback)    \
+GO(XNStatusStartCallback)           \
+GO(XNStatusDoneCallback)            \
+GO(XNStatusDrawCallback)            \
+GO(XNR6PreeditCallback)             \
+GO(XNStringConversionCallback)
+
+#define GO(A)                                                               \
+static uintptr_t my_XICProc_fct_##A = 0;                                    \
+static int my_XICProc_##A(void* a, void* b, void* c)                        \
+{                                                                           \
+    if (my_XICProc_fct_##A == 0)                                            \
+        printf_log(LOG_NONE, "%s cannot find XICProc callback\n", __func__);\
+    return (int)RunFunction(my_context, my_XICProc_fct_##A, 3, a, b, c);    \
+}                                                                           \
+static uintptr_t my_XIMProc_fct_##A = 0;                                    \
+static void my_XIMProc_##A(void* a, void* b, void* c)                       \
+{                                                                           \
+    if (my_XIMProc_fct_##A == 0)                                            \
+        printf_log(LOG_NONE, "%s cannot find XIMProc callback\n", __func__);\
+    RunFunction(my_context, my_XIMProc_fct_##A, 3, a, b, c);                \
+}
+SUPER()
+#undef GO
+
+#define VA_CALL(FUNC, FIRST_ARG, VAARGS, VAARGSZ, RESULT)       \
+switch (VAARGSZ)                                                \
+{                                                               \
+case 2:                                                         \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], NULL);       \
+    break;                                                      \
+case 4:                                                         \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], NULL);     \
+    break;                                                                          \
+case 6:                                                                             \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], NULL);   \
+    break;                                                                                              \
+case 8:                                                                                                 \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], NULL); \
+    break;                                                                                                                  \
+case 10:                                                                                                                    \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9], NULL);   \
+    break;                                                                                                                                          \
+case 12:                                                                                                                                            \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], NULL);  \
+    break;                                                                                                                                                                  \
+case 14:                                                                                                                                                                    \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], NULL);  \
+    break;                                                                                                                                                                                          \
+case 16:                                                                                                                                                                                            \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], NULL);  \
+    break;                                                                                                                                                                                                                  \
+case 18:                                                                                                                                                                                                                    \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], VAARGS[16], VAARGS[17], NULL);  \
+    break;                                                                                                                                                                                                                                          \
+case 20:                                                                                                                                                                                                                                            \
+    RESULT = FUNC(FIRST_ARG, VAARGS[0], VAARGS[1], VAARGS[2], VAARGS[3], VAARGS[4], VAARGS[5], VAARGS[6], VAARGS[7], VAARGS[8], VAARGS[9],  VAARGS[10], VAARGS[11], VAARGS[12], VAARGS[13], VAARGS[14], VAARGS[15], VAARGS[16], VAARGS[17], VAARGS[18], VAARGS[19], NULL);  \
+    break;                                                                                                                                                                                                                                                                  \
+default:                                                                                                                \
+    printf_log(LOG_NONE, "warning: %s's vasize (%d) is too large, need create new call case!\n", __func__, VAARGSZ);    \
+    break;                                                                                                              \
+}
+
+#define GO(A)                                                                       \
+if (va[i] && strcmp((char*)va[i], A) == 0) {                                        \
+    XICCallback* origin = (XICCallback*)va[i+1];                                    \
+    XICCallback* new = callbacks + i;                                               \
+    new->client_data = origin->client_data;                                         \
+    my_XICProc_fct_##A = (uintptr_t)origin->callback;                               \
+    new->callback = my_XICProc_##A;                                                 \
+    new_va[i+1] = new;                                                              \
+}
+
+EXPORT void* my_XVaCreateNestedList(x64emu_t* emu, int unused, void** va) {
+    library_t* lib = emu->context->x11lib;
+    x11_my_t *my = (x11_my_t *)lib->priv.w.p2;
+    int n = 0;
+    while (va[++n]) ;
+    void** new_va = malloc(sizeof(void*) * n);
+    XICCallback* callbacks = (XICCallback*)malloc(sizeof(XIMCallback) * n);
+
+    for (int i = 0; i < n; i += 2) {
+        new_va[i] = va[i];
+        new_va[i+1] = va[i+1];
+        SUPER()
+    }
+
+    void* res;
+    VA_CALL(my->XVaCreateNestedList, unused, new_va, n, res);
+    free(new_va);
+    free(callbacks);
+    return res;
+}
+
+EXPORT void* my_XCreateIC(x64emu_t* emu, void* xim, void** va) {
+    library_t* lib = emu->context->x11lib;
+    x11_my_t *my = (x11_my_t *)lib->priv.w.p2;
+    int n = 0;
+    while (va[++n]) ;
+    void** new_va = malloc(sizeof(void*) * n);
+    XICCallback* callbacks = (XICCallback*)malloc(sizeof(XIMCallback) * n);
+
+    for (int i = 0; i < n; i += 2) {
+        new_va[i] = va[i];
+        new_va[i+1] = va[i+1];
+        SUPER()
+    }
+
+    void* res;
+    VA_CALL(my->XCreateIC, xim, new_va, n, res);
+    free(new_va);
+    free(callbacks);
+    return res;
+}
+
+EXPORT void* my_XSetICValues(x64emu_t* emu, void* xic, void** va) {
+    library_t* lib = emu->context->x11lib;
+    x11_my_t *my = (x11_my_t *)lib->priv.w.p2;
+    int n = 0;
+    while (va[++n]) ;
+    void** new_va = malloc(sizeof(void*) * n);
+    XICCallback* callbacks = (XICCallback*)malloc(sizeof(XIMCallback) * n);
+
+    for (int i = 0; i < n; i += 2) {
+        new_va[i] = va[i];
+        new_va[i+1] = va[i+1];
+        SUPER()
+    }
+
+    void* res; 
+    VA_CALL(my->XSetICValues, xic, new_va, n, res);
+    free(new_va);
+    free(callbacks);
+    return res;
+}
+#undef GO
+
+EXPORT void* my_XSetIMValues(x64emu_t* emu, void* xim, void** va) {
+    library_t* lib = emu->context->x11lib;
+    x11_my_t *my = (x11_my_t *)lib->priv.w.p2;
+    int n = 0;
+    while (va[++n]) ;
+    void** new_va = malloc(sizeof(void*) * n);
+    XIMCallback* callbacks = (XIMCallback*)malloc(sizeof(XIMCallback) * n);
+
+    #define GO(A)                                                                       \
+    if (va[i] && strcmp((char*)va[i], A) == 0) {                                        \
+        XIMCallback* origin = (XIMCallback*)va[i+1];                                    \
+        XIMCallback* new = callbacks + i;                                               \
+        new->client_data = origin->client_data;                                         \
+        my_XIMProc_fct_##A = (uintptr_t)origin->callback;                               \
+        new->callback = my_XIMProc_##A;                                                 \
+        new_va[i+1] = new;                                                              \
+    }
+    for (int i = 0; i < n; i += 2) {
+        new_va[i] = va[i];
+        new_va[i+1] = va[i+1];
+        SUPER()
+    }
+    #undef GO
+    
+    void* res;
+    VA_CALL(my->XSetIMValues, xim, new_va, n, res)
+    free(new_va);
+    free(callbacks);
+    return res;
+}
+#undef VA_CALL
+#undef SUPER
 
 EXPORT void* my_XSetErrorHandler(x64emu_t* emu, XErrorHandler handler)
 {
@@ -740,27 +940,6 @@ EXPORT void my__XDeqAsyncHandler(x64emu_t* emu, void* cb, void* data)
     x11_my_t *my = (x11_my_t *)lib->priv.w.p2;
     my->_XDeqAsyncHandler(findXInternalAsyncHandlerFct(cb), data);
 }
-#if 0
-typedef struct my_XIMArg_s {
-    char    *name;
-    void    *value;
-} my_XIMArg_t;
-#define my_XNVaNestedList                       "XNVaNestedList"
-
-EXPORT void* my_XVaCreateNestedList(int dummy, void* b)
-{
-    // need to create a similar function here...
-    void* p = b;
-    int n = 0;
-    while(p++) ++n;
-    void** ret = (void**)malloc(sizeof(void*)*n);
-    p = b;
-    n = 0;
-    while(p++)
-        ret[n++] = p;
-    return ret;
-}
-#endif
 
 EXPORT void* my_XESetWireToEvent(x64emu_t* emu, void* display, int32_t event_number, void* proc)
 {
diff --git a/src/wrapped/wrappedlibx11_private.h b/src/wrapped/wrappedlibx11_private.h
index 98f407c1..c857355b 100755
--- a/src/wrapped/wrappedlibx11_private.h
+++ b/src/wrapped/wrappedlibx11_private.h
@@ -225,7 +225,7 @@ GO(XCreateFontCursor, pFpu)
 GO(XCreateFontSet, pFppppp)
 GO(XCreateGC, pFppup)
 //GO(XCreateGlyphCursor
-GO(XCreateIC, pFpppppppppppppppp)     // use ..., so putting an arbitrary number of args, also can have Callbacks ?! Allegro have 7 args and no callback
+GOM(XCreateIC, pFEpV)     // use vararg
 GOM(XCreateImage, pFEppuiipuuii)
 GO(dummy_XCreateImage, pFppuiipuuii)    // to have the wrapper
 DATAB(_XCreateMutex_fn, sizeof(void*))
@@ -942,9 +942,9 @@ GO(XSetGraphicsExposures, iFppi)
 GO(XSetICFocus, vFp)
 GO(XSetIconName, iFppp)
 //GO(XSetIconSizes
-GO(XSetICValues, pFpppppp)          // use vaarg
+GOM(XSetICValues, pFEpV)         // use vaarg
 // _XSetImage
-GO(XSetIMValues, pFppppppppppppp)	// use vaarg
+GOM(XSetIMValues, pFEpV)	// use vaarg
 GO(XSetInputFocus, iFppiL)
 GOM(XSetIOErrorHandler, pFEp)
 GO(_XSetLastRequestRead, uFpp)
@@ -1052,7 +1052,7 @@ GO(Xutf8TextListToTextProperty, iFppiup)
 //GO(Xutf8TextPerCharExtents
 GO(Xutf8TextPropertyToTextList, iFpppp)
 // _Xutf8TextPropertyToTextList
-GO(XVaCreateNestedList, pFipppppppppppppppppppppp)  // should recreate the function instead...
+GOM(XVaCreateNestedList, pFEiV)
 GO(XVendorRelease, iFp)
 // _XVIDtoVisual
 GO(XVisualIDFromVisual, LFp)