about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-12 18:39:09 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-12 18:40:31 +0200
commitb6cd19b78bf3cce7cdc55c4210f5174eb8b76e28 (patch)
tree9e4cd0c62f25f42145ac0e8f80c8caa82789d38c /src
parent6a3a19da68b6d4d59d368172f2f3e411326258fd (diff)
downloadbox64-b6cd19b78bf3cce7cdc55c4210f5174eb8b76e28.tar.gz
box64-b6cd19b78bf3cce7cdc55c4210f5174eb8b76e28.zip
[BOX32] More work on libX11 and friends, using more shadow structure like Screen and Visual (help wine, probably other too)
Diffstat (limited to 'src')
-rw-r--r--src/libtools/my_x11_conv.c134
-rw-r--r--src/libtools/my_x11_conv.h13
-rw-r--r--src/libtools/my_x11_defs.h234
-rw-r--r--src/libtools/my_x11_defs_32.h16
-rw-r--r--src/wrapped32/generated/functions_list.txt19
-rw-r--r--src/wrapped32/generated/wrappedlibx11types32.h4
-rw-r--r--src/wrapped32/generated/wrappedlibxexttypes32.h9
-rw-r--r--src/wrapped32/generated/wrapper32.c16
-rw-r--r--src/wrapped32/generated/wrapper32.h8
-rw-r--r--src/wrapped32/wrappedlibgl.c17
-rw-r--r--src/wrapped32/wrappedlibx11.c89
-rw-r--r--src/wrapped32/wrappedlibx11_private.h4
-rw-r--r--src/wrapped32/wrappedlibxext.c70
-rw-r--r--src/wrapped32/wrappedlibxext_private.h10
-rw-r--r--src/wrapped32/wrappedlibxrender.c23
15 files changed, 463 insertions, 203 deletions
diff --git a/src/libtools/my_x11_conv.c b/src/libtools/my_x11_conv.c
index b4f4b091..89709a9f 100644
--- a/src/libtools/my_x11_conv.c
+++ b/src/libtools/my_x11_conv.c
@@ -12,11 +12,19 @@
 #include "my_x11_defs_32.h"
 #include "my_x11_conv.h"
 
+typedef struct Visuals_s {
+    my_Visual_t* _64;
+    my_Visual_32_t* _32;
+    int ref;    // 0 is 64, 1 is 32
+} Visuals_t;
+KHASH_MAP_INIT_INT(visuals, Visuals_t);
+
 #define N_DISPLAY 4
 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_XDisplay_32_t my32_Displays_32[N_DISPLAY] = {0};
+kh_visuals_t* my32_Displays_Visuals[N_DISPLAY] = {0};
 
 void* getDisplay(void* d)
 {
@@ -65,6 +73,90 @@ void convert_Screen_to_32(void* d, void* s)
     dst->root_input_mask = to_long(src->root_input_mask);
 }
 
+void internal_convert_Visual_to_32(void* d, void* s)
+{
+    my_Visual_t* src = s;
+    my_Visual_32_t* dst = d;
+    dst->ext_data = to_ptrv(src->ext_data);
+    dst->visualid = to_ulong(src->visualid);
+    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->bits_per_rgb = src->bits_per_rgb;
+    dst->map_entries = src->map_entries;
+}
+void internal_convert_Visual_to_64(void* d, void* s)
+{
+    my_Visual_32_t* src = s;
+    my_Visual_t* dst = d;
+    dst->map_entries = src->map_entries;
+    dst->bits_per_rgb = src->bits_per_rgb;
+    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->visualid = from_ulong(src->visualid);
+    dst->ext_data = from_ptrv(src->ext_data);
+}
+
+my_Visual_32_t* getVisual32(int N, my_Visual_t* a)
+{
+    if(!a) return NULL;
+    uint32_t key = a->visualid;
+    khint_t k = kh_get(visuals, my32_Displays_Visuals[N], key);
+    Visuals_t* ret = NULL;
+    if(k==kh_end(my32_Displays_Visuals[N])) {
+        int r;
+        k = kh_put(visuals, my32_Displays_Visuals[N], key, &r);
+        ret = &kh_value(my32_Displays_Visuals[N], k);
+        ret->_32 = calloc(1, sizeof(my_Visual_32_t));
+        ret->_64 = a;
+        ret->ref = 0;
+        internal_convert_Visual_to_32(ret->_32, ret->_64);
+    } else
+        ret = &kh_value(my32_Displays_Visuals[N], k);
+    return ret->_32;
+}
+my_Visual_t* getVisual64(int N, my_Visual_32_t* a)
+{
+    if(!a) return NULL;
+    uint32_t key = a->visualid;
+    khint_t k = kh_get(visuals, my32_Displays_Visuals[N], key);
+    Visuals_t* ret = NULL;
+    if(k==kh_end(my32_Displays_Visuals[N])) {
+        int r;
+        k = kh_put(visuals, my32_Displays_Visuals[N], key, &r);
+        ret = &kh_value(my32_Displays_Visuals[N], k);
+        ret->_64 = calloc(1, sizeof(my_Visual_t));
+        ret->_32 = a;
+        ret->ref = 1;
+        internal_convert_Visual_to_64(ret->_64, ret->_32);
+    } else
+        ret = &kh_value(my32_Displays_Visuals[N], k);
+    return ret->_64;
+}
+
+void* convert_Visual_to_32(void* dpy, void* a)
+{
+    if(!dpy) return a;
+    for(int i=0; i<N_DISPLAY; ++i)
+        if(((&my32_Displays_32[i])==dpy) || (my32_Displays_64[i]==dpy)) {
+            return getVisual32(i, a);
+        }
+    return a;
+}
+void* convert_Visual_to_64(void* dpy, void* a)
+{
+    if(!dpy) return a;
+    for(int i=0; i<N_DISPLAY; ++i)
+        if(((&my32_Displays_32[i])==dpy) || (my32_Displays_64[i]==dpy)) {
+            return getVisual64(i, a);
+        }
+    return a;
+}
+
+
 void* my_dlopen(x64emu_t* emu, void *filename, int flag);
 void* addDisplay(void* d)
 {
@@ -92,6 +184,7 @@ void* addDisplay(void* d)
             ret->free_funcs = to_ptrv(free_funcs);
             lock_fns = &my32_lock_fns_32[i];
             ret->lock_fns = to_ptrv(lock_fns);
+            my32_Displays_Visuals[i] = kh_init(visuals);
         }
     }
     if(!ret) {
@@ -135,6 +228,7 @@ void* addDisplay(void* d)
         ret->screens = to_ptrv(screens);
         for(int i=0; i<dpy->nscreens; ++i) {
             convert_Screen_to_32(screens+i, dpy->screens+i);
+            screens[i].root_visual = to_ptrv(getVisual32(i, dpy->screens[i].root_visual));
         }
     } else
         ret->screens = 0;
@@ -180,6 +274,11 @@ void delDisplay(void* d)
             my32_Displays_64[i] = NULL;
             free(from_ptrv(my32_Displays_32[i].screens));
             my32_Displays_32[i].screens = 0;
+            Visuals_t* v;
+            uint32_t k;
+            kh_foreach_ref(my32_Displays_Visuals[i], k, v, if(v->ref) free(v->_64); else free(v->_32));
+            kh_destroy(visuals, my32_Displays_Visuals[i]);
+            my32_Displays_Visuals[i] = NULL;
             return;
         }
     }
@@ -322,9 +421,9 @@ void inplace_XModifierKeymap_enlarge(void* a)
     d->max_keypermod = s->max_keypermod;
 }
 
-void convert_XVisualInfo_to_32(my_XVisualInfo_32_t* dst, my_XVisualInfo_t* src)
+void convert_XVisualInfo_to_32(void* dpy, my_XVisualInfo_32_t* dst, my_XVisualInfo_t* src)
 {
-    dst->visual = to_ptrv(src->visual);
+    dst->visual = to_ptrv(convert_Visual_to_32(dpy, src->visual));
     dst->visualid = to_ulong(src->visualid);
     dst->screen = src->screen;
     dst->depth = src->depth;
@@ -335,7 +434,7 @@ void convert_XVisualInfo_to_32(my_XVisualInfo_32_t* dst, my_XVisualInfo_t* src)
     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)
+void convert_XVisualInfo_to_64(void* dpy, my_XVisualInfo_t* dst, my_XVisualInfo_32_t* src)
 {
     dst->bits_per_rgb = src->bits_per_rgb;
     dst->colormap_size = src->colormap_size;
@@ -346,23 +445,23 @@ void convert_XVisualInfo_to_64(my_XVisualInfo_t* dst, my_XVisualInfo_32_t* src)
     dst->depth = src->depth;
     dst->screen = src->screen;
     dst->visualid = from_ulong(src->visualid);
-    dst->visual = from_ptrv(src->visual);
+    dst->visual = convert_Visual_to_64(dpy, from_ptrv(src->visual));
 }
-void inplace_XVisualInfo_shrink(void *a)
+void inplace_XVisualInfo_shrink(void* dpy, void *a)
 {
     if(!a) return;
     my_XVisualInfo_t *src = a;
     my_XVisualInfo_32_t* dst = a;
 
-    convert_XVisualInfo_to_32(dst, src);
+    convert_XVisualInfo_to_32(dpy, dst, src);
 }
-void inplace_XVisualInfo_enlarge(void *a)
+void inplace_XVisualInfo_enlarge(void* dpy, void *a)
 {
     if(!a) return;
     my_XVisualInfo_32_t *src = a;
     my_XVisualInfo_t* dst = a;
 
-    convert_XVisualInfo_to_64(dst, src);
+    convert_XVisualInfo_to_64(dpy, dst, src);
 }
 
 void inplace_XdbeVisualInfo_shrink(void* a)
@@ -868,3 +967,22 @@ void inplace_XDevice_enlarge(void* a)
     dst->num_classes = src->num_classes;
     dst->device_id = src->device_id;
 }
+
+void convert_XShmSegmentInfo_to_32(void* d, void* s)
+{
+    my_XShmSegmentInfo_t* src = s;
+    my_XShmSegmentInfo_32_t* dst = d;
+    dst->shmseg = to_ulong(src->shmseg);
+    dst->shmid = src->shmid;
+    dst->shmaddr = to_ptrv(src->shmaddr);
+    dst->readOnly = src->readOnly;
+}
+void convert_XShmSegmentInfo_to_64(void* d, void* s)
+{
+    my_XShmSegmentInfo_32_t* src = s;
+    my_XShmSegmentInfo_t* dst = d;
+    dst->readOnly = src->readOnly;
+    dst->shmaddr = from_ptrv(src->shmaddr);
+    dst->shmid = src->shmid;
+    dst->shmseg = from_ulong(src->shmseg);
+}
\ No newline at end of file
diff --git a/src/libtools/my_x11_conv.h b/src/libtools/my_x11_conv.h
index 9a39fe4e..b6dc28fd 100644
--- a/src/libtools/my_x11_conv.h
+++ b/src/libtools/my_x11_conv.h
@@ -25,6 +25,9 @@ void refreshDisplay(void* dpy);
 
 void convert_Screen_to_32(void* d, void* s);
 
+void* convert_Visual_to_32(void* dpy, void* a);
+void* convert_Visual_to_64(void* dpy, void* a);
+
 void convert_XWMints_to_64(void* d, void* s);
 void inplace_enlarge_wmhints(void* hints);
 void inplace_shrink_wmhints(void* hints);
@@ -37,10 +40,10 @@ void convert_XWindowAttributes_to_32(void* d, void* s);
 void inplace_XModifierKeymap_shrink(void* a);
 void inplace_XModifierKeymap_enlarge(void* a);
 
-void convert_XVisualInfo_to_32(my_XVisualInfo_32_t* dst, my_XVisualInfo_t* src);
-void convert_XVisualInfo_to_64(my_XVisualInfo_t* dst, my_XVisualInfo_32_t* src);
-void inplace_XVisualInfo_shrink(void *a);
-void inplace_XVisualInfo_enlarge(void *a);
+void convert_XVisualInfo_to_32(void* dpy, my_XVisualInfo_32_t* dst, my_XVisualInfo_t* src);
+void convert_XVisualInfo_to_64(void* dpy, my_XVisualInfo_t* dst, my_XVisualInfo_32_t* src);
+void inplace_XVisualInfo_shrink(void* dpy, void *a);
+void inplace_XVisualInfo_enlarge(void* dpy, void *a);
 
 void inplace_XdbeVisualInfo_shrink(void* a);
 void inplace_XdbeScreenVisualInfo_shrink(void* a);
@@ -91,4 +94,6 @@ void unregister_XFixes_events();
 void register_XRandR_events(int event_base);
 void unregister_XRandR_events();
 
+void convert_XShmSegmentInfo_to_32(void* d, void* s);
+void convert_XShmSegmentInfo_to_64(void* d, void* s);
 #endif//MY_X11_CONV
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs.h b/src/libtools/my_x11_defs.h
index ad1e2de3..e422f8f3 100644
--- a/src/libtools/my_x11_defs.h
+++ b/src/libtools/my_x11_defs.h
@@ -108,119 +108,128 @@ struct my_XConnWatchInfo {
     struct _XConnWatchInfo *next;
 };
 
+typedef struct my_Visual_s {
+    void*   ext_data;   //XExtData*
+    XID visualid;
+    int c_class;
+    unsigned long red_mask, green_mask, blue_mask;
+    int bits_per_rgb;
+    int map_entries;
+} my_Visual_t;
+
 typedef struct my_Screen_s {
-        void* ext_data;         //XExtData *
-        struct my_XDisplay_s *display;
-        XID root;
-        int width, height;
-        int mwidth, mheight;
-        int ndepths;
-        void* depths;   //Depth *
-        int root_depth;         /* bits per pixel */
-        void* root_visual;  //Visual *
-        void* default_gc;   //GC == struct _XGC*
-        XID cmap;
-        unsigned long white_pixel;
-        unsigned long black_pixel;
-        int max_maps, min_maps;
-        int backing_store;
-        int save_unders;
-        long root_input_mask;
+    void* ext_data;         //XExtData *
+    struct my_XDisplay_s *display;
+    XID root;
+    int width, height;
+    int mwidth, mheight;
+    int ndepths;
+    void* depths;   //Depth *
+    int root_depth;         /* bits per pixel */
+    my_Visual_t* root_visual;
+    void* default_gc;   //GC == struct _XGC*
+    XID cmap;
+    unsigned long white_pixel;
+    unsigned long black_pixel;
+    int max_maps, min_maps;
+    int backing_store;
+    int save_unders;
+    long root_input_mask;
 } my_Screen_t;
 
 typedef struct my_XDisplay_s
 {
-        void *ext_data;
-        struct my_XFreeFuncs *free_funcs;
-        int fd;
-        int conn_checker;
-        int proto_major_version;
-        int proto_minor_version;
-        char *vendor;
-        XID resource_base;
-        XID resource_mask;
-        XID resource_id;
-        int resource_shift;
-        XID (*resource_alloc)(void*);
-        int byte_order;
-        int bitmap_unit;
-        int bitmap_pad;
-        int bitmap_bit_order;
-        int nformats;
-        void *pixmap_format;
-        int vnumber;
-        int release;
-        void *head, *tail;
-        int qlen;
-        unsigned long last_request_read;
-        unsigned long request;
-        char *last_req;
-        char *buffer;
-        char *bufptr;
-        char *bufmax;
-        unsigned max_request_size;
-        void* *db;
-        int (*synchandler)(void*);
-        char *display_name;
-        int default_screen;
-        int nscreens;
-        my_Screen_t *screens;
-        unsigned long motion_buffer;
-        volatile unsigned long flags;
-        int min_keycode;
-        int max_keycode;
-        void *keysyms;
-        void *modifiermap;
-        int keysyms_per_keycode;
-        char *xdefaults;
-        char *scratch_buffer;
-        unsigned long scratch_length;
-        int ext_number;
-        struct my_XExten *ext_procs;
-        int (*event_vec[128])(void *, void *, void *);
-        int (*wire_vec[128])(void *, void *, void *);
-        XID lock_meaning;
-        void* lock;
-        struct my_XInternalAsync *async_handlers;
-        unsigned long bigreq_size;
-        struct my_XLockPtrs *lock_fns;
-        void (*idlist_alloc)(void *, void *, int);
-        void* key_bindings;
-        XID cursor_font;
-        void* *atoms;
-        unsigned int mode_switch;
-        unsigned int num_lock;
-        void* context_db;
-        int (**error_vec)(void*, void*, void*);
-        struct {
-           void* defaultCCCs;
-           void* clientCmaps;
-           void* perVisualIntensityMaps;
-        } cms;
-        void* im_filters;
-        void* qfree;
-        unsigned long next_event_serial_num;
-        struct my_XExten *flushes;
-        struct my_XConnectionInfo *im_fd_info;
-        int im_fd_length;
-        struct my_XConnWatchInfo *conn_watchers;
-        int watcher_count;
-        void* filedes;
-        int (*savedsynchandler)(void *);
-        XID resource_max;
-        int xcmisc_opcode;
-        void* *xkb_info;
-        void* *trans_conn;
-        void* *xcb;
-        unsigned int next_cookie;
-        int (*generic_event_vec[128])(void*, void*, void*);
-        int (*generic_event_copy_vec[128])(void*, void*, void*);
-        void *cookiejar;
-        unsigned long last_request_read_upper32bit; // 64bits only
-        unsigned long request_upper32bit;   // 64bits only
-        void* error_threads;
-        void* exit_handler;
-        void* exit_handler_data;
+    void *ext_data;
+    struct my_XFreeFuncs *free_funcs;
+    int fd;
+    int conn_checker;
+    int proto_major_version;
+    int proto_minor_version;
+    char *vendor;
+    XID resource_base;
+    XID resource_mask;
+    XID resource_id;
+    int resource_shift;
+    XID (*resource_alloc)(void*);
+    int byte_order;
+    int bitmap_unit;
+    int bitmap_pad;
+    int bitmap_bit_order;
+    int nformats;
+    void *pixmap_format;
+    int vnumber;
+    int release;
+    void *head, *tail;
+    int qlen;
+    unsigned long last_request_read;
+    unsigned long request;
+    char *last_req;
+    char *buffer;
+    char *bufptr;
+    char *bufmax;
+    unsigned max_request_size;
+    void* *db;
+    int (*synchandler)(void*);
+    char *display_name;
+    int default_screen;
+    int nscreens;
+    my_Screen_t *screens;
+    unsigned long motion_buffer;
+    volatile unsigned long flags;
+    int min_keycode;
+    int max_keycode;
+    void *keysyms;
+    void *modifiermap;
+    int keysyms_per_keycode;
+    char *xdefaults;
+    char *scratch_buffer;
+    unsigned long scratch_length;
+    int ext_number;
+    struct my_XExten *ext_procs;
+    int (*event_vec[128])(void *, void *, void *);
+    int (*wire_vec[128])(void *, void *, void *);
+    XID lock_meaning;
+    void* lock;
+    struct my_XInternalAsync *async_handlers;
+    unsigned long bigreq_size;
+    struct my_XLockPtrs *lock_fns;
+    void (*idlist_alloc)(void *, void *, int);
+    void* key_bindings;
+    XID cursor_font;
+    void* *atoms;
+    unsigned int mode_switch;
+    unsigned int num_lock;
+    void* context_db;
+    int (**error_vec)(void*, void*, void*);
+    struct {
+        void* defaultCCCs;
+        void* clientCmaps;
+        void* perVisualIntensityMaps;
+    } cms;
+    void* im_filters;
+    void* qfree;
+    unsigned long next_event_serial_num;
+    struct my_XExten *flushes;
+    struct my_XConnectionInfo *im_fd_info;
+    int im_fd_length;
+    struct my_XConnWatchInfo *conn_watchers;
+    int watcher_count;
+    void* filedes;
+    int (*savedsynchandler)(void *);
+    XID resource_max;
+    int xcmisc_opcode;
+    void* *xkb_info;
+    void* *trans_conn;
+    void* *xcb;
+    unsigned int next_cookie;
+    int (*generic_event_vec[128])(void*, void*, void*);
+    int (*generic_event_copy_vec[128])(void*, void*, void*);
+    void *cookiejar;
+    unsigned long last_request_read_upper32bit; // 64bits only
+    unsigned long request_upper32bit;   // 64bits only
+    void* error_threads;
+    void* exit_handler;
+    void* exit_handler_data;
 } my_XDisplay_t;
 
 typedef struct my_XSetWindowAttributes_s {
@@ -846,7 +855,7 @@ typedef struct my_XWindowAttributes_s {
 } my_XWindowAttributes_t;
 
 typedef struct my_XVisualInfo_s {
-  void* visual; //Visual*
+  my_Visual_t* visual;
   unsigned long  visualid;
   int screen;
   int depth;
@@ -1306,4 +1315,11 @@ typedef struct my_XRRPropertyInfo_s {
     long*   values;
 } my_XRRPropertyInfo_t;
 
+typedef struct my_XShmSegmentInfo_s {
+    XID     shmseg;
+    int     shmid;
+    char*   shmaddr;
+    int     readOnly;
+} my_XShmSegmentInfo_t;
+
 #endif//MY_X11_DEFS
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h
index 289ad764..cbe78f75 100644
--- a/src/libtools/my_x11_defs_32.h
+++ b/src/libtools/my_x11_defs_32.h
@@ -88,6 +88,15 @@ struct my_XConnWatchInfo_32 {
     ptr_t next; //struct _XConnWatchInfo *
 };
 
+typedef struct my_Visual_32_s {
+    ptr_t   ext_data;   //XExtData*
+    XID_32 visualid;
+    int c_class;
+    ulong_t red_mask, green_mask, blue_mask;
+    int bits_per_rgb;
+    int map_entries;
+} my_Visual_32_t;
+
 typedef struct my_Screen_32_s {
     ptr_t ext_data;         //XExtData *
     ptr_t display;      //struct my_XDisplay_s *
@@ -1238,4 +1247,11 @@ typedef struct my_XRRPropertyInfo_32_s {
     ptr_t   values; //long*
 } my_XRRPropertyInfo_32_t;
 
+typedef struct my_XShmSegmentInfo_32_s {
+    XID_32  shmseg;
+    int     shmid;
+    ptr_t   shmaddr;
+    int     readOnly;
+} my_XShmSegmentInfo_32_t;
+
 #endif//MY_X11_DEFS_32
\ No newline at end of file
diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt
index a33d9a55..2c75c3cc 100644
--- a/src/wrapped32/generated/functions_list.txt
+++ b/src/wrapped32/generated/functions_list.txt
@@ -230,6 +230,7 @@
 #() lFpl -> lFpl
 #() lFpL -> lFpL
 #() LFEL -> LFEL
+#() LFEp -> LFEp
 #() LFLi -> LFLi
 #() LFpL -> LFpL
 #() LFpp -> LFpp
@@ -293,7 +294,6 @@
 #() iFSBliu_ -> iFSB
 #() iFbppi_i -> iFBi
 #() iFXbiip_ -> iFXB
-#() iFXbLipi_ -> iFXB
 #() iFrLL_BLL_ -> iFBB
 #() LFXrLiiuL_ -> LFXB
 #() vFbll_rllll_ -> vFBB
@@ -808,7 +808,6 @@
 #() LFppLa -> LFppLa
 #() LFXCii -> LFXCii
 #() LFXLuu -> LFXLuu
-#() LFXLpi -> LFXLpi
 #() LFXpLp -> LFXpLp
 #() pFEupp -> pFEupp
 #() pFEpip -> pFEpip
@@ -1026,6 +1025,7 @@
 #() UFuiCiu -> UFuiCiu
 #() lFpuipC -> lFpuipC
 #() LFEppLL -> LFEppLL
+#() LFEXLpi -> LFEXLpi
 #() LFpLppa -> LFpLppa
 #() LFXLuuu -> LFXLuuu
 #() LFXLpuu -> LFXLpuu
@@ -1295,7 +1295,6 @@
 #() iFXLibL_ubL_u -> iFXLiBuBu
 #() vFXLpiibpiip_i -> vFXLpiiBi
 #() iFXLpiibpiiL_i -> iFXLpiiBi
-#() LFXLpbLipi_uuu -> LFXLpBuuu
 #() LFXLLuubLWWWcc_bLWWWcc_ -> LFXLLuuBB
 #() LFXLLbLWWWcc_bLWWWcc_uu -> LFXLLBBuu
 #() vFiiiiuuip -> vFiiiiuuip
@@ -1345,6 +1344,7 @@
 #() uFuipppppp -> uFuipppppp
 #() uFuupuuiuf -> uFuupuuiuf
 #() uFulpppppp -> uFulpppppp
+#() LFEXLppuuu -> LFEXLppuuu
 #() LFXLpuuLLu -> LFXLpuuLLu
 #() iFXLLiippBL_ -> iFXLLiippB
 #() iFXLpppbL_pp -> iFXLpppBpp
@@ -1395,7 +1395,7 @@
 #() iFXiLLLiiibiip_ -> iFXiLLLiiiB
 #() iFXLbL_bL_ppppp -> iFXLBBppppp
 #() vFXiLLrLiiuL_iipi -> vFXiLLBiipi
-#() pFEXbpLiLLLii_uipbLipi_uu -> pFEXBuipBuu
+#() pFEXbpLiLLLii_uippuu -> pFEXBuippuu
 #() vFEXLpppippp -> vFEXLpppippp
 #() vFiiiiiiiiii -> vFiiiiiiiiii
 #() vFiiiiiiiiui -> vFiiiiiiiiui
@@ -2013,6 +2013,8 @@ wrappedlibx11:
 - iFX:
   - XCloseDisplay
   - XGrabServer
+- LFp:
+  - XVisualIDFromVisual
 - pFp:
   - XSetErrorHandler
   - XSetIOErrorHandler
@@ -2077,6 +2079,8 @@ wrappedlibx11:
 - iFXppp:
   - XCheckIfEvent
   - XIfEvent
+- LFXLpi:
+  - XCreateColormap
 - pFXlpp:
   - XGetVisualInfo
 - iFXbpLiL_pp:
@@ -2141,6 +2145,9 @@ wrappedlibxext:
   - XSetExtensionErrorHandler
 - iFpX:
   - XextRemoveDisplay
+- iFXp:
+  - XShmAttach
+  - XShmDetach
 - pFpX:
   - XextFindDisplay
 - pFXpp:
@@ -2149,7 +2156,9 @@ wrappedlibxext:
   - XShmGetImage
 - pFpXppip:
   - XextAddDisplay
-- pFXbpLiLLLii_uipbLipi_uu:
+- LFXLppuuu:
+  - XShmCreatePixmap
+- pFXbpLiLLLii_uippuu:
   - XShmCreateImage
 - iFXLppiiiiuui:
   - XShmPutImage
diff --git a/src/wrapped32/generated/wrappedlibx11types32.h b/src/wrapped32/generated/wrappedlibx11types32.h
index 1c148794..055fee0d 100644
--- a/src/wrapped32/generated/wrappedlibx11types32.h
+++ b/src/wrapped32/generated/wrappedlibx11types32.h
@@ -15,6 +15,7 @@ typedef void (*vFp_t)(void*);
 typedef void (*vFX_t)(void*);
 typedef int32_t (*iFp_t)(void*);
 typedef int32_t (*iFX_t)(void*);
+typedef uintptr_t (*LFp_t)(void*);
 typedef void* (*pFp_t)(void*);
 typedef void* (*pFX_t)(void*);
 typedef void* (*XFp_t)(void*);
@@ -40,6 +41,7 @@ typedef int32_t (*iFXLLp_t)(void*, uintptr_t, uintptr_t, void*);
 typedef int32_t (*iFXLpi_t)(void*, uintptr_t, void*, int32_t);
 typedef int32_t (*iFXLpp_t)(void*, uintptr_t, void*, void*);
 typedef int32_t (*iFXppp_t)(void*, void*, void*, void*);
+typedef uintptr_t (*LFXLpi_t)(void*, uintptr_t, void*, int32_t);
 typedef void* (*pFXlpp_t)(void*, intptr_t, void*, void*);
 typedef int32_t (*iFXbpLiL_pp_t)(void*, struct_pLiL_t*, void*, void*);
 typedef int32_t (*iFppipp_t)(void*, void*, int32_t, void*, void*);
@@ -74,6 +76,7 @@ typedef uintptr_t (*LFXLiiuuuiupLp_t)(void*, uintptr_t, int32_t, int32_t, uint32
 	GO(_XInitImageFuncPtrs, iFp_t) \
 	GO(XCloseDisplay, iFX_t) \
 	GO(XGrabServer, iFX_t) \
+	GO(XVisualIDFromVisual, LFp_t) \
 	GO(XSetErrorHandler, pFp_t) \
 	GO(XSetIOErrorHandler, pFp_t) \
 	GO(XGetModifierMapping, pFX_t) \
@@ -113,6 +116,7 @@ typedef uintptr_t (*LFXLiiuuuiupLp_t)(void*, uintptr_t, int32_t, int32_t, uint32
 	GO(XGetWMNormalHints, iFXLpp_t) \
 	GO(XCheckIfEvent, iFXppp_t) \
 	GO(XIfEvent, iFXppp_t) \
+	GO(XCreateColormap, LFXLpi_t) \
 	GO(XGetVisualInfo, pFXlpp_t) \
 	GO(XmbTextPropertyToTextList, iFXbpLiL_pp_t) \
 	GO(XLookupString, iFppipp_t) \
diff --git a/src/wrapped32/generated/wrappedlibxexttypes32.h b/src/wrapped32/generated/wrappedlibxexttypes32.h
index 9f95f95b..ef459e28 100644
--- a/src/wrapped32/generated/wrappedlibxexttypes32.h
+++ b/src/wrapped32/generated/wrappedlibxexttypes32.h
@@ -15,11 +15,13 @@ typedef void (*vFp_t)(void*);
 typedef void* (*pFv_t)(void);
 typedef void* (*pFp_t)(void*);
 typedef int32_t (*iFpX_t)(void*, void*);
+typedef int32_t (*iFXp_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 uintptr_t (*LFXLppuuu_t)(void*, uintptr_t, void*, void*, uint32_t, uint32_t, uint32_t);
+typedef void* (*pFXbpLiLLLii_uippuu_t)(void*, struct_pLiLLLii_t*, uint32_t, int32_t, void*, void*, 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() \
@@ -28,11 +30,14 @@ typedef int32_t (*iFXLppiiiiuui_t)(void*, uintptr_t, void*, void*, int32_t, int3
 	GO(XextCreateExtension, pFv_t) \
 	GO(XSetExtensionErrorHandler, pFp_t) \
 	GO(XextRemoveDisplay, iFpX_t) \
+	GO(XShmAttach, iFXp_t) \
+	GO(XShmDetach, iFXp_t) \
 	GO(XextFindDisplay, pFpX_t) \
 	GO(XdbeGetVisualInfo, pFXpp_t) \
 	GO(XShmGetImage, iFXLpiiL_t) \
 	GO(XextAddDisplay, pFpXppip_t) \
-	GO(XShmCreateImage, pFXbpLiLLLii_uipbLipi_uu_t) \
+	GO(XShmCreatePixmap, LFXLppuuu_t) \
+	GO(XShmCreateImage, pFXbpLiLLLii_uippuu_t) \
 	GO(XShmPutImage, iFXLppiiiiuui_t)
 
 #endif // __wrappedlibxextTYPES32_H_
diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c
index 397d198b..a4fa97fd 100644
--- a/src/wrapped32/generated/wrapper32.c
+++ b/src/wrapped32/generated/wrapper32.c
@@ -320,6 +320,7 @@ typedef intptr_t (*lFpu_t)(void*, uint32_t);
 typedef intptr_t (*lFpl_t)(void*, intptr_t);
 typedef intptr_t (*lFpL_t)(void*, uintptr_t);
 typedef uintptr_t (*LFEL_t)(x64emu_t*, uintptr_t);
+typedef uintptr_t (*LFEp_t)(x64emu_t*, void*);
 typedef uintptr_t (*LFLi_t)(uintptr_t, int32_t);
 typedef uintptr_t (*LFpL_t)(void*, uintptr_t);
 typedef uintptr_t (*LFpp_t)(void*, void*);
@@ -383,7 +384,6 @@ typedef int32_t (*iFXbip__t)(void*, struct_ip_t*);
 typedef int32_t (*iFSBliu__t)(void*, struct_liu_t*);
 typedef int32_t (*iFbppi_i_t)(struct_ppi_t*, int32_t);
 typedef int32_t (*iFXbiip__t)(void*, struct_iip_t*);
-typedef int32_t (*iFXbLipi__t)(void*, struct_Lipi_t*);
 typedef int32_t (*iFrLL_BLL__t)(struct_LL_t*, struct_LL_t*);
 typedef uintptr_t (*LFXrLiiuL__t)(void*, struct_LiiuL_t*);
 typedef void (*vFbll_rllll__t)(struct_ll_t*, struct_llll_t*);
@@ -898,7 +898,6 @@ typedef uintptr_t (*LFppLp_t)(void*, void*, uintptr_t, void*);
 typedef uintptr_t (*LFppLa_t)(void*, void*, uintptr_t, void*);
 typedef uintptr_t (*LFXCii_t)(void*, uint8_t, int32_t, int32_t);
 typedef uintptr_t (*LFXLuu_t)(void*, uintptr_t, uint32_t, uint32_t);
-typedef uintptr_t (*LFXLpi_t)(void*, uintptr_t, void*, int32_t);
 typedef uintptr_t (*LFXpLp_t)(void*, void*, uintptr_t, void*);
 typedef void* (*pFEupp_t)(x64emu_t*, uint32_t, void*, void*);
 typedef void* (*pFEpip_t)(x64emu_t*, void*, int32_t, void*);
@@ -1116,6 +1115,7 @@ typedef uint32_t (*uFpLLLS_t)(void*, uintptr_t, uintptr_t, uintptr_t, void*);
 typedef uint64_t (*UFuiCiu_t)(uint32_t, int32_t, uint8_t, int32_t, uint32_t);
 typedef intptr_t (*lFpuipC_t)(void*, uint32_t, int32_t, void*, uint8_t);
 typedef uintptr_t (*LFEppLL_t)(x64emu_t*, void*, void*, uintptr_t, uintptr_t);
+typedef uintptr_t (*LFEXLpi_t)(x64emu_t*, void*, uintptr_t, void*, int32_t);
 typedef uintptr_t (*LFpLppa_t)(void*, uintptr_t, void*, void*, void*);
 typedef uintptr_t (*LFXLuuu_t)(void*, uintptr_t, uint32_t, uint32_t, uint32_t);
 typedef uintptr_t (*LFXLpuu_t)(void*, uintptr_t, void*, uint32_t, uint32_t);
@@ -1385,7 +1385,6 @@ typedef int32_t (*iFXiLibiip_ip_t)(void*, int32_t, uintptr_t, int32_t, struct_ii
 typedef int32_t (*iFXLibL_ubL_u_t)(void*, uintptr_t, int32_t, struct_L_t*, uint32_t, struct_L_t*, uint32_t);
 typedef void (*vFXLpiibpiip_i_t)(void*, uintptr_t, void*, int32_t, int32_t, struct_piip_t*, int32_t);
 typedef int32_t (*iFXLpiibpiiL_i_t)(void*, uintptr_t, void*, int32_t, int32_t, struct_piiL_t*, int32_t);
-typedef uintptr_t (*LFXLpbLipi_uuu_t)(void*, uintptr_t, void*, struct_Lipi_t*, uint32_t, uint32_t, uint32_t);
 typedef uintptr_t (*LFXLLuubLWWWcc_bLWWWcc__t)(void*, uintptr_t, uintptr_t, uint32_t, uint32_t, struct_LWWWcc_t*, struct_LWWWcc_t*);
 typedef uintptr_t (*LFXLLbLWWWcc_bLWWWcc_uu_t)(void*, uintptr_t, uintptr_t, struct_LWWWcc_t*, struct_LWWWcc_t*, uint32_t, uint32_t);
 typedef void (*vFiiiiuuip_t)(int32_t, int32_t, int32_t, int32_t, uint32_t, uint32_t, int32_t, void*);
@@ -1435,6 +1434,7 @@ typedef uint8_t (*CFuiifpppp_t)(uint32_t, int32_t, int32_t, float, void*, void*,
 typedef uint32_t (*uFuipppppp_t)(uint32_t, int32_t, void*, void*, void*, void*, void*, void*);
 typedef uint32_t (*uFuupuuiuf_t)(uint32_t, uint32_t, void*, uint32_t, uint32_t, int32_t, uint32_t, float);
 typedef uint32_t (*uFulpppppp_t)(uint32_t, intptr_t, void*, void*, void*, void*, void*, void*);
+typedef uintptr_t (*LFEXLppuuu_t)(x64emu_t*, void*, uintptr_t, void*, void*, uint32_t, uint32_t, uint32_t);
 typedef uintptr_t (*LFXLpuuLLu_t)(void*, uintptr_t, void*, uint32_t, uint32_t, uintptr_t, uintptr_t, uint32_t);
 typedef int32_t (*iFXLLiippBL__t)(void*, uintptr_t, uintptr_t, int32_t, int32_t, void*, void*, struct_L_t*);
 typedef int32_t (*iFXLpppbL_pp_t)(void*, uintptr_t, void*, void*, void*, struct_L_t*, void*, void*);
@@ -1485,7 +1485,7 @@ typedef int32_t (*iFXiLiiibiip_ip_t)(void*, int32_t, uintptr_t, int32_t, int32_t
 typedef int32_t (*iFXiLLLiiibiip__t)(void*, int32_t, uintptr_t, uintptr_t, uintptr_t, int32_t, int32_t, int32_t, struct_iip_t*);
 typedef int32_t (*iFXLbL_bL_ppppp_t)(void*, uintptr_t, struct_L_t*, struct_L_t*, void*, void*, void*, void*, void*);
 typedef void (*vFXiLLrLiiuL_iipi_t)(void*, int32_t, uintptr_t, uintptr_t, struct_LiiuL_t*, int32_t, int32_t, void*, int32_t);
-typedef void* (*pFEXbpLiLLLii_uipbLipi_uu_t)(x64emu_t*, void*, struct_pLiLLLii_t*, uint32_t, int32_t, void*, struct_Lipi_t*, uint32_t, uint32_t);
+typedef void* (*pFEXbpLiLLLii_uippuu_t)(x64emu_t*, void*, struct_pLiLLLii_t*, uint32_t, int32_t, void*, void*, uint32_t, uint32_t);
 typedef void (*vFEXLpppippp_t)(x64emu_t*, void*, uintptr_t, void*, void*, void*, int32_t, void*, void*, void*);
 typedef void (*vFiiiiiiiiii_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t);
 typedef void (*vFiiiiiiiiui_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t, int32_t);
@@ -1817,6 +1817,7 @@ void lFpu_32(x64emu_t *emu, uintptr_t fcn) { lFpu_t fn = (lFpu_t)fcn; R_EAX = to
 void lFpl_32(x64emu_t *emu, uintptr_t fcn) { lFpl_t fn = (lFpl_t)fcn; R_EAX = to_long(fn(from_ptriv(R_ESP + 4), from_long(from_ptri(long_t, R_ESP + 8)))); }
 void lFpL_32(x64emu_t *emu, uintptr_t fcn) { lFpL_t fn = (lFpL_t)fcn; R_EAX = to_long(fn(from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)))); }
 void LFEL_32(x64emu_t *emu, uintptr_t fcn) { LFEL_t fn = (LFEL_t)fcn; R_EAX = to_ulong(fn(emu, from_ulong(from_ptri(ulong_t, R_ESP + 4)))); }
+void LFEp_32(x64emu_t *emu, uintptr_t fcn) { LFEp_t fn = (LFEp_t)fcn; R_EAX = to_ulong(fn(emu, from_ptriv(R_ESP + 4))); }
 void LFLi_32(x64emu_t *emu, uintptr_t fcn) { LFLi_t fn = (LFLi_t)fcn; R_EAX = to_ulong(fn(from_ulong(from_ptri(ulong_t, R_ESP + 4)), from_ptri(int32_t, R_ESP + 8))); }
 void LFpL_32(x64emu_t *emu, uintptr_t fcn) { LFpL_t fn = (LFpL_t)fcn; R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)))); }
 void LFpp_32(x64emu_t *emu, uintptr_t fcn) { LFpp_t fn = (LFpp_t)fcn; R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8))); }
@@ -1880,7 +1881,6 @@ void iFXbip__32(x64emu_t *emu, uintptr_t fcn) { iFXbip__t fn = (iFXbip__t)fcn; s
 void iFSBliu__32(x64emu_t *emu, uintptr_t fcn) { iFSBliu__t fn = (iFSBliu__t)fcn; struct_liu_t arg_8={0}; R_EAX = fn(io_convert32(from_ptriv(R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_liu(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); }
 void iFbppi_i_32(x64emu_t *emu, uintptr_t fcn) { iFbppi_i_t fn = (iFbppi_i_t)fcn; struct_ppi_t arg_4={0}; if (*(ptr_t*)(from_ptr((R_ESP + 4)))) from_struct_ppi(&arg_4, *(ptr_t*)(from_ptr((R_ESP + 4)))); R_EAX = fn(*(ptr_t*)(from_ptr((R_ESP + 4))) ? &arg_4 : NULL, from_ptri(int32_t, R_ESP + 8)); if (*(ptr_t*)(from_ptr((R_ESP + 4)))) to_struct_ppi(*(ptr_t*)(from_ptr((R_ESP + 4))), &arg_4); }
 void iFXbiip__32(x64emu_t *emu, uintptr_t fcn) { iFXbiip__t fn = (iFXbiip__t)fcn; struct_iip_t arg_8={0}; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) from_struct_iip(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_iip(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); }
-void iFXbLipi__32(x64emu_t *emu, uintptr_t fcn) { iFXbLipi__t fn = (iFXbLipi__t)fcn; struct_Lipi_t arg_8={0}; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) from_struct_Lipi(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_Lipi(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); }
 void iFrLL_BLL__32(x64emu_t *emu, uintptr_t fcn) { iFrLL_BLL__t fn = (iFrLL_BLL__t)fcn; struct_LL_t arg_4={0}; if (*(ptr_t*)(from_ptr((R_ESP + 4)))) from_struct_LL(&arg_4, *(ptr_t*)(from_ptr((R_ESP + 4)))); struct_LL_t arg_8={0}; R_EAX = fn(*(ptr_t*)(from_ptr((R_ESP + 4))) ? &arg_4 : NULL, *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_LL(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); }
 void LFXrLiiuL__32(x64emu_t *emu, uintptr_t fcn) { LFXrLiiuL__t fn = (LFXrLiiuL__t)fcn; struct_LiiuL_t arg_8={0}; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) from_struct_LiiuL(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL)); }
 void vFbll_rllll__32(x64emu_t *emu, uintptr_t fcn) { vFbll_rllll__t fn = (vFbll_rllll__t)fcn; struct_ll_t arg_4={0}; if (*(ptr_t*)(from_ptr((R_ESP + 4)))) from_struct_ll(&arg_4, *(ptr_t*)(from_ptr((R_ESP + 4)))); struct_llll_t arg_8={0}; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) from_struct_llll(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); fn(*(ptr_t*)(from_ptr((R_ESP + 4))) ? &arg_4 : NULL, *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 4)))) to_struct_ll(*(ptr_t*)(from_ptr((R_ESP + 4))), &arg_4); }
@@ -2395,7 +2395,6 @@ void LFppLp_32(x64emu_t *emu, uintptr_t fcn) { LFppLp_t fn = (LFppLp_t)fcn; R_EA
 void LFppLa_32(x64emu_t *emu, uintptr_t fcn) { LFppLa_t fn = (LFppLa_t)fcn; R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_locale(from_ptri(ptr_t, R_ESP + 16)))); }
 void LFXCii_32(x64emu_t *emu, uintptr_t fcn) { LFXCii_t fn = (LFXCii_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ptri(uint8_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16))); }
 void LFXLuu_32(x64emu_t *emu, uintptr_t fcn) { LFXLuu_t fn = (LFXLuu_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(uint32_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16))); }
-void LFXLpi_32(x64emu_t *emu, uintptr_t fcn) { LFXLpi_t fn = (LFXLpi_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16))); }
 void LFXpLp_32(x64emu_t *emu, uintptr_t fcn) { LFXpLp_t fn = (LFXpLp_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptriv(R_ESP + 16))); }
 void pFEupp_32(x64emu_t *emu, uintptr_t fcn) { pFEupp_t fn = (pFEupp_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptri(uint32_t, R_ESP + 4), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12))); }
 void pFEpip_32(x64emu_t *emu, uintptr_t fcn) { pFEpip_t fn = (pFEpip_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptriv(R_ESP + 12))); }
@@ -2613,6 +2612,7 @@ void uFpLLLS_32(x64emu_t *emu, uintptr_t fcn) { uFpLLLS_t fn = (uFpLLLS_t)fcn; R
 void UFuiCiu_32(x64emu_t *emu, uintptr_t fcn) { UFuiCiu_t fn = (UFuiCiu_t)fcn; ui64_t r; r.u = (uint64_t)fn(from_ptri(uint32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(uint8_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20)); R_EAX = r.d[0]; R_EDX = r.d[1]; }
 void lFpuipC_32(x64emu_t *emu, uintptr_t fcn) { lFpuipC_t fn = (lFpuipC_t)fcn; R_EAX = to_long(fn(from_ptriv(R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16), from_ptri(uint8_t, R_ESP + 20))); }
 void LFEppLL_32(x64emu_t *emu, uintptr_t fcn) { LFEppLL_t fn = (LFEppLL_t)fcn; R_EAX = to_ulong(fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ulong(from_ptri(ulong_t, R_ESP + 16)))); }
+void LFEXLpi_32(x64emu_t *emu, uintptr_t fcn) { LFEXLpi_t fn = (LFEXLpi_t)fcn; R_EAX = to_ulong(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16))); }
 void LFpLppa_32(x64emu_t *emu, uintptr_t fcn) { LFpLppa_t fn = (LFpLppa_t)fcn; R_EAX = to_ulong(fn(from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_locale(from_ptri(ptr_t, R_ESP + 20)))); }
 void LFXLuuu_32(x64emu_t *emu, uintptr_t fcn) { LFXLuuu_t fn = (LFXLuuu_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(uint32_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20))); }
 void LFXLpuu_32(x64emu_t *emu, uintptr_t fcn) { LFXLpuu_t fn = (LFXLpuu_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20))); }
@@ -2882,7 +2882,6 @@ void iFXiLibiip_ip_32(x64emu_t *emu, uintptr_t fcn) { iFXiLibiip_ip_t fn = (iFXi
 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); }
 void vFXLpiibpiip_i_32(x64emu_t *emu, uintptr_t fcn) { vFXLpiibpiip_i_t fn = (vFXLpiibpiip_i_t)fcn; struct_piip_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_piip(&arg_24, *(ptr_t*)(from_ptr((R_ESP + 24)))); fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptri(int32_t, R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_piip(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
 void iFXLpiibpiiL_i_32(x64emu_t *emu, uintptr_t fcn) { iFXLpiibpiiL_i_t fn = (iFXLpiibpiiL_i_t)fcn; struct_piiL_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_piiL(&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_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptri(int32_t, R_ESP + 28)); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_piiL(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
-void LFXLpbLipi_uuu_32(x64emu_t *emu, uintptr_t fcn) { LFXLpbLipi_uuu_t fn = (LFXLpbLipi_uuu_t)fcn; struct_Lipi_t arg_16={0}; if (*(ptr_t*)(from_ptr((R_ESP + 16)))) from_struct_Lipi(&arg_16, *(ptr_t*)(from_ptr((R_ESP + 16)))); R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, from_ptri(uint32_t, R_ESP + 20), from_ptri(uint32_t, R_ESP + 24), from_ptri(uint32_t, R_ESP + 28))); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_Lipi(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); }
 void LFXLLuubLWWWcc_bLWWWcc__32(x64emu_t *emu, uintptr_t fcn) { LFXLLuubLWWWcc_bLWWWcc__t fn = (LFXLLuubLWWWcc_bLWWWcc__t)fcn; struct_LWWWcc_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_LWWWcc(&arg_24, *(ptr_t*)(from_ptr((R_ESP + 24)))); struct_LWWWcc_t arg_28={0}; if (*(ptr_t*)(from_ptr((R_ESP + 28)))) from_struct_LWWWcc(&arg_28, *(ptr_t*)(from_ptr((R_ESP + 28)))); R_EAX = to_ulong(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(uint32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, *(ptr_t*)(from_ptr((R_ESP + 28))) ? &arg_28 : NULL)); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_LWWWcc(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); if (*(ptr_t*)(from_ptr((R_ESP + 28)))) to_struct_LWWWcc(*(ptr_t*)(from_ptr((R_ESP + 28))), &arg_28); }
 void LFXLLbLWWWcc_bLWWWcc_uu_32(x64emu_t *emu, uintptr_t fcn) { LFXLLbLWWWcc_bLWWWcc_uu_t fn = (LFXLLbLWWWcc_bLWWWcc_uu_t)fcn; struct_LWWWcc_t arg_16={0}; if (*(ptr_t*)(from_ptr((R_ESP + 16)))) from_struct_LWWWcc(&arg_16, *(ptr_t*)(from_ptr((R_ESP + 16)))); struct_LWWWcc_t arg_20={0}; if (*(ptr_t*)(from_ptr((R_ESP + 20)))) from_struct_LWWWcc(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); R_EAX = to_ulong(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)), *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL, from_ptri(uint32_t, R_ESP + 24), from_ptri(uint32_t, R_ESP + 28))); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_LWWWcc(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); if (*(ptr_t*)(from_ptr((R_ESP + 20)))) to_struct_LWWWcc(*(ptr_t*)(from_ptr((R_ESP + 20))), &arg_20); }
 void vFiiiiuuip_32(x64emu_t *emu, uintptr_t fcn) { vFiiiiuuip_t fn = (vFiiiiuuip_t)fcn; 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), from_ptri(uint32_t, R_ESP + 20), from_ptri(uint32_t, R_ESP + 24), from_ptri(int32_t, R_ESP + 28), from_ptriv(R_ESP + 32)); }
@@ -2932,6 +2931,7 @@ void CFuiifpppp_32(x64emu_t *emu, uintptr_t fcn) { CFuiifpppp_t fn = (CFuiifpppp
 void uFuipppppp_32(x64emu_t *emu, uintptr_t fcn) { uFuipppppp_t fn = (uFuipppppp_t)fcn; R_EAX = (uint32_t)fn(from_ptri(uint32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24), from_ptriv(R_ESP + 28), from_ptriv(R_ESP + 32)); }
 void uFuupuuiuf_32(x64emu_t *emu, uintptr_t fcn) { uFuupuuiuf_t fn = (uFuupuuiuf_t)fcn; R_EAX = (uint32_t)fn(from_ptri(uint32_t, R_ESP + 4), from_ptri(uint32_t, R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24), from_ptri(uint32_t, R_ESP + 28), from_ptri(float, R_ESP + 32)); }
 void uFulpppppp_32(x64emu_t *emu, uintptr_t fcn) { uFulpppppp_t fn = (uFulpppppp_t)fcn; R_EAX = (uint32_t)fn(from_ptri(uint32_t, R_ESP + 4), from_long(from_ptri(long_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24), from_ptriv(R_ESP + 28), from_ptriv(R_ESP + 32)); }
+void LFEXLppuuu_32(x64emu_t *emu, uintptr_t fcn) { LFEXLppuuu_t fn = (LFEXLppuuu_t)fcn; R_EAX = to_ulong(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptri(uint32_t, R_ESP + 20), from_ptri(uint32_t, R_ESP + 24), from_ptri(uint32_t, R_ESP + 28))); }
 void LFXLpuuLLu_32(x64emu_t *emu, uintptr_t fcn) { LFXLpuuLLu_t fn = (LFXLpuuLLu_t)fcn; R_EAX = to_ulong(fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20), from_ulong(from_ptri(ulong_t, R_ESP + 24)), from_ulong(from_ptri(ulong_t, R_ESP + 28)), from_ptri(uint32_t, R_ESP + 32))); }
 void iFXLLiippBL__32(x64emu_t *emu, uintptr_t fcn) { iFXLLiippBL__t fn = (iFXLLiippBL__t)fcn; struct_L_t arg_32={0}; R_EAX = 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_ptriv(R_ESP + 24), from_ptriv(R_ESP + 28), *(ptr_t*)(from_ptr((R_ESP + 32))) ? &arg_32 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 32)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 32))), &arg_32); }
 void iFXLpppbL_pp_32(x64emu_t *emu, uintptr_t fcn) { iFXLpppbL_pp_t fn = (iFXLpppbL_pp_t)fcn; 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_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptriv(R_ESP + 28), from_ptriv(R_ESP + 32)); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
@@ -2982,7 +2982,7 @@ void iFXiLiiibiip_ip_32(x64emu_t *emu, uintptr_t fcn) { iFXiLiiibiip_ip_t fn = (
 void iFXiLLLiiibiip__32(x64emu_t *emu, uintptr_t fcn) { iFXiLLLiiibiip__t fn = (iFXiLLLiiibiip__t)fcn; struct_iip_t arg_36={0}; if (*(ptr_t*)(from_ptr((R_ESP + 36)))) from_struct_iip(&arg_36, *(ptr_t*)(from_ptr((R_ESP + 36)))); 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_ulong(from_ptri(ulong_t, R_ESP + 16)), from_ulong(from_ptri(ulong_t, R_ESP + 20)), from_ptri(int32_t, R_ESP + 24), from_ptri(int32_t, R_ESP + 28), from_ptri(int32_t, R_ESP + 32), *(ptr_t*)(from_ptr((R_ESP + 36))) ? &arg_36 : NULL); if (*(ptr_t*)(from_ptr((R_ESP + 36)))) to_struct_iip(*(ptr_t*)(from_ptr((R_ESP + 36))), &arg_36); }
 void iFXLbL_bL_ppppp_32(x64emu_t *emu, uintptr_t fcn) { iFXLbL_bL_ppppp_t fn = (iFXLbL_bL_ppppp_t)fcn; struct_L_t arg_12={0}; if (*(ptr_t*)(from_ptr((R_ESP + 12)))) from_struct_L(&arg_12, *(ptr_t*)(from_ptr((R_ESP + 12)))); 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)))); R_EAX = fn(getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), *(ptr_t*)(from_ptr((R_ESP + 12))) ? &arg_12 : NULL, *(ptr_t*)(from_ptr((R_ESP + 16))) ? &arg_16 : NULL, from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24), from_ptriv(R_ESP + 28), from_ptriv(R_ESP + 32), from_ptriv(R_ESP + 36)); if (*(ptr_t*)(from_ptr((R_ESP + 12)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 12))), &arg_12); if (*(ptr_t*)(from_ptr((R_ESP + 16)))) to_struct_L(*(ptr_t*)(from_ptr((R_ESP + 16))), &arg_16); }
 void vFXiLLrLiiuL_iipi_32(x64emu_t *emu, uintptr_t fcn) { vFXiLLrLiiuL_iipi_t fn = (vFXiLLrLiiuL_iipi_t)fcn; struct_LiiuL_t arg_20={0}; if (*(ptr_t*)(from_ptr((R_ESP + 20)))) from_struct_LiiuL(&arg_20, *(ptr_t*)(from_ptr((R_ESP + 20)))); fn(getDisplay(from_ptriv(R_ESP + 4)), from_ptri(int32_t, R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ulong(from_ptri(ulong_t, R_ESP + 16)), *(ptr_t*)(from_ptr((R_ESP + 20))) ? &arg_20 : NULL, from_ptri(int32_t, R_ESP + 24), from_ptri(int32_t, R_ESP + 28), from_ptriv(R_ESP + 32), from_ptri(int32_t, R_ESP + 36)); }
-void pFEXbpLiLLLii_uipbLipi_uu_32(x64emu_t *emu, uintptr_t fcn) { pFEXbpLiLLLii_uipbLipi_uu_t fn = (pFEXbpLiLLLii_uipbLipi_uu_t)fcn; struct_pLiLLLii_t arg_8={0}; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) from_struct_pLiLLLii(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); struct_Lipi_t arg_24={0}; if (*(ptr_t*)(from_ptr((R_ESP + 24)))) from_struct_Lipi(&arg_24, *(ptr_t*)(from_ptr((R_ESP + 24)))); R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, from_ptri(uint32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptriv(R_ESP + 20), *(ptr_t*)(from_ptr((R_ESP + 24))) ? &arg_24 : NULL, from_ptri(uint32_t, R_ESP + 28), from_ptri(uint32_t, R_ESP + 32))); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_pLiLLLii(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); if (*(ptr_t*)(from_ptr((R_ESP + 24)))) to_struct_Lipi(*(ptr_t*)(from_ptr((R_ESP + 24))), &arg_24); }
+void pFEXbpLiLLLii_uippuu_32(x64emu_t *emu, uintptr_t fcn) { pFEXbpLiLLLii_uippuu_t fn = (pFEXbpLiLLLii_uippuu_t)fcn; struct_pLiLLLii_t arg_8={0}; if (*(ptr_t*)(from_ptr((R_ESP + 8)))) from_struct_pLiLLLii(&arg_8, *(ptr_t*)(from_ptr((R_ESP + 8)))); R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), *(ptr_t*)(from_ptr((R_ESP + 8))) ? &arg_8 : NULL, from_ptri(uint32_t, R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptriv(R_ESP + 20), from_ptriv(R_ESP + 24), from_ptri(uint32_t, R_ESP + 28), from_ptri(uint32_t, R_ESP + 32))); if (*(ptr_t*)(from_ptr((R_ESP + 8)))) to_struct_pLiLLLii(*(ptr_t*)(from_ptr((R_ESP + 8))), &arg_8); }
 void vFEXLpppippp_32(x64emu_t *emu, uintptr_t fcn) { vFEXLpppippp_t fn = (vFEXLpppippp_t)fcn; fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20), from_ptri(int32_t, R_ESP + 24), from_ptriv(R_ESP + 28), from_ptriv(R_ESP + 32), from_ptriv(R_ESP + 36)); }
 void vFiiiiiiiiii_32(x64emu_t *emu, uintptr_t fcn) { vFiiiiiiiiii_t fn = (vFiiiiiiiiii_t)fcn; 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), from_ptri(int32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24), from_ptri(int32_t, R_ESP + 28), from_ptri(int32_t, R_ESP + 32), from_ptri(int32_t, R_ESP + 36), from_ptri(int32_t, R_ESP + 40)); }
 void vFiiiiiiiiui_32(x64emu_t *emu, uintptr_t fcn) { vFiiiiiiiiui_t fn = (vFiiiiiiiiui_t)fcn; 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), from_ptri(int32_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24), from_ptri(int32_t, R_ESP + 28), from_ptri(int32_t, R_ESP + 32), from_ptri(uint32_t, R_ESP + 36), from_ptri(int32_t, R_ESP + 40)); }
diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h
index 5e57b8a7..a34df650 100644
--- a/src/wrapped32/generated/wrapper32.h
+++ b/src/wrapped32/generated/wrapper32.h
@@ -271,6 +271,7 @@ void lFpu_32(x64emu_t *emu, uintptr_t fnc);
 void lFpl_32(x64emu_t *emu, uintptr_t fnc);
 void lFpL_32(x64emu_t *emu, uintptr_t fnc);
 void LFEL_32(x64emu_t *emu, uintptr_t fnc);
+void LFEp_32(x64emu_t *emu, uintptr_t fnc);
 void LFLi_32(x64emu_t *emu, uintptr_t fnc);
 void LFpL_32(x64emu_t *emu, uintptr_t fnc);
 void LFpp_32(x64emu_t *emu, uintptr_t fnc);
@@ -334,7 +335,6 @@ void iFXbip__32(x64emu_t *emu, uintptr_t fnc);
 void iFSBliu__32(x64emu_t *emu, uintptr_t fnc);
 void iFbppi_i_32(x64emu_t *emu, uintptr_t fnc);
 void iFXbiip__32(x64emu_t *emu, uintptr_t fnc);
-void iFXbLipi__32(x64emu_t *emu, uintptr_t fnc);
 void iFrLL_BLL__32(x64emu_t *emu, uintptr_t fnc);
 void LFXrLiiuL__32(x64emu_t *emu, uintptr_t fnc);
 void vFbll_rllll__32(x64emu_t *emu, uintptr_t fnc);
@@ -849,7 +849,6 @@ void LFppLp_32(x64emu_t *emu, uintptr_t fnc);
 void LFppLa_32(x64emu_t *emu, uintptr_t fnc);
 void LFXCii_32(x64emu_t *emu, uintptr_t fnc);
 void LFXLuu_32(x64emu_t *emu, uintptr_t fnc);
-void LFXLpi_32(x64emu_t *emu, uintptr_t fnc);
 void LFXpLp_32(x64emu_t *emu, uintptr_t fnc);
 void pFEupp_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpip_32(x64emu_t *emu, uintptr_t fnc);
@@ -1067,6 +1066,7 @@ void uFpLLLS_32(x64emu_t *emu, uintptr_t fnc);
 void UFuiCiu_32(x64emu_t *emu, uintptr_t fnc);
 void lFpuipC_32(x64emu_t *emu, uintptr_t fnc);
 void LFEppLL_32(x64emu_t *emu, uintptr_t fnc);
+void LFEXLpi_32(x64emu_t *emu, uintptr_t fnc);
 void LFpLppa_32(x64emu_t *emu, uintptr_t fnc);
 void LFXLuuu_32(x64emu_t *emu, uintptr_t fnc);
 void LFXLpuu_32(x64emu_t *emu, uintptr_t fnc);
@@ -1336,7 +1336,6 @@ void iFXiLibiip_ip_32(x64emu_t *emu, uintptr_t fnc);
 void iFXLibL_ubL_u_32(x64emu_t *emu, uintptr_t fnc);
 void vFXLpiibpiip_i_32(x64emu_t *emu, uintptr_t fnc);
 void iFXLpiibpiiL_i_32(x64emu_t *emu, uintptr_t fnc);
-void LFXLpbLipi_uuu_32(x64emu_t *emu, uintptr_t fnc);
 void LFXLLuubLWWWcc_bLWWWcc__32(x64emu_t *emu, uintptr_t fnc);
 void LFXLLbLWWWcc_bLWWWcc_uu_32(x64emu_t *emu, uintptr_t fnc);
 void vFiiiiuuip_32(x64emu_t *emu, uintptr_t fnc);
@@ -1386,6 +1385,7 @@ void CFuiifpppp_32(x64emu_t *emu, uintptr_t fnc);
 void uFuipppppp_32(x64emu_t *emu, uintptr_t fnc);
 void uFuupuuiuf_32(x64emu_t *emu, uintptr_t fnc);
 void uFulpppppp_32(x64emu_t *emu, uintptr_t fnc);
+void LFEXLppuuu_32(x64emu_t *emu, uintptr_t fnc);
 void LFXLpuuLLu_32(x64emu_t *emu, uintptr_t fnc);
 void iFXLLiippBL__32(x64emu_t *emu, uintptr_t fnc);
 void iFXLpppbL_pp_32(x64emu_t *emu, uintptr_t fnc);
@@ -1436,7 +1436,7 @@ void iFXiLiiibiip_ip_32(x64emu_t *emu, uintptr_t fnc);
 void iFXiLLLiiibiip__32(x64emu_t *emu, uintptr_t fnc);
 void iFXLbL_bL_ppppp_32(x64emu_t *emu, uintptr_t fnc);
 void vFXiLLrLiiuL_iipi_32(x64emu_t *emu, uintptr_t fnc);
-void pFEXbpLiLLLii_uipbLipi_uu_32(x64emu_t *emu, uintptr_t fnc);
+void pFEXbpLiLLLii_uippuu_32(x64emu_t *emu, uintptr_t fnc);
 void vFEXLpppippp_32(x64emu_t *emu, uintptr_t fnc);
 void vFiiiiiiiiii_32(x64emu_t *emu, uintptr_t fnc);
 void vFiiiiiiiiui_32(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped32/wrappedlibgl.c b/src/wrapped32/wrappedlibgl.c
index 8a45afe2..d520a6a8 100644
--- a/src/wrapped32/wrappedlibgl.c
+++ b/src/wrapped32/wrappedlibgl.c
@@ -16,8 +16,7 @@
 #include "librarian.h"
 #include "callback.h"
 #include "gltools.h"
-#include "libtools/my_x11_defs.h"
-#include "libtools/my_x11_defs_32.h"
+#include "libtools/my_x11_conv.h"
 
 extern const char* libglName;
 #define LIBNAME libgl
@@ -28,8 +27,6 @@ extern const char* libglName;
 
 void* getDisplay(void* d); // define in 32bits wrappedx11.c
 
-void convert_XVisualInfo_to_32(void* d, void* s);
-void convert_XVisualInfo_to_64(void* d, void* s);
 // FIXME: old wrapped* type of file, cannot use generated/wrappedlibgltypes.h
 void* getGLProcAddress32(x64emu_t* emu, glprocaddress_t procaddr, const char* rname);
 EXPORT void* my32_glXGetProcAddress(x64emu_t* emu, void* name)
@@ -498,7 +495,7 @@ static void* my32_glXGetVisualFromFBConfig_##A(x64emu_t* emu, void* dpy, void* c
     if(!res)                                                                                                \
         return NULL;                                                                                        \
     my_XVisualInfo_32_t* vinfo = (my_XVisualInfo_32_t*)res;                                                 \
-    convert_XVisualInfo_to_32(vinfo, res);                                                                  \
+    convert_XVisualInfo_to_32(dpy, vinfo, res);                                                                  \
     return vinfo;                                                                                           \
 }
 SUPER()
@@ -526,7 +523,7 @@ static void* my32_glXChooseVisual_##A(x64emu_t* emu, void* dpy, int screen, int*
     if(!res)                                                                                       \
         return NULL;                                                                               \
     my_XVisualInfo_32_t* vinfo = (my_XVisualInfo_32_t*)res;                                        \
-    convert_XVisualInfo_to_32(vinfo, res);                                                         \
+    convert_XVisualInfo_to_32(dpy, vinfo, res);                                                         \
     return vinfo;                                                                                  \
 }
 SUPER()
@@ -551,7 +548,7 @@ static void* my32_glXCreateContext_##A(x64emu_t* emu, void* dpy, my_XVisualInfo_
     if(!my32_glXCreateContext_fct_##A)                                                                                  \
         return NULL;                                                                                                    \
     my_XVisualInfo_t info_l = {0};                                                                                      \
-    convert_XVisualInfo_to_64(&info_l, info);                                                                           \
+    convert_XVisualInfo_to_64(dpy, &info_l, info);                                                                           \
     return my32_glXCreateContext_fct_##A (dpy, &info_l, shared, direct);                                                \
 }
 SUPER()
@@ -946,7 +943,7 @@ EXPORT void* my32_glXGetVisualFromFBConfig(x64emu_t* emu, void* dpy, void* confi
     void* res = my->glXGetVisualFromFBConfig(dpy, config);
     if(!res) return NULL;
     my_XVisualInfo_32_t* vinfo = (my_XVisualInfo_32_t*)res;
-    convert_XVisualInfo_to_32(vinfo, res);
+    convert_XVisualInfo_to_32(dpy, vinfo, res);
     return vinfo;
 }
 
@@ -955,14 +952,14 @@ EXPORT void* my32_glXChooseVisual(x64emu_t* emu, void* dpy, int screen, int* att
     void* res = my->glXChooseVisual(dpy, screen, attr);
     if(!res) return NULL;
     my_XVisualInfo_32_t* vinfo = (my_XVisualInfo_32_t*)res;
-    convert_XVisualInfo_to_32(vinfo, res);
+    convert_XVisualInfo_to_32(dpy, vinfo, res);
     return vinfo;
 }
 
 EXPORT void* my32_glXCreateContext(x64emu_t* emu, void* dpy, my_XVisualInfo_32_t* info, void* shared, int direct)
 {
     my_XVisualInfo_t info_l = {0};
-    convert_XVisualInfo_to_64(&info_l, info);
+    convert_XVisualInfo_to_64(dpy, &info_l, info);
     return my->glXCreateContext(dpy, &info_l, shared, direct);
 }
 
diff --git a/src/wrapped32/wrappedlibx11.c b/src/wrapped32/wrappedlibx11.c
index cfd99314..e2256ba5 100644
--- a/src/wrapped32/wrappedlibx11.c
+++ b/src/wrapped32/wrappedlibx11.c
@@ -38,8 +38,7 @@ typedef int (*WireToEventProc)(void*, void*, void*);
 typedef int(*EventHandler) (void*,void*,void*);
 int32_t my32_XIfEvent(x64emu_t* emu, void* d,void* ev, EventHandler h, void* arg);
 
-void UnwrapXImage(void* d, void* s);
-void WrapXImage(void* d, void* s);
+void delShmInfo(my_XShmSegmentInfo_t* a);   // edfine in Xext, to remove a saved ShmInfo
 
 typedef void (*vFp_t)(void*);
 typedef int  (*iFp_t)(void*);
@@ -200,6 +199,8 @@ static int my32_error_handler_##A(void* dpy, void* error)
 {                                                                                           \
     static my_XErrorEvent_32_t evt = {0};                                                   \
     convert_XErrorEvent_to_32(&evt, error);                                                 \
+    printf_log(LOG_DEBUG, "Calling Xerrorhandler(%p, %p), err=%hhu/%hhu/%hhu\n",            \
+        dpy, error, evt.error_code, evt.request_code, evt.minor_code);                      \
     return (int)RunFunctionFmt(my32_error_handler_fct_##A, "pp", FindDisplay(dpy), &evt);   \
 }
 SUPER()
@@ -584,14 +585,14 @@ static void* find_async_handler_Fct(void* fct)
 static uintptr_t my32_create_image_fct_##A = 0;                                                                                     \
 static void* my32_create_image_##A(void* a, void* b, uint32_t c, int d, int e, void* f, uint32_t g, uint32_t h, int i, int j)       \
 {                                                                                                                                   \
-    void* ret = (void*)RunFunctionFmt(my32_create_image_fct_##A, "ppuiipuuii", FindDisplay(a), b, c, d, e, f, g, h, i, j);          \
+    void* ret = (void*)RunFunctionFmt(my32_create_image_fct_##A, "ppuiipuuii", FindDisplay(a), convert_Visual_to_32(a, b), c, d, e, f, g, h, i, j);          \
     UnwrapXImage(ret, ret);                                                                                                         \
     return ret;                                                                                                                     \
 }                                                                                                                                   \
 static pFXpuiipuuii_t my32_rev_create_image_fct_##A = NULL;                                                                         \
 static void* my32_rev_create_image_##A(void* a, void* b, uint32_t c, int d, int e, void* f, uint32_t g, uint32_t h, int i, int j)   \
 {                                                                                                                                   \
-    void* ret = my32_rev_create_image_fct_##A (getDisplay(a), b, c, d, e, f, g, h, i, j);                                           \
+    void* ret = my32_rev_create_image_fct_##A (getDisplay(a), convert_Visual_to_64(a, b), c, d, e, f, g, h, i, j);                  \
     WrapXImage(ret, ret);                                                                                                           \
     return ret;                                                                                                                     \
 }
@@ -633,24 +634,31 @@ static void* reverse_create_image_Fct(library_t* lib, void* fct)
     SUPER()
     #undef GO
     if(f)
-        return (void*)AddCheckBridge(lib->w.bridge, pFXpuiipuuii_32, f, 0, "ximage_create_image");
+        return (void*)AddCheckBridge(lib->w.bridge, pFXpuiipuuii_32, f, 0, "Ximage_create_image");
     printf_log(LOG_NONE, "Warning, no more slot for reverse 32bits libX11 create_image callback\n");
     return fct;
 }
 // destroy_image
 #define GO(A)   \
-static uintptr_t my32_destroy_image_fct_##A = 0;                    \
-static int my32_destroy_image_##A(void* a)                          \
-{                                                                   \
-    inplace_XImage_shrink(a);                                       \
-    return (int)RunFunctionFmt(my32_destroy_image_fct_##A, "p", a); \
-}                                                                   \
-static iFp_t my32_rev_destroy_image_fct_##A = NULL;                 \
-static int my32_rev_destroy_image_##A(void* a)                      \
-{                                                                   \
-    inplace_XImage_enlarge(a);                                      \
-    to_hash_d((uintptr_t)((XImage*)a)->obdata);                     \
-    return my32_rev_destroy_image_fct_##A (a);                      \
+static uintptr_t my32_destroy_image_fct_##A = 0;                        \
+static int my32_destroy_image_##A(void* a)                              \
+{                                                                       \
+    void* obdata = ((XImage*)a)->obdata;                                \
+    inplace_XImage_shrink(a);                                           \
+    int ret = (int)RunFunctionFmt(my32_destroy_image_fct_##A, "p", a);  \
+    to_hash_d((uintptr_t)obdata);                                       \
+    if(obdata) delShmInfo(obdata);                                      \
+    return ret;                                                         \
+}                                                                       \
+static iFp_t my32_rev_destroy_image_fct_##A = NULL;                     \
+static int my32_rev_destroy_image_##A(void* a)                          \
+{                                                                       \
+    inplace_XImage_enlarge(a);                                          \
+    to_hash_d((uintptr_t)((XImage*)a)->obdata);                         \
+    void* obdata = ((XImage*)a)->obdata;                                \
+    int ret = my32_rev_destroy_image_fct_##A (a);                       \
+    if(obdata) delShmInfo(obdata);                                      \
+    return ret;                                                         \
 }
 SUPER()
 #undef GO
@@ -690,7 +698,7 @@ static void* reverse_destroy_image_Fct(library_t* lib, void* fct)
     SUPER()
     #undef GO
     if(f)
-        return (void*)AddCheckBridge(lib->w.bridge, iFp_32, f, 0, "ximage_destroy_image");
+        return (void*)AddCheckBridge(lib->w.bridge, iFp_32, f, 0, "Ximage_destroy_image");
     printf_log(LOG_NONE, "Warning, no more slot for reverse 32bits libX11 destroy_image callback\n");
     return fct;
 }
@@ -750,7 +758,7 @@ static void* reverse_get_pixel_Fct(library_t* lib, void* fct)
     SUPER()
     #undef GO
     if(f)
-        return (void*)AddCheckBridge(lib->w.bridge, LFpii_32, f, 0, "ximage_get_pixel");
+        return (void*)AddCheckBridge(lib->w.bridge, LFpii_32, f, 0, "Ximage_get_pixel");
     printf_log(LOG_NONE, "Warning, no more slot for reverse 32bits libX11 get_pixel callback\n");
     return fct;
 }
@@ -810,7 +818,7 @@ static void* reverse_put_pixel_Fct(library_t* lib, void* fct)
     SUPER()
     #undef GO
     if(f)
-        return (void*)AddCheckBridge(lib->w.bridge, iFpiiL_32, f, 0, "ximage_put_pixel");
+        return (void*)AddCheckBridge(lib->w.bridge, iFpiiL_32, f, 0, "Ximage_put_pixel");
     printf_log(LOG_NONE, "Warning, no more slot for reverse 32bits libX11 put_pixel callback\n");
     return fct;
 }
@@ -946,16 +954,16 @@ void* my32_XCreateImage(x64emu_t* emu, void* disp, void* vis, uint32_t depth, in
 
 int32_t my32_XInitImage(x64emu_t* emu, void* img);
 
-void* my32_XGetImage(x64emu_t* emu, void* disp, size_t drawable, int32_t x, int32_t y
+void* my32_XGetImage(x64emu_t* emu, void* disp, XID drawable, int32_t x, int32_t y
                     , uint32_t w, uint32_t h, uint32_t plane, int32_t fmt);
 
-int32_t my32_XPutImage(x64emu_t* emu, void* disp, size_t drawable, void* gc, void* image
+int32_t my32_XPutImage(x64emu_t* emu, void* disp, XID drawable, void* gc, void* image
                     , int32_t src_x, int32_t src_y, int32_t dst_x, int32_t dst_y
                     , uint32_t w, uint32_t h);
 
-void* my32_XGetSubImage(x64emu_t* emu, void* disp, size_t drawable
+void* my32_XGetSubImage(x64emu_t* emu, void* disp, XID drawable
                     , int32_t x, int32_t y
-                    , uint32_t w, uint32_t h, size_t plane, int32_t fmt
+                    , uint32_t w, uint32_t h, XID plane, int32_t fmt
                     , void* image, int32_t dst_x, int32_t dst_y);
 
 void my32_XDestroyImage(x64emu_t* emu, void* image);
@@ -1519,7 +1527,7 @@ EXPORT void* my32_XCreateImage(x64emu_t* emu, void* disp, void* vis, uint32_t de
                     , void* data, uint32_t w, uint32_t h, int32_t pad, int32_t bpl)
 {
 
-    XImage *img = my->XCreateImage(disp, vis, depth, fmt, off, data, w, h, pad, bpl);
+    XImage *img = my->XCreateImage(disp, convert_Visual_to_64(disp, vis), depth, fmt, off, data, w, h, pad, bpl);
     if(!img)
         return img;
     // bridge all access functions...
@@ -1537,7 +1545,7 @@ EXPORT int32_t my32_XInitImage(x64emu_t* emu, void* img)
     return ret;
 }
 
-EXPORT void* my32_XGetImage(x64emu_t* emu, void* disp, size_t drawable, int32_t x, int32_t y
+EXPORT void* my32_XGetImage(x64emu_t* emu, void* disp, XID drawable, int32_t x, int32_t y
                     , uint32_t w, uint32_t h, uint32_t plane, int32_t fmt)
 {
 
@@ -1549,10 +1557,13 @@ EXPORT void* my32_XGetImage(x64emu_t* emu, void* disp, size_t drawable, int32_t
     return img;
 }
 
-EXPORT void my32__XInitImageFuncPtrs(x64emu_t* emu, XImage* img)
+EXPORT void my32__XInitImageFuncPtrs(x64emu_t* emu, XImage_32* img)
 {
-    my->_XInitImageFuncPtrs(img);
-    inplace_XImage_shrink(img);
+    XImage img_l = {0};
+    img->f.add_pixel = img->f.create_image = img->f.destroy_image = img->f.get_pixel = img->f.put_pixel = img->f.sub_image = 0;
+    UnwrapXImage(&img_l, img);
+    my->_XInitImageFuncPtrs(&img_l);
+    WrapXImage(img, &img_l);
 }
 
 EXPORT int32_t my32_XPutImage(x64emu_t* emu, void* disp, size_t drawable, void* gc, void* image
@@ -1566,9 +1577,9 @@ EXPORT int32_t my32_XPutImage(x64emu_t* emu, void* disp, size_t drawable, void*
     return r;
 }
 
-EXPORT void* my32_XGetSubImage(x64emu_t* emu, void* disp, size_t drawable
+EXPORT void* my32_XGetSubImage(x64emu_t* emu, void* disp, XID drawable
                     , int32_t x, int32_t y
-                    , uint32_t w, uint32_t h, size_t plane, int32_t fmt
+                    , uint32_t w, uint32_t h, XID plane, int32_t fmt
                     , void* image, int32_t dst_x, int32_t dst_y)
 {
 
@@ -1686,7 +1697,7 @@ EXPORT XID my32_XCreateWindow(x64emu_t* emu, void* d, XID Window, int x, int y,
     my_XSetWindowAttributes_t attrib;
     if(attr)
         convert_XSetWindowAttributes_to_64(&attrib, attr);
-    return my->XCreateWindow(d, Window, x, y, width, height, border_width, depth, cl, visual, mask, attr?(&attrib):NULL);
+    return my->XCreateWindow(d, Window, x, y, width, height, border_width, depth, cl, convert_Visual_to_64(d, visual), mask, attr?(&attrib):NULL);
 }
 
 EXPORT int my32_XNextEvent(x64emu_t* emu, void* dpy, my_XEvent_32_t* evt)
@@ -2132,12 +2143,22 @@ EXPORT void* my32_XGetIMValues(x64emu_t* emu, void* xim, ptr_t* b)
 EXPORT void* my32_XGetVisualInfo(x64emu_t* emu, void* dpy, long mask, my_XVisualInfo_32_t* template, int* n)
 {
     my_XVisualInfo_t template_l = {0};
-    if(template) convert_XVisualInfo_to_64(&template_l, template);
+    if(template) convert_XVisualInfo_to_64(dpy, &template_l, template);
     my_XVisualInfo_t* ret = my->XGetVisualInfo(dpy, mask, template?(&template_l):NULL, n);
-    inplace_XVisualInfo_shrink(ret);
+    inplace_XVisualInfo_shrink(dpy, ret);
     return ret;
 }
 
+EXPORT XID my32_XVisualIDFromVisual(x64emu_t* emu, my_Visual_32_t* v)
+{
+    return from_ulong(v->visualid);
+}
+
+EXPORT XID my32_XCreateColormap(x64emu_t* emu, void* dpy, XID w, my_Visual_32_t* v, int alloc)
+{
+    return my->XCreateColormap(dpy, w, convert_Visual_to_64(dpy, v), alloc);
+}
+
 EXPORT int my32_XQueryColors(x64emu_t* emu, void* dpy, XID map, my_XColor_32_t* defs, int ncolor)
 {
     struct_LWWWcc_t defs_l[ncolor];
diff --git a/src/wrapped32/wrappedlibx11_private.h b/src/wrapped32/wrappedlibx11_private.h
index 597e7594..a32c5d46 100644
--- a/src/wrapped32/wrappedlibx11_private.h
+++ b/src/wrapped32/wrappedlibx11_private.h
@@ -209,7 +209,7 @@ GO(XCopyGC, iFXpLp)
 GO(XCopyPlane, iFXLLpiiuuiiL)
 //GO(_XCopyToArg, 
 GO(XCreateBitmapFromData, LFXLpuu)
-GO(XCreateColormap, LFXLpi)
+GOM(XCreateColormap, LFEXLpi)
 GO(XCreateFontCursor, LFXu)
 GOM(XCreateFontSet, pFEXpppp)
 GO(XCreateGC, pFXLLbiLLLiiiiiiiLLiiLiiiiLic_)
@@ -1195,7 +1195,7 @@ GO(Xutf8TextPerCharExtents, iFppippippp)
 GOM(XVaCreateNestedList, pFEiV)
 GO(XVendorRelease, iFX)
 GO(_XVIDtoVisual, pFXL)
-GO(XVisualIDFromVisual, LFp)
+GOM(XVisualIDFromVisual, LFEp)
 GO(XWarpPointer, iFXLLiiuuii)
 //GO(_XwcDefaultDrawImageString, 
 //GO(_XwcDefaultDrawString, 
diff --git a/src/wrapped32/wrappedlibxext.c b/src/wrapped32/wrappedlibxext.c
index daadc460..8acbdee7 100644
--- a/src/wrapped32/wrappedlibxext.c
+++ b/src/wrapped32/wrappedlibxext.c
@@ -402,10 +402,44 @@ static void* find_error_string_Fct(void* fct)
 
 #undef SUPER
 
+KHASH_MAP_INIT_INT(shminfo, my_XShmSegmentInfo_t*);
+static kh_shminfo_t* shminfos = NULL;
+
+my_XShmSegmentInfo_t* getShmInfo(void* a)
+{
+    if(!a) return NULL;
+    ptr_t key = to_ptrv(a);
+    khint_t k = kh_get(shminfo, shminfos, key);
+    my_XShmSegmentInfo_t* ret = NULL;
+    if(k==kh_end(shminfos)) {
+        int r;
+        k = kh_put(shminfo, shminfos, key, &r);
+        ret = kh_value(shminfos, k) = calloc(1, sizeof(my_XShmSegmentInfo_t));
+    } else
+        ret = kh_value(shminfos, k);
+    convert_XShmSegmentInfo_to_64(ret, a);
+    return ret;
+}
+
+void delShmInfo(my_XShmSegmentInfo_t* a)
+{
+    if(!a) return;
+    my_XShmSegmentInfo_t* b;
+    kh_foreach_value(shminfos, b, 
+        if(a==b) {
+            free(a);
+            kh_del(shminfo, shminfos, __i);
+            return;
+        }
+    );
+}
+
 EXPORT void* my32_XShmCreateImage(x64emu_t* emu, void* disp, void* vis, uint32_t depth, int32_t fmt
                     , void* data, void* shminfo, uint32_t w, uint32_t h)
 {
-    XImage *img = my->XShmCreateImage(disp, vis, depth, fmt, data, shminfo, w, h);
+    my_XShmSegmentInfo_t* shminfo_l = getShmInfo(shminfo);
+    XImage *img = my->XShmCreateImage(disp, convert_Visual_to_64(disp, vis), depth, fmt, data, shminfo_l, w, h);
+    convert_XShmSegmentInfo_to_32(shminfo, shminfo_l);
     inplace_XImage_shrink(img);
     return img;
 }
@@ -428,6 +462,30 @@ EXPORT int32_t my32_XShmGetImage(x64emu_t* emu, void* disp, size_t drawable, voi
     return r;
 }
 
+EXPORT XID my32_XShmCreatePixmap(x64emu_t* emu, void* dpy, XID d, void* data, void* shminfo, uint32_t width, uint32_t height, uint32_t depth)
+{
+    my_XShmSegmentInfo_t* shminfo_l = getShmInfo(shminfo);
+    XID ret = my->XShmCreatePixmap(dpy, d, data, shminfo_l, width, height, depth);
+    convert_XShmSegmentInfo_to_32(shminfo, shminfo_l);  // just in case
+    return ret;
+}
+
+EXPORT int my32_XShmAttach(x64emu_t* emu, void* dpy, void* shminfo)
+{
+    my_XShmSegmentInfo_t* shminfo_l = getShmInfo(shminfo);
+    int ret = my->XShmAttach(dpy, shminfo_l);
+    convert_XShmSegmentInfo_to_32(shminfo, shminfo_l);  // just in case
+    return ret;
+}
+
+EXPORT int my32_XShmDetach(x64emu_t* emu, void* dpy, void* shminfo)
+{
+    my_XShmSegmentInfo_t* shminfo_l = getShmInfo(shminfo);
+    int ret = my->XShmDetach(dpy, shminfo_l);
+    convert_XShmSegmentInfo_to_32(shminfo, shminfo_l);  // just in case
+    return ret;
+}
+
 EXPORT void* my32_XSetExtensionErrorHandler(x64emu_t* emu, void* handler)
 {
     (void)emu;
@@ -519,4 +577,14 @@ EXPORT int my32_XextRemoveDisplay(x64emu_t* emu, void* ext, void* dpy)
 #define NEEDED_LIBS "libX11.so.6", "libxcb.so.1", "libXau.so.6", "libdl.so.2", "libXdmcp.so.6"
 #endif
 #endif
+
+#define CUSTOM_INIT \
+    shminfos = kh_init(shminfo);
+
+#define CUSTOM_FINI \
+    my_XShmSegmentInfo_t* info;                     \
+    kh_foreach_value(shminfos, info, free(info));   \
+    kh_destroy(shminfo, shminfos);                  \
+    shminfos = NULL;
+
 #include "wrappedlib_init32.h"
diff --git a/src/wrapped32/wrappedlibxext_private.h b/src/wrapped32/wrappedlibxext_private.h
index ea66930f..0d189dbc 100644
--- a/src/wrapped32/wrappedlibxext_private.h
+++ b/src/wrapped32/wrappedlibxext_private.h
@@ -78,14 +78,14 @@ GO(XShapeQueryExtension, iFXpp)
 GO(XShapeQueryExtents, iFXLpppppppppp)
 GO(XShapeQueryVersion, iFXpp)
 GO(XShapeSelectInput, vFXLL)
-GO(XShmAttach, iFXbLipi_)
-GOM(XShmCreateImage, pFEXbpLiLLLii_uipbLipi_uu)
-GO(XShmCreatePixmap, LFXLpbLipi_uuu)
-GO(XShmDetach, iFXbLipi_)
+GOM(XShmAttach, iFEXp)    //!\ use shminfo
+GOM(XShmCreateImage, pFEXbpLiLLLii_uippuu)  //!\ use shminfo
+GOM(XShmCreatePixmap, LFEXLppuuu) //!\ use shminfo
+GOM(XShmDetach, iFEXp)    //!\ use shminfo
 GO(XShmGetEventBase, iFX)
 GOM(XShmGetImage, iFEXLpiiL)
 GO(XShmPixmapFormat, iFX)
-GOM(XShmPutImage, iFEXLppiiiiuui) // Warning: failed to confirm
+GOM(XShmPutImage, iFEXLppiiiiuui)
 GO(XShmQueryExtension, iFX)
 GO(XShmQueryVersion, iFXppp)
 //GO(XSyncAwait, iFppi)
diff --git a/src/wrapped32/wrappedlibxrender.c b/src/wrapped32/wrappedlibxrender.c
index e1688640..fcef909a 100644
--- a/src/wrapped32/wrappedlibxrender.c
+++ b/src/wrapped32/wrappedlibxrender.c
@@ -33,8 +33,7 @@
 #define NEEDED_LIBS "libX11.so.6"
 #endif
 
-#include "libtools/my_x11_defs.h"
-#include "libtools/my_x11_defs_32.h"
+#include "libtools/my_x11_conv.h"
 
 #include "generated/wrappedlibxrendertypes32.h"
 
@@ -46,12 +45,13 @@ static kh_picformat_t*   hash_picformat;
 EXPORT void* my32_XRenderFindFormat(x64emu_t* emu, void* dpy, unsigned long mask, void* tmpl, int count)
 {
     void* ret = my->XRenderFindFormat(dpy, mask, tmpl, count);
+    if(!ret) return NULL;
     khint_t k = kh_get(picformat, hash_picformat, (uintptr_t)ret);
     if(k!=kh_end(hash_picformat))
         return kh_value(hash_picformat, k);
     int r;
     k = kh_put(picformat, hash_picformat, (uintptr_t)ret, &r);
-    struct_LiiuL_t* res = box_calloc(1, sizeof(struct_LiiuL_t));
+    struct_LiiuL_t* res = calloc(1, sizeof(struct_LiiuL_t));
     to_struct_LiiuL(to_ptrv(res), ret);
     kh_value(hash_picformat, k) = res;
     return res;
@@ -60,12 +60,13 @@ EXPORT void* my32_XRenderFindFormat(x64emu_t* emu, void* dpy, unsigned long mask
 EXPORT void* my32_XRenderFindStandardFormat(x64emu_t* emu, void* dpy, int fmt)
 {
     void* ret = my->XRenderFindStandardFormat(dpy, fmt);
+    if(!ret) return NULL;
     khint_t k = kh_get(picformat, hash_picformat, (uintptr_t)ret);
     if(k!=kh_end(hash_picformat))
         return kh_value(hash_picformat, k);
     int r;
     k = kh_put(picformat, hash_picformat, (uintptr_t)ret, &r);
-    struct_LiiuL_t* res = box_calloc(1, sizeof(struct_LiiuL_t));
+    struct_LiiuL_t* res = calloc(1, sizeof(struct_LiiuL_t));
     to_struct_LiiuL(to_ptrv(res), ret);
     kh_value(hash_picformat, k) = res;
     return res;
@@ -73,25 +74,25 @@ EXPORT void* my32_XRenderFindStandardFormat(x64emu_t* emu, void* dpy, int fmt)
 
 EXPORT void* my32_XRenderFindVisualFormat(x64emu_t* emu, void* dpy, void* visual)
 {
-    void* ret = my->XRenderFindVisualFormat(dpy, visual);
+    void* ret = my->XRenderFindVisualFormat(dpy, convert_Visual_to_64(dpy, visual));
+    if(!ret) return NULL;
     khint_t k = kh_get(picformat, hash_picformat, (uintptr_t)ret);
     if(k!=kh_end(hash_picformat))
         return kh_value(hash_picformat, k);
     int r;
     k = kh_put(picformat, hash_picformat, (uintptr_t)ret, &r);
-    struct_LiiuL_t* res = box_calloc(1, sizeof(struct_LiiuL_t));
+    struct_LiiuL_t* res = calloc(1, sizeof(struct_LiiuL_t));
     to_struct_LiiuL(to_ptrv(res), ret);
     kh_value(hash_picformat, k) = res;
     return res;
 }
-
-#define CUSTOM_INIT         \
-    hash_picformat = kh_init(picformat);
+#define CUSTOM_INIT                                     \
+    hash_picformat = kh_init(picformat);                \
 
 #define CUSTOM_FINI                                     \
     void* p;                                            \
-    kh_foreach_value(hash_picformat, p, box_free(p));   \
+    kh_foreach_value(hash_picformat, p, free(p));       \
     kh_destroy(picformat, hash_picformat);              \
-    hash_picformat = NULL;
+    hash_picformat = NULL;                              \
 
 #include "wrappedlib_init32.h"