diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-12 18:39:09 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-12 18:40:31 +0200 |
| commit | b6cd19b78bf3cce7cdc55c4210f5174eb8b76e28 (patch) | |
| tree | 9e4cd0c62f25f42145ac0e8f80c8caa82789d38c /src/libtools | |
| parent | 6a3a19da68b6d4d59d368172f2f3e411326258fd (diff) | |
| download | box64-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.c | 134 | ||||
| -rw-r--r-- | src/libtools/my_x11_conv.h | 13 | ||||
| -rw-r--r-- | src/libtools/my_x11_defs.h | 234 | ||||
| -rw-r--r-- | src/libtools/my_x11_defs_32.h | 16 |
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 |