diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-09-11 14:27:21 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-09-11 14:27:21 +0200 |
| commit | 1f3729822a2eed41c907cc6e9ffa275c1b772e3f (patch) | |
| tree | 497e5517f3c169e790ba5afcdc394d068a22e8df /src | |
| parent | a27283aa9b8a738fea10052df50bd2c7313fa043 (diff) | |
| download | box64-1f3729822a2eed41c907cc6e9ffa275c1b772e3f.tar.gz box64-1f3729822a2eed41c907cc6e9ffa275c1b772e3f.zip | |
Some more wrapping on AtkUtils
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/gtkclass.h | 14 | ||||
| -rwxr-xr-x | src/tools/bridge.c | 9 | ||||
| -rwxr-xr-x | src/tools/gtkclass.c | 59 | ||||
| -rwxr-xr-x | src/wrapped/wrappedatk.c | 4 | ||||
| -rwxr-xr-x | src/wrapped/wrappedatkbridge.c | 5 | ||||
| -rwxr-xr-x | src/wrapped/wrappedatkbridge_private.h | 4 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgobject2.c | 4 |
7 files changed, 91 insertions, 8 deletions
diff --git a/src/include/gtkclass.h b/src/include/gtkclass.h index 18fc0150..04c1fd5e 100755 --- a/src/include/gtkclass.h +++ b/src/include/gtkclass.h @@ -527,6 +527,18 @@ typedef struct my_AtkObjectClass_s void* pad1; } my_AtkObjectClass_t; +typedef struct my_AtkUtilClass_s +{ + my_GObjectClass_t parent; + uint32_t (* add_global_event_listener) (void* listener, void* event_type); + void (* remove_global_event_listener) (uint32_t listener_id); + uint32_t (* add_key_event_listener) (void* listener, void* data); + void (* remove_key_event_listener) (uint32_t listener_id); + void* (* get_root) (void); + void* (* get_toolkit_name) (void); + void* (* get_toolkit_version) (void); +} my_AtkUtilClass_t; + // GTypeValueTable typedef struct my_GTypeValueTable_s { @@ -612,12 +624,14 @@ GTKCLASS(GtkTextView2) \ GTKCLASS(MetaFrames2) \ GTKCLASS(GDBusObjectManagerClient) \ GTKCLASS(AtkObject) \ +GTKCLASS(AtkUtil) \ #define GTKCLASS(A) void Set##A##ID(size_t id); GTKCLASSES() #undef GTKCLASS void SetGTypeName(void* f); +void SetGClassPeek(void* f); void AutoBridgeGtk(void*(*ref)(size_t), void(*unref)(void*)); void* wrapCopyGTKClass(void* cl, size_t type); diff --git a/src/tools/bridge.c b/src/tools/bridge.c index 8c9070eb..cfbcdeb5 100755 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -14,6 +14,7 @@ #include "debug.h" #include "x64emu.h" #include "box64context.h" +#include "elfloader.h" #ifdef DYNAREC #include "dynablock.h" #endif @@ -180,9 +181,11 @@ void* GetNativeFnc(uintptr_t fnc) { if(!fnc) return NULL; // check if function exist in some loaded lib - Dl_info info; - if(dladdr((void*)fnc, &info)) - return (void*)fnc; + if(!FindElfAddress(my_context, fnc)) { + Dl_info info; + if(dladdr((void*)fnc, &info)) + return (void*)fnc; + } if(!getProtection(fnc)) return NULL; // check if it's an indirect jump diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c index 633fa02f..35e6c7fd 100755 --- a/src/tools/gtkclass.c +++ b/src/tools/gtkclass.c @@ -21,6 +21,7 @@ int is_gtk3 = 0; static bridge_t* my_bridge = NULL; static const char* (*g_type_name)(size_t) = NULL; +static void* (*g_type_class_peek)(size_t) = NULL; #define GTKCLASS(A) static size_t my_##A = (size_t)-1; GTKCLASSES() #undef GTKCLASS @@ -1557,6 +1558,52 @@ static void bridgeAtkObjectClass(my_AtkObjectClass_t* class) #undef SUPERGO +// ----- AtkUtilClass ------ +// wrapper x86 -> natives of callbacks +WRAPPER(AtkUtil,add_global_event_listener, uint32_t,(void* listener, void* event_type), 2, AddCheckBridge(my_bridge, iFpupp, listener, 0, NULL), event_type); +WRAPPER(AtkUtil,remove_global_event_listener, void ,(uint32_t listener_id), 1, listener_id); +WRAPPER(AtkUtil,add_key_event_listener, uint32_t ,(void* listener, void* data), 2, AddCheckBridge(my_bridge, iFpp, listener, 0, NULL), data); +WRAPPER(AtkUtil,remove_key_event_listener, void ,(uint32_t listener_id), 1, listener_id); +WRAPPER(AtkUtil,get_root, void* ,(void), 0, 0); +WRAPPER(AtkUtil,get_toolkit_name, void* ,(void), 0, 0); +WRAPPER(AtkUtil,get_toolkit_version, void* ,(void), 0, 0); + +#define SUPERGO() \ + GO(add_global_event_listener, uFpp); \ + GO(remove_global_event_listener, vFu); \ + GO(add_key_event_listener, uFpp); \ + GO(remove_key_event_listener, vFu); \ + GO(get_root, pFv); \ + GO(get_toolkit_name, pFv); \ + GO(get_toolkit_version, pFv); \ + +// wrap (so bridge all calls, just in case) +static void wrapAtkUtilClass(my_AtkUtilClass_t* class) +{ + wrapGObjectClass(&class->parent); + #define GO(A, W) class->A = reverse_##A##_AtkUtil (W, class->A) + SUPERGO() + #undef GO +} +// unwrap (and use callback if not a native call anymore) +static void unwrapAtkUtilClass(my_AtkUtilClass_t* class) +{ + unwrapGObjectClass(&class->parent); + #define GO(A, W) class->A = find_##A##_AtkUtil (class->A) + SUPERGO() + #undef GO +} +// autobridge +static void bridgeAtkUtilClass(my_AtkUtilClass_t* class) +{ + bridgeGObjectClass(&class->parent); + #define GO(A, W) autobridge_##A##_AtkUtil (W, class->A) + SUPERGO() + #undef GO +} + +#undef SUPERGO + // No more wrap/unwrap #undef WRAPPER #undef FIND @@ -2110,11 +2157,16 @@ static uintptr_t my_class_init_fct_##A = 0; \ static size_t parent_class_init_##A = 0; \ static int my_class_init_##A(void* a, void* b) \ { \ - printf_log(LOG_DEBUG, "Custom Class init %d for class %p (parent=%p)\n", A, a, (void*)parent_class_init_##A);\ + printf_log(LOG_DEBUG, "Custom Class init %d for class %p (parent=%p:%s)\n", A, a, (void*)parent_class_init_##A, g_type_name(parent_class_init_##A));\ int ret = RunFunction(my_context, my_class_init_fct_##A, 2, a, b); \ unwrapGTKClass(a, parent_class_init_##A); \ bridgeGTKClass(a, parent_class_init_##A); \ my_unwrap_signal_offset(a); \ + if(!strcmp(g_type_name(parent_class_init_##A), "AtkUtil")) { \ + my_AtkUtilClass_t* p = (my_AtkUtilClass_t*)g_type_class_peek(parent_class_init_##A);\ + unwrapGTKClass(p, parent_class_init_##A); \ + bridgeGTKClass(p, parent_class_init_##A); \ + } \ return ret; \ } SUPER() @@ -2322,6 +2374,11 @@ void SetGTypeName(void* f) g_type_name = f; } +void SetGClassPeek(void* f) +{ + g_type_class_peek = f; +} + my_signal_t* new_mysignal(void* f, void* data, void* destroy) { my_signal_t* sig = (my_signal_t*)box_calloc(1, sizeof(my_signal_t)); diff --git a/src/wrapped/wrappedatk.c b/src/wrapped/wrappedatk.c index f96beff0..f785817f 100755 --- a/src/wrapped/wrappedatk.c +++ b/src/wrapped/wrappedatk.c @@ -26,6 +26,7 @@ typedef size_t (*LFv_t) (); #define ADDED_FUNCTIONS() \ GO(atk_object_get_type, LFv_t) \ +GO(atk_util_get_type, LFv_t) \ #include "generated/wrappedatktypes.h" @@ -128,7 +129,8 @@ EXPORT uint32_t my_atk_add_key_event_listener(x64emu_t* emu, void* f, void* p) #define CUSTOM_INIT \ getMy(lib); \ - SetAtkObjectID(my->atk_object_get_type()); \ + SetAtkObjectID(my->atk_object_get_type()); \ + SetAtkUtilID(my->atk_util_get_type()); \ #define CUSTOM_FINI \ freeMy(); diff --git a/src/wrapped/wrappedatkbridge.c b/src/wrapped/wrappedatkbridge.c index dfc0d199..88198faf 100755 --- a/src/wrapped/wrappedatkbridge.c +++ b/src/wrapped/wrappedatkbridge.c @@ -15,6 +15,11 @@ const char* atkbridgeName = "libatk-bridge-2.0.so.0"; #define LIBNAME atkbridge +EXPORT int my_atk_bridge_adaptor_init(void* argc, void** argv) +{ + return 0; +} + #define PRE_INIT \ if(box64_nogtk) \ return -1; diff --git a/src/wrapped/wrappedatkbridge_private.h b/src/wrapped/wrappedatkbridge_private.h index 4851d8e8..f77ca365 100755 --- a/src/wrapped/wrappedatkbridge_private.h +++ b/src/wrapped/wrappedatkbridge_private.h @@ -2,5 +2,5 @@ #error meh! #endif -GO(atk_bridge_adaptor_cleanup, iFpp) -GO(atk_bridge_adaptor_init, vFv) \ No newline at end of file +GO(atk_bridge_adaptor_cleanup, vFv) +GO(atk_bridge_adaptor_init, iFpp) //%NoE \ No newline at end of file diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c index 2572f531..c4f95265 100755 --- a/src/wrapped/wrappedgobject2.c +++ b/src/wrapped/wrappedgobject2.c @@ -27,7 +27,8 @@ typedef void*(*pFL_t)(size_t); #define ADDED_FUNCTIONS() \ GO(g_object_get_type, LFv_t) \ - GO(g_type_name, pFL_t) + GO(g_type_name, pFL_t) \ + GO(g_type_class_peek, pFL_t) \ #include "generated/wrappedgobject2types.h" static void addGObject2Alternate(library_t* lib); @@ -864,6 +865,7 @@ EXPORT void my_g_signal_override_class_handler(x64emu_t* emu, char* name, void* getMy(lib); \ SetGObjectID(my->g_object_get_type()); \ SetGTypeName(my->g_type_name); \ + SetGClassPeek(my->g_type_class_peek); \ setNeededLibs(lib, 1, "libglib-2.0.so.0"); #define CUSTOM_FINI \ |