diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedgobject2types.h | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgobject2.c | 31 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgobject2_private.h | 2 |
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) |