about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-09-11 14:27:21 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-09-11 14:27:21 +0200
commit1f3729822a2eed41c907cc6e9ffa275c1b772e3f (patch)
tree497e5517f3c169e790ba5afcdc394d068a22e8df /src
parenta27283aa9b8a738fea10052df50bd2c7313fa043 (diff)
downloadbox64-1f3729822a2eed41c907cc6e9ffa275c1b772e3f.tar.gz
box64-1f3729822a2eed41c907cc6e9ffa275c1b772e3f.zip
Some more wrapping on AtkUtils
Diffstat (limited to 'src')
-rwxr-xr-xsrc/include/gtkclass.h14
-rwxr-xr-xsrc/tools/bridge.c9
-rwxr-xr-xsrc/tools/gtkclass.c59
-rwxr-xr-xsrc/wrapped/wrappedatk.c4
-rwxr-xr-xsrc/wrapped/wrappedatkbridge.c5
-rwxr-xr-xsrc/wrapped/wrappedatkbridge_private.h4
-rwxr-xr-xsrc/wrapped/wrappedgobject2.c4
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 \