about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-27 19:52:22 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-27 19:52:52 +0100
commitd0d85e684db61171e873fbc1b07b272bdba449f3 (patch)
treeec930d8d6965abb900ffe21d6a95359431ac1675 /src
parent05b322414a11117c39327690f1d8533f247b0a18 (diff)
downloadbox64-d0d85e684db61171e873fbc1b07b272bdba449f3.tar.gz
box64-d0d85e684db61171e873fbc1b07b272bdba449f3.zip
[WRAPPER] More work on gtk/gstreamer wrapping
Diffstat (limited to 'src')
-rw-r--r--src/include/bridge.h1
-rw-r--r--src/include/gtkclass.h2
-rw-r--r--src/tools/bridge.c5
-rw-r--r--src/tools/gtkclass.c309
-rw-r--r--src/wrapped/wrappedgobject2.c6
5 files changed, 142 insertions, 181 deletions
diff --git a/src/include/bridge.h b/src/include/bridge.h
index 8a760939..6202707d 100644
--- a/src/include/bridge.h
+++ b/src/include/bridge.h
@@ -23,6 +23,7 @@ uintptr_t AddVSyscall(bridge_t* bridge, int num);
 int hasAlternate(void* addr);
 void* getAlternate(void* addr);
 void addAlternate(void* addr, void* alt);
+void addCheckAlternate(void* addr, void* alt);
 void cleanAlternate(void);
 const char* getBridgeName(void* addr);
 
diff --git a/src/include/gtkclass.h b/src/include/gtkclass.h
index 54fcb1ce..d948ff87 100644
--- a/src/include/gtkclass.h
+++ b/src/include/gtkclass.h
@@ -2313,6 +2313,8 @@ void AutoBridgeGtk(void*(*ref)(size_t), void(*unref)(void*));
 
 void* wrapCopyGTKClass(void* cl, size_t type);
 void* unwrapCopyGTKClass(void* klass, size_t type);
+void wrapGTKClass(void* cl, size_t type);
+void unwrapGTKClass(void* klass, size_t type);
 
 void unwrapGTKInterface(void* cl, size_t type);
 void* wrapCopyGTKInterface(void* cl, size_t type);
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index a5396020..b147d23a 100644
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -272,6 +272,11 @@ void addAlternate(void* addr, void* alt) {
     kh_value(my_alternates, k) = alt;
 }
 
+void addCheckAlternate(void* addr, void* alt) {
+    if(!hasAlternate(addr))
+        addAlternate(addr, alt);
+}
+
 void cleanAlternate() {
     if(my_alternates) {
         kh_destroy(alternate, my_alternates);
diff --git a/src/tools/gtkclass.c b/src/tools/gtkclass.c
index 639a2333..e40dcbb2 100644
--- a/src/tools/gtkclass.c
+++ b/src/tools/gtkclass.c
@@ -60,21 +60,21 @@ static RET my_##NAME##_##A DEF              \
 }
 
 #define FIND(A, NAME) \
-static void* find_##NAME##_##A(void* fct)                           \
-{                                                                   \
-    if(!fct) return fct;                                            \
-    void* tmp = GetNativeFnc((uintptr_t)fct);                       \
-    if(tmp) return tmp;                                             \
-    if(my_##NAME##_##A##_fct_0 == (uintptr_t)fct) return my_##NAME##_##A##_0;   \
-    if(my_##NAME##_##A##_fct_1 == (uintptr_t)fct) return my_##NAME##_##A##_1;   \
-    if(my_##NAME##_##A##_fct_2 == (uintptr_t)fct) return my_##NAME##_##A##_2;   \
-    if(my_##NAME##_##A##_fct_3 == (uintptr_t)fct) return my_##NAME##_##A##_3;   \
-    if(my_##NAME##_##A##_fct_4 == (uintptr_t)fct) return my_##NAME##_##A##_4;   \
-    if(my_##NAME##_##A##_fct_5 == (uintptr_t)fct) return my_##NAME##_##A##_5;   \
-    if(my_##NAME##_##A##_fct_6 == (uintptr_t)fct) return my_##NAME##_##A##_6;   \
-    if(my_##NAME##_##A##_fct_7 == (uintptr_t)fct) return my_##NAME##_##A##_7;   \
-    if(my_##NAME##_##A##_fct_8 == (uintptr_t)fct) return my_##NAME##_##A##_8;   \
-    if(my_##NAME##_##A##_fct_9 == (uintptr_t)fct) return my_##NAME##_##A##_9;   \
+static void* find_##NAME##_##A(wrapper_t W, void* fct)                            \
+{                                                                                 \
+    if(!fct) return fct;                                                          \
+    void* tmp = GetNativeFnc((uintptr_t)fct);                                     \
+    if(tmp) {AddAutomaticBridge(my_bridge, W, fct, 0, #NAME "_" #A); return tmp;} \
+    if(my_##NAME##_##A##_fct_0 == (uintptr_t)fct) return my_##NAME##_##A##_0;     \
+    if(my_##NAME##_##A##_fct_1 == (uintptr_t)fct) return my_##NAME##_##A##_1;     \
+    if(my_##NAME##_##A##_fct_2 == (uintptr_t)fct) return my_##NAME##_##A##_2;     \
+    if(my_##NAME##_##A##_fct_3 == (uintptr_t)fct) return my_##NAME##_##A##_3;     \
+    if(my_##NAME##_##A##_fct_4 == (uintptr_t)fct) return my_##NAME##_##A##_4;     \
+    if(my_##NAME##_##A##_fct_5 == (uintptr_t)fct) return my_##NAME##_##A##_5;     \
+    if(my_##NAME##_##A##_fct_6 == (uintptr_t)fct) return my_##NAME##_##A##_6;     \
+    if(my_##NAME##_##A##_fct_7 == (uintptr_t)fct) return my_##NAME##_##A##_7;     \
+    if(my_##NAME##_##A##_fct_8 == (uintptr_t)fct) return my_##NAME##_##A##_8;     \
+    if(my_##NAME##_##A##_fct_9 == (uintptr_t)fct) return my_##NAME##_##A##_9;     \
     if(my_##NAME##_##A##_fct_10 == (uintptr_t)fct) return my_##NAME##_##A##_10;   \
     if(my_##NAME##_##A##_fct_11 == (uintptr_t)fct) return my_##NAME##_##A##_11;   \
     if(my_##NAME##_##A##_fct_12 == (uintptr_t)fct) return my_##NAME##_##A##_12;   \
@@ -105,46 +105,46 @@ static void* find_##NAME##_##A(void* fct)                           \
     if(my_##NAME##_##A##_fct_37 == (uintptr_t)fct) return my_##NAME##_##A##_37;   \
     if(my_##NAME##_##A##_fct_38 == (uintptr_t)fct) return my_##NAME##_##A##_38;   \
     if(my_##NAME##_##A##_fct_39 == (uintptr_t)fct) return my_##NAME##_##A##_39;   \
-    if(my_##NAME##_##A##_fct_0 == 0) {my_##NAME##_##A##_fct_0 = (uintptr_t)fct; return my_##NAME##_##A##_0; } \
-    if(my_##NAME##_##A##_fct_1 == 0) {my_##NAME##_##A##_fct_1 = (uintptr_t)fct; return my_##NAME##_##A##_1; } \
-    if(my_##NAME##_##A##_fct_2 == 0) {my_##NAME##_##A##_fct_2 = (uintptr_t)fct; return my_##NAME##_##A##_2; } \
-    if(my_##NAME##_##A##_fct_3 == 0) {my_##NAME##_##A##_fct_3 = (uintptr_t)fct; return my_##NAME##_##A##_3; } \
-    if(my_##NAME##_##A##_fct_4 == 0) {my_##NAME##_##A##_fct_4 = (uintptr_t)fct; return my_##NAME##_##A##_4; } \
-    if(my_##NAME##_##A##_fct_5 == 0) {my_##NAME##_##A##_fct_5 = (uintptr_t)fct; return my_##NAME##_##A##_5; } \
-    if(my_##NAME##_##A##_fct_6 == 0) {my_##NAME##_##A##_fct_6 = (uintptr_t)fct; return my_##NAME##_##A##_6; } \
-    if(my_##NAME##_##A##_fct_7 == 0) {my_##NAME##_##A##_fct_7 = (uintptr_t)fct; return my_##NAME##_##A##_7; } \
-    if(my_##NAME##_##A##_fct_8 == 0) {my_##NAME##_##A##_fct_8 = (uintptr_t)fct; return my_##NAME##_##A##_8; } \
-    if(my_##NAME##_##A##_fct_9 == 0) {my_##NAME##_##A##_fct_9 = (uintptr_t)fct; return my_##NAME##_##A##_9; } \
-    if(my_##NAME##_##A##_fct_10 == 0) {my_##NAME##_##A##_fct_10 = (uintptr_t)fct; return my_##NAME##_##A##_10; } \
-    if(my_##NAME##_##A##_fct_11 == 0) {my_##NAME##_##A##_fct_11 = (uintptr_t)fct; return my_##NAME##_##A##_11; } \
-    if(my_##NAME##_##A##_fct_12 == 0) {my_##NAME##_##A##_fct_12 = (uintptr_t)fct; return my_##NAME##_##A##_12; } \
-    if(my_##NAME##_##A##_fct_13 == 0) {my_##NAME##_##A##_fct_13 = (uintptr_t)fct; return my_##NAME##_##A##_13; } \
-    if(my_##NAME##_##A##_fct_14 == 0) {my_##NAME##_##A##_fct_14 = (uintptr_t)fct; return my_##NAME##_##A##_14; } \
-    if(my_##NAME##_##A##_fct_15 == 0) {my_##NAME##_##A##_fct_15 = (uintptr_t)fct; return my_##NAME##_##A##_15; } \
-    if(my_##NAME##_##A##_fct_16 == 0) {my_##NAME##_##A##_fct_16 = (uintptr_t)fct; return my_##NAME##_##A##_16; } \
-    if(my_##NAME##_##A##_fct_17 == 0) {my_##NAME##_##A##_fct_17 = (uintptr_t)fct; return my_##NAME##_##A##_17; } \
-    if(my_##NAME##_##A##_fct_18 == 0) {my_##NAME##_##A##_fct_18 = (uintptr_t)fct; return my_##NAME##_##A##_18; } \
-    if(my_##NAME##_##A##_fct_19 == 0) {my_##NAME##_##A##_fct_19 = (uintptr_t)fct; return my_##NAME##_##A##_19; } \
-    if(my_##NAME##_##A##_fct_20 == 0) {my_##NAME##_##A##_fct_20 = (uintptr_t)fct; return my_##NAME##_##A##_20; } \
-    if(my_##NAME##_##A##_fct_21 == 0) {my_##NAME##_##A##_fct_21 = (uintptr_t)fct; return my_##NAME##_##A##_21; } \
-    if(my_##NAME##_##A##_fct_22 == 0) {my_##NAME##_##A##_fct_22 = (uintptr_t)fct; return my_##NAME##_##A##_22; } \
-    if(my_##NAME##_##A##_fct_23 == 0) {my_##NAME##_##A##_fct_23 = (uintptr_t)fct; return my_##NAME##_##A##_23; } \
-    if(my_##NAME##_##A##_fct_24 == 0) {my_##NAME##_##A##_fct_24 = (uintptr_t)fct; return my_##NAME##_##A##_24; } \
-    if(my_##NAME##_##A##_fct_25 == 0) {my_##NAME##_##A##_fct_25 = (uintptr_t)fct; return my_##NAME##_##A##_25; } \
-    if(my_##NAME##_##A##_fct_26 == 0) {my_##NAME##_##A##_fct_26 = (uintptr_t)fct; return my_##NAME##_##A##_26; } \
-    if(my_##NAME##_##A##_fct_27 == 0) {my_##NAME##_##A##_fct_27 = (uintptr_t)fct; return my_##NAME##_##A##_27; } \
-    if(my_##NAME##_##A##_fct_28 == 0) {my_##NAME##_##A##_fct_28 = (uintptr_t)fct; return my_##NAME##_##A##_28; } \
-    if(my_##NAME##_##A##_fct_29 == 0) {my_##NAME##_##A##_fct_29 = (uintptr_t)fct; return my_##NAME##_##A##_29; } \
-    if(my_##NAME##_##A##_fct_30 == 0) {my_##NAME##_##A##_fct_30 = (uintptr_t)fct; return my_##NAME##_##A##_30; } \
-    if(my_##NAME##_##A##_fct_31 == 0) {my_##NAME##_##A##_fct_31 = (uintptr_t)fct; return my_##NAME##_##A##_31; } \
-    if(my_##NAME##_##A##_fct_32 == 0) {my_##NAME##_##A##_fct_32 = (uintptr_t)fct; return my_##NAME##_##A##_32; } \
-    if(my_##NAME##_##A##_fct_33 == 0) {my_##NAME##_##A##_fct_33 = (uintptr_t)fct; return my_##NAME##_##A##_33; } \
-    if(my_##NAME##_##A##_fct_34 == 0) {my_##NAME##_##A##_fct_34 = (uintptr_t)fct; return my_##NAME##_##A##_34; } \
-    if(my_##NAME##_##A##_fct_35 == 0) {my_##NAME##_##A##_fct_35 = (uintptr_t)fct; return my_##NAME##_##A##_35; } \
-    if(my_##NAME##_##A##_fct_36 == 0) {my_##NAME##_##A##_fct_36 = (uintptr_t)fct; return my_##NAME##_##A##_36; } \
-    if(my_##NAME##_##A##_fct_37 == 0) {my_##NAME##_##A##_fct_37 = (uintptr_t)fct; return my_##NAME##_##A##_37; } \
-    if(my_##NAME##_##A##_fct_38 == 0) {my_##NAME##_##A##_fct_38 = (uintptr_t)fct; return my_##NAME##_##A##_38; } \
-    if(my_##NAME##_##A##_fct_39 == 0) {my_##NAME##_##A##_fct_39 = (uintptr_t)fct; return my_##NAME##_##A##_39; } \
+    if(my_##NAME##_##A##_fct_0 == 0) {my_##NAME##_##A##_fct_0 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_0, fct); return my_##NAME##_##A##_0; } \
+    if(my_##NAME##_##A##_fct_1 == 0) {my_##NAME##_##A##_fct_1 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_1, fct); return my_##NAME##_##A##_1; } \
+    if(my_##NAME##_##A##_fct_2 == 0) {my_##NAME##_##A##_fct_2 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_2, fct); return my_##NAME##_##A##_2; } \
+    if(my_##NAME##_##A##_fct_3 == 0) {my_##NAME##_##A##_fct_3 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_3, fct); return my_##NAME##_##A##_3; } \
+    if(my_##NAME##_##A##_fct_4 == 0) {my_##NAME##_##A##_fct_4 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_4, fct); return my_##NAME##_##A##_4; } \
+    if(my_##NAME##_##A##_fct_5 == 0) {my_##NAME##_##A##_fct_5 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_5, fct); return my_##NAME##_##A##_5; } \
+    if(my_##NAME##_##A##_fct_6 == 0) {my_##NAME##_##A##_fct_6 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_6, fct); return my_##NAME##_##A##_6; } \
+    if(my_##NAME##_##A##_fct_7 == 0) {my_##NAME##_##A##_fct_7 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_7, fct); return my_##NAME##_##A##_7; } \
+    if(my_##NAME##_##A##_fct_8 == 0) {my_##NAME##_##A##_fct_8 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_8, fct); return my_##NAME##_##A##_8; } \
+    if(my_##NAME##_##A##_fct_9 == 0) {my_##NAME##_##A##_fct_9 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_9, fct); return my_##NAME##_##A##_9; } \
+    if(my_##NAME##_##A##_fct_10 == 0) {my_##NAME##_##A##_fct_10 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_10, fct); return my_##NAME##_##A##_10; } \
+    if(my_##NAME##_##A##_fct_11 == 0) {my_##NAME##_##A##_fct_11 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_11, fct); return my_##NAME##_##A##_11; } \
+    if(my_##NAME##_##A##_fct_12 == 0) {my_##NAME##_##A##_fct_12 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_12, fct); return my_##NAME##_##A##_12; } \
+    if(my_##NAME##_##A##_fct_13 == 0) {my_##NAME##_##A##_fct_13 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_13, fct); return my_##NAME##_##A##_13; } \
+    if(my_##NAME##_##A##_fct_14 == 0) {my_##NAME##_##A##_fct_14 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_14, fct); return my_##NAME##_##A##_14; } \
+    if(my_##NAME##_##A##_fct_15 == 0) {my_##NAME##_##A##_fct_15 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_15, fct); return my_##NAME##_##A##_15; } \
+    if(my_##NAME##_##A##_fct_16 == 0) {my_##NAME##_##A##_fct_16 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_16, fct); return my_##NAME##_##A##_16; } \
+    if(my_##NAME##_##A##_fct_17 == 0) {my_##NAME##_##A##_fct_17 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_17, fct); return my_##NAME##_##A##_17; } \
+    if(my_##NAME##_##A##_fct_18 == 0) {my_##NAME##_##A##_fct_18 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_18, fct); return my_##NAME##_##A##_18; } \
+    if(my_##NAME##_##A##_fct_19 == 0) {my_##NAME##_##A##_fct_19 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_19, fct); return my_##NAME##_##A##_19; } \
+    if(my_##NAME##_##A##_fct_20 == 0) {my_##NAME##_##A##_fct_20 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_20, fct); return my_##NAME##_##A##_20; } \
+    if(my_##NAME##_##A##_fct_21 == 0) {my_##NAME##_##A##_fct_21 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_21, fct); return my_##NAME##_##A##_21; } \
+    if(my_##NAME##_##A##_fct_22 == 0) {my_##NAME##_##A##_fct_22 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_22, fct); return my_##NAME##_##A##_22; } \
+    if(my_##NAME##_##A##_fct_23 == 0) {my_##NAME##_##A##_fct_23 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_23, fct); return my_##NAME##_##A##_23; } \
+    if(my_##NAME##_##A##_fct_24 == 0) {my_##NAME##_##A##_fct_24 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_24, fct); return my_##NAME##_##A##_24; } \
+    if(my_##NAME##_##A##_fct_25 == 0) {my_##NAME##_##A##_fct_25 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_25, fct); return my_##NAME##_##A##_25; } \
+    if(my_##NAME##_##A##_fct_26 == 0) {my_##NAME##_##A##_fct_26 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_26, fct); return my_##NAME##_##A##_26; } \
+    if(my_##NAME##_##A##_fct_27 == 0) {my_##NAME##_##A##_fct_27 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_27, fct); return my_##NAME##_##A##_27; } \
+    if(my_##NAME##_##A##_fct_28 == 0) {my_##NAME##_##A##_fct_28 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_28, fct); return my_##NAME##_##A##_28; } \
+    if(my_##NAME##_##A##_fct_29 == 0) {my_##NAME##_##A##_fct_29 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_29, fct); return my_##NAME##_##A##_29; } \
+    if(my_##NAME##_##A##_fct_30 == 0) {my_##NAME##_##A##_fct_30 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_30, fct); return my_##NAME##_##A##_30; } \
+    if(my_##NAME##_##A##_fct_31 == 0) {my_##NAME##_##A##_fct_31 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_31, fct); return my_##NAME##_##A##_31; } \
+    if(my_##NAME##_##A##_fct_32 == 0) {my_##NAME##_##A##_fct_32 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_32, fct); return my_##NAME##_##A##_32; } \
+    if(my_##NAME##_##A##_fct_33 == 0) {my_##NAME##_##A##_fct_33 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_33, fct); return my_##NAME##_##A##_33; } \
+    if(my_##NAME##_##A##_fct_34 == 0) {my_##NAME##_##A##_fct_34 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_34, fct); return my_##NAME##_##A##_34; } \
+    if(my_##NAME##_##A##_fct_35 == 0) {my_##NAME##_##A##_fct_35 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_35, fct); return my_##NAME##_##A##_35; } \
+    if(my_##NAME##_##A##_fct_36 == 0) {my_##NAME##_##A##_fct_36 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_36, fct); return my_##NAME##_##A##_36; } \
+    if(my_##NAME##_##A##_fct_37 == 0) {my_##NAME##_##A##_fct_37 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_37, fct); return my_##NAME##_##A##_37; } \
+    if(my_##NAME##_##A##_fct_38 == 0) {my_##NAME##_##A##_fct_38 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_38, fct); return my_##NAME##_##A##_38; } \
+    if(my_##NAME##_##A##_fct_39 == 0) {my_##NAME##_##A##_fct_39 = (uintptr_t)fct; addCheckAlternate((void*)my_##NAME##_##A##_fct_39, fct); return my_##NAME##_##A##_39; } \
     printf_log(LOG_NONE, "Warning, no more slot for " #A " " #NAME " gtkclass callback\n");    \
     return NULL;    \
 }
@@ -285,7 +285,7 @@ static void wrapGObjectClass(my_GObjectClass_t* class)
 // unwrap (and use callback if not a native call anymore)
 static void unwrapGObjectClass(my_GObjectClass_t* class)
 {
-    #define GO(A, W)   class->A = find_##A##_GObject (class->A)
+    #define GO(A, W)   class->A = find_##A##_GObject (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -338,7 +338,7 @@ static void wrapGInitiallyUnownedClass(my_GInitiallyUnownedClass_t* class)
 // unwrap (and use callback if not a native call anymore)
 static void unwrapGInitiallyUnownedClass(my_GInitiallyUnownedClass_t* class)
 {
-    #define GO(A, W)   class->A = find_##A##_GInitiallyUnowned (class->A)
+    #define GO(A, W)   class->A = find_##A##_GInitiallyUnowned (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -406,7 +406,7 @@ static void wrapGApplicationClass(my_GApplicationClass_t* class)
 static void unwrapGApplicationClass(my_GApplicationClass_t* class)
 {
     unwrapGObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GApplication (class->A)   //SUPERGO() defined but not used
+    #define GO(A, W)   class->A = find_##A##_GApplication (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -452,7 +452,7 @@ static void wrapGtkApplicationClass(my_GtkApplicationClass_t* class)
 static void unwrapGtkApplicationClass(my_GtkApplicationClass_t* class)
 {
     unwrapGApplicationClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkApplication (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkApplication (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -499,7 +499,7 @@ static void wrapGtkObjectClass(my_GtkObjectClass_t* class)
 static void unwrapGtkObjectClass(my_GtkObjectClass_t* class)
 {
     unwrapGInitiallyUnownedClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkObject (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkObject (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -673,7 +673,7 @@ static void wrapGtkWidget2Class(my_GtkWidget2Class_t* class)
 static void unwrapGtkWidget2Class(my_GtkWidget2Class_t* class)
 {
     unwrapGtkObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkWidget2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkWidget2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -880,7 +880,7 @@ static void wrapGtkWidget3Class(my_GtkWidget3Class_t* class)
 static void unwrapGtkWidget3Class(my_GtkWidget3Class_t* class)
 {
     unwrapGInitiallyUnownedClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkWidget3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkWidget3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -940,7 +940,7 @@ static void wrapGtkContainer2Class(my_GtkContainer2Class_t* class)
 static void unwrapGtkContainer2Class(my_GtkContainer2Class_t* class)
 {
     unwrapGtkWidget2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkContainer2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkContainer2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1002,7 +1002,7 @@ static void wrapGtkContainer3Class(my_GtkContainer3Class_t* class)
 static void unwrapGtkContainer3Class(my_GtkContainer3Class_t* class)
 {
     unwrapGtkWidget3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkContainer3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkContainer3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1056,7 +1056,7 @@ static void wrapGtkActionClass(my_GtkActionClass_t* class)
 static void unwrapGtkActionClass(my_GtkActionClass_t* class)
 {
     unwrapGObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkAction (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkAction (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1124,7 +1124,7 @@ static void wrapGtkMisc3Class(my_GtkMisc3Class_t* class)
 static void unwrapGtkMisc3Class(my_GtkMisc3Class_t* class)
 {
     unwrapGtkWidget3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkMisc3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkMisc3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1203,7 +1203,7 @@ static void wrapGtkLabel2Class(my_GtkLabel2Class_t* class)
 static void unwrapGtkLabel2Class(my_GtkLabel2Class_t* class)
 {
     unwrapGtkMisc2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkLabel2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkLabel2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1252,7 +1252,7 @@ static void wrapGtkLabel3Class(my_GtkLabel3Class_t* class)
 static void unwrapGtkLabel3Class(my_GtkLabel3Class_t* class)
 {
     unwrapGtkMisc3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkLabel3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkLabel3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1326,7 +1326,7 @@ static void wrapGtkTreeView2Class(my_GtkTreeView2Class_t* class)
 static void unwrapGtkTreeView2Class(my_GtkTreeView2Class_t* class)
 {
     unwrapGtkContainer2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkTreeView2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkTreeView2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1434,7 +1434,7 @@ static void wrapGtkWindow2Class(my_GtkWindow2Class_t* class)
 static void unwrapGtkWindow2Class(my_GtkWindow2Class_t* class)
 {
     unwrapGtkBin2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkWindow2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkWindow2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1487,7 +1487,7 @@ static void wrapGtkWindow3Class(my_GtkWindow3Class_t* class)
 static void unwrapGtkWindow3Class(my_GtkWindow3Class_t* class)
 {
     unwrapGtkBin3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkWindow3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkWindow3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1571,7 +1571,7 @@ static void wrapGtkListBoxClass(my_GtkListBoxClass_t* class)
 static void unwrapGtkListBoxClass(my_GtkListBoxClass_t* class)
 {
     unwrapGtkContainer3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkListBoxClass (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkListBoxClass (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1615,7 +1615,7 @@ static void wrapGtkListBoxRowClass(my_GtkListBoxRowClass_t* class)
 static void unwrapGtkListBoxRowClass(my_GtkListBoxRowClass_t* class)
 {
     unwrapGtkBin3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkListBoxRowClass (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkListBoxRowClass (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1771,7 +1771,7 @@ static void wrapGDBusObjectManagerClientClass(my_GDBusObjectManagerClientClass_t
 static void unwrapGDBusObjectManagerClientClass(my_GDBusObjectManagerClientClass_t* class)
 {
     unwrapGObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GDBusObjectManagerClient (class->A)
+    #define GO(A, W)   class->A = find_##A##_GDBusObjectManagerClient (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1826,7 +1826,7 @@ static void wrapGtkButton2Class(my_GtkButton2Class_t* class)
 static void unwrapGtkButton2Class(my_GtkButton2Class_t* class)
 {
     unwrapGtkBin2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkButton2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkButton2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1881,7 +1881,7 @@ static void wrapGtkButton3Class(my_GtkButton3Class_t* class)
 static void unwrapGtkButton3Class(my_GtkButton3Class_t* class)
 {
     unwrapGtkBin3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkButton3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkButton3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1928,7 +1928,7 @@ static void wrapGtkComboBox2Class(my_GtkComboBox2Class_t* class)
 static void unwrapGtkComboBox2Class(my_GtkComboBox2Class_t* class)
 {
     unwrapGtkBin2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkComboBox2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkComboBox2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -1973,7 +1973,7 @@ static void wrapGtkToggleButton2Class(my_GtkToggleButton2Class_t* class)
 static void unwrapGtkToggleButton2Class(my_GtkToggleButton2Class_t* class)
 {
     unwrapGtkButton2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkToggleButton2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkToggleButton2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2018,7 +2018,7 @@ static void wrapGtkToggleButton3Class(my_GtkToggleButton3Class_t* class)
 static void unwrapGtkToggleButton3Class(my_GtkToggleButton3Class_t* class)
 {
     unwrapGtkButton3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkToggleButton3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkToggleButton3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2063,7 +2063,7 @@ static void wrapGtkCheckButton2Class(my_GtkCheckButton2Class_t* class)
 static void unwrapGtkCheckButton2Class(my_GtkCheckButton2Class_t* class)
 {
     unwrapGtkToggleButton2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkCheckButton2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkCheckButton2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2108,7 +2108,7 @@ static void wrapGtkCheckButton3Class(my_GtkCheckButton3Class_t* class)
 static void unwrapGtkCheckButton3Class(my_GtkCheckButton3Class_t* class)
 {
     unwrapGtkToggleButton3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkCheckButton3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkCheckButton3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2149,7 +2149,7 @@ static void wrapGtkMenuButton3Class(my_GtkMenuButton3Class_t* class)
 static void unwrapGtkMenuButton3Class(my_GtkMenuButton3Class_t* class)
 {
     unwrapGtkToggleButton3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkMenuButton3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkMenuButton3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2211,7 +2211,7 @@ static void wrapGtkEntry2Class(my_GtkEntry2Class_t* class)
 static void unwrapGtkEntry2Class(my_GtkEntry2Class_t* class)
 {
     unwrapGtkWidget2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkEntry2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkEntry2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2263,7 +2263,7 @@ static void wrapGtkSpinButton2Class(my_GtkSpinButton2Class_t* class)
 static void unwrapGtkSpinButton2Class(my_GtkSpinButton2Class_t* class)
 {
     unwrapGtkEntry2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkSpinButton2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkSpinButton2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2311,7 +2311,7 @@ static void wrapGtkProgress2Class(my_GtkProgress2Class_t* class)
 static void unwrapGtkProgress2Class(my_GtkProgress2Class_t* class)
 {
     unwrapGtkWidget2Class(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_GtkProgress2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkProgress2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2353,7 +2353,7 @@ static void wrapGtkProgressBar2Class(my_GtkProgressBar2Class_t* class)
 static void unwrapGtkProgressBar2Class(my_GtkProgressBar2Class_t* class)
 {
     unwrapGtkProgress2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkProgressBar2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkProgressBar2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2397,7 +2397,7 @@ static void wrapGtkFrame2Class(my_GtkFrame2Class_t* class)
 static void unwrapGtkFrame2Class(my_GtkFrame2Class_t* class)
 {
     unwrapGtkBin2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkFrame2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkFrame2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2457,7 +2457,7 @@ static void wrapGtkMenuShell2Class(my_GtkMenuShell2Class_t* class)
 static void unwrapGtkMenuShell2Class(my_GtkMenuShell2Class_t* class)
 {
     unwrapGtkContainer2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkMenuShell2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkMenuShell2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2499,7 +2499,7 @@ static void wrapGtkMenuBar2Class(my_GtkMenuBar2Class_t* class)
 static void unwrapGtkMenuBar2Class(my_GtkMenuBar2Class_t* class)
 {
     unwrapGtkMenuShell2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkMenuBar2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkMenuBar2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2567,7 +2567,7 @@ static void wrapGtkTextView2Class(my_GtkTextView2Class_t* class)
 static void unwrapGtkTextView2Class(my_GtkTextView2Class_t* class)
 {
     unwrapGtkContainer2Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkTextView2 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkTextView2 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2637,7 +2637,7 @@ static void wrapGtkTextView3Class(my_GtkTextView3Class_t* class)
 static void unwrapGtkTextView3Class(my_GtkTextView3Class_t* class)
 {
     unwrapGtkContainer3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkTextView3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkTextView3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2679,7 +2679,7 @@ static void wrapGtkGrid3Class(my_GtkGrid3Class_t* class)
 static void unwrapGtkGrid3Class(my_GtkGrid3Class_t* class)
 {
     unwrapGtkContainer3Class(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkGrid3 (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkGrid3 (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2733,7 +2733,7 @@ static void wrapGtkEventControllerClass(my_GtkEventControllerClass_t* class)
 static void unwrapGtkEventControllerClass(my_GtkEventControllerClass_t* class)
 {
     unwrapGObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkEventController (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkEventController (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2787,7 +2787,7 @@ static void wrapGtkGestureClass(my_GtkGestureClass_t* class)
 static void unwrapGtkGestureClass(my_GtkGestureClass_t* class)
 {
     unwrapGtkEventControllerClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkGesture (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkGesture (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2859,7 +2859,7 @@ static void wrapGtkGestureLongPressClass(my_GtkGestureLongPressClass_t* class)
 static void unwrapGtkGestureLongPressClass(my_GtkGestureLongPressClass_t* class)
 {
     unwrapGtkGestureSingleClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GtkGestureLongPress (class->A)
+    #define GO(A, W)   class->A = find_##A##_GtkGestureLongPress (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -2953,7 +2953,7 @@ static void wrapAtkObjectClass(my_AtkObjectClass_t* class)
 static void unwrapAtkObjectClass(my_AtkObjectClass_t* class)
 {
     unwrapGObjectClass(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_AtkObject (class->A)
+    #define GO(A, W)   class->A = find_##A##_AtkObject (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3009,7 +3009,7 @@ static void wrapAtkUtilClass(my_AtkUtilClass_t* class)
 static void unwrapAtkUtilClass(my_AtkUtilClass_t* class)
 {
     unwrapGObjectClass(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_AtkUtil (class->A)
+    #define GO(A, W)   class->A = find_##A##_AtkUtil (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3053,7 +3053,7 @@ static void wrapGstObjectClass(my_GstObjectClass_t* class)
 static void unwrapGstObjectClass(my_GstObjectClass_t* class)
 {
     unwrapGInitiallyUnownedClass(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_GstObject (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstObject (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3099,7 +3099,7 @@ static void wrapGstAllocatorClass(my_GstAllocatorClass_t* class)
 static void unwrapGstAllocatorClass(my_GstAllocatorClass_t* class)
 {
     unwrapGstObjectClass(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_GstAllocator (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstAllocator (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3134,7 +3134,7 @@ WRAPPER(GstAllocatorInstance, mem_unmap_full, void ,(void* mem, void* info), "pp
 static void unwrapGstAllocatorInstance(my_GstAllocator_t* class)
 {
     unwrapGstObjectInstance(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_GstAllocatorInstance (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstAllocatorInstance (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3175,7 +3175,7 @@ static void wrapGstTaskPoolClass(my_GstTaskPoolClass_t* class)
 static void unwrapGstTaskPoolClass(my_GstTaskPoolClass_t* class)
 {
     unwrapGstObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstTaskPool (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstTaskPool (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3249,7 +3249,7 @@ static void wrapGstElementClass(my_GstElementClass_t* class)
 static void unwrapGstElementClass(my_GstElementClass_t* class)
 {
     unwrapGstObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstElement (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstElement (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3308,7 +3308,7 @@ static void wrapGstBinClass(my_GstBinClass_t* class)
 static void unwrapGstBinClass(my_GstBinClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstBin (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstBin (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3394,7 +3394,7 @@ static void wrapGstBaseTransformClass(my_GstBaseTransformClass_t* class)
 static void unwrapGstBaseTransformClass(my_GstBaseTransformClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstBaseTransform (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstBaseTransform (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3477,7 +3477,7 @@ static void wrapGstVideoDecoderClass(my_GstVideoDecoderClass_t* class)
 static void unwrapGstVideoDecoderClass(my_GstVideoDecoderClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstVideoDecoder (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoDecoder (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3556,7 +3556,7 @@ static void wrapGstVideoEncoderClass(my_GstVideoEncoderClass_t* class)
 static void unwrapGstVideoEncoderClass(my_GstVideoEncoderClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstVideoEncoder (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoEncoder (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3633,7 +3633,7 @@ static void wrapGstBaseSinkClass(my_GstBaseSinkClass_t* class)
 static void unwrapGstBaseSinkClass(my_GstBaseSinkClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstBaseSink (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstBaseSink (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3677,7 +3677,7 @@ static void wrapGstVideoSinkClass(my_GstVideoSinkClass_t* class)
 static void unwrapGstVideoSinkClass(my_GstVideoSinkClass_t* class)
 {
     unwrapGstBaseSinkClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstVideoSink (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoSink (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3723,7 +3723,7 @@ static void wrapGstGLBaseFilterClass(my_GstGLBaseFilterClass_t* class)
 static void unwrapGstGLBaseFilterClass(my_GstGLBaseFilterClass_t* class)
 {
     unwrapGstBaseTransformClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstGLBaseFilter (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstGLBaseFilter (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3773,7 +3773,7 @@ static void wrapGstGLFilterClass(my_GstGLFilterClass_t* class)
 static void unwrapGstGLFilterClass(my_GstGLFilterClass_t* class)
 {
     unwrapGstGLBaseFilterClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstGLFilter (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstGLFilter (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3859,7 +3859,7 @@ static void wrapGstAggregatorClass(my_GstAggregatorClass_t* class)
 static void unwrapGstAggregatorClass(my_GstAggregatorClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstAggregator (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstAggregator (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3907,7 +3907,7 @@ static void wrapGstVideoAggregatorClass(my_GstVideoAggregatorClass_t* class)
 static void unwrapGstVideoAggregatorClass(my_GstVideoAggregatorClass_t* class)
 {
     unwrapGstAggregatorClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstVideoAggregator (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoAggregator (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -3951,7 +3951,7 @@ static void wrapGstPadClass(my_GstPadClass_t* class)
 static void unwrapGstPadClass(my_GstPadClass_t* class)
 {
     unwrapGstObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstPad (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstPad (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4014,8 +4014,8 @@ WRAPPER(GstPadInstance, eventfullfunc, int    , (void* pad, void* parent, void*
 static void unwrapGstPadInstance(my_GstPad_t* class)
 {
     unwrapGstObjectInstance(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_GstPadInstance (class->A)
-    #define GO2(B, A, W)   class->B.A = find_##A##_GstPadInstance (class->B.A)
+    #define GO(A, W)   class->A = find_##A##_GstPadInstance (W, class->A)
+    #define GO2(B, A, W)   class->B.A = find_##A##_GstPadInstance (W, class->B.A)
     SUPERGO()
     #undef GO2
     #undef GO
@@ -4052,7 +4052,7 @@ static void wrapGstAggregatorPadClass(my_GstAggregatorPadClass_t* class)
 static void unwrapGstAggregatorPadClass(my_GstAggregatorPadClass_t* class)
 {
     unwrapGstPadClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstAggregatorPad (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstAggregatorPad (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4102,7 +4102,7 @@ static void wrapGstVideoAggregatorPadClass(my_GstVideoAggregatorPadClass_t* clas
 static void unwrapGstVideoAggregatorPadClass(my_GstVideoAggregatorPadClass_t* class)
 {
     unwrapGstAggregatorPadClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstVideoAggregatorPad (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoAggregatorPad (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4181,7 +4181,7 @@ static void wrapGstBaseSrcClass(my_GstBaseSrcClass_t* class)
 static void unwrapGstBaseSrcClass(my_GstBaseSrcClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstBaseSrc (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstBaseSrc (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4227,7 +4227,7 @@ static void wrapGstPushSrcClass(my_GstPushSrcClass_t* class)
 static void unwrapGstPushSrcClass(my_GstPushSrcClass_t* class)
 {
     unwrapGstBaseSrcClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstPushSrc (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstPushSrc (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4273,7 +4273,7 @@ static void wrapGstGLBaseSrcClass(my_GstGLBaseSrcClass_t* class)
 static void unwrapGstGLBaseSrcClass(my_GstGLBaseSrcClass_t* class)
 {
     unwrapGstPushSrcClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstGLBaseSrc (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstGLBaseSrc (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4349,7 +4349,7 @@ static void wrapGstAudioDecoderClass(my_GstAudioDecoderClass_t* class)
 static void unwrapGstAudioDecoderClass(my_GstAudioDecoderClass_t* class)
 {
     unwrapGstElementClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstAudioDecoder (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstAudioDecoder (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4395,7 +4395,7 @@ static void wrapGstVideoFilterClass(my_GstVideoFilterClass_t* class)
 static void unwrapGstVideoFilterClass(my_GstVideoFilterClass_t* class)
 {
     unwrapGstBaseTransformClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstVideoFilter (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoFilter (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4437,7 +4437,7 @@ static void wrapGstAudioFilterClass(my_GstAudioFilterClass_t* class)
 static void unwrapGstAudioFilterClass(my_GstAudioFilterClass_t* class)
 {
     unwrapGstBaseTransformClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GstAudioFilter (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstAudioFilter (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4499,7 +4499,7 @@ static void wrapGstBufferPoolClass(my_GstBufferPoolClass_t* class)
 static void unwrapGstBufferPoolClass(my_GstBufferPoolClass_t* class)
 {
     unwrapGstObjectClass(&class->object_class);
-    #define GO(A, W)   class->A = find_##A##_GstBufferPool (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstBufferPool (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4539,7 +4539,7 @@ static void wrapGstVideoBufferPoolClass(my_GstVideoBufferPoolClass_t* class)
 static void unwrapGstVideoBufferPoolClass(my_GstVideoBufferPoolClass_t* class)
 {
     unwrapGstBufferPoolClass(&class->parent);
-    #define GO(A, W)   class->A = find_##A##_GstVideoBufferPool (class->A)
+    #define GO(A, W)   class->A = find_##A##_GstVideoBufferPool (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4583,7 +4583,7 @@ static void wrapGDBusProxyClass(my_GDBusProxyClass_t* class)
 static void unwrapGDBusProxyClass(my_GDBusProxyClass_t* class)
 {
     unwrapGObjectClass(&class->parent_class);
-    #define GO(A, W)   class->A = find_##A##_GDBusProxy (class->A)
+    #define GO(A, W)   class->A = find_##A##_GDBusProxy (W, class->A)
     SUPERGO()
     #undef GO
 }
@@ -4632,7 +4632,7 @@ static void wrapGstURIHandlerInterface(my_GstURIHandlerInterface_t* iface)
 static void unwrapGstURIHandlerInterface(my_GstURIHandlerInterface_t* iface)
 {
     // parent don't need wrazpping
-    #define GO(A, W)   iface->A = find_##A##_GstURIHandler (iface->A)
+    #define GO(A, W)   iface->A = find_##A##_GstURIHandler (W, iface->A)
     SUPERGO()
     #undef GO
 }
@@ -4675,7 +4675,7 @@ int checkRegisteredClass(size_t klass)
 }
 
 // g_type_class_peek_parent
-static void wrapGTKClass(void* cl, size_t type)
+void wrapGTKClass(void* cl, size_t type)
 {
     #define GTKIFACE(A)
     #define GTKCLASS(A)                             \
@@ -4697,7 +4697,7 @@ static void wrapGTKClass(void* cl, size_t type)
     #undef GTKIFACE
 }
 
-static void unwrapGTKClass(void* cl, size_t type)
+void unwrapGTKClass(void* cl, size_t type)
 {
     #define GTKIFACE(A)
     #define GTKCLASS(A)                             \
@@ -4903,39 +4903,12 @@ void* unwrapCopyGTKInterface(void* iface, size_t type)
 
 // gtk_type_class
 
-#define GO(A) \
-static void* my_gclassallu_ref_##A = NULL;   \
-static my_GClassAll_t my_gclassallu_##A;
-
-SUPER()
-#undef GO
 void* wrapCopyGTKClass(void* klass, size_t type)
 {
     if(!klass) return klass;
     while(checkRegisteredClass(type))
         type = g_type_parent(type);
     printf_log(LOG_DEBUG, "wrapCopyGTKClass(%p, %zd (%s))\n", klass, type, g_type_name(type));
-    #define GO(A) if(klass == my_gclassallu_ref_##A) return &my_gclassallu_##A;
-    SUPER()
-    #undef GO
-    // check if class is the exact type we know
-    int sz = 0;
-    #define GTKIFACE(A)
-    #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==(size_t)-1 && !strcmp(g_type_name(type), "MetaFrames")) {
-            my_MetaFrames2 = type;
-            sz = sizeof(my_MetaFrames2Class_t);
-        } else {
-            printf_log(LOG_NONE, "Warning, wrapCopyGTKClass called with unknown class type 0x%zx (%s)\n", type, g_type_name(type));
-            return klass;
-        }
-    }
-    #undef GTKIFACE
-    #undef GTKCLASS
-    (void)sz;
     bridgeGTKClass(klass, type);
     return klass;
 }
@@ -4946,27 +4919,6 @@ void* wrapCopyGTKInterface(void* iface, size_t type)
     while(checkRegisteredClass(type))
         type = g_type_parent(type);
     printf_log(LOG_DEBUG, "wrapCopyGTKInterface(%p, %zd (%s))\n", iface, type, g_type_name(type));
-    #define GO(A) if(iface == my_gclassallu_ref_##A) return &my_gclassallu_##A;
-    SUPER()
-    #undef GO
-    // check if class is the exact type we know
-    int sz = 0;
-    #define GTKIFACE(A) if(type==my_##A) sz = sizeof(my_##A##Interface_t); else
-    #define GTKCLASS(A)
-    GTKCLASSES()
-    if(type==8) {}  // GInterface have no structure
-    else {
-        if(my_MetaFrames2==(size_t)-1 && !strcmp(g_type_name(type), "MetaFrames")) {
-            my_MetaFrames2 = type;
-            sz = sizeof(my_MetaFrames2Class_t);
-        } else {
-            printf_log(LOG_NONE, "Warning, wrapCopyGTKInterface called with unknown class type 0x%zx (%s)\n", type, g_type_name(type));
-            return iface;
-        }
-    }
-    #undef GTKIFACE
-    #undef GTKCLASS
-    (void)sz;
     bridgeGTKInterface(iface, type);
     return iface;
 }
@@ -5391,12 +5343,10 @@ static int my_class_init_##A(void* a, void* b)                              \
     while(checkRegisteredClass(type))                                       \
         type = g_type_parent(type);                                         \
     unwrapGTKClass(a, type);                                                \
-    bridgeGTKClass(a, type);                                                \
     my_unwrap_signal_offset(a);                                             \
     if(!strcmp(g_type_name(type), "AtkUtil")) {                             \
         my_AtkUtilClass_t* p = (my_AtkUtilClass_t*)g_type_class_peek(type);\
         unwrapGTKClass(p, type);                                            \
-        bridgeGTKClass(p, type);                                            \
     }                                                                       \
     return ret;                                                             \
 }
@@ -5512,7 +5462,6 @@ static int my_gtk_class_init_##A(void* g_class) {   \
     printf_log(LOG_DEBUG, "Calling fct_gtk_class_init_" #A " wrapper\n");           \
     int ret = (int)RunFunctionFmt(fct_gtk_class_init_##A, "p", g_class);\
     unwrapGTKClass(g_class, fct_gtk_parent_##A);                                    \
-    bridgeGTKClass(g_class, fct_gtk_parent_##A);                                    \
     return ret;                                                                     \
 }   \
 static uintptr_t fct_gtk_object_init_##A = 0;                                           \
diff --git a/src/wrapped/wrappedgobject2.c b/src/wrapped/wrappedgobject2.c
index 875c3d88..ab6a5d7f 100644
--- a/src/wrapped/wrappedgobject2.c
+++ b/src/wrapped/wrappedgobject2.c
@@ -219,6 +219,8 @@ EXPORT uintptr_t my_g_signal_connect_data(x64emu_t* emu, void* instance, void* d
     else GO("insert_text", 5)
     else GO("move-cursor", 5)   // GtkEntry
     else GO("move_cursor", 5)
+    else GO("autoplug-select", 5)
+    else GO("autoplug-sort", 5)
     else
         ret = my->g_signal_connect_data(instance, detailed, (flags&2)?((void*)signal_cb_swapped):((void*)signal_cb), sig, signal_delete, flags);
     #undef GO
@@ -887,7 +889,9 @@ EXPORT void my_g_object_set_qdata_full(x64emu_t* emu, void* o, uint32_t q, void*
 
 EXPORT void my_g_object_class_install_properties(x64emu_t* emu, void* klass, uint32_t n, void* specs)
 {
-    my->g_object_class_install_properties(unwrapCopyGTKClass(klass, my->g_object_get_type()), n, specs);
+    unwrapGTKClass(klass, my->g_object_get_type());
+    my->g_object_class_install_properties(klass, n, specs);
+    wrapGTKClass(klass, my->g_object_get_type());
 }
 
 EXPORT void my_g_object_weak_ref(x64emu_t* emu, void* object, void* notify, void* data)