about summary refs log tree commit diff stats
path: root/src/wrapped32/wrappedlibx11.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-13 15:24:03 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-13 15:24:11 +0100
commitfa3db3df11f0d10a4a46f5ec5b0aaeaf34656d72 (patch)
tree74dacd24ef44f155a2b6f0ab517bfe25c2e48dc2 /src/wrapped32/wrappedlibx11.c
parent4b4c0143d951b6aa18e2102136b4b72e165459d4 (diff)
downloadbox64-fa3db3df11f0d10a4a46f5ec5b0aaeaf34656d72.tar.gz
box64-fa3db3df11f0d10a4a46f5ec5b0aaeaf34656d72.zip
[BOX32][WRAPPER] Added a arge batch of 32bits wrapped function to X11 and friends
Diffstat (limited to 'src/wrapped32/wrappedlibx11.c')
-rw-r--r--src/wrapped32/wrappedlibx11.c383
1 files changed, 346 insertions, 37 deletions
diff --git a/src/wrapped32/wrappedlibx11.c b/src/wrapped32/wrappedlibx11.c
index a2d94afc..21e694c4 100644
--- a/src/wrapped32/wrappedlibx11.c
+++ b/src/wrapped32/wrappedlibx11.c
@@ -405,13 +405,12 @@ static void* reverse_register_imFct(library_t* lib, void* fct)
     #undef GO
     return (void*)AddBridge(lib->w.bridge, iFppp_32, fct, 0, NULL);
 }
-#if 0
 // XConnectionWatchProc
 #define GO(A)   \
-static uintptr_t my32_XConnectionWatchProc_fct_##A = 0;                               \
-static void my32_XConnectionWatchProc_##A(void* dpy, void* data, int op, void* d)     \
-{                                                                                   \
-    RunFunctionFmt(my32_XConnectionWatchProc_fct_##A, "ppip", dpy, data, op, d);  \
+static uintptr_t my32_XConnectionWatchProc_fct_##A = 0;                                         \
+static void my32_XConnectionWatchProc_##A(void* dpy, void* data, int op, void* d)               \
+{                                                                                               \
+    RunFunctionFmt(my32_XConnectionWatchProc_fct_##A, "ppip", FindDisplay(dpy), data, op, d);   \
 }
 SUPER()
 #undef GO
@@ -428,7 +427,6 @@ static void* findXConnectionWatchProcFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for libX11 XConnectionWatchProc callback\n");
     return NULL;
 }
-#endif
 // xifevent
 #define GO(A)   \
 static uintptr_t my32_xifevent_fct_##A = 0;                                             \
@@ -455,13 +453,12 @@ static void* findxifeventFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for libX11 xifevent callback\n");
     return NULL;
 }
-#if 0
 // XInternalAsyncHandler
 #define GO(A)   \
-static uintptr_t my32_XInternalAsyncHandler_fct_##A = 0;                                              \
-static int my32_XInternalAsyncHandler_##A(void* dpy, void* rep, void* buf, int len, void* data)       \
-{                                                                                                   \
-    return RunFunctionFmt(my32_XInternalAsyncHandler_fct_##A, "pppip", dpy, rep, buf, len, data);  \
+static uintptr_t my32_XInternalAsyncHandler_fct_##A = 0;                                                        \
+static int my32_XInternalAsyncHandler_##A(void* dpy, void* rep, void* buf, int len, void* data)                 \
+{                                                                                                               \
+    return RunFunctionFmt(my32_XInternalAsyncHandler_fct_##A, "pppip", FindDisplay(dpy), rep, buf, len, data);  \
 }
 SUPER()
 #undef GO
@@ -478,7 +475,6 @@ static void* findXInternalAsyncHandlerFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for libX11 XInternalAsyncHandler callback\n");
     return NULL;
 }
-#endif
 // XSynchronizeProc
 #define GO(A)   \
 static uintptr_t my32_XSynchronizeProc_fct_##A = 0;                       \
@@ -556,12 +552,13 @@ static void* findXUnlockDisplayFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for libX11 XUnlockDisplay callback\n");
     return NULL;
 }
+#endif
 // async_handler
 #define GO(A)   \
-static uintptr_t my32_async_handler_fct_##A = 0;                                      \
-static int my32_async_handler_##A(void* a, void* b, void* c, int d, void* e)          \
-{                                                                                   \
-    return (int)RunFunctionFmt(my32_async_handler_fct_##A, "pppip", a, b, c, d, e);   \
+static uintptr_t my32_async_handler_fct_##A = 0;                                                    \
+static int my32_async_handler_##A(void* a, void* b, void* c, int d, void* e)                        \
+{                                                                                                   \
+    return (int)RunFunctionFmt(my32_async_handler_fct_##A, "pppip", FindDisplay(a), b, c, d, e);    \
 }
 SUPER()
 #undef GO
@@ -578,7 +575,6 @@ static void* find_async_handler_Fct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for libX11 async_handler callback\n");
     return NULL;
 }
-#endif
 // XImage function wrappers
 // create_image
 #define GO(A)   \
@@ -1606,7 +1602,7 @@ EXPORT void my32_XDestroyImage(x64emu_t* emu, void* image)
     to_hash_d((uintptr_t)((XImage*)image)->obdata);
     my->XDestroyImage(image);
 }
-#if 0
+
 typedef struct xintasync_s {
     struct xintasync_s *next;
     int (*handler)(
@@ -1624,7 +1620,6 @@ 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;
@@ -1661,11 +1656,11 @@ EXPORT int my32_XQueryExtension(x64emu_t* emu, void* display, char* name, int* m
     }
     return ret;
 }
-#if 0
 EXPORT int my32_XAddConnectionWatch(x64emu_t* emu, void* display, char* f, void* data)
 {
     return my->XAddConnectionWatch(display, findXConnectionWatchProcFct(f), data);
 }
+#if 0
 
 EXPORT void my32_XRemoveConnectionWatch(x64emu_t* emu, void* display, char* f, void* data)
 {
@@ -1687,7 +1682,7 @@ EXPORT void* my32_XSynchronize(x64emu_t* emu, void* display, int onoff)
 EXPORT void* my32_XOpenDisplay(void* name)
 {
     void* ret = my->XOpenDisplay(name);
-    if(ret && box64_x11sync) {my->XSynchronize(ret, 1); printf_log(LOG_INFO, "Forcing Syncronized opration on Display %p\n", ret);}
+    if(ret && box64_x11sync) {my->XSynchronize(ret, 1); printf_log(LOG_INFO, "Forcing Syncronized operation on Display %p\n", ret);}
     return ret;
 }
 
@@ -1884,16 +1879,15 @@ EXPORT int my32_XGetWMNormalHints(x64emu_t* emu, void* dpy, XID window, void* hi
     }
     return ret;
 }
-#if 0
 EXPORT void* my32__XGetRequest(x64emu_t* emu, my_XDisplay_t* dpy, uint8_t type, size_t len)
 {
     // check if asynchandler needs updated wrapping
-    struct my32_XInternalAsync * p = dpy->async_handlers;
+    struct my_XInternalAsync * p = dpy->async_handlers;
     while(p) {
         if(GetNativeFnc((uintptr_t)p->handler)!=p->handler) {
             // needs wrapping and autobridge!
             void* new_handler = find_async_handler_Fct(p->handler);
-            AddAutomaticBridge(my_lib->w.bridge, iFpppip, new_handler, 0, "async_handler");
+            AddAutomaticBridge(my_lib->w.bridge, iFpppip_32, new_handler, 0, "async_handler");
             p->handler = new_handler;
         }
         p = p->next;
@@ -1901,7 +1895,6 @@ EXPORT void* my32__XGetRequest(x64emu_t* emu, my_XDisplay_t* dpy, uint8_t type,
 
     return my->_XGetRequest(dpy, type, len);
 }
-#endif
 
 EXPORT int my32_XStringListToTextProperty(x64emu_t* emu, ptr_t* list, int count, void* text)
 {
@@ -1939,6 +1932,18 @@ EXPORT int my32_XmbTextListToTextProperty(x64emu_t* emu, void* dpy, ptr_t* list,
     return ret;
 }
 
+EXPORT int my32_XwcTextListToTextProperty(x64emu_t* emu, void* dpy, ptr_t* list, int count, uint32_t style, void* text)
+{
+    char* l_list[count];
+    if(list)
+        for(int i=0; i<count; ++i)
+            l_list[i] = from_ptrv(list[i]);
+    struct_pLiL_t text_l = {0};
+    int ret = my->XwcTextListToTextProperty(dpy, list?(&l_list):NULL, count, style, &text_l);
+    to_struct_pLiL(to_ptrv(text), &text_l);
+    return ret;
+}
+
 EXPORT int my32_XGetWindowAttributes(x64emu_t* emu, void* dpy, XID window, my_XWindowAttributes_32_t* attr)
 {
     static my_Screen_32_t screen32 = {0};
@@ -2020,6 +2025,29 @@ EXPORT void my32_Xutf8SetWMProperties(x64emu_t* emu, void* dpy, XID window, void
     my->Xutf8SetWMProperties(dpy, window, window_name, icon_name, argv?argv_l:NULL, argc, normal_hints?(&wm_size_l):NULL, wm_hints?(&wm_hints_l):NULL, class_hints?(&class_hints_l):NULL);
 }
 
+EXPORT void my32_XmbSetWMProperties(x64emu_t* emu, void* dpy, XID window, void* window_name, void* icon_name, ptr_t* argv, int argc, void* normal_hints, my_XWMHints_32_t* wm_hints, ptr_t* class_hints)
+{
+    int wm_size_l[17+2] = {0};
+    my_XWMHints_t wm_hints_l = {0};
+    char* class_hints_l[2] = {0};
+    char* argv_l[argc+1];
+
+    if(normal_hints)
+        convert_XSizeHints_to_64(&wm_size_l, normal_hints);
+    if(wm_hints)
+        convert_XWMints_to_64(&wm_hints_l, wm_hints);
+    if(class_hints) {
+        class_hints_l[0] = from_ptrv(class_hints[0]);
+        class_hints_l[1] = from_ptrv(class_hints[1]);
+    }
+    if(argv) {
+        memset(argv_l, 0, sizeof(argv_l));
+        for(int i=0; i<argc; ++i)
+            argv_l[i] = from_ptrv(argv[i]);
+    }
+    my->XmbSetWMProperties(dpy, window, window_name, icon_name, argv?argv_l:NULL, argc, normal_hints?(&wm_size_l):NULL, wm_hints?(&wm_hints_l):NULL, class_hints?(&class_hints_l):NULL);
+}
+
 
 EXPORT void* my32_XListExtensions(x64emu_t* emu, void* dpy, int* n)
 {
@@ -2061,21 +2089,18 @@ EXPORT int my32_XQueryTree(x64emu_t* emu, void* dpy, XID window, XID_32* root, X
     return ret;
 }
 
-EXPORT void* my32_XCreateFontSet(x64emu_t* emu, void* dpy, void* name, ptr_t* missing, int* missing_count, ptr_t* string)
+EXPORT int my32_Xutf8TextPropertyToTextList(x64emu_t* emu, void* dpy, void* prop, ptr_t* list, int* count)
 {
-    void** missing_l = NULL;
-    void* string_l = NULL;
-    void* ret = my->XCreateFontSet(dpy, name, &missing_l, missing_count, string?(&string_l):NULL);
-    if(string) *string = to_ptrv(string_l);
-    // inplace string list shrink
-    *missing = to_ptrv(missing_l);
-    if(missing_l && *missing_count) {
-        for(int i=0; i<*missing_count; ++i)
-            ((ptr_t*)missing_l)[i] = to_ptrv(missing_l[i]);
+    void** list_l = NULL;
+    int ret = my->Xutf8TextPropertyToTextList(dpy, prop, &list_l, count);
+    if(list_l && *count) {
+        for(int i=0; i<*count; ++i)
+            ((ptr_t*)list_l)[i] = to_ptrv(list_l[i]);
     }
     // put end marker, for expansion
-    if(missing_l)
-        ((ptr_t*)missing_l)[*missing_count] = 0;
+    if(list_l)
+        ((ptr_t*)list_l)[*count] = 0;
+    *list = to_ptrv(list_l);
     return ret;
 }
 
@@ -2094,6 +2119,21 @@ EXPORT int my32_XmbTextPropertyToTextList(x64emu_t* emu, void* dpy, void* prop,
     return ret;
 }
 
+EXPORT int my32_XwcTextPropertyToTextList(x64emu_t* emu, void* dpy, void* prop, ptr_t* list, int* count)
+{
+    void** list_l = NULL;
+    int ret = my->XwcTextPropertyToTextList(dpy, prop, &list_l, count);
+    if(list_l && *count) {
+        for(int i=0; i<*count; ++i)
+            ((ptr_t*)list_l)[i] = to_ptrv(list_l[i]);
+    }
+    // put end marker, for expansion
+    if(list_l)
+        ((ptr_t*)list_l)[*count] = 0;
+    *list = to_ptrv(list_l);
+    return ret;
+}
+
 EXPORT void my32_XFreeStringList(x64emu_t* emu, ptr_t* list)
 {
     // need to find size of list
@@ -2226,6 +2266,198 @@ EXPORT int my32_XFreeFont(x64emu_t* emu, void* dpy, void* f)
     return my->XFreeFont(dpy, f);
 }
 
+EXPORT void* my32_XCreateFontSet(x64emu_t* emu, void* dpy, void* name, ptr_t* missing, int* missing_count, ptr_t* string)
+{
+    void** missing_l = NULL;
+    void* string_l = NULL;
+    void* ret = my->XCreateFontSet(dpy, name, &missing_l, missing_count, string?(&string_l):NULL);
+    if(string) *string = to_ptrv(string_l);
+    // inplace string list shrink
+    *missing = to_ptrv(missing_l);
+    if(missing_l && *missing_count) {
+        for(int i=0; i<*missing_count; ++i)
+            ((ptr_t*)missing_l)[i] = to_ptrv(missing_l[i]);
+    }
+    // put end marker, for expansion
+    if(missing_l)
+        ((ptr_t*)missing_l)[*missing_count] = 0;
+    my_XFontSet_32_t* set = box32_calloc(1, sizeof(my_XFontSet_32_t));
+    set->fontset = ret;
+    return set;
+}
+
+EXPORT int my32_XFontsOfFontSet(x64emu_t* emu, my_XFontSet_32_t* set, ptr_t* fonts_ret, ptr_t* names_ret)
+{
+    void* fonts_ret_l = NULL;
+    void* names_ret_l = NULL;
+    int ret = my->XFontsOfFontSet(set->fontset, fonts_ret?(&fonts_ret_l):NULL, names_ret?(&names_ret_l):NULL);
+    if(ret<=0)
+        return ret;
+    if(names_ret) {
+        int j = set->names_size++;
+        set->names = box32_realloc(set->names, sizeof(ptr_t*)*set->names_size);
+        set->names[j] = box32_malloc(sizeof(ptr_t)*ret);
+        for(int i=0; i<ret; ++i)
+            set->names[j][i] = to_ptrv(((void**)names_ret_l)[i]);
+        *names_ret = to_ptrv(set->names[j]);
+    }
+    if(fonts_ret) {
+        int j = set->fonts_size++;
+        set->fonts = box32_realloc(set->fonts, sizeof(ptr_t*)*set->fonts_size);
+        set->fonts[j] = box32_malloc(sizeof(ptr_t)*ret);
+        for(int i=0; i<ret; ++i)
+            set->fonts[j][i] = to_ptrv(((void**)fonts_ret_l)[i]);
+        *fonts_ret = to_ptrv(set->fonts[j]);
+    }
+}
+
+EXPORT void* my32_XExtentsOfFontSet(x64emu_t* emu, my_XFontSet_32_t* set)
+{
+    return my->XExtentsOfFontSet(set->fontset);
+}
+
+EXPORT void* my32_XLocaleOfFontSet(x64emu_t* emu, my_XFontSet_32_t* set)
+{
+    return my->XLocaleOfFontSet(set->fontset);
+}
+
+EXPORT void* my32_XBaseFontNameListOfFontSet(x64emu_t* emu, my_XFontSet_32_t* set)
+{
+    return my->XBaseFontNameListOfFontSet(set->fontset);
+}
+
+EXPORT int my32_XContextDependentDrawing(x64emu_t* emu, my_XFontSet_32_t* set)
+{
+    return my->XContextDependentDrawing(set->fontset);
+}
+
+EXPORT int my32_XDirectionalDependentDrawing(x64emu_t* emu, my_XFontSet_32_t* set)
+{
+    return my->XDirectionalDependentDrawing(set->fontset);
+}
+
+EXPORT int my32_XContextualDrawing(x64emu_t* emu, my_XFontSet_32_t* set)
+{
+    return my->XContextualDrawing(set->fontset);
+}
+
+EXPORT int my32_XmbTextEscapement(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz)
+{
+    return my->XmbTextEscapement(set->fontset, text, sz);
+}
+
+EXPORT int my32_XwcTextEscapement(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz)
+{
+    return my->XwcTextEscapement(set->fontset, text, sz);
+}
+
+EXPORT int my32_Xutf8TextEscapement(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz)
+{
+    return my->Xutf8TextEscapement(set->fontset, text, sz);
+}
+
+EXPORT int my32_XmbTextExtents(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz, void* ink, void* log)
+{
+    return my->XmbTextExtents(set->fontset, text, sz, ink, log);
+}
+
+EXPORT int my32_XwcTextExtents(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz, void* ink, void* log)
+{
+    return my->XwcTextExtents(set->fontset, text, sz, ink, log);
+}
+
+EXPORT int my32_Xutf8TextExtents(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz, void* ink, void* log)
+{
+    return my->Xutf8TextExtents(set->fontset, text, sz, ink, log);
+}
+
+EXPORT int my32_XmbTextPerCharExtents(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz, void* ink, void* log, int buff_sz, void* buff, void* ink_ret, void* log_ret)
+{
+    return my->XmbTextPerCharExtents(set->fontset, text, sz, ink, log, buff_sz, buff, ink_ret, log_ret);
+}
+
+EXPORT int my32_XwcTextPerCharExtents(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz, void* ink, void* log, int buff_sz, void* buff, void* ink_ret, void* log_ret)
+{
+    return my->XwcTextPerCharExtents(set->fontset, text, sz, ink, log, buff_sz, buff, ink_ret, log_ret);
+}
+
+EXPORT int my32_Xutf8TextPerCharExtents(x64emu_t* emu, my_XFontSet_32_t* set, void* text, int sz, void* ink, void* log, int buff_sz, void* buff, void* ink_ret, void* log_ret)
+{
+    return my->Xutf8TextPerCharExtents(set->fontset, text, sz, ink, log, buff_sz, buff, ink_ret, log_ret);
+}
+
+EXPORT void my32_XmbDrawString(x64emu_t* emu, void* dpy, XID d, my_XFontSet_32_t* set, void* gc, int x, int y, void* text, int sz)
+{
+    my->XmbDrawString(dpy, d, set->fontset, gc, x, y, text, sz);
+}
+
+EXPORT void my32_XwcDrawString(x64emu_t* emu, void* dpy, XID d, my_XFontSet_32_t* set, void* gc, int x, int y, void* text, int sz)
+{
+    my->XwcDrawString(dpy, d, set->fontset, gc, x, y, text, sz);
+}
+
+EXPORT void my32_Xutf8DrawString(x64emu_t* emu, void* dpy, XID d, my_XFontSet_32_t* set, void* gc, int x, int y, void* text, int sz)
+{
+    my->Xutf8DrawString(dpy, d, set->fontset, gc, x, y, text, sz);
+}
+
+EXPORT void my32_XmbDrawImageString(x64emu_t* emu, void* dpy, XID d, my_XFontSet_32_t* set, void* gc, int x, int y, void* text, int sz)
+{
+    my->XmbDrawImageString(dpy, d, set->fontset, gc, x, y, text, sz);
+}
+
+EXPORT void my32_XwcDrawImageString(x64emu_t* emu, void* dpy, XID d, my_XFontSet_32_t* set, void* gc, int x, int y, void* text, int sz)
+{
+    my->XwcDrawImageString(dpy, d, set->fontset, gc, x, y, text, sz);
+}
+
+EXPORT void my32_Xutf8DrawImageString(x64emu_t* emu, void* dpy, XID d, my_XFontSet_32_t* set, void* gc, int x, int y, void* text, int sz)
+{
+    my->Xutf8DrawImageString(dpy, d, set->fontset, gc, x, y, text, sz);
+}
+
+EXPORT void my32_XmbDrawText(x64emu_t* emu, void* dpy, XID d, void* gc, int x, int y, my_XmbTextItem_32_t* text, int sz)
+{
+    my_XmbTextItem_t text_l = {0};
+    text_l.chars = from_ptrv(text->chars);
+    text_l.nchars = text->nchars;
+    text_l.delta = text->delta;
+    text_l.font_set = ((my_XFontSet_32_t*)from_ptrv(text->font_set))->fontset;
+    my->XmbDrawText(dpy, d, gc, x, y, &text_l, sz);
+}
+
+EXPORT void my32_XwcDrawText(x64emu_t* emu, void* dpy, XID d, void* gc, int x, int y, my_XwcTextItem_32_t* text, int sz)
+{
+    my_XwcTextItem_t text_l = {0};
+    text_l.chars = from_ptrv(text->chars);
+    text_l.nchars = text->nchars;
+    text_l.delta = text->delta;
+    text_l.font_set = ((my_XFontSet_32_t*)from_ptrv(text->font_set))->fontset;
+    my->XwcDrawText(dpy, d, gc, x, y, &text_l, sz);
+}
+
+EXPORT void my32_Xutf8DrawText(x64emu_t* emu, void* dpy, XID d, void* gc, int x, int y, my_XmbTextItem_32_t* text, int sz)
+{
+    my_XmbTextItem_t text_l = {0};
+    text_l.chars = from_ptrv(text->chars);
+    text_l.nchars = text->nchars;
+    text_l.delta = text->delta;
+    text_l.font_set = ((my_XFontSet_32_t*)from_ptrv(text->font_set))->fontset;
+    my->Xutf8DrawText(dpy, d, gc, x, y, &text_l, sz);
+}
+
+EXPORT void my32_XFreeFontSet(x64emu_t* emu,void* dpy, my_XFontSet_32_t* set)
+{
+    my->XFreeFontSet(dpy, set->fontset);
+    for(int i=0; i<set->names_size; ++i)
+        box32_free(set->names[i]);
+    box32_free(set->names);
+    for(int i=0; i<set->fonts_size; ++i)
+        box32_free(set->names[i]);
+    box32_free(set->fonts);
+    box32_free(set);
+}
+
 EXPORT int my32_XChangeWindowAttributes(x64emu_t* emu, void* dpy, XID window, unsigned long mask, my_XSetWindowAttributes_32_t* attrs)
 {
     my_XSetWindowAttributes_t attrs_l[1];
@@ -2261,6 +2493,15 @@ EXPORT int my32_XTextExtents(x64emu_t* emu, my_XFontStruct_32_t* font_struct, vo
     return ret;
 }
 
+EXPORT int my32_XTextExtents16(x64emu_t* emu, my_XFontStruct_32_t* font_struct, void* string, int nchars, int* dir, int* ascent, int* descent, my_XCharStruct_32_t* overall)
+{
+    //XCharStruct doesn't need any changes
+    inplace_XFontStruct_enlarge(font_struct);
+    int ret = my->XTextExtents16(font_struct, string, nchars, dir, ascent, descent, overall);
+    inplace_XFontStruct_shrink(font_struct);
+    return ret;
+}
+
 EXPORT void* my32_XLoadQueryFont(x64emu_t* emu, void* dpy, void* name)
 {
     void* ret = my->XLoadQueryFont(dpy, name);
@@ -2286,6 +2527,14 @@ EXPORT int my32_XFreeFontInfo(x64emu_t* emu, ptr_t* names, void* free_info, int
     return my->XFreeFontInfo(names_l, free_info, count);
 }
 
+EXPORT int my32_XTextWidth(x64emu_t* emu, void* font, void* string, int count)
+{
+    inplace_XFontStruct_enlarge(font);
+    int ret = my->XTextWidth(font, string, count);
+    inplace_XFontProp_shrink(font);
+    return ret;
+}
+
 EXPORT int my32_XTextWidth16(x64emu_t* emu, void* font, void* string, int count)
 {
     inplace_XFontStruct_enlarge(font);
@@ -2309,6 +2558,66 @@ EXPORT int my32_XGrabServer(x64emu_t* emu, void* dpy)
     return ret;
 }
 
+EXPORT void* my32_XkbGetMap(x64emu_t* emu, void* dpy, uint32_t which, uint32_t dev)
+{
+    return inplace_XkbDescRec_shrink(my->XkbGetMap(dpy, which, dev));
+}
+EXPORT int my32_XkbGetNames(x64emu_t* emu, void* dpy, uint32_t which, my_XkbDescRec_32_t* ptr)
+{
+    inplace_XkbDescRec_enlarge(ptr);
+    int ret = my->XkbGetNames(dpy, which, ptr);
+    inplace_XkbDescRec_shrink(ptr);
+    return ret;
+}
+EXPORT int my32_XkbGetUpdatedMap(x64emu_t* emu, void* dpy, uint32_t which, my_XkbDescRec_32_t* ptr)
+{
+    inplace_XkbDescRec_enlarge(ptr);
+    int ret = my->XkbGetUpdatedMap(dpy, which, ptr);
+    inplace_XkbDescRec_shrink(ptr);
+    return ret;
+}
+
+EXPORT int my32_XkbGetControls(x64emu_t* emu, void* dpy, int which, my_XkbDescRec_32_t* ptr)
+{
+    inplace_XkbDescRec_enlarge(ptr);
+    int ret = my->XkbGetControls(dpy, which, ptr);
+    inplace_XkbDescRec_shrink(ptr);
+    return ret;
+}
+
+EXPORT void my32_XkbFreeKeyboard(x64emu_t* emu, void* xkb, int which, int all)
+{
+    my->XkbFreeKeyboard(inplace_XkbDescRec_enlarge(xkb), which, all);
+}
+
+EXPORT void* my32_XGetMotionEvents(x64emu_t* emu, void* dpy, XID w, unsigned long start, unsigned long stop, int* n)
+{
+    void* ret = my->XGetMotionEvents(dpy, w, start, stop, n);
+    if(ret) {
+        my_XTimeCoord_t *src = ret;
+        my_XTimeCoord_32_t* dst = ret;
+        for(int i=0; i<*n; ++i) {
+            dst[i].time = to_ulong(src[i].time);
+            dst[i].x = src[i].x;
+            dst[i].y = src[i].y;
+        }
+    }
+    return ret;
+}
+
+EXPORT int my32_XGetWMColormapWindows(x64emu_t* emu, void* dpy, XID w, ptr_t* maps, int* n)
+{
+    void* maps_l = NULL;
+    int ret = my->XGetWMColormapWindows(dpy, w, &maps_l, n);
+    *maps = to_ptrv(maps_l);
+    XID* src = maps_l;
+    XID_32* dst = maps_l;
+    for(int i=0; i<*n; ++i) {
+        dst[i] = to_ulong(src[i]);
+    }
+    return ret;
+}
+
 #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"); \