about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/generated/functions_list.txt1
-rw-r--r--src/wrapped/generated/wrappedglib2types.h1
-rwxr-xr-xsrc/wrapped/wrappedglib2.c60
-rwxr-xr-xsrc/wrapped/wrappedglib2_private.h2
4 files changed, 63 insertions, 1 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 24189ab3..8352de4a 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -2295,6 +2295,7 @@ wrappedglib2:
 - vFppp:
   - g_array_sort_with_data
   - g_hash_table_foreach
+  - g_option_context_add_main_entries
   - g_ptr_array_foreach
   - g_ptr_array_sort_with_data
   - g_static_private_set
diff --git a/src/wrapped/generated/wrappedglib2types.h b/src/wrapped/generated/wrappedglib2types.h
index f4a7ef9d..c34dfb6e 100644
--- a/src/wrapped/generated/wrappedglib2types.h
+++ b/src/wrapped/generated/wrappedglib2types.h
@@ -102,6 +102,7 @@ typedef int64_t (*iFpppippppppp_t)(void*, void*, void*, int64_t, void*, void*, v
 	GO(g_strjoinv, pFpA_t) \
 	GO(g_array_sort_with_data, vFppp_t) \
 	GO(g_hash_table_foreach, vFppp_t) \
+	GO(g_option_context_add_main_entries, vFppp_t) \
 	GO(g_ptr_array_foreach, vFppp_t) \
 	GO(g_ptr_array_sort_with_data, vFppp_t) \
 	GO(g_static_private_set, vFppp_t) \
diff --git a/src/wrapped/wrappedglib2.c b/src/wrapped/wrappedglib2.c
index 769ca8cd..457ccac2 100755
--- a/src/wrapped/wrappedglib2.c
+++ b/src/wrapped/wrappedglib2.c
@@ -658,6 +658,36 @@ static void* reverseGPrintFuncFct(void* fct)
     #undef GO
     return NULL;
 }
+// GOptionArg ...
+#define GO(A)   \
+static uintptr_t my_GOptionArg_fct_##A = 0;                                     \
+static int my_GOptionArg_##A(void* a, void* b, void* c, void* d)                \
+{                                                                               \
+    return (int)RunFunction(my_context, my_GOptionArg_fct_##A, 4, a, b, c, d);  \
+}
+SUPER()
+#undef GO
+static void* findGOptionArgFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_GOptionArg_fct_##A == (uintptr_t)fct) return my_GOptionArg_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_GOptionArg_fct_##A == 0) {my_GOptionArg_fct_##A = (uintptr_t)fct; return my_GOptionArg_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for glib2 GOptionArg callback\n");
+    return NULL;
+}
+static void* reverseGOptionArgFct(void* fct)
+{
+    if(!fct) return fct;
+    #define GO(A) if((uintptr_t)fct == my_GOptionArg_fct_##A) return (void*)my_GOptionArg_fct_##A;
+    SUPER()
+    #undef GO
+    return NULL;
+}
 
 #undef SUPER
 
@@ -1390,6 +1420,36 @@ EXPORT void* my_g_option_group_new(x64emu_t* emu, void* name, void* desc, void*
     return my->g_option_group_new(name, desc, help, data, findDestroyFct(destroy));
 }
 
+typedef struct my_GOptionEntry_s {
+  void*     long_name;
+  char      short_name;
+  int       flags;
+  int       arg;
+  void*     arg_data;
+  void*     description;
+  void*     arg_description;
+} my_GOptionEntry_t;
+
+EXPORT void my_g_option_context_add_main_entries(x64emu_t* emu, void* context, my_GOptionEntry_t* entries, void* domain)
+{
+    glib2_my_t *my = (glib2_my_t*)my_lib->priv.w.p2;
+    my_GOptionEntry_t* p = entries;
+    while (p) {
+        // wrap Callbacks
+        if (p->arg == 3)
+            p->arg_data = findGOptionArgFct(p->arg_data);
+        ++p;
+    }
+    my->g_option_context_add_main_entries(context, entries, domain);
+    p = entries;
+    while (p) {
+        // unwrap Callbacks
+        if (p->arg == 3)
+            p->arg_data = reverseGOptionArgFct(p->arg_data);
+        ++p;
+    }
+}
+
 
 #define PRE_INIT    \
     if(box64_nogtk) \
diff --git a/src/wrapped/wrappedglib2_private.h b/src/wrapped/wrappedglib2_private.h
index 4bcb1521..a8463e3d 100755
--- a/src/wrapped/wrappedglib2_private.h
+++ b/src/wrapped/wrappedglib2_private.h
@@ -763,7 +763,7 @@ GO(g_on_error_query, vFp)
 GO(g_on_error_stack_trace, vFp)
 GO(g_open, iFpii)
 GO(g_option_context_add_group, vFpp)
-GO(g_option_context_add_main_entries, vFppp)
+GOM(g_option_context_add_main_entries, vFEppp)
 GO(g_option_context_free, vFp)
 GO(g_option_context_get_description, pFp)
 GO(g_option_context_get_help, pFpip)