about summary refs log tree commit diff stats
path: root/src/wrapped32
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-08 16:34:20 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-08 16:34:20 +0200
commit591e2db7128b8d5d618ee58037777eb64d91c953 (patch)
tree72b4b779bc9eaec3946d6399d42538ddbd2809e0 /src/wrapped32
parent8414563ad0d217b05dc8656c8d779ae16a66c58b (diff)
downloadbox64-591e2db7128b8d5d618ee58037777eb64d91c953.tar.gz
box64-591e2db7128b8d5d618ee58037777eb64d91c953.zip
[BOX32] Refactored X11 wrapping, and add a few more functions
Diffstat (limited to 'src/wrapped32')
-rw-r--r--src/wrapped32/generated/functions_list.txt19
-rw-r--r--src/wrapped32/generated/wrappedlibx11types32.h6
-rw-r--r--src/wrapped32/generated/wrappedlibxexttypes32.h9
-rw-r--r--src/wrapped32/generated/wrapper32.c8
-rw-r--r--src/wrapped32/generated/wrapper32.h4
-rw-r--r--src/wrapped32/wrappedlibx11.c827
-rw-r--r--src/wrapped32/wrappedlibx11_private.h12
-rw-r--r--src/wrapped32/wrappedlibxext.c201
-rw-r--r--src/wrapped32/wrappedlibxext_private.h10
9 files changed, 192 insertions, 904 deletions
diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt
index f20dfde5..1e503a94 100644
--- a/src/wrapped32/generated/functions_list.txt
+++ b/src/wrapped32/generated/functions_list.txt
@@ -388,6 +388,7 @@
 #() iFEpL -> iFEpL
 #() iFEpp -> iFEpp
 #() iFEpV -> iFEpV
+#() iFEpX -> iFEpX
 #() iFEhi -> iFEhi
 #() iFEhp -> iFEhp
 #() iFEXp -> iFEXp
@@ -501,6 +502,7 @@
 #() pFEpi -> pFEpi
 #() pFEpp -> pFEpp
 #() pFEpV -> pFEpV
+#() pFEpX -> pFEpX
 #() pFEXi -> pFEXi
 #() pFEXL -> pFEXL
 #() pFEXp -> pFEXp
@@ -710,6 +712,7 @@
 #() iFESpp -> iFESpp
 #() iFESpV -> iFESpV
 #() iFEXip -> iFEXip
+#() iFEXlp -> iFEXlp
 #() iFEXLp -> iFEXLp
 #() iFiiii -> iFiiii
 #() iFiiiu -> iFiiiu
@@ -1272,6 +1275,7 @@
 #() pFEpLiiii -> pFEpLiiii
 #() pFEpLiiiI -> pFEpLiiiI
 #() pFEpLiiil -> pFEpLiiil
+#() pFEpXppip -> pFEpXppip
 #() vFXLLiiibl_ -> vFXLLiiiB
 #() iFXiLibiip_ip -> iFXiLiBip
 #() iFXLibL_ubL_u -> iFXLiBuBu
@@ -2005,6 +2009,8 @@ wrappedlibx11:
   - XSetIMValues
 - pFXi:
   - XSynchronize
+- pFXL:
+  - XGetWMHints
 - pFXp:
   - XListExtensions
 - vFXLp:
@@ -2013,6 +2019,8 @@ wrappedlibx11:
   - XStringListToTextProperty
 - iFXip:
   - XCheckTypedEvent
+- iFXlp:
+  - XMaskEvent
 - iFXLp:
   - XGetWindowAttributes
   - XSetWMHints
@@ -2020,6 +2028,8 @@ wrappedlibx11:
   - XGetPixel
 - pFXip:
   - XESetCloseDisplay
+  - XESetEventToWire
+  - XESetWireToEvent
 - iFpLlp:
   - XWindowEvent
 - iFXLip:
@@ -2084,12 +2094,21 @@ wrappedlibxcursor:
 wrappedlibxext:
 - vFp:
   - XdbeFreeVisualInfo
+  - XextDestroyExtension
+- pFv:
+  - XextCreateExtension
 - pFp:
   - XSetExtensionErrorHandler
+- iFpX:
+  - XextRemoveDisplay
+- pFpX:
+  - XextFindDisplay
 - pFXpp:
   - XdbeGetVisualInfo
 - iFXLpiiL:
   - XShmGetImage
+- pFpXppip:
+  - XextAddDisplay
 - pFXbpLiLLLii_uipbLipi_uu:
   - XShmCreateImage
 - iFXLppiiiiuui:
diff --git a/src/wrapped32/generated/wrappedlibx11types32.h b/src/wrapped32/generated/wrappedlibx11types32.h
index 6f292dc4..b5974d1b 100644
--- a/src/wrapped32/generated/wrappedlibx11types32.h
+++ b/src/wrapped32/generated/wrappedlibx11types32.h
@@ -23,10 +23,12 @@ typedef uintptr_t (*LFpi_t)(void*, int32_t);
 typedef void* (*pFiV_t)(int32_t, ...);
 typedef void* (*pFpV_t)(void*, ...);
 typedef void* (*pFXi_t)(void*, int32_t);
+typedef void* (*pFXL_t)(void*, uintptr_t);
 typedef void* (*pFXp_t)(void*, void*);
 typedef void (*vFXLp_t)(void*, uintptr_t, void*);
 typedef int32_t (*iFpip_t)(void*, int32_t, void*);
 typedef int32_t (*iFXip_t)(void*, int32_t, void*);
+typedef int32_t (*iFXlp_t)(void*, intptr_t, void*);
 typedef int32_t (*iFXLp_t)(void*, uintptr_t, void*);
 typedef uintptr_t (*LFXii_t)(void*, int32_t, int32_t);
 typedef void* (*pFXip_t)(void*, int32_t, void*);
@@ -80,14 +82,18 @@ typedef uintptr_t (*LFXLiiuuuiupLp_t)(void*, uintptr_t, int32_t, int32_t, uint32
 	GO(XSetICValues, pFpV_t) \
 	GO(XSetIMValues, pFpV_t) \
 	GO(XSynchronize, pFXi_t) \
+	GO(XGetWMHints, pFXL_t) \
 	GO(XListExtensions, pFXp_t) \
 	GO(XSetWMNormalHints, vFXLp_t) \
 	GO(XStringListToTextProperty, iFpip_t) \
 	GO(XCheckTypedEvent, iFXip_t) \
+	GO(XMaskEvent, iFXlp_t) \
 	GO(XGetWindowAttributes, iFXLp_t) \
 	GO(XSetWMHints, iFXLp_t) \
 	GO(XGetPixel, LFXii_t) \
 	GO(XESetCloseDisplay, pFXip_t) \
+	GO(XESetEventToWire, pFXip_t) \
+	GO(XESetWireToEvent, pFXip_t) \
 	GO(XWindowEvent, iFpLlp_t) \
 	GO(XCheckTypedWindowEvent, iFXLip_t) \
 	GO(XCheckWindowEvent, iFXLlp_t) \
diff --git a/src/wrapped32/generated/wrappedlibxexttypes32.h b/src/wrapped32/generated/wrappedlibxexttypes32.h
index fa6d4f69..9f95f95b 100644
--- a/src/wrapped32/generated/wrappedlibxexttypes32.h
+++ b/src/wrapped32/generated/wrappedlibxexttypes32.h
@@ -12,17 +12,26 @@
 #endif
 
 typedef void (*vFp_t)(void*);
+typedef void* (*pFv_t)(void);
 typedef void* (*pFp_t)(void*);
+typedef int32_t (*iFpX_t)(void*, void*);
+typedef void* (*pFpX_t)(void*, void*);
 typedef void* (*pFXpp_t)(void*, void*, void*);
 typedef int32_t (*iFXLpiiL_t)(void*, uintptr_t, void*, int32_t, int32_t, uintptr_t);
+typedef void* (*pFpXppip_t)(void*, void*, void*, void*, int32_t, void*);
 typedef void* (*pFXbpLiLLLii_uipbLipi_uu_t)(void*, struct_pLiLLLii_t*, uint32_t, int32_t, void*, struct_Lipi_t*, uint32_t, uint32_t);
 typedef int32_t (*iFXLppiiiiuui_t)(void*, uintptr_t, void*, void*, int32_t, int32_t, int32_t, int32_t, uint32_t, uint32_t, int32_t);
 
 #define SUPER() ADDED_FUNCTIONS() \
 	GO(XdbeFreeVisualInfo, vFp_t) \
+	GO(XextDestroyExtension, vFp_t) \
+	GO(XextCreateExtension, pFv_t) \
 	GO(XSetExtensionErrorHandler, pFp_t) \
+	GO(XextRemoveDisplay, iFpX_t) \
+	GO(XextFindDisplay, pFpX_t) \
 	GO(XdbeGetVisualInfo, pFXpp_t) \
 	GO(XShmGetImage, iFXLpiiL_t) \
+	GO(XextAddDisplay, pFpXppip_t) \
 	GO(XShmCreateImage, pFXbpLiLLLii_uipbLipi_uu_t) \
 	GO(XShmPutImage, iFXLppiiiiuui_t)
 
diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c
index f2f0a602..3e2962d5 100644
--- a/src/wrapped32/generated/wrapper32.c
+++ b/src/wrapped32/generated/wrapper32.c
@@ -478,6 +478,7 @@ typedef int32_t (*iFEpl_t)(x64emu_t*, void*, intptr_t);
 typedef int32_t (*iFEpL_t)(x64emu_t*, void*, uintptr_t);
 typedef int32_t (*iFEpp_t)(x64emu_t*, void*, void*);
 typedef int32_t (*iFEpV_t)(x64emu_t*, void*, void*);
+typedef int32_t (*iFEpX_t)(x64emu_t*, void*, void*);
 typedef int32_t (*iFEhi_t)(x64emu_t*, uintptr_t, int32_t);
 typedef int32_t (*iFEhp_t)(x64emu_t*, uintptr_t, void*);
 typedef int32_t (*iFEXp_t)(x64emu_t*, void*, void*);
@@ -591,6 +592,7 @@ typedef void* (*pFEiV_t)(x64emu_t*, int32_t, void*);
 typedef void* (*pFEpi_t)(x64emu_t*, void*, int32_t);
 typedef void* (*pFEpp_t)(x64emu_t*, void*, void*);
 typedef void* (*pFEpV_t)(x64emu_t*, void*, void*);
+typedef void* (*pFEpX_t)(x64emu_t*, void*, void*);
 typedef void* (*pFEXi_t)(x64emu_t*, void*, int32_t);
 typedef void* (*pFEXL_t)(x64emu_t*, void*, uintptr_t);
 typedef void* (*pFEXp_t)(x64emu_t*, void*, void*);
@@ -800,6 +802,7 @@ typedef int32_t (*iFEhup_t)(x64emu_t*, uintptr_t, uint32_t, void*);
 typedef int32_t (*iFESpp_t)(x64emu_t*, void*, void*, void*);
 typedef int32_t (*iFESpV_t)(x64emu_t*, void*, void*, void*);
 typedef int32_t (*iFEXip_t)(x64emu_t*, void*, int32_t, void*);
+typedef int32_t (*iFEXlp_t)(x64emu_t*, void*, intptr_t, void*);
 typedef int32_t (*iFEXLp_t)(x64emu_t*, void*, uintptr_t, void*);
 typedef int32_t (*iFiiii_t)(int32_t, int32_t, int32_t, int32_t);
 typedef int32_t (*iFiiiu_t)(int32_t, int32_t, int32_t, uint32_t);
@@ -1362,6 +1365,7 @@ typedef void* (*pFEpiiiiu_t)(x64emu_t*, void*, int32_t, int32_t, int32_t, int32_
 typedef void* (*pFEpLiiii_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, int32_t, int32_t);
 typedef void* (*pFEpLiiiI_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, int32_t, int64_t);
 typedef void* (*pFEpLiiil_t)(x64emu_t*, void*, uintptr_t, int32_t, int32_t, int32_t, intptr_t);
+typedef void* (*pFEpXppip_t)(x64emu_t*, void*, void*, void*, void*, int32_t, void*);
 typedef void (*vFXLLiiibl__t)(void*, uintptr_t, uintptr_t, int32_t, int32_t, int32_t, struct_l_t*);
 typedef int32_t (*iFXiLibiip_ip_t)(void*, int32_t, uintptr_t, int32_t, struct_iip_t*, int32_t, void*);
 typedef int32_t (*iFXLibL_ubL_u_t)(void*, uintptr_t, int32_t, struct_L_t*, uint32_t, struct_L_t*, uint32_t);
@@ -1953,6 +1957,7 @@ void iFEpl_32(x64emu_t *emu, uintptr_t fcn) { iFEpl_t fn = (iFEpl_t)fcn; R_EAX =
 void iFEpL_32(x64emu_t *emu, uintptr_t fcn) { iFEpL_t fn = (iFEpL_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8))); }
 void iFEpp_32(x64emu_t *emu, uintptr_t fcn) { iFEpp_t fn = (iFEpp_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8)); }
 void iFEpV_32(x64emu_t *emu, uintptr_t fcn) { iFEpV_t fn = (iFEpV_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), from_ptrv(R_ESP + 8)); }
+void iFEpX_32(x64emu_t *emu, uintptr_t fcn) { iFEpX_t fn = (iFEpX_t)fcn; R_EAX = fn(emu, from_ptriv(R_ESP + 4), getDisplay(from_ptriv(R_ESP + 8))); }
 void iFEhi_32(x64emu_t *emu, uintptr_t fcn) { iFEhi_t fn = (iFEhi_t)fcn; R_EAX = fn(emu, from_hash(from_ptri(ptr_t, R_ESP + 4)), from_ptri(int32_t, R_ESP + 8)); }
 void iFEhp_32(x64emu_t *emu, uintptr_t fcn) { iFEhp_t fn = (iFEhp_t)fcn; R_EAX = fn(emu, from_hash(from_ptri(ptr_t, R_ESP + 4)), from_ptriv(R_ESP + 8)); }
 void iFEXp_32(x64emu_t *emu, uintptr_t fcn) { iFEXp_t fn = (iFEXp_t)fcn; R_EAX = fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8)); }
@@ -2066,6 +2071,7 @@ void pFEiV_32(x64emu_t *emu, uintptr_t fcn) { pFEiV_t fn = (pFEiV_t)fcn; R_EAX =
 void pFEpi_32(x64emu_t *emu, uintptr_t fcn) { pFEpi_t fn = (pFEpi_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ptri(int32_t, R_ESP + 8))); }
 void pFEpp_32(x64emu_t *emu, uintptr_t fcn) { pFEpp_t fn = (pFEpp_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8))); }
 void pFEpV_32(x64emu_t *emu, uintptr_t fcn) { pFEpV_t fn = (pFEpV_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ptrv(R_ESP + 8))); }
+void pFEpX_32(x64emu_t *emu, uintptr_t fcn) { pFEpX_t fn = (pFEpX_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), getDisplay(from_ptriv(R_ESP + 8)))); }
 void pFEXi_32(x64emu_t *emu, uintptr_t fcn) { pFEXi_t fn = (pFEXi_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptri(int32_t, R_ESP + 8))); }
 void pFEXL_32(x64emu_t *emu, uintptr_t fcn) { pFEXL_t fn = (pFEXL_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)))); }
 void pFEXp_32(x64emu_t *emu, uintptr_t fcn) { pFEXp_t fn = (pFEXp_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8))); }
@@ -2275,6 +2281,7 @@ void iFEhup_32(x64emu_t *emu, uintptr_t fcn) { iFEhup_t fn = (iFEhup_t)fcn; R_EA
 void iFESpp_32(x64emu_t *emu, uintptr_t fcn) { iFESpp_t fn = (iFESpp_t)fcn; R_EAX = fn(emu, io_convert32(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12)); }
 void iFESpV_32(x64emu_t *emu, uintptr_t fcn) { iFESpV_t fn = (iFESpV_t)fcn; R_EAX = fn(emu, io_convert32(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ptrv(R_ESP + 12)); }
 void iFEXip_32(x64emu_t *emu, uintptr_t fcn) { iFEXip_t fn = (iFEXip_t)fcn; R_EAX = fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptri(int32_t, R_ESP + 8), from_ptriv(R_ESP + 12)); }
+void iFEXlp_32(x64emu_t *emu, uintptr_t fcn) { iFEXlp_t fn = (iFEXlp_t)fcn; R_EAX = fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_long(from_ptri(long_t, R_ESP + 8)), from_ptriv(R_ESP + 12)); }
 void iFEXLp_32(x64emu_t *emu, uintptr_t fcn) { iFEXLp_t fn = (iFEXLp_t)fcn; R_EAX = fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12)); }
 void iFiiii_32(x64emu_t *emu, uintptr_t fcn) { iFiiii_t fn = (iFiiii_t)fcn; R_EAX = fn(from_ptri(int32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16)); }
 void iFiiiu_32(x64emu_t *emu, uintptr_t fcn) { iFiiiu_t fn = (iFiiiu_t)fcn; R_EAX = fn(from_ptri(int32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16)); }
@@ -2837,6 +2844,7 @@ void pFEpiiiiu_32(x64emu_t *emu, uintptr_t fcn) { pFEpiiiiu_t fn = (pFEpiiiiu_t)
 void pFEpLiiii_32(x64emu_t *emu, uintptr_t fcn) { pFEpLiiii_t fn = (pFEpLiiii_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24))); }
 void pFEpLiiiI_32(x64emu_t *emu, uintptr_t fcn) { pFEpLiiiI_t fn = (pFEpLiiiI_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptri(int64_t, R_ESP + 24))); }
 void pFEpLiiil_32(x64emu_t *emu, uintptr_t fcn) { pFEpLiiil_t fn = (pFEpLiiil_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_long(from_ptri(long_t, R_ESP + 24)))); }
+void pFEpXppip_32(x64emu_t *emu, uintptr_t fcn) { pFEpXppip_t fn = (pFEpXppip_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), getDisplay(from_ptriv(R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptriv(R_ESP + 24))); }
 void vFXLLiiibl__32(x64emu_t *emu, uintptr_t fcn) { vFXLLiiibl__t fn = (vFXLLiiibl__t)fcn; struct_l_t arg_28={0}; if (*(ptr_t*)(from_ptr((R_ESP + 28)))) from_struct_l(&arg_28, *(ptr_t*)(from_ptr((R_ESP + 28)))); fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24), *(ptr_t*)(from_ptr((R_ESP + 28))) ? &arg_28 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 28)))) to_struct_l(*(ptr_t*)(from_ptr((R_ESP + 28))), &arg_28); }
 void iFXiLibiip_ip_32(x64emu_t *emu, uintptr_t fcn) { iFXiLibiip_ip_t fn = (iFXiLibiip_ip_t)fcn; struct_iip_t arg_20={0}; if (*(ptr_t*)(from_ptr((R_ESP + 20)))) from_struct_iip(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), from_ptri(int32_t, R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptri(int32_t, R_ESP + 16), *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL, from_ptri(int32_t, R_ESP + 24), from_ptriv(R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_iip(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); }
 void iFXLibL_ubL_u_32(x64emu_t *emu, uintptr_t fcn) { iFXLibL_ubL_u_t fn = (iFXLibL_ubL_u_t)fcn; struct_L_t arg_16={0}; if (*(ptr_t*)(from_ptr((R_ESP + 16)))) from_struct_L(&arg_16, *(ptr_t*)(from_ptr((R_ESP + 16)))); struct_L_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_L(&arg_24, *(ptr_t*)(from_ptr((R_ESP + 24)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, from_ptri(uint32_t, R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptri(uint32_t, R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h
index c5d842d5..7b29d9a8 100644
--- a/src/wrapped32/generated/wrapper32.h
+++ b/src/wrapped32/generated/wrapper32.h
@@ -429,6 +429,7 @@ void iFEpl_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpL_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpp_32(x64emu_t *emu, uintptr_t fnc);
 void iFEpV_32(x64emu_t *emu, uintptr_t fnc);
+void iFEpX_32(x64emu_t *emu, uintptr_t fnc);
 void iFEhi_32(x64emu_t *emu, uintptr_t fnc);
 void iFEhp_32(x64emu_t *emu, uintptr_t fnc);
 void iFEXp_32(x64emu_t *emu, uintptr_t fnc);
@@ -542,6 +543,7 @@ void pFEiV_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpi_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpp_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpV_32(x64emu_t *emu, uintptr_t fnc);
+void pFEpX_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXi_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXL_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXp_32(x64emu_t *emu, uintptr_t fnc);
@@ -751,6 +753,7 @@ void iFEhup_32(x64emu_t *emu, uintptr_t fnc);
 void iFESpp_32(x64emu_t *emu, uintptr_t fnc);
 void iFESpV_32(x64emu_t *emu, uintptr_t fnc);
 void iFEXip_32(x64emu_t *emu, uintptr_t fnc);
+void iFEXlp_32(x64emu_t *emu, uintptr_t fnc);
 void iFEXLp_32(x64emu_t *emu, uintptr_t fnc);
 void iFiiii_32(x64emu_t *emu, uintptr_t fnc);
 void iFiiiu_32(x64emu_t *emu, uintptr_t fnc);
@@ -1313,6 +1316,7 @@ void pFEpiiiiu_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpLiiii_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpLiiiI_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpLiiil_32(x64emu_t *emu, uintptr_t fnc);
+void pFEpXppip_32(x64emu_t *emu, uintptr_t fnc);
 void vFXLLiiibl__32(x64emu_t *emu, uintptr_t fnc);
 void iFXiLibiip_ip_32(x64emu_t *emu, uintptr_t fnc);
 void iFXLibL_ubL_u_32(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped32/wrappedlibx11.c b/src/wrapped32/wrappedlibx11.c
index 9f44cd39..818c21bd 100644
--- a/src/wrapped32/wrappedlibx11.c
+++ b/src/wrapped32/wrappedlibx11.c
@@ -27,11 +27,8 @@
 
 #define LIBNAME libx11
 
-#include "libtools/my_x11_defs.h"
-#include "libtools/my_x11_defs_32.h"
+#include "libtools/my_x11_conv.h"
 
-void convertXEvent(my_XEvent_32_t* dst, my_XEvent_t* src);
-void unconvertXEvent(my_XEvent_t* dst, my_XEvent_32_t* src);
 typedef int (*XErrorHandler)(void *, void *);
 void* my32_XSetErrorHandler(x64emu_t* t, XErrorHandler handler);
 typedef int (*XIOErrorHandler)(void *);
@@ -93,13 +90,16 @@ GO(12)  \
 GO(13)  \
 GO(14)  \
 GO(15)
-#if 0
+
 // wire_to_event
 #define GO(A)   \
-static uintptr_t my32_wire_to_event_fct_##A = 0;                      \
-static int my32_wire_to_event_##A(void* dpy, void* re, void* event)   \
-{                                                                   \
-    return (int)RunFunctionFmt(my32_wire_to_event_fct_##A, "ppp", dpy, re, event);\
+static uintptr_t my32_wire_to_event_fct_##A = 0;                                                    \
+static int my32_wire_to_event_##A(void* dpy, void* re, void* event)                                 \
+{                                                                                                   \
+    static my_XEvent_32_t re_s = {0};                                                               \
+    int ret = (int)RunFunctionFmt(my32_wire_to_event_fct_##A, "ppp", getDisplay(dpy), &re_s, event);\
+    unconvertXEvent(re, &re_s);                                                                     \
+    return ret;                                                                                     \
 }
 SUPER()
 #undef GO
@@ -124,15 +124,17 @@ static void* reverse_wire_to_eventFct(library_t* lib, void* fct)
     #define GO(A) if(my32_wire_to_event_##A == fct) return (void*)my32_wire_to_event_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL);
+    return (void*)AddBridge(lib->w.bridge, iFppp_32, fct, 0, NULL);
 }
 
 // event_to_wire
 #define GO(A)   \
-static uintptr_t my32_event_to_wire_fct_##A = 0;                      \
-static int my32_event_to_wire_##A(void* dpy, void* re, void* event)   \
-{                                                                   \
-    return (int)RunFunctionFmt(my32_event_to_wire_fct_##A, "ppp", dpy, re, event);\
+static uintptr_t my32_event_to_wire_fct_##A = 0;                                                    \
+static int my32_event_to_wire_##A(void* dpy, void* re, void* event)                                 \
+{                                                                                                   \
+    my_XEvent_32_t re_s = {0};                                                                      \
+    convertXEvent(&re_s, re);                                                                       \
+    return (int)RunFunctionFmt(my32_event_to_wire_fct_##A, "ppp", getDisplay(dpy), &re_s, event);   \
 }
 SUPER()
 #undef GO
@@ -157,9 +159,8 @@ static void* reverse_event_to_wireFct(library_t* lib, void* fct)
     #define GO(A) if(my32_event_to_wire_##A == fct) return (void*)my32_event_to_wire_fct_##A;
     SUPER()
     #undef GO
-    return (void*)AddBridge(lib->w.bridge, iFppp, fct, 0, NULL);
+    return (void*)AddBridge(lib->w.bridge, iFppp_32, fct, 0, NULL);
 }
-#endif
 // error_handler
 #define GO(A)   \
 static uintptr_t my32_error_handler_fct_##A = 0;                                            \
@@ -1500,6 +1501,7 @@ EXPORT void my32__XDeqAsyncHandler(x64emu_t* emu, void* cb, void* data)
     my->_XDeqAsyncHandler(findXInternalAsyncHandlerFct(cb), data);
 }
 
+#endif
 EXPORT void* my32_XESetWireToEvent(x64emu_t* emu, void* display, int32_t event_number, void* proc)
 {
     void* ret = NULL;
@@ -1516,7 +1518,6 @@ EXPORT void* my32_XESetEventToWire(x64emu_t* emu, void* display, int32_t event_n
 
     return reverse_event_to_wireFct(my_lib, ret);
 }
-#endif
 
 EXPORT int my32_XRegisterIMInstantiateCallback(x64emu_t* emu, void* d, void* db, void* res_name, void* res_class, void* cb, void* data)
 {
@@ -1560,170 +1561,10 @@ EXPORT void* my32_XSynchronize(x64emu_t* emu, void* display, int onoff)
     return reverse_XSynchronizeProcFct(my_lib, my->XSynchronize(display, onoff));
 }
 
-#define N_DISPLAY 4
-#define N_SCREENS 16
-my_XDisplay_t* my32_Displays_64[N_DISPLAY] = {0};
-struct my_XFreeFuncs_32 my32_free_funcs_32[N_DISPLAY] = {0};
-struct my_XLockPtrs_32 my32_lock_fns_32[N_DISPLAY] = {0};
-my_Screen_32_t my32_screens[N_DISPLAY*N_SCREENS] = {0};
-int n_screeens = 0;
-my_XDisplay_32_t my32_Displays_32[N_DISPLAY] = {0};
-
-void* getDisplay(void* d)
-{
-    if(!d) return d;
-    for(int i=0; i<N_DISPLAY; ++i)
-        if(((&my32_Displays_32[i])==d) || (my32_Displays_64[i]==d))
-            return my32_Displays_64[i];
-        printf_log(LOG_INFO, "BOX32: Warning, 32bits Display %p not found\n", d);
-    return d;
-}
-
-void* FindDisplay(void* d)
-{
-    if(!d) return d;
-    for(int i=0; i<N_DISPLAY; ++i)
-        if((my32_Displays_64[i]==d) || ((&my32_Displays_32[i])==d))
-            return &my32_Displays_32[i];
-    return d;
-}
-
-void convert_Screen_to_32(void* d, void* s)
-{
-    my_Screen_t* src = s;
-    my_Screen_32_t* dst = d;
-    dst->ext_data = to_ptrv(src->ext_data);
-    dst->display = to_ptrv(FindDisplay(src->display));
-    dst->root = to_ulong(src->root);
-    dst->width = src->width;
-    dst->mwidth = src->mwidth;
-    dst->ndepths = src->ndepths;
-    dst->depths = to_ptrv(src->depths);
-    dst->root_depth = src->root_depth;
-    dst->root_visual = to_ptrv(src->root_visual);
-    dst->default_gc = to_ptrv(src->default_gc);
-    dst->cmap = to_ulong(src->cmap);
-    dst->white_pixel = to_ulong(src->white_pixel);
-    dst->black_pixel = to_ulong(src->black_pixel);
-    dst->max_maps = src->max_maps;
-    dst->backing_store = src->backing_store;
-    dst->save_unders = src->save_unders;
-    dst->root_input_mask = to_long(src->root_input_mask);
-}
-
-void* my_dlopen(x64emu_t* emu, void *filename, int flag);
-void* addDisplay(void* d)
-{
-    if(!my_lib) {
-        // the lib has not be loaded directly... need to open it! leaking the lib handle...
-        #ifdef ANDROID
-        my_dlopen(thread_get_emu(), "libX11.so", RTLD_NOW);
-        #else
-        my_dlopen(thread_get_emu(), "libX11.so.6", RTLD_NOW);
-        #endif
-    }
-    my_XDisplay_t* dpy = (my_XDisplay_t*)d;
-    // look for a free slot, or a display already there
-    my_XDisplay_32_t* ret = NULL;
-    struct my_XFreeFuncs_32 *free_funcs = NULL;
-    struct my_XLockPtrs_32 *lock_fns = NULL;
-    for(int i=0; i<N_DISPLAY && !ret; ++i)
-        if(my32_Displays_64[i]==dpy)
-            return &my32_Displays_32[i];
-    for(int i=0; i<N_DISPLAY && !ret; ++i) {
-        if(!my32_Displays_64[i]) {
-            my32_Displays_64[i] = dpy;
-            ret = &my32_Displays_32[i];
-            free_funcs = &my32_free_funcs_32[i];
-            ret->free_funcs = to_ptrv(free_funcs);
-            lock_fns = &my32_lock_fns_32[i];
-            ret->lock_fns = to_ptrv(lock_fns);
-        }
-    }
-    if(!ret) {
-        printf_log(LOG_INFO, "BOX32: No more slot available for libX11 Display!");
-        return d;
-    }
-
-    bridge_t* system = my_lib->w.bridge;
-
-    // partial copy...
-
-    #define GO(A, W)\
-    if(dpy->A)      \
-        if(!CheckBridged(system, dpy->A)) \
-            ret->A = AddCheckBridge(system, W, dpy->A, 0, #A); \
-
-    #define GO2(A, B, W) \
-    if(dpy->A && dpy->A->B)  \
-        if(!CheckBridged(system, dpy->A->B)) \
-            A->B = AddCheckBridge(system, W, dpy->A->B, 0, #B "_" #A); \
-
-    ret->vendor = to_cstring(dpy->vendor);
-    ret->fd = dpy->fd;
-    ret->conn_checker = dpy->conn_checker;
-    ret->proto_major_version = dpy->proto_major_version;
-    ret->proto_minor_version = dpy->proto_minor_version;
-    ret->xdefaults = to_cstring(dpy->xdefaults);
-    ret->display_name = to_cstring(dpy->display_name);
-    ret->default_screen = dpy->default_screen;
-    ret->nscreens = dpy->nscreens;
-    if(dpy->screens) {
-        ret->screens = to_ptrv(&my32_screens[n_screeens]);
-        for(int i=0; i<dpy->nscreens; ++i) {
-            if(n_screeens==N_DISPLAY*N_SCREENS) {
-                printf_log(LOG_INFO, "BOX32: Warning, no more libX11 Screen slots!");
-                break;
-            }
-            convert_Screen_to_32(&my32_screens[n_screeens++], &dpy->screens[i]);
-        }
-    } else
-        ret->screens = 0;
-
-    GO2(free_funcs, atoms, vFp_32)
-    GO2(free_funcs, modifiermap, iFp_32)
-    GO2(free_funcs, key_bindings, vFp_32)
-    GO2(free_funcs, context_db, vFp_32)
-    GO2(free_funcs, defaultCCCs, vFp_32)
-    GO2(free_funcs, clientCmaps, vFp_32)
-    GO2(free_funcs, intensityMaps, vFp_32)
-    GO2(free_funcs, im_filters, vFp_32)
-    GO2(free_funcs, xkb, vFp_32)
-    GO(resource_alloc, LFp_32)
-    GO(synchandler, iFp_32)
-    //TODO: ext_procs?
-    //TODO: event_vec?
-    //TODO: wire_vec?
-    //TODO: async_handlers?
-    GO2(lock_fns, lock_display, vFp_32)
-    GO2(lock_fns, unlock_display, vFp_32)
-    GO(idlist_alloc, vFppi_32)
-    //TODO: error_vec?
-    //TODO: flushes
-    //TODO: im_fd_info?
-    //TODO: conn_watchers
-    GO(savedsynchandler, iFp_32)
-    //TODO: generic_event_vec?
-    //TODO: generic_event_copy_vec?
-
-
-    #undef GO
-    #undef GO2
-
-    return ret;
-}
-
 EXPORT int my32_XCloseDisplay(x64emu_t* emu, void* dpy)
 {
     int ret = my->XCloseDisplay(dpy);
-    if(ret)
-        for(int i=0; i<N_DISPLAY; ++i) {
-            // crude free of ressources... not perfect
-            if(my32_Displays_64[i]==dpy) {
-                my32_Displays_64[i] = NULL;
-                return ret;
-            }
-        }
+    if(ret) delDisplay(dpy);
     return ret;
 }
 
@@ -1751,453 +1592,6 @@ EXPORT XID my32_XCreateWindow(x64emu_t* emu, void* d, XID Window, int x, int y,
     return my->XCreateWindow(d, Window, x, y, width, height, border_width, depth, cl, visual, mask, attr?(&attrib):NULL);
 }
 
-void convertXEvent(my_XEvent_32_t* dst, my_XEvent_t* src)
-{
-    if(!src->type) {
-        // This is an XErrorEvent, and it's different!
-        dst->xerror.type = src->xerror.type;
-        dst->xerror.display = to_ptrv(FindDisplay(src->xerror.display));
-        dst->xerror.resourceid = to_ulong(src->xerror.resourceid);
-        dst->xerror.serial = to_ulong(src->xerror.serial);
-        dst->xerror.error_code = src->xerror.error_code;
-        dst->xerror.request_code = src->xerror.request_code;
-        dst->xerror.minor_code = src->xerror.minor_code;
-        return;
-    }
-    // convert the XAnyEvent first, as it's a common set
-    dst->type = src->type;
-    dst->xany.display = to_ptrv(FindDisplay(src->xany.display));
-    dst->xany.window = to_ulong(src->xany.window);
-    dst->xany.send_event = src->xany.serial;
-    dst->xany.serial = to_ulong(src->xany.serial);
-    switch(src->type) {
-        case XEVT_KeyPress:
-        case XEVT_KeyRelease:
-            dst->xkey.root = to_ulong(src->xkey.root);
-            dst->xkey.subwindow = to_ulong(src->xkey.subwindow);
-            dst->xkey.time = to_ulong(src->xkey.time);
-            dst->xkey.x = src->xkey.x;
-            dst->xkey.y = src->xkey.y;
-            dst->xkey.x_root = src->xkey.x_root;
-            dst->xkey.y_root = src->xkey.y_root;
-            dst->xkey.state = src->xkey.state;
-            dst->xkey.keycode = src->xkey.keycode;
-            dst->xkey.same_screen = src->xkey.same_screen;
-            break;
-        case XEVT_ButtonPress:
-        case XEVT_ButtonRelease:
-            dst->xbutton.root = to_ulong(src->xbutton.root);
-            dst->xbutton.subwindow = to_ulong(src->xbutton.subwindow);
-            dst->xbutton.time = to_ulong(src->xbutton.time);
-            dst->xbutton.x = src->xbutton.x;
-            dst->xbutton.y = src->xbutton.y;
-            dst->xbutton.x_root = src->xbutton.x_root;
-            dst->xbutton.y_root = src->xbutton.y_root;
-            dst->xbutton.state = src->xbutton.state;
-            dst->xbutton.button = src->xbutton.button;
-            dst->xbutton.same_screen = src->xbutton.same_screen;
-            break;
-        case XEVT_MotionNotify:
-            dst->xmotion.root = to_ulong(src->xmotion.root);
-            dst->xmotion.subwindow = to_ulong(src->xmotion.subwindow);
-            dst->xmotion.time = to_ulong(src->xmotion.time);
-            dst->xmotion.x = src->xmotion.x;
-            dst->xmotion.y = src->xmotion.y;
-            dst->xmotion.x_root = src->xmotion.x_root;
-            dst->xmotion.y_root = src->xmotion.y_root;
-            dst->xmotion.state = src->xmotion.state;
-            dst->xmotion.is_hint = src->xmotion.is_hint;
-            dst->xmotion.same_screen = src->xmotion.same_screen;
-            break;
-        case XEVT_EnterNotify:
-        case XEVT_LeaveNotify:
-            dst->xcrossing.root = to_ulong(src->xcrossing.root);
-            dst->xcrossing.subwindow = to_ulong(src->xcrossing.subwindow);
-            dst->xcrossing.time = to_ulong(src->xcrossing.time);
-            dst->xcrossing.x = src->xcrossing.x;
-            dst->xcrossing.y = src->xcrossing.y;
-            dst->xcrossing.x_root = src->xcrossing.x_root;
-            dst->xcrossing.y_root = src->xcrossing.y_root;
-            dst->xcrossing.mode = src->xcrossing.mode;
-            dst->xcrossing.detail = src->xcrossing.detail;
-            dst->xcrossing.same_screen = src->xcrossing.same_screen;
-            dst->xcrossing.focus = src->xcrossing.focus;
-            dst->xcrossing.state = src->xcrossing.state;
-            break;
-        case XEVT_FocusIn:
-        case XEVT_FocusOut:
-            dst->xfocus.mode = src->xfocus.mode;
-            dst->xfocus.detail = src->xfocus.detail;
-            break;
-        case XEVT_KeymapNotify:
-            memcpy(dst->xkeymap.key_vector, src->xkeymap.key_vector, 32);
-            break;
-        case XEVT_Expose:
-            dst->xexpose.x = src->xexpose.x;
-            dst->xexpose.y = src->xexpose.y;
-            dst->xexpose.width = src->xexpose.width;
-            dst->xexpose.height = src->xexpose.height;
-            dst->xexpose.count = src->xexpose.count;
-            break;
-        case XEVT_GraphicsExpose:
-            dst->xgraphicsexpose.x = src->xgraphicsexpose.x;
-            dst->xgraphicsexpose.y = src->xgraphicsexpose.y;
-            dst->xgraphicsexpose.width = src->xgraphicsexpose.width;
-            dst->xgraphicsexpose.height = src->xgraphicsexpose.height;
-            dst->xgraphicsexpose.count = src->xgraphicsexpose.count;
-            dst->xgraphicsexpose.major_code = src->xgraphicsexpose.major_code;
-            dst->xgraphicsexpose.minor_code = src->xgraphicsexpose.minor_code;
-            break;
-        case XEVT_NoExpose:
-            dst->xnoexpose.major_code = src->xnoexpose.major_code;
-            dst->xnoexpose.minor_code = src->xnoexpose.minor_code;
-            break;
-        case XEVT_VisibilityNotify:
-            dst->xvisibility.state = src->xvisibility.state;
-            break;
-        case XEVT_CreateNotify:
-            dst->xcreatewindow.window = to_ulong(src->xcreatewindow.window);
-            dst->xcreatewindow.x = src->xcreatewindow.x;
-            dst->xcreatewindow.y = src->xcreatewindow.y;
-            dst->xcreatewindow.width = src->xcreatewindow.width;
-            dst->xcreatewindow.height = src->xcreatewindow.height;
-            dst->xcreatewindow.border_width = src->xcreatewindow.border_width;
-            dst->xcreatewindow.override_redirect = src->xcreatewindow.override_redirect;
-            break;
-        case XEVT_DestroyNotify:
-            dst->xdestroywindow.window = to_ulong(src->xdestroywindow.window);
-            break;
-        case XEVT_UnmapNotify:
-            dst->xunmap.window = to_ulong(src->xunmap.window);
-            dst->xunmap.from_configure = src->xunmap.from_configure;
-            break;
-        case XEVT_MapNotify:
-            dst->xmap.window = to_ulong(src->xmap.window);
-            dst->xmap.override_redirect = src->xmap.override_redirect;
-            break;
-        case XEVT_MapRequest:
-            dst->xmaprequest.window = to_ulong(src->xmaprequest.window);
-            break;
-        case XEVT_ReparentNotify:
-            dst->xreparent.window = to_ulong(src->xreparent.window);
-            dst->xreparent.parent = to_ulong(src->xreparent.parent);
-            dst->xreparent.x = src->xreparent.x;
-            dst->xreparent.y = src->xreparent.y;
-            dst->xreparent.override_redirect = src->xreparent.override_redirect;
-            break;
-        case XEVT_ConfigureNotify:
-            dst->xconfigure.window = to_ulong(src->xconfigure.window);
-            dst->xconfigure.x = src->xconfigure.x;
-            dst->xconfigure.y = src->xconfigure.y;
-            dst->xconfigure.width = src->xconfigure.width;
-            dst->xconfigure.height = src->xconfigure.height;
-            dst->xconfigure.border_width = src->xconfigure.border_width;
-            dst->xconfigure.above = to_ulong(src->xconfigure.above);
-            dst->xconfigure.override_redirect = src->xconfigure.override_redirect;
-            break;
-        case XEVT_ConfigureRequest:
-            dst->xconfigurerequest.window = to_ulong(src->xconfigurerequest.window);
-            dst->xconfigurerequest.x = src->xconfigurerequest.x;
-            dst->xconfigurerequest.y = src->xconfigurerequest.y;
-            dst->xconfigurerequest.width = src->xconfigurerequest.width;
-            dst->xconfigurerequest.height = src->xconfigurerequest.height;
-            dst->xconfigurerequest.border_width = src->xconfigurerequest.border_width;
-            dst->xconfigurerequest.above = to_ulong(src->xconfigurerequest.above);
-            dst->xconfigurerequest.detail = src->xconfigurerequest.detail;
-            dst->xconfigurerequest.value_mask = to_ulong(src->xconfigurerequest.value_mask);
-            break;
-        case XEVT_GravityNotify:
-            dst->xgravity.window = to_ulong(src->xgravity.window);
-            dst->xgravity.x = src->xgravity.x;
-            dst->xgravity.y = src->xgravity.y;
-            break;
-        case XEVT_ResizeRequest:
-            dst->xresizerequest.width = src->xresizerequest.width;
-            dst->xresizerequest.height = src->xresizerequest.height;
-            break;
-        case XEVT_CirculateNotify:
-            dst->xcirculate.window = to_ulong(src->xcirculate.window);
-            dst->xcirculate.place = src->xcirculate.place;
-            break;
-        case XEVT_CirculateRequest:
-            dst->xcirculaterequest.window = to_ulong(src->xcirculaterequest.window);
-            dst->xcirculaterequest.place = src->xcirculaterequest.place;
-            break;
-        case XEVT_PropertyNotify:
-            dst->xproperty.atom = to_ulong(src->xproperty.atom);
-            dst->xproperty.time = to_ulong(src->xproperty.time);
-            dst->xproperty.state = src->xproperty.state;
-            break;
-        case XEVT_SelectionClear:
-            dst->xselectionclear.selection = to_ulong(src->xselectionclear.selection);
-            dst->xselectionclear.time = to_ulong(src->xselectionclear.time);
-            break;
-        case XEVT_SelectionRequest:
-            dst->xselectionrequest.requestor = to_ulong(src->xselectionrequest.requestor);
-            dst->xselectionrequest.selection = to_ulong(src->xselectionrequest.selection);
-            dst->xselectionrequest.target = to_ulong(src->xselectionrequest.target);
-            dst->xselectionrequest.property = to_ulong(src->xselectionrequest.property);
-            dst->xselectionrequest.time = to_ulong(src->xselectionrequest.time);
-            break;
-        case XEVT_SelectionNotify:
-            dst->xselection.selection = to_ulong(src->xselection.selection);
-            dst->xselection.target = to_ulong(src->xselection.target);
-            dst->xselection.property = to_ulong(src->xselection.property);
-            dst->xselection.time = to_ulong(src->xselection.time);
-            break;
-        case XEVT_ColormapNotify:
-            dst->xcolormap.colormap = to_ulong(src->xcolormap.colormap);
-            dst->xcolormap.c_new = src->xcolormap.c_new;
-            dst->xcolormap.state = src->xcolormap.state;
-            break;
-        case XEVT_ClientMessage:
-            dst->xclient.message_type = to_ulong(src->xclient.message_type);
-            dst->xclient.format = src->xclient.format;
-            if(src->xclient.format==32)
-                for(int i=0; i<5; ++i) {
-                    if(((src->xclient.data.l[i]&0xffffffff80000000LL))==0xffffffff80000000LL)
-                        dst->xclient.data.l[i] = to_ulong(src->xclient.data.l[i]&0xffffffff);   // negative value...
-                    else
-                        dst->xclient.data.l[i] = to_ulong(src->xclient.data.l[i]);
-                }
-            else
-                memcpy(dst->xclient.data.b, src->xclient.data.b, 20);
-            break;
-        case XEVT_MappingNotify:
-            dst->xmapping.request = src->xmapping.request;
-            dst->xmapping.first_keycode = src->xmapping.first_keycode;
-            dst->xmapping.count = src->xmapping.count;
-            break;
-        case XEVT_GenericEvent:
-            dst->xgeneric.extension = src->xgeneric.extension;
-            dst->xgeneric.evtype = src->xgeneric.evtype;
-            break;
-        default:
-            printf_log(LOG_INFO, "Warning, unsupported 32bits XEvent type=%d\n", src->type);
-    }
-}
-void unconvertXEvent(my_XEvent_t* dst, my_XEvent_32_t* src)
-{
-    if(!src->type) {
-        // This is an XErrorEvent, and it's different!
-        dst->xerror.type = src->xerror.type;
-        dst->xerror.display = getDisplay(from_ptrv(src->xerror.display));
-        dst->xerror.resourceid = from_ulong(src->xerror.resourceid);
-        dst->xerror.serial = from_ulong(src->xerror.serial);
-        dst->xerror.error_code = src->xerror.error_code;
-        dst->xerror.request_code = src->xerror.request_code;
-        dst->xerror.minor_code = src->xerror.minor_code;
-        return;
-    }
-    // convert the XAnyEvent first, as it's a common set
-    dst->type = src->type;
-    dst->xany.display = getDisplay(from_ptrv(src->xany.display));
-    dst->xany.window = from_ulong(src->xany.window);
-    dst->xany.send_event = src->xany.serial;
-    dst->xany.serial = from_ulong(src->xany.serial);
-    switch(src->type) {
-        case XEVT_KeyPress:
-        case XEVT_KeyRelease:
-            dst->xkey.root = from_ulong(src->xkey.root);
-            dst->xkey.subwindow = from_ulong(src->xkey.subwindow);
-            dst->xkey.time = from_ulong(src->xkey.time);
-            dst->xkey.x = src->xkey.x;
-            dst->xkey.y = src->xkey.y;
-            dst->xkey.x_root = src->xkey.x_root;
-            dst->xkey.y_root = src->xkey.y_root;
-            dst->xkey.state = src->xkey.state;
-            dst->xkey.keycode = src->xkey.keycode;
-            dst->xkey.same_screen = src->xkey.same_screen;
-            break;
-        case XEVT_ButtonPress:
-        case XEVT_ButtonRelease:
-            dst->xbutton.root = from_ulong(src->xbutton.root);
-            dst->xbutton.subwindow = from_ulong(src->xbutton.subwindow);
-            dst->xbutton.time = from_ulong(src->xbutton.time);
-            dst->xbutton.x = src->xbutton.x;
-            dst->xbutton.y = src->xbutton.y;
-            dst->xbutton.x_root = src->xbutton.x_root;
-            dst->xbutton.y_root = src->xbutton.y_root;
-            dst->xbutton.state = src->xbutton.state;
-            dst->xbutton.button = src->xbutton.button;
-            dst->xbutton.same_screen = src->xbutton.same_screen;
-            break;
-        case XEVT_MotionNotify:
-            dst->xmotion.root = from_ulong(src->xmotion.root);
-            dst->xmotion.subwindow = from_ulong(src->xmotion.subwindow);
-            dst->xmotion.time = from_ulong(src->xmotion.time);
-            dst->xmotion.x = src->xmotion.x;
-            dst->xmotion.y = src->xmotion.y;
-            dst->xmotion.x_root = src->xmotion.x_root;
-            dst->xmotion.y_root = src->xmotion.y_root;
-            dst->xmotion.state = src->xmotion.state;
-            dst->xmotion.is_hint = src->xmotion.is_hint;
-            dst->xmotion.same_screen = src->xmotion.same_screen;
-            break;
-        case XEVT_EnterNotify:
-        case XEVT_LeaveNotify:
-            dst->xcrossing.root = from_ulong(src->xcrossing.root);
-            dst->xcrossing.subwindow = from_ulong(src->xcrossing.subwindow);
-            dst->xcrossing.time = from_ulong(src->xcrossing.time);
-            dst->xcrossing.x = src->xcrossing.x;
-            dst->xcrossing.y = src->xcrossing.y;
-            dst->xcrossing.x_root = src->xcrossing.x_root;
-            dst->xcrossing.y_root = src->xcrossing.y_root;
-            dst->xcrossing.mode = src->xcrossing.mode;
-            dst->xcrossing.detail = src->xcrossing.detail;
-            dst->xcrossing.same_screen = src->xcrossing.same_screen;
-            dst->xcrossing.focus = src->xcrossing.focus;
-            dst->xcrossing.state = src->xcrossing.state;
-            break;
-        case XEVT_FocusIn:
-        case XEVT_FocusOut:
-            dst->xfocus.mode = src->xfocus.mode;
-            dst->xfocus.detail = src->xfocus.detail;
-            break;
-        case XEVT_KeymapNotify:
-            memcpy(dst->xkeymap.key_vector, src->xkeymap.key_vector, 32);
-            break;
-        case XEVT_Expose:
-            dst->xexpose.x = src->xexpose.x;
-            dst->xexpose.y = src->xexpose.y;
-            dst->xexpose.width = src->xexpose.width;
-            dst->xexpose.height = src->xexpose.height;
-            dst->xexpose.count = src->xexpose.count;
-            break;
-        case XEVT_GraphicsExpose:
-            dst->xgraphicsexpose.x = src->xgraphicsexpose.x;
-            dst->xgraphicsexpose.y = src->xgraphicsexpose.y;
-            dst->xgraphicsexpose.width = src->xgraphicsexpose.width;
-            dst->xgraphicsexpose.height = src->xgraphicsexpose.height;
-            dst->xgraphicsexpose.count = src->xgraphicsexpose.count;
-            dst->xgraphicsexpose.major_code = src->xgraphicsexpose.major_code;
-            dst->xgraphicsexpose.minor_code = src->xgraphicsexpose.minor_code;
-            break;
-        case XEVT_NoExpose:
-            dst->xnoexpose.major_code = src->xnoexpose.major_code;
-            dst->xnoexpose.minor_code = src->xnoexpose.minor_code;
-            break;
-        case XEVT_VisibilityNotify:
-            dst->xvisibility.state = src->xvisibility.state;
-            break;
-        case XEVT_CreateNotify:
-            dst->xcreatewindow.window = from_ulong(src->xcreatewindow.window);
-            dst->xcreatewindow.x = src->xcreatewindow.x;
-            dst->xcreatewindow.y = src->xcreatewindow.y;
-            dst->xcreatewindow.width = src->xcreatewindow.width;
-            dst->xcreatewindow.height = src->xcreatewindow.height;
-            dst->xcreatewindow.border_width = src->xcreatewindow.border_width;
-            dst->xcreatewindow.override_redirect = src->xcreatewindow.override_redirect;
-            break;
-        case XEVT_DestroyNotify:
-            dst->xdestroywindow.window = from_ulong(src->xdestroywindow.window);
-            break;
-        case XEVT_UnmapNotify:
-            dst->xunmap.window = from_ulong(src->xunmap.window);
-            dst->xunmap.from_configure = src->xunmap.from_configure;
-            break;
-        case XEVT_MapNotify:
-            dst->xmap.window = from_ulong(src->xmap.window);
-            dst->xmap.override_redirect = src->xmap.override_redirect;
-            break;
-        case XEVT_MapRequest:
-            dst->xmaprequest.window = from_ulong(src->xmaprequest.window);
-            break;
-        case XEVT_ReparentNotify:
-            dst->xreparent.window = from_ulong(src->xreparent.window);
-            dst->xreparent.parent = from_ulong(src->xreparent.parent);
-            dst->xreparent.x = src->xreparent.x;
-            dst->xreparent.y = src->xreparent.y;
-            dst->xreparent.override_redirect = src->xreparent.override_redirect;
-            break;
-        case XEVT_ConfigureNotify:
-            dst->xconfigure.window = from_ulong(src->xconfigure.window);
-            dst->xconfigure.x = src->xconfigure.x;
-            dst->xconfigure.y = src->xconfigure.y;
-            dst->xconfigure.width = src->xconfigure.width;
-            dst->xconfigure.height = src->xconfigure.height;
-            dst->xconfigure.border_width = src->xconfigure.border_width;
-            dst->xconfigure.above = from_ulong(src->xconfigure.above);
-            dst->xconfigure.override_redirect = src->xconfigure.override_redirect;
-            break;
-        case XEVT_ConfigureRequest:
-            dst->xconfigurerequest.window = from_ulong(src->xconfigurerequest.window);
-            dst->xconfigurerequest.x = src->xconfigurerequest.x;
-            dst->xconfigurerequest.y = src->xconfigurerequest.y;
-            dst->xconfigurerequest.width = src->xconfigurerequest.width;
-            dst->xconfigurerequest.height = src->xconfigurerequest.height;
-            dst->xconfigurerequest.border_width = src->xconfigurerequest.border_width;
-            dst->xconfigurerequest.above = from_ulong(src->xconfigurerequest.above);
-            dst->xconfigurerequest.detail = src->xconfigurerequest.detail;
-            dst->xconfigurerequest.value_mask = from_ulong(src->xconfigurerequest.value_mask);
-            break;
-        case XEVT_GravityNotify:
-            dst->xgravity.window = from_ulong(src->xgravity.window);
-            dst->xgravity.x = src->xgravity.x;
-            dst->xgravity.y = src->xgravity.y;
-            break;
-        case XEVT_ResizeRequest:
-            dst->xresizerequest.width = src->xresizerequest.width;
-            dst->xresizerequest.height = src->xresizerequest.height;
-            break;
-        case XEVT_CirculateNotify:
-            dst->xcirculate.window = from_ulong(src->xcirculate.window);
-            dst->xcirculate.place = src->xcirculate.place;
-            break;
-        case XEVT_CirculateRequest:
-            dst->xcirculaterequest.window = from_ulong(src->xcirculaterequest.window);
-            dst->xcirculaterequest.place = src->xcirculaterequest.place;
-            break;
-        case XEVT_PropertyNotify:
-            dst->xproperty.atom = from_ulong(src->xproperty.atom);
-            dst->xproperty.time = from_ulong(src->xproperty.time);
-            dst->xproperty.state = src->xproperty.state;
-            break;
-        case XEVT_SelectionClear:
-            dst->xselectionclear.selection = from_ulong(src->xselectionclear.selection);
-            dst->xselectionclear.time = from_ulong(src->xselectionclear.time);
-            break;
-        case XEVT_SelectionRequest:
-            dst->xselectionrequest.requestor = from_ulong(src->xselectionrequest.requestor);
-            dst->xselectionrequest.selection = from_ulong(src->xselectionrequest.selection);
-            dst->xselectionrequest.target = from_ulong(src->xselectionrequest.target);
-            dst->xselectionrequest.property = from_ulong(src->xselectionrequest.property);
-            dst->xselectionrequest.time = from_ulong(src->xselectionrequest.time);
-            break;
-        case XEVT_SelectionNotify:
-            dst->xselection.selection = from_ulong(src->xselection.selection);
-            dst->xselection.target = from_ulong(src->xselection.target);
-            dst->xselection.property = from_ulong(src->xselection.property);
-            dst->xselection.time = from_ulong(src->xselection.time);
-            break;
-        case XEVT_ColormapNotify:
-            dst->xcolormap.colormap = from_ulong(src->xcolormap.colormap);
-            dst->xcolormap.c_new = src->xcolormap.c_new;
-            dst->xcolormap.state = src->xcolormap.state;
-            break;
-        case XEVT_ClientMessage:
-            dst->xclient.message_type = from_ulong(src->xclient.message_type);
-            dst->xclient.format = src->xclient.format;
-            if(src->xclient.format==32)
-                for(int i=0; i<5; ++i) dst->xclient.data.l[i] = from_ulong(src->xclient.data.l[i]);
-            else
-                memcpy(dst->xclient.data.b, src->xclient.data.b, 20);
-            break;
-        case XEVT_MappingNotify:
-            dst->xmapping.request = src->xmapping.request;
-            dst->xmapping.first_keycode = src->xmapping.first_keycode;
-            dst->xmapping.count = src->xmapping.count;
-            break;
-        case XEVT_GenericEvent:
-            dst->xgeneric.extension = src->xgeneric.extension;
-            dst->xgeneric.evtype = src->xgeneric.evtype;
-            break;
-
-        default:
-            printf_log(LOG_INFO, "Warning, unsupported 32bits (un)XEvent type=%d\n", src->type);
-    }
-}
-
 EXPORT int my32_XNextEvent(x64emu_t* emu, void* dpy, my_XEvent_32_t* evt)
 {
     my_XEvent_t event = {0};
@@ -2246,6 +1640,14 @@ EXPORT int my32_XWindowEvent(x64emu_t* emu, void* dpy, XID window, long mask, my
     return ret;
 }
 
+EXPORT int my32_XMaskEvent(x64emu_t* emu, void* dpy, long mask, my_XEvent_32_t* evt)
+{
+    my_XEvent_t event = {0};
+    int ret = my->XMaskEvent(dpy, mask, &event);
+    if(ret) convertXEvent(evt, &event);
+    return ret;
+}
+
 EXPORT int my32_XSendEvent(x64emu_t* emu, void* dpy, XID window, int propagate, long mask, my_XEvent_32_t* evt)
 {
     my_XEvent_t event = {0};
@@ -2333,79 +1735,6 @@ EXPORT int my32_XSetWMProtocols(x64emu_t* emu, void* dpy, XID window, XID_32* pr
     return my->XSetWMProtocols(dpy, window, protocol?list:NULL, count);
 }
 
-void convert_XWMints_to_64(void* d, void* s)
-{
-    my_XWMHints_t* dst = d;
-    my_XWMHints_32_t* src = s;
-    long flags = from_long(src->flags);
-    // reverse order
-    if(flags&XWMHint_WindowGroupHint)   dst->window_group = from_ulong(src->window_group);
-    if(flags&XWMHint_IconMaskHint)      dst->icon_mask = from_ulong(src->icon_mask);
-    if(flags&XWMHint_IconPositionHint)  {dst->icon_y = src->icon_y; dst->icon_x = src->icon_x;}
-    if(flags&XWMHint_IconWindowHint)    dst->icon_window = from_ulong(src->icon_window);
-    if(flags&XWMHint_IconPixmapHint)    dst->icon_pixmap = from_ulong(src->icon_pixmap);
-    if(flags&XWMHint_StateHint)         dst->initial_state = src->initial_state;
-    if(flags&XWMHint_InputHint)         dst->input = src->input;
-
-    dst->flags = flags;
-}
-void inplace_enlarge_wmhints(void* hints)
-{
-    if(!hints) return;
-    my_XWMHints_32_t* src = hints;
-    my_XWMHints_t* dst = hints;
-    long flags = from_long(src->flags);
-    // reverse order
-    if(flags&XWMHint_WindowGroupHint)   dst->window_group = from_ulong(src->window_group);
-    if(flags&XWMHint_IconMaskHint)      dst->icon_mask = from_ulong(src->icon_mask);
-    if(flags&XWMHint_IconPositionHint)  {dst->icon_y = src->icon_y; dst->icon_x = src->icon_x;}
-    if(flags&XWMHint_IconWindowHint)    dst->icon_window = from_ulong(src->icon_window);
-    if(flags&XWMHint_IconPixmapHint)    dst->icon_pixmap = from_ulong(src->icon_pixmap);
-    if(flags&XWMHint_StateHint)         dst->initial_state = src->initial_state;
-    if(flags&XWMHint_InputHint)         dst->input = src->input;
-
-    dst->flags = flags;
-}
-void inplace_shrink_wmhints(void* hints)
-{
-    if(!hints) return;
-    my_XWMHints_t* src = hints;
-    my_XWMHints_32_t* dst = hints;
-    long_t flags = to_long(src->flags);
-    // forward order
-    if(flags&XWMHint_InputHint)         dst->input = src->input;
-    if(flags&XWMHint_StateHint)         dst->initial_state = src->initial_state;
-    if(flags&XWMHint_IconPixmapHint)    dst->icon_pixmap = to_ulong(src->icon_pixmap);
-    if(flags&XWMHint_IconWindowHint)    dst->icon_window = to_ulong(src->icon_window);
-    if(flags&XWMHint_IconPositionHint)  {dst->icon_y = src->icon_y; dst->icon_x = src->icon_x;}
-    if(flags&XWMHint_IconMaskHint)      dst->icon_mask = to_ulong(src->icon_mask);
-    if(flags&XWMHint_WindowGroupHint)   dst->window_group = to_ulong(src->window_group);
-
-    dst->flags = flags;
-}
-
-void convert_XSizeHints_to_64(void* d, void *s)
-{
-    //XSizeHints is a long flag and 17*int...
-    long flags = to_long(*(long_t*)s);
-    memcpy(d+8, s+4, 17*4);
-    *(long*)d = flags;
-}
-void inplace_enlarge_wmsizehints(void* hints)
-{
-    //XSizeHints is a long flag and 17*int...
-    long flags = to_long(*(long_t*)hints);
-    memmove(hints+8, hints+4, 17*4);
-    *(long*)hints = flags;
-}
-void inplace_shrink_wmsizehints(void* hints)
-{
-    //XSizeHints is a long flag and 17*int...
-    long_t flags = from_long(*(long*)hints);
-    memmove(hints+4, hints+8, 17*4);
-    *(long_t*)hints = flags;
-}
-
 EXPORT int my32_XSetWMHints(x64emu_t* emu, void* dpy, XID window, void* hints)
 {
     inplace_enlarge_wmhints(hints);
@@ -2414,6 +1743,13 @@ EXPORT int my32_XSetWMHints(x64emu_t* emu, void* dpy, XID window, void* hints)
     return ret;
 }
 
+EXPORT void* my32_XGetWMHints(x64emu_t* emu, void* dpy, XID window)
+{
+    void* ret = my->XGetWMHints(dpy, window);
+    inplace_shrink_wmhints(ret);
+    return ret;
+}
+
 EXPORT int my32_XSetWMNormalHints(x64emu_t* emu, void* dpy, XID window, void* hints)
 {
     inplace_enlarge_wmsizehints(hints);
@@ -2463,35 +1799,6 @@ EXPORT int my32_Xutf8TextListToTextProperty(x64emu_t* emu, void* dpy, ptr_t* lis
     return ret;
 }
 
-void convert_XWindowAttributes_to_32(void* d, void* s)
-{
-    my_XWindowAttributes_t* src = s;
-    my_XWindowAttributes_32_t* dst = d;
-    dst->x = src->x;
-    dst->y = src->y;
-    dst->width = src->width;
-    dst->height = src->height;
-    dst->border_width = src->border_width;
-    dst->depth = src->depth;
-    dst->visual = to_ptrv(src->visual);
-    dst->root = to_ulong(src->root);
-    dst->c_class = src->c_class;
-    dst->bit_gravity = src->bit_gravity;
-    dst->win_gravity = src->win_gravity;
-    dst->backing_store = src->backing_store;
-    dst->backing_planes = to_ulong(src->backing_planes);
-    dst->backing_pixel = to_ulong(src->backing_pixel);
-    dst->save_under = src->save_under;
-    dst->colormap = to_ulong(src->colormap);
-    dst->map_installed = src->map_installed;
-    dst->map_state = src->map_state;
-    dst->all_event_masks = to_long(src->all_event_masks);
-    dst->your_event_mask = to_long(src->your_event_mask);
-    dst->do_not_propagate_mask = to_long(src->do_not_propagate_mask);
-    dst->override_redirect = src->override_redirect;
-    dst->screen = to_ptrv(src->screen);
-}
-
 EXPORT int my32_XGetWindowAttributes(x64emu_t* emu, void* dpy, XID window, my_XWindowAttributes_32_t* attr)
 {
     static my_Screen_32_t screen32 = {0};
@@ -2660,23 +1967,6 @@ EXPORT int my32_XFreeColors(x64emu_t* emu, void* dpy, XID map, ulong_t* pixels,
     return my->XFreeColors(dpy, map, pixels_l, npixels, planes);
 }
 
-void inplace_XModifierKeymap_shrink(void* a)
-{
-    my_XModifierKeymap_32_t *d = a;
-    my_XModifierKeymap_t* s = a;
-
-    d->max_keypermod = s->max_keypermod;
-    d->modifiermap = to_ptrv(s->modifiermap);
-}
-void inplace_XModifierKeymap_enlarge(void* a)
-{
-    my_XModifierKeymap_t *d = a;
-    my_XModifierKeymap_32_t* s = a;
-
-    d->modifiermap = from_ptrv(s->modifiermap);
-    d->max_keypermod = s->max_keypermod;
-}
-
 EXPORT void* my32_XGetModifierMapping(x64emu_t* emu, void* dpy)
 {
     void *ret = my->XGetModifierMapping(dpy);
@@ -2717,49 +2007,6 @@ EXPORT void* my32_XGetIMValues(x64emu_t* emu, void* xim, ptr_t* b)
     return NULL;
 }
 
-void convert_XVisualInfo_to_32(my_XVisualInfo_32_t* dst, my_XVisualInfo_t* src)
-{
-    dst->visual = to_ptrv(src->visual);
-    dst->visualid = to_ulong(src->visualid);
-    dst->screen = src->screen;
-    dst->depth = src->depth;
-    dst->c_class = src->c_class;
-    dst->red_mask = to_ulong(src->red_mask);
-    dst->green_mask = to_ulong(src->green_mask);
-    dst->blue_mask = to_ulong(src->blue_mask);
-    dst->colormap_size = src->colormap_size;
-    dst->bits_per_rgb = src->bits_per_rgb;
-}
-void convert_XVisualInfo_to_64(my_XVisualInfo_t* dst, my_XVisualInfo_32_t* src)
-{
-    dst->bits_per_rgb = src->bits_per_rgb;
-    dst->colormap_size = src->colormap_size;
-    dst->blue_mask = from_ulong(src->blue_mask);
-    dst->green_mask = from_ulong(src->green_mask);
-    dst->red_mask = from_ulong(src->red_mask);
-    dst->c_class = src->c_class;
-    dst->depth = src->depth;
-    dst->screen = src->screen;
-    dst->visualid = from_ulong(src->visualid);
-    dst->visual = from_ptrv(src->visual);
-}
-void inplace_XVisualInfo_shrink(void *a)
-{
-    if(!a) return;
-    my_XVisualInfo_t *src = a;
-    my_XVisualInfo_32_t* dst = a;
-
-    convert_XVisualInfo_to_32(dst, src);
-}
-void inplace_XVisualInfo_enlarge(void *a)
-{
-    if(!a) return;
-    my_XVisualInfo_32_t *src = a;
-    my_XVisualInfo_t* dst = a;
-
-    convert_XVisualInfo_to_64(dst, src);
-}
-
 EXPORT void* my32_XGetVisualInfo(x64emu_t* emu, void* dpy, long mask, my_XVisualInfo_32_t* template, int* n)
 {
     my_XVisualInfo_t template_l = {0};
@@ -2783,7 +2030,11 @@ EXPORT int my32_XQueryColors(x64emu_t* emu, void* dpy, XID map, my_XColor_32_t*
 #define CUSTOM_INIT                 \
     AddAutomaticBridge(lib->w.bridge, vFp_32, *(void**)dlsym(lib->w.lib, "_XLockMutex_fn"), 0, "_XLockMutex_fn"); \
     AddAutomaticBridge(lib->w.bridge, vFp_32, *(void**)dlsym(lib->w.lib, "_XUnlockMutex_fn"), 0, "_XUnlockMutex_fn"); \
-    if(box64_x11threads) my->XInitThreads();
+    if(box64_x11threads) my->XInitThreads();    \
+    my_context->libx11 = lib;
+
+#define CUSTOM_FINI     \
+    my_context->libx11 = NULL;
 #if 0
 #ifdef ANDROID
 #define NEEDED_LIBS "libxcb.so"
diff --git a/src/wrapped32/wrappedlibx11_private.h b/src/wrapped32/wrappedlibx11_private.h
index 3c3b1240..fc0c7a17 100644
--- a/src/wrapped32/wrappedlibx11_private.h
+++ b/src/wrapped32/wrappedlibx11_private.h
@@ -305,13 +305,13 @@ GOM(XESetCloseDisplay, pFEXip)
 //GOM(XESetCreateGC, pFEXip)
 //GOM(XESetError, pFEXip)
 //GOM(XESetErrorString, pFEXip)
-//GOM(XESetEventToWire, pFEXip)
+GOM(XESetEventToWire, pFEXip)
 //GOM(XESetFlushGC, pFEXip)
 //GOM(XESetFreeFont, pFEXip)
 //GOM(XESetFreeGC, pFEXip)
 //GOM(XESetPrintErrorValues, pFEXip)
 //GOM(XESetWireToError, pFEXip)
-//GOM(XESetWireToEvent, pFEXip)
+GOM(XESetWireToEvent, pFEXip)
 //GOM(XESetWireToEventCookie, pFEXip)
 //GOM(XEventMaskOfScreen, lFEbpXLiiiiipippLLLiiiil_)
 GO(_XEventsQueued, iFXi)
@@ -416,7 +416,7 @@ GOM(XGetWindowAttributes, iFEXLp)
 GO(XGetWindowProperty, iFXLLlliLBL_pBL_BL_Bp_)
 GO(XGetWMClientMachine, iFXLbpLiL_)
 //GO(XGetWMColormapWindows, iFXLbbL__p)
-//GO(XGetWMHints, bliiLLiiLL_FXL)
+GOM(XGetWMHints, pFEXL)
 GO(XGetWMIconName, iFXLbpLiL_)
 GO(XGetWMName, iFXLbpLiL_)
 //GO(XGetWMNormalHints, iFpLpp)
@@ -887,7 +887,7 @@ GO(XLowerWindow, iFXL)
 GO(XMapRaised, iFXL)
 GO(XMapSubwindows, iFXL)
 GO(XMapWindow, iFXL)
-//GO(XMaskEvent, iFplp)
+GOM(XMaskEvent, iFEXlp)
 GO(XMatchVisualInfo, iFXiiiBpLiiiLLLii_)
 //GOM(XMaxCmapsOfScreen, iFEbpXLiiiiipippLLLiiiil_)
 GO(XMaxRequestSize, lFX)
@@ -996,7 +996,7 @@ GO(XRemoveFromSaveSet, iFXL)
 GO(XRemoveHost, iFXbiip_)
 GO(XRemoveHosts, iFXbiip_i)
 GO(XReparentWindow, iFXLLii)
-//GO(_XReply, iFppii)
+GO(_XReply, iFXpii)
 GO(XResetScreenSaver, iFX)
 GO(XResizeWindow, iFXLuu)
 GO(XResourceManagerString, pFX)
@@ -1077,7 +1077,7 @@ GOM(XSetIMValues, pFEpV)
 GO(XSetInputFocus, iFXLiL)
 //GOM(XSetIOErrorExitHandler, vFEXpp)
 GOM(XSetIOErrorHandler, pFEp)
-//GO(_XSetLastRequestRead, LFpp)
+GO(_XSetLastRequestRead, LFXp)
 GO(XSetLineAttributes, iFXpuiii)
 GO(XSetLocaleModifiers, pFp)
 GO(XSetModifierMapping, iFXbip_)
diff --git a/src/wrapped32/wrappedlibxext.c b/src/wrapped32/wrappedlibxext.c
index 16d910f3..efd390ba 100644
--- a/src/wrapped32/wrappedlibxext.c
+++ b/src/wrapped32/wrappedlibxext.c
@@ -26,35 +26,17 @@
 
 #define LIBNAME libxext
 
-#include "libtools/my_x11_defs.h"
-#include "libtools/my_x11_defs_32.h"
+#include "libtools/my_x11_conv.h"
 
 typedef struct _XImage XImage;
 void BridgeImageFunc(x64emu_t *emu, XImage *img);
 void UnbridgeImageFunc(x64emu_t *emu, XImage *img);
 typedef int (*XextErrorHandler)(void *, void *, void*);
 
-typedef struct my32_XExtensionHooks {
-    int (*create_gc)(void*, uint32_t, void*);
-    int (*copy_gc)(void*, uint32_t, void*);
-    int (*flush_gc)(void*, uint32_t, void*);
-    int (*free_gc)(void*, uint32_t, void*);
-    int (*create_font)(void*, void*, void*);
-    int (*free_font)(void*, void*, void*);
-    int (*close_display)(void*, void*);
-    int (*wire_to_event)(void*, void*, void*);
-    int (*event_to_wire)(void*, void*, void*);
-    int (*error)(void*, void*, void*, int*);
-    char *(*error_string)(void*, int, void*, void*, int);
-} my32_XExtensionHooks;
-
-
 #include "generated/wrappedlibxexttypes32.h"
 
 #include "wrappercallback32.h"
 
-void* getDisplay(void*);
-
 #define SUPER() \
 GO(0)   \
 GO(1)   \
@@ -96,10 +78,10 @@ static void* reverse_exterrorhandleFct(void* fct)
 }
 // create_gc ...
 #define GO(A)   \
-static uintptr_t my_create_gc_fct_##A = 0;                          \
-static int my_create_gc_##A(void* a, uint32_t b, void* c)           \
-{                                                                   \
-    return RunFunctionFmt(my_create_gc_fct_##A, "pup", a, b, c);    \
+static uintptr_t my_create_gc_fct_##A = 0;                                      \
+static int my_create_gc_##A(void* a, uint32_t b, void* c)                       \
+{                                                                               \
+    return RunFunctionFmt(my_create_gc_fct_##A, "pup", getDisplay(a), b, c);    \
 }
 SUPER()
 #undef GO
@@ -118,10 +100,10 @@ static void* find_create_gc_Fct(void* fct)
 }
 // copy_gc ...
 #define GO(A)   \
-static uintptr_t my_copy_gc_fct_##A = 0;                        \
-static int my_copy_gc_##A(void* a, uint32_t b, void* c)         \
-{                                                               \
-    return RunFunctionFmt(my_copy_gc_fct_##A, "pup", a, b, c);  \
+static uintptr_t my_copy_gc_fct_##A = 0;                                    \
+static int my_copy_gc_##A(void* a, uint32_t b, void* c)                     \
+{                                                                           \
+    return RunFunctionFmt(my_copy_gc_fct_##A, "pup", getDisplay(a), b, c);  \
 }
 SUPER()
 #undef GO
@@ -140,10 +122,10 @@ static void* find_copy_gc_Fct(void* fct)
 }
 // flush_gc ...
 #define GO(A)   \
-static uintptr_t my_flush_gc_fct_##A = 0;                           \
-static int my_flush_gc_##A(void* a, uint32_t b, void* c)            \
-{                                                                   \
-    return RunFunctionFmt(my_flush_gc_fct_##A, "pup", a, b, c);     \
+static uintptr_t my_flush_gc_fct_##A = 0;                                   \
+static int my_flush_gc_##A(void* a, uint32_t b, void* c)                    \
+{                                                                           \
+    return RunFunctionFmt(my_flush_gc_fct_##A, "pup", getDisplay(a), b, c); \
 }
 SUPER()
 #undef GO
@@ -162,10 +144,10 @@ static void* find_flush_gc_Fct(void* fct)
 }
 // free_gc ...
 #define GO(A)   \
-static uintptr_t my_free_gc_fct_##A = 0;                           \
-static int my_free_gc_##A(void* a, uint32_t b, void* c)            \
-{                                                                  \
-    return RunFunctionFmt(my_free_gc_fct_##A, "pup", a, b, c);     \
+static uintptr_t my_free_gc_fct_##A = 0;                                    \
+static int my_free_gc_##A(void* a, uint32_t b, void* c)                     \
+{                                                                           \
+    return RunFunctionFmt(my_free_gc_fct_##A, "pup", getDisplay(a), b, c);  \
 }
 SUPER()
 #undef GO
@@ -184,10 +166,13 @@ static void* find_free_gc_Fct(void* fct)
 }
 // create_font ...
 #define GO(A)   \
-static uintptr_t my_create_font_fct_##A = 0;                            \
-static int my_create_font_##A(void* a, void* b, void* c)                \
-{                                                                       \
-    return RunFunctionFmt(my_create_font_fct_##A, "ppp", a, b, c);      \
+static uintptr_t my_create_font_fct_##A = 0;                                        \
+static int my_create_font_##A(void* a, void* b, void* c)                            \
+{                                                                                   \
+    inplace_XFontStruct_shrink(b);                                                  \
+    int ret = RunFunctionFmt(my_create_font_fct_##A, "ppp", getDisplay(a), b, c);   \
+    inplace_XFontStruct_enlarge(b);                                                 \
+    return ret;                                                                     \
 }
 SUPER()
 #undef GO
@@ -206,10 +191,13 @@ static void* find_create_font_Fct(void* fct)
 }
 // free_font ...
 #define GO(A)   \
-static uintptr_t my_free_font_fct_##A = 0;                            \
-static int my_free_font_##A(void* a, void* b, void* c)                \
-{                                                                     \
-    return RunFunctionFmt(my_free_font_fct_##A, "ppp", a, b, c);      \
+static uintptr_t my_free_font_fct_##A = 0;                                      \
+static int my_free_font_##A(void* a, void* b, void* c)                          \
+{                                                                               \
+    inplace_XFontStruct_shrink(b);                                              \
+    int ret = RunFunctionFmt(my_free_font_fct_##A, "ppp", getDisplay(a), b, c); \
+    inplace_XFontStruct_enlarge(b);                                             \
+    return ret;                                                                 \
 }
 SUPER()
 #undef GO
@@ -228,10 +216,10 @@ static void* find_free_font_Fct(void* fct)
 }
 // close_display ...
 #define GO(A)   \
-static uintptr_t my_close_display_fct_##A = 0;                  \
-static int my_close_display_##A(void* a, void* b)               \
-{                                                               \
-    return RunFunctionFmt(my_close_display_fct_##A, "pp", a, b);\
+static uintptr_t my_close_display_fct_##A = 0;                                  \
+static int my_close_display_##A(void* a, void* b)                               \
+{                                                                               \
+    return RunFunctionFmt(my_close_display_fct_##A, "pp", getDisplay(a), b);    \
 }
 SUPER()
 #undef GO
@@ -250,10 +238,12 @@ static void* find_close_display_Fct(void* fct)
 }
 // wire_to_event ...
 #define GO(A)   \
-static uintptr_t my_wire_to_event_fct_##A = 0;                          \
-static int my_wire_to_event_##A(void* a, void* b, void* c)              \
-{                                                                       \
-    return RunFunctionFmt(my_wire_to_event_fct_##A, "ppp", a, b, c);    \
+static uintptr_t my_wire_to_event_fct_##A = 0;                                          \
+static int my_wire_to_event_##A(void* a, void* b, void* c)                              \
+{                                                                                       \
+    static my_XEvent_32_t evt;                                                          \
+    int ret = RunFunctionFmt(my_wire_to_event_fct_##A, "ppp", getDisplay(a), &evt, c);  \
+    unconvertXEvent(b, &evt);                                                           \
 }
 SUPER()
 #undef GO
@@ -272,10 +262,12 @@ static void* find_wire_to_event_Fct(void* fct)
 }
 // event_to_wire ...
 #define GO(A)   \
-static uintptr_t my_event_to_wire_fct_##A = 0;                          \
-static int my_event_to_wire_##A(void* a, void* b, void* c)              \
-{                                                                       \
-    return RunFunctionFmt(my_event_to_wire_fct_##A, "ppp", a, b, c);    \
+static uintptr_t my_event_to_wire_fct_##A = 0;                                      \
+static int my_event_to_wire_##A(void* a, void* b, void* c)                          \
+{                                                                                   \
+    static my_XEvent_32_t evt;                                                      \
+    convertXEvent(&evt, b);                                                         \
+    return RunFunctionFmt(my_event_to_wire_fct_##A, "ppp", getDisplay(a), &evt, c); \
 }
 SUPER()
 #undef GO
@@ -294,10 +286,10 @@ static void* find_event_to_wire_Fct(void* fct)
 }
 // error ...
 #define GO(A)   \
-static uintptr_t my_error_fct_##A = 0;                              \
-static int my_error_##A(void* a, void* b, void* c, int* d)          \
-{                                                                   \
-    return RunFunctionFmt(my_error_fct_##A, "pppp", a, b, c, d);    \
+static uintptr_t my_error_fct_##A = 0;                                          \
+static int my_error_##A(void* a, void* b, void* c, int* d)                      \
+{                                                                               \
+    return RunFunctionFmt(my_error_fct_##A, "pppp", getDisplay(a), b, c, d);    \
 }
 SUPER()
 #undef GO
@@ -316,10 +308,10 @@ static void* find_error_Fct(void* fct)
 }
 // error_string ...
 #define GO(A)   \
-static uintptr_t my_error_string_fct_##A = 0;                               \
-static int my_error_string_##A(void* a, int b, void* c, void* d, int e)     \
-{                                                                           \
-    return RunFunctionFmt(my_error_string_fct_##A, "pippi", a, b, c, d, e); \
+static uintptr_t my_error_string_fct_##A = 0;                                           \
+static int my_error_string_##A(void* a, int b, void* c, void* d, int e)                 \
+{                                                                                       \
+    return RunFunctionFmt(my_error_string_fct_##A, "pippi", getDisplay(a), b, c, d, e); \
 }
 SUPER()
 #undef GO
@@ -395,48 +387,6 @@ EXPORT void* my32_XSetExtensionErrorHandler(x64emu_t* emu, void* handler)
 //    void *ret = my->XextAddDisplay(extinfo, dpy, extname, &natives, nevents, data);
 //    return ret;
 //}
-void inplace_XdbeVisualInfo_shrink(void* a)
-{
-    if(!a) return;
-    my_XdbeVisualInfo_t *src = a;
-    my_XdbeVisualInfo_32_t* dst = a;
-
-    dst->visual = to_ulong(src->visual);
-    dst->depth = src->depth;
-    dst->perflevel = src->perflevel;
-}
-void inplace_XdbeScreenVisualInfo_shrink(void* a)
-{
-    if(!a) return;
-    my_XdbeScreenVisualInfo_t *src = a;
-    my_XdbeScreenVisualInfo_32_t* dst = a;
-
-    for(int i=0; i<src->count; ++i)
-        inplace_XdbeVisualInfo_shrink(src->visinfo+i);
-    dst->count = src->count;
-    dst->visinfo = to_ptrv(src->visinfo);
-}
-void inplace_XdbeVisualInfo_enlarge(void* a)
-{
-    if(!a) return;
-    my_XdbeVisualInfo_32_t *src = a;
-    my_XdbeVisualInfo_t* dst = a;
-
-    dst->perflevel = src->perflevel;
-    dst->depth = src->depth;
-    dst->visual = from_ulong(src->visual);
-}
-void inplace_XdbeScreenVisualInfo_enlarge(void* a)
-{
-    if(!a) return;
-    my_XdbeScreenVisualInfo_32_t *src = a;
-    my_XdbeScreenVisualInfo_t* dst = a;
-
-    dst->visinfo = from_ptrv(src->visinfo);
-    dst->count = src->count;
-    for(int i=dst->count-1; i>=0; --i)
-        inplace_XdbeVisualInfo_enlarge(dst->visinfo+i);
-}
 
 EXPORT void* my32_XdbeGetVisualInfo(x64emu_t* emu, void* dpy, XID_32* draws, int* num)
 {
@@ -455,6 +405,47 @@ EXPORT void my32_XdbeFreeVisualInfo(x64emu_t* emu, void* infos)
     my->XdbeFreeVisualInfo(infos);
 }
 
+EXPORT void* my32_XextCreateExtension(x64emu_t* emu)
+{
+    return  inplace_XExtensionInfo_shrink(my->XextCreateExtension());
+}
+
+EXPORT void my32_XextDestroyExtension(x64emu_t* emu, void* ext)
+{
+    my->XextDestroyExtension(inplace_XExtensionInfo_enlarge(ext));
+}
+
+EXPORT void* my32_XextAddDisplay(x64emu_t* emu, void* ext, void* dpy, void* name, my_XExtensionHooks_32_t* hooks, int nevents, void* data)
+{
+    my_XExtensionHooks_t hooks_l = {0};
+    if(hooks) {
+        #define GO(A) hooks_l.A = find_##A##_Fct(from_ptrv(hooks->A))
+        GO(create_gc);
+        GO(copy_gc);
+        GO(flush_gc);
+        GO(free_gc);
+        GO(create_font);
+        GO(free_font);
+        GO(close_display);
+        GO(wire_to_event);
+        GO(event_to_wire);
+        GO(error);
+        GO(error_string);
+        #undef GO
+    }
+    inplace_XExtensionInfo_shrink(my->XextAddDisplay(inplace_XExtensionInfo_enlarge(ext), dpy, name, hooks?(&hooks_l):NULL, nevents, data));
+}
+
+EXPORT void* my32_XextFindDisplay(x64emu_t* emu, void* ext, void* dpy)
+{
+    return inplace_XExtensionInfo_shrink(my->XextFindDisplay(inplace_XExtensionInfo_enlarge(ext), dpy));
+}
+
+EXPORT int my32_XextRemoveDisplay(x64emu_t* emu, void* ext, void* dpy)
+{
+    return my->XextRemoveDisplay(inplace_XExtensionInfo_enlarge(ext), dpy);
+}
+
 #if 0
 #ifdef ANDROID
 #define NEEDED_LIBS "libX11.so", "libxcb.so", "libXau.so", "libdl.so", "libXdmcp.so"
diff --git a/src/wrapped32/wrappedlibxext_private.h b/src/wrapped32/wrappedlibxext_private.h
index 1f46c486..ea66930f 100644
--- a/src/wrapped32/wrappedlibxext_private.h
+++ b/src/wrapped32/wrappedlibxext_private.h
@@ -34,12 +34,12 @@ GO(XdbeSwapBuffers, iFXbLC_i)
 //GO(XeviGetVisualInfo, iFXbL_ibbLiiuuuuubL___p)
 GO(XeviQueryExtension, iFX)
 GO(XeviQueryVersion, iFXpp)
-//GOM(XextAddDisplay, pFEbppi_Xpbppppppppppp_ip)
-//GOM(XextCreateExtension, bppi_FEv)
-//GOM(XextDestroyExtension, vFEbppi_)
+GOM(XextAddDisplay, pFEpXppip)
+GOM(XextCreateExtension, pFEv)
+GOM(XextDestroyExtension, vFEp)
 //DATAB(_XExtensionErrorFunction, 4)
-//GOM(XextFindDisplay, pFEbppi_X)
-//GOM(XextRemoveDisplay, iFEbppi_X)
+GOM(XextFindDisplay, pFEpX)
+GOM(XextRemoveDisplay, iFEpX)
 GO(XGEQueryExtension, iFXpp)
 GO(XGEQueryVersion, iFXpp)
 GO(XLbxGetEventBase, iFX)