diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/include/gtkclass.h | 10 | ||||
| -rwxr-xr-x | src/tools/gtkclass.c | 49 | ||||
| -rwxr-xr-x | src/wrapped/wrappedgio2.c | 20 |
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 \ |