diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-03-07 17:31:40 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-03-07 17:31:40 +0100 |
| commit | 7165ff7b840a7b4de13111b7d17e482d8e6cef9d (patch) | |
| tree | b7ab437b5b7736f46d81d31ee72ed40c22f13d7a /src/wrapped/wrappedcairo.c | |
| parent | 81d906fd3b6ed25a81665d839ceef2d88f4a74f9 (diff) | |
| download | box64-7165ff7b840a7b4de13111b7d17e482d8e6cef9d.tar.gz box64-7165ff7b840a7b4de13111b7d17e482d8e6cef9d.zip | |
More work on X11 wrapping, allowing gtk to run fully emulated
Diffstat (limited to 'src/wrapped/wrappedcairo.c')
| -rw-r--r-- | src/wrapped/wrappedcairo.c | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/src/wrapped/wrappedcairo.c b/src/wrapped/wrappedcairo.c index f2d1e72c..77c4fc2e 100644 --- a/src/wrapped/wrappedcairo.c +++ b/src/wrapped/wrappedcairo.c @@ -25,10 +25,59 @@ const char* cairoName = "libcairo.so.2"; #include "wrappercallback.h" -#include "wrappedlib_init.h" +#define SUPER() \ +GO(0) \ +GO(1) \ +GO(2) \ +GO(3) \ +GO(4) +// destroy ... +#define GO(A) \ +static uintptr_t my_destroy_fct_##A = 0; \ +static void my_destroy_##A(void* a) \ +{ \ + RunFunctionFmt(my_destroy_fct_##A, "p", a); \ +} +SUPER() +#undef GO +static void* find_destroy_Fct(void* fct) +{ + if(!fct) return fct; + if(GetNativeFnc((uintptr_t)fct)) return GetNativeFnc((uintptr_t)fct); + #define GO(A) if(my_destroy_fct_##A == (uintptr_t)fct) return my_destroy_##A; + SUPER() + #undef GO + #define GO(A) if(my_destroy_fct_##A == 0) {my_destroy_fct_##A = (uintptr_t)fct; return my_destroy_##A; } + SUPER() + #undef GO + printf_log(LOG_NONE, "Warning, no more slot for cairo destroy callback\n"); + return NULL; +} +static void* reverse_destroy_Fct(void* fct) +{ + if(!fct) return fct; + if(CheckBridged(my_lib->w.bridge, fct)) + return (void*)CheckBridged(my_lib->w.bridge, fct); + #define GO(A) if(my_destroy_##A == fct) return (void*)my_destroy_fct_##A; + SUPER() + #undef GO + return (void*)AddBridge(my_lib->w.bridge, pFpii, fct, 0, NULL); +} EXPORT void* my_cairo_xcb_device_get_connection(x64emu_t* emu, void* a) { return add_xcb_connection(my->cairo_xcb_device_get_connection(a)); -} \ No newline at end of file +} + +EXPORT int my_cairo_surface_set_user_data(x64emu_t* emu, void* surf, void* key, void* data, void* d) +{ + return my->cairo_surface_set_user_data(surf, key, data, find_destroy_Fct(d)); +} + +EXPORT int my_cairo_set_user_data(x64emu_t* emu, void* cr, void* key, void* data, void* d) +{ + return my->cairo_set_user_data(cr, key, data, find_destroy_Fct(d)); +} + +#include "wrappedlib_init.h" \ No newline at end of file |