diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-11 16:59:43 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-11 16:59:43 +0100 |
| commit | ace28039283d0b256e0d6773561778c4baf6ae77 (patch) | |
| tree | bbc12dc17cc409fe818ebf9014640c2703589787 /src | |
| parent | 8073bb279f5370ca58e283bbee0aff9aaa92ce24 (diff) | |
| parent | 7943858290281e0fc506bd530d16427c5e93b011 (diff) | |
| download | box64-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.txt | 8 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibx11types.h | 6 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibx11.c | 223 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibx11_private.h | 8 |
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) |