about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-07-12 20:34:35 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-07-12 20:34:35 +0200
commitaaab83356dba9005254f4b820a6a0d3f697c2320 (patch)
tree20611fcaf5d07c2a1063d83d3e8697e5ca4cdaf1
parent7c1637328a46a4cf7fa0b31320bcee76abfb2982 (diff)
downloadbox64-aaab83356dba9005254f4b820a6a0d3f697c2320.tar.gz
box64-aaab83356dba9005254f4b820a6a0d3f697c2320.zip
Added some more gtkclass wrapping and fixed g_initable_new wrapping (for spotify)
-rwxr-xr-xsrc/include/gtkclass.h10
-rwxr-xr-xsrc/tools/gtkclass.c49
-rwxr-xr-xsrc/wrapped/wrappedgio2.c20
3 files changed, 70 insertions, 9 deletions
diff --git a/src/include/gtkclass.h b/src/include/gtkclass.h
index 6835a68b..8a88a0d2 100755
--- a/src/include/gtkclass.h
+++ b/src/include/gtkclass.h
@@ -778,7 +778,7 @@ typedef struct my_GstAllocatorClass_s {
   void*    _gst_reserved[4];
 } my_GstAllocatorClass_t;
 
-typedef struct my__GstTaskPoolClass {
+typedef struct my_GstTaskPoolClass_s {
   my_GstObjectClass_t parent_class;
   void      (*prepare)  (void* pool, void* error);
   void      (*cleanup)  (void* pool);
@@ -788,6 +788,13 @@ typedef struct my__GstTaskPoolClass {
   void*     _gst_reserved[4-1];
 } my_GstTaskPoolClass_t;
 
+typedef struct my_GDBusProxyClass_s {
+  my_GObjectClass_t parent_class;
+  void (*g_properties_changed) (void* proxy, void* changed_properties, const char* const* invalidated_properties);
+  void (*g_signal)             (void* proxy, const char* sender_name, const char* signal_name, void* parameters);
+  void* padding[32];
+} my_GDBusProxyClass_t;
+
 // GTypeValueTable
 typedef struct my_GTypeValueTable_s {
   void     (*value_init)         (void* value);
@@ -894,6 +901,7 @@ GTKCLASS(AtkUtil)                   \
 GTKCLASS(GstObject)                 \
 GTKCLASS(GstAllocator)              \
 GTKCLASS(GstTaskPool)               \
+GTKCLASS(GDBusProxy)                \
 
 #define GTKCLASS(A) void Set##A##ID(size_t id);
 GTKCLASSES()
diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c
index 69a7cd22..269d8429 100755
--- a/src/tools/gtkclass.c
+++ b/src/tools/gtkclass.c
@@ -2440,6 +2440,41 @@ static void bridgeGstTaskPoolClass(my_GstTaskPoolClass_t* class)
 
 #undef SUPERGO
 
+// ----- GDBusProxyClass ------
+// wrapper x86 -> natives of callbacks
+WRAPPER(GDBusProxy, g_properties_changed, void, (void* proxy, void* changed_properties, const char* const* invalidated_properties), "ppp", proxy, changed_properties, invalidated_properties);
+WRAPPER(GDBusProxy, g_signal, void,             (void* proxy, const char* sender_name, const char* signal_name, void* parameters), "pppp", proxy, sender_name, signal_name, parameters);
+
+#define SUPERGO()                   \
+    GO(g_properties_changed, vFppp);\
+    GO(g_signal, vFpppp);           \
+
+// wrap (so bridge all calls, just in case)
+static void wrapGDBusProxyClass(my_GDBusProxyClass_t* class)
+{
+    wrapGObjectClass(&class->parent_class);
+    #define GO(A, W) class->A = reverse_##A##_GDBusProxy (W, class->A)
+    SUPERGO()
+    #undef GO
+}
+// unwrap (and use callback if not a native call anymore)
+static void unwrapGDBusProxyClass(my_GDBusProxyClass_t* class)
+{
+    unwrapGObjectClass(&class->parent_class);
+    #define GO(A, W)   class->A = find_##A##_GDBusProxy (class->A)
+    SUPERGO()
+    #undef GO
+}
+// autobridge
+static void bridgeGDBusProxyClass(my_GDBusProxyClass_t* class)
+{
+    bridgeGObjectClass(&class->parent_class);
+    #define GO(A, W) autobridge_##A##_GDBusProxy (W, class->A)
+    SUPERGO()
+    #undef GO
+}
+
+#undef SUPERGO
 
 // No more wrap/unwrap
 #undef WRAPPER
@@ -2457,7 +2492,8 @@ static void wrapGTKClass(void* cl, size_t type)
 
     printf_log(LOG_DEBUG, "wrapGTKClass(%p, %zd (%s))\n", cl, type, g_type_name(type));
     GTKCLASSES()
-    {
+    if(type==8) {}  // GInterface have no structure
+    else {
         if(my_MetaFrames2==-1 && !strcmp(g_type_name(type), "MetaFrames")) {
             my_MetaFrames2 = type;
             wrapMetaFrames2Class((my_MetaFrames2Class_t*)cl);
@@ -2476,6 +2512,8 @@ static void unwrapGTKClass(void* cl, size_t type)
 
     printf_log(LOG_DEBUG, "unwrapGTKClass(%p, %zd (%s))\n", cl, type, g_type_name(type));
     GTKCLASSES()
+    if(type==8) {}  // GInterface have no structure
+    else
     {}  // else no warning, one is enough...
     #undef GTKCLASS
 }
@@ -2489,7 +2527,8 @@ static void bridgeGTKClass(void* cl, size_t type)
 
     printf_log(LOG_DEBUG, "bridgeGTKClass(%p, %zd (%s))\n", cl, type, g_type_name(type));
     GTKCLASSES()
-    {
+    if(type==8) {}  // GInterface have no structure
+    else {
         printf_log(LOG_NONE, "Warning, AutoBridge GTK Class with unknown class type %zd (%s)\n", type, g_type_name(type));
     }
     #undef GTKCLASS
@@ -2519,7 +2558,8 @@ void* unwrapCopyGTKClass(void* klass, size_t type)
     size_t sz = 0;
     #define GTKCLASS(A) if(type==my_##A) sz = sizeof(my_##A##Class_t); else
     GTKCLASSES()
-    {
+    if(type==8) {}  // GInterface have no structure
+    else {
         printf_log(LOG_NONE, "Warning, unwrapCopyGTKClass called with unknown class type %zu (%s)\n", type, g_type_name(type));
         return klass;
     }
@@ -2556,7 +2596,8 @@ void* wrapCopyGTKClass(void* klass, size_t type)
     int sz = 0;
     #define GTKCLASS(A) if(type==my_##A) sz = sizeof(my_##A##Class_t); else
     GTKCLASSES()
-    {
+    if(type==8) {}  // GInterface have no structure
+    else {
         if(my_MetaFrames2==-1 && !strcmp(g_type_name(type), "MetaFrames")) {
             my_MetaFrames2 = type;
             sz = sizeof(my_MetaFrames2Class_t);
diff --git a/src/wrapped/wrappedgio2.c b/src/wrapped/wrappedgio2.c
index 30f7b683..efe21bd2 100755
--- a/src/wrapped/wrappedgio2.c
+++ b/src/wrapped/wrappedgio2.c
@@ -26,7 +26,8 @@ const char* gio2Name = "libgio-2.0.so.0";
 typedef size_t(*LFv_t)(void);
 
 #define ADDED_FUNCTIONS() \
- GO(g_application_get_type, LFv_t)           \
+ GO(g_application_get_type, LFv_t)          \
+ GO(g_dbus_proxy_get_type, LFv_t)           \
 
 #include "wrappedgio2types.h"
 
@@ -577,7 +578,17 @@ EXPORT void my_g_simple_async_result_set_error(x64emu_t* emu, void* simple, void
 
 EXPORT void* my_g_initable_new(x64emu_t* emu, void* type, void* cancel, void* err, void* first, uintptr_t* b)
 {
-    myStackAlign(emu, first, b, emu->scratch, R_EAX, 4);
+    // look for number of pairs
+    int n = 1;
+    emu->scratch[0] = (uint64_t)first;
+    emu->scratch[1] = getVArgs(emu, 4, b, 0);
+    while(getVArgs(emu, 4, b, n)) {
+        emu->scratch[n+1] = getVArgs(emu, 4, b, n);
+        emu->scratch[n+2] = getVArgs(emu, 4, b, n+1);
+        n+=2;
+    }
+    emu->scratch[n+1] = 0;
+    emu->scratch[n+2] = 0;
     PREPARE_VALIST;
     return my->g_initable_new_valist(type, first, VARARGS, cancel, err);
 }
@@ -606,8 +617,9 @@ EXPORT void my_g_task_return_new_error(x64emu_t* emu, void* task, uint32_t domai
         return -1;
 
 #define CUSTOM_INIT \
-    getMy(lib);                         \
-    SetGApplicationID(my->g_application_get_type());            \
+    getMy(lib);                                         \
+    SetGApplicationID(my->g_application_get_type());    \
+    SetGDBusProxyID(my->g_dbus_proxy_get_type());       \
     setNeededLibs(lib, 1, "libgmodule-2.0.so.0");
 
 #define CUSTOM_FINI \