about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authormhavu <marko.havu@aalto.fi>2022-04-10 13:29:20 +0300
committermhavu <marko.havu@aalto.fi>2022-04-10 13:29:20 +0300
commit929741e9f8976899f632069a5aaf4934fca00fb7 (patch)
treea27f5f36d5898fb8cafdd0dd3d1077ab0d29234d
parentee6c824ccfe6638ef8805782dd05463658f88784 (diff)
downloadbox64-929741e9f8976899f632069a5aaf4934fca00fb7.tar.gz
box64-929741e9f8976899f632069a5aaf4934fca00fb7.zip
Added wrapping for g_object_weak_ref()
-rw-r--r--src/wrapped/generated/functions_list.txt2
-rw-r--r--src/wrapped/generated/wrappedgobject2types.h2
-rwxr-xr-xsrc/wrapped/wrappedgobject2.c31
-rwxr-xr-xsrc/wrapped/wrappedgobject2_private.h2
4 files changed, 36 insertions, 1 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 11c3bf09..49d315db 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -2446,6 +2446,8 @@ wrappedgobject2:
   - g_type_add_interface_static
 - vFpup:
   - g_object_class_install_properties
+- vFppp:
+  - g_object_weak_ref
 - vFppV:
   - g_object_get
   - g_object_set
diff --git a/src/wrapped/generated/wrappedgobject2types.h b/src/wrapped/generated/wrappedgobject2types.h
index 04e6d4ae..abf8e561 100644
--- a/src/wrapped/generated/wrappedgobject2types.h
+++ b/src/wrapped/generated/wrappedgobject2types.h
@@ -17,6 +17,7 @@ typedef void* (*pFpp_t)(void*, void*);
 typedef void (*vFiip_t)(int64_t, int64_t, void*);
 typedef void (*vFLLp_t)(uintptr_t, uintptr_t, void*);
 typedef void (*vFpup_t)(void*, uint64_t, void*);
+typedef void (*vFppp_t)(void*, void*, void*);
 typedef void (*vFppV_t)(void*, void*, ...);
 typedef void (*vFppA_t)(void*, void*, va_list);
 typedef uintptr_t (*LFppp_t)(void*, void*, void*);
@@ -47,6 +48,7 @@ typedef uint64_t (*uFpLippppLuA_t)(void*, uintptr_t, int64_t, void*, void*, void
 	GO(g_value_register_transform_func, vFiip_t) \
 	GO(g_type_add_interface_static, vFLLp_t) \
 	GO(g_object_class_install_properties, vFpup_t) \
+	GO(g_object_weak_ref, vFppp_t) \
 	GO(g_object_get, vFppV_t) \
 	GO(g_object_set, vFppV_t) \
 	GO(g_object_get_valist, vFppA_t) \
diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c
index 043ef63e..85d19086 100755
--- a/src/wrapped/wrappedgobject2.c
+++ b/src/wrapped/wrappedgobject2.c
@@ -396,6 +396,7 @@ static void* findValueTransformFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gobject Value Transform callback\n");
     return NULL;
 }
+
 // GDestroyFunc ...
 #define GO(A)   \
 static uintptr_t my_destroyfunc_fct_##A = 0;   \
@@ -418,6 +419,30 @@ static void* findDestroyFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gobject GDestroyNotify callback\n");
     return NULL;
 }
+
+// GWeakNotify
+#define GO(A)   \
+static uintptr_t my_weaknotifyfunc_fct_##A = 0;   \
+static int my_weaknotifyfunc_##A(void* a, void* b)     \
+{                                       \
+    return RunFunction(my_context, my_weaknotifyfunc_fct_##A, 2, a, b);\
+}
+SUPER()
+#undef GO
+static void* findWeakNotifyFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_weaknotifyfunc_fct_##A == (uintptr_t)fct) return my_weaknotifyfunc_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_weaknotifyfunc_fct_##A == 0) {my_weaknotifyfunc_fct_##A = (uintptr_t)fct; return my_weaknotifyfunc_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gobject GWeakNotify callback\n");
+    return NULL;
+}
+
 // GCallback  (generic function with 6 arguments, hopefully it's enough)
 #define GO(A)   \
 static uintptr_t my_GCallback_fct_##A = 0;                                             \
@@ -882,6 +907,12 @@ EXPORT void my_g_object_class_install_properties(x64emu_t* emu, void* klass, uin
     my->g_object_class_install_properties(unwrapCopyGTKClass(klass, my->g_object_get_type()), n, specs);
 }
 
+EXPORT void my_g_object_weak_ref(x64emu_t* emu, void* object, void* notify, void* data)
+{
+    gobject2_my_t *my = (gobject2_my_t*)my_lib->priv.w.p2;
+    my->g_object_weak_ref(object, findWeakNotifyFct(notify), data);
+}
+
 #define PRE_INIT    \
     if(box64_nogtk) \
         return -1;
diff --git a/src/wrapped/wrappedgobject2_private.h b/src/wrapped/wrappedgobject2_private.h
index 1a17d5e7..ebbcae26 100755
--- a/src/wrapped/wrappedgobject2_private.h
+++ b/src/wrapped/wrappedgobject2_private.h
@@ -163,7 +163,7 @@ GO(g_object_steal_qdata, pFpp)
 GO(g_object_thaw_notify, vFp)
 GO(g_object_unref, vFp)
 GO(g_object_watch_closure, vFpp)
-//GOM(g_object_weak_ref, vFpBp)
+GOM(g_object_weak_ref, vFEppp)
 GO(g_object_weak_unref, vFpp)
 GO(g_param_spec_boolean, pFpppii)
 GO(g_param_spec_boxed, pFpppLi)