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/tools | |
| parent | a27283aa9b8a738fea10052df50bd2c7313fa043 (diff) | |
| download | box64-1f3729822a2eed41c907cc6e9ffa275c1b772e3f.tar.gz box64-1f3729822a2eed41c907cc6e9ffa275c1b772e3f.zip | |
Some more wrapping on AtkUtils
Diffstat (limited to 'src/tools')
| -rwxr-xr-x | src/tools/bridge.c | 9 | ||||
| -rwxr-xr-x | src/tools/gtkclass.c | 59 |
2 files changed, 64 insertions, 4 deletions
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)); |