about summary refs log tree commit diff stats
path: root/src/libtools
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/libtools
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/libtools')
-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
4 files changed, 276 insertions, 121 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