about summary refs log tree commit diff stats
path: root/src/wrapped/wrappedglib2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wrapped/wrappedglib2.c')
-rwxr-xr-xsrc/wrapped/wrappedglib2.c60
1 files changed, 60 insertions, 0 deletions
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) \