about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-10-07 10:39:53 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-10-07 10:39:53 +0200
commit9d63f0ce9a3c8b9453084e0748fd0f3d8cfb8ae8 (patch)
tree8e5b39c30260fd790a0c017745770d9000094004 /src
parentafd8d305f386a79ab07927758edb5c2957878ab0 (diff)
downloadbox64-9d63f0ce9a3c8b9453084e0748fd0f3d8cfb8ae8.tar.gz
box64-9d63f0ce9a3c8b9453084e0748fd0f3d8cfb8ae8.zip
Added wrapped threads_add_timeout_full to gdk2 and gdk3 (for #997)
Diffstat (limited to 'src')
-rw-r--r--src/wrapped/generated/functions_list.txt72
-rw-r--r--src/wrapped/generated/wrappedgdk3types.h4
-rw-r--r--src/wrapped/generated/wrappedgdkx112types.h4
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h66
-rw-r--r--src/wrapped/generated/wrapper.c4
-rw-r--r--src/wrapped/generated/wrapper.h2
-rw-r--r--src/wrapped/wrappedgdk3.c6
-rw-r--r--src/wrapped/wrappedgdk3_private.h2
-rw-r--r--src/wrapped/wrappedgdkx112.c50
-rw-r--r--src/wrapped/wrappedgdkx112_private.h2
10 files changed, 204 insertions, 8 deletions
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index cd9abe7d..d8701336 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -896,6 +896,7 @@
 #() iFEpLi
 #() iFEpLp
 #() iFEppi
+#() iFEppu
 #() iFEppd
 #() iFEppL
 #() iFEppp
@@ -2921,7 +2922,6 @@
 #!defined(HAVE_LD80BITS) KFKK
 #!defined(HAVE_LD80BITS) KFKp
 #defined(NOALIGN) iFipiip
-#!defined(NOALIGN) iFEppu
 #!defined(NOALIGN) iFEiiip
 #!defined(NOALIGN) iFEipii
 #!defined(NOALIGN) iFEipiip
@@ -3195,6 +3195,8 @@ wrappedgdk3:
   - gdk_threads_add_idle_full
 - iFiippp:
   - gdk_input_add_full
+- uFiuppp:
+  - gdk_threads_add_timeout_full
 wrappedgdkpixbuf2:
 - pFpiiiiiipp:
   - gdk_pixbuf_new_from_data
@@ -3211,6 +3213,8 @@ wrappedgdkx112:
   - gdk_input_add
 - iFiippp:
   - gdk_input_add_full
+- uFiuppp:
+  - gdk_threads_add_timeout_full
 wrappedgio2:
 - vFppp:
   - g_simple_async_result_set_op_res_gpointer
@@ -3873,6 +3877,18 @@ wrappedlibc:
   - _setjmp
   - atexit
   - getcontext
+  - pthread_attr_destroy
+  - pthread_attr_init
+  - pthread_barrierattr_destroy
+  - pthread_barrierattr_init
+  - pthread_cond_broadcast
+  - pthread_cond_destroy
+  - pthread_condattr_destroy
+  - pthread_condattr_init
+  - pthread_getattr_default_np
+  - pthread_mutexattr_destroy
+  - pthread_mutexattr_init
+  - pthread_setattr_default_np
   - register_printf_type
   - setcontext
   - setjmp
@@ -3904,12 +3920,30 @@ wrappedlibc:
 - iFip:
   - fstat
   - fstat64
+- iFLp:
+  - pthread_getattr_np
 - iFpi:
   - __sigsetjmp
   - backtrace
+  - pthread_attr_setdetachstate
+  - pthread_attr_setinheritsched
+  - pthread_attr_setschedpolicy
+  - pthread_attr_setscope
+  - pthread_barrierattr_setpshared
+  - pthread_condattr_setclock
+  - pthread_condattr_setpshared
+  - pthread_kill
+  - pthread_kill@GLIBC_2.2.5
+  - pthread_mutexattr_setkind_np
+  - pthread_mutexattr_setprotocol
+  - pthread_mutexattr_setpshared
+  - pthread_mutexattr_setrobust
+  - pthread_mutexattr_settype
   - sigsetjmp
 - iFpL:
   - munmap
+  - pthread_attr_setguardsize
+  - pthread_attr_setstacksize
 - iFpp:
   - __vprintf_chk
   - dl_iterate_phdr
@@ -3917,6 +3951,28 @@ wrappedlibc:
   - execvp
   - lstat
   - lstat64
+  - pthread_attr_getdetachstate
+  - pthread_attr_getguardsize
+  - pthread_attr_getinheritsched
+  - pthread_attr_getschedparam
+  - pthread_attr_getschedpolicy
+  - pthread_attr_getscope
+  - pthread_attr_getstackaddr
+  - pthread_attr_getstacksize
+  - pthread_attr_setschedparam
+  - pthread_attr_setstackaddr
+  - pthread_barrierattr_getpshared
+  - pthread_cond_init
+  - pthread_cond_wait
+  - pthread_condattr_getclock
+  - pthread_condattr_getpshared
+  - pthread_key_create
+  - pthread_mutex_init
+  - pthread_mutexattr_getkind_np
+  - pthread_mutexattr_getprotocol
+  - pthread_mutexattr_getrobust
+  - pthread_mutexattr_gettype
+  - pthread_once
   - sigaltstack
   - stat
   - stat64
@@ -3978,9 +4034,17 @@ wrappedlibc:
   - vdprintf
 - iFpLi:
   - mprotect
+- iFpLp:
+  - pthread_attr_setaffinity_np
+  - pthread_getaffinity_np
+  - pthread_setaffinity_np
 - iFppi:
   - ftw
   - ftw64
+- iFppu:
+  - pthread_barrier_init
+- iFppL:
+  - pthread_attr_setstack
 - iFppp:
   - __cxa_atexit
   - __cxa_thread_atexit_impl
@@ -3989,6 +4053,9 @@ wrappedlibc:
   - __vfprintf_chk
   - __vsscanf
   - execve
+  - pthread_atfork
+  - pthread_attr_getstack
+  - pthread_cond_timedwait
 - iFppV:
   - __asprintf
   - __isoc23_fscanf
@@ -4075,11 +4142,14 @@ wrappedlibc:
   - vswprintf
 - iFppii:
   - nftw64
+- iFppip:
+  - pthread_cond_clockwait
 - iFppiV:
   - makecontext
 - iFpppp:
   - __register_atfork
   - __vsprintf_chk
+  - pthread_create
   - scandir
   - scandir64
 - lFuipp:
diff --git a/src/wrapped/generated/wrappedgdk3types.h b/src/wrapped/generated/wrappedgdk3types.h
index c6b278f6..7e207207 100644
--- a/src/wrapped/generated/wrappedgdk3types.h
+++ b/src/wrapped/generated/wrappedgdk3types.h
@@ -17,6 +17,7 @@ typedef void (*vFppp_t)(void*, void*, void*);
 typedef int32_t (*iFiipp_t)(int32_t, int32_t, void*, void*);
 typedef uint32_t (*uFippp_t)(int32_t, void*, void*, void*);
 typedef int32_t (*iFiippp_t)(int32_t, int32_t, void*, void*, void*);
+typedef uint32_t (*uFiuppp_t)(int32_t, uint32_t, void*, void*, void*);
 
 #define SUPER() ADDED_FUNCTIONS() \
 	GO(gdk_init, vFpp_t) \
@@ -26,6 +27,7 @@ typedef int32_t (*iFiippp_t)(int32_t, int32_t, void*, void*, void*);
 	GO(gdk_window_remove_filter, vFppp_t) \
 	GO(gdk_input_add, iFiipp_t) \
 	GO(gdk_threads_add_idle_full, uFippp_t) \
-	GO(gdk_input_add_full, iFiippp_t)
+	GO(gdk_input_add_full, iFiippp_t) \
+	GO(gdk_threads_add_timeout_full, uFiuppp_t)
 
 #endif // __wrappedgdk3TYPES_H_
diff --git a/src/wrapped/generated/wrappedgdkx112types.h b/src/wrapped/generated/wrappedgdkx112types.h
index 1d129740..d33182bf 100644
--- a/src/wrapped/generated/wrappedgdkx112types.h
+++ b/src/wrapped/generated/wrappedgdkx112types.h
@@ -16,6 +16,7 @@ typedef int32_t (*iFpp_t)(void*, void*);
 typedef void (*vFppp_t)(void*, void*, void*);
 typedef int32_t (*iFiipp_t)(int32_t, int32_t, void*, void*);
 typedef int32_t (*iFiippp_t)(int32_t, int32_t, void*, void*, void*);
+typedef uint32_t (*uFiuppp_t)(int32_t, uint32_t, void*, void*, void*);
 
 #define SUPER() ADDED_FUNCTIONS() \
 	GO(gdk_init, vFpp_t) \
@@ -24,6 +25,7 @@ typedef int32_t (*iFiippp_t)(int32_t, int32_t, void*, void*, void*);
 	GO(gdk_window_add_filter, vFppp_t) \
 	GO(gdk_window_remove_filter, vFppp_t) \
 	GO(gdk_input_add, iFiipp_t) \
-	GO(gdk_input_add_full, iFiippp_t)
+	GO(gdk_input_add_full, iFiippp_t) \
+	GO(gdk_threads_add_timeout_full, uFiuppp_t)
 
 #endif // __wrappedgdkx112TYPES_H_
diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h
index 5f5b8e1b..4110d5ca 100644
--- a/src/wrapped/generated/wrappedlibctypes.h
+++ b/src/wrapped/generated/wrappedlibctypes.h
@@ -25,6 +25,7 @@ typedef void (*vFpu_t)(void*, uint32_t);
 typedef void (*vFpp_t)(void*, void*);
 typedef void (*vFpV_t)(void*, ...);
 typedef int32_t (*iFip_t)(int32_t, void*);
+typedef int32_t (*iFLp_t)(uintptr_t, void*);
 typedef int32_t (*iFpi_t)(void*, int32_t);
 typedef int32_t (*iFpL_t)(void*, uintptr_t);
 typedef int32_t (*iFpp_t)(void*, void*);
@@ -44,7 +45,10 @@ typedef int32_t (*iFipp_t)(int32_t, void*, void*);
 typedef int32_t (*iFipV_t)(int32_t, void*, ...);
 typedef int32_t (*iFipA_t)(int32_t, void*, va_list);
 typedef int32_t (*iFpLi_t)(void*, uintptr_t, int32_t);
+typedef int32_t (*iFpLp_t)(void*, uintptr_t, void*);
 typedef int32_t (*iFppi_t)(void*, void*, int32_t);
+typedef int32_t (*iFppu_t)(void*, void*, uint32_t);
+typedef int32_t (*iFppL_t)(void*, void*, uintptr_t);
 typedef int32_t (*iFppp_t)(void*, void*, void*);
 typedef int32_t (*iFppV_t)(void*, void*, ...);
 typedef int32_t (*iFppA_t)(void*, void*, va_list);
@@ -72,6 +76,7 @@ typedef int32_t (*iFpipA_t)(void*, int32_t, void*, va_list);
 typedef int32_t (*iFpLpV_t)(void*, uintptr_t, void*, ...);
 typedef int32_t (*iFpLpA_t)(void*, uintptr_t, void*, va_list);
 typedef int32_t (*iFppii_t)(void*, void*, int32_t, int32_t);
+typedef int32_t (*iFppip_t)(void*, void*, int32_t, void*);
 typedef int32_t (*iFppiV_t)(void*, void*, int32_t, ...);
 typedef int32_t (*iFpppp_t)(void*, void*, void*, void*);
 typedef intptr_t (*lFuipp_t)(uint32_t, int32_t, void*, void*);
@@ -107,6 +112,18 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(_setjmp, iFp_t) \
 	GO(atexit, iFp_t) \
 	GO(getcontext, iFp_t) \
+	GO(pthread_attr_destroy, iFp_t) \
+	GO(pthread_attr_init, iFp_t) \
+	GO(pthread_barrierattr_destroy, iFp_t) \
+	GO(pthread_barrierattr_init, iFp_t) \
+	GO(pthread_cond_broadcast, iFp_t) \
+	GO(pthread_cond_destroy, iFp_t) \
+	GO(pthread_condattr_destroy, iFp_t) \
+	GO(pthread_condattr_init, iFp_t) \
+	GO(pthread_getattr_default_np, iFp_t) \
+	GO(pthread_mutexattr_destroy, iFp_t) \
+	GO(pthread_mutexattr_init, iFp_t) \
+	GO(pthread_setattr_default_np, iFp_t) \
 	GO(register_printf_type, iFp_t) \
 	GO(setcontext, iFp_t) \
 	GO(setjmp, iFp_t) \
@@ -130,16 +147,55 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(warnx, vFpV_t) \
 	GO(fstat, iFip_t) \
 	GO(fstat64, iFip_t) \
+	GO(pthread_getattr_np, iFLp_t) \
 	GO(__sigsetjmp, iFpi_t) \
 	GO(backtrace, iFpi_t) \
+	GO(pthread_attr_setdetachstate, iFpi_t) \
+	GO(pthread_attr_setinheritsched, iFpi_t) \
+	GO(pthread_attr_setschedpolicy, iFpi_t) \
+	GO(pthread_attr_setscope, iFpi_t) \
+	GO(pthread_barrierattr_setpshared, iFpi_t) \
+	GO(pthread_condattr_setclock, iFpi_t) \
+	GO(pthread_condattr_setpshared, iFpi_t) \
+	GO(pthread_kill, iFpi_t) \
+	GO(pthread_kill@GLIBC_2.2.5, iFpi_t) \
+	GO(pthread_mutexattr_setkind_np, iFpi_t) \
+	GO(pthread_mutexattr_setprotocol, iFpi_t) \
+	GO(pthread_mutexattr_setpshared, iFpi_t) \
+	GO(pthread_mutexattr_setrobust, iFpi_t) \
+	GO(pthread_mutexattr_settype, iFpi_t) \
 	GO(sigsetjmp, iFpi_t) \
 	GO(munmap, iFpL_t) \
+	GO(pthread_attr_setguardsize, iFpL_t) \
+	GO(pthread_attr_setstacksize, iFpL_t) \
 	GO(__vprintf_chk, iFpp_t) \
 	GO(dl_iterate_phdr, iFpp_t) \
 	GO(execv, iFpp_t) \
 	GO(execvp, iFpp_t) \
 	GO(lstat, iFpp_t) \
 	GO(lstat64, iFpp_t) \
+	GO(pthread_attr_getdetachstate, iFpp_t) \
+	GO(pthread_attr_getguardsize, iFpp_t) \
+	GO(pthread_attr_getinheritsched, iFpp_t) \
+	GO(pthread_attr_getschedparam, iFpp_t) \
+	GO(pthread_attr_getschedpolicy, iFpp_t) \
+	GO(pthread_attr_getscope, iFpp_t) \
+	GO(pthread_attr_getstackaddr, iFpp_t) \
+	GO(pthread_attr_getstacksize, iFpp_t) \
+	GO(pthread_attr_setschedparam, iFpp_t) \
+	GO(pthread_attr_setstackaddr, iFpp_t) \
+	GO(pthread_barrierattr_getpshared, iFpp_t) \
+	GO(pthread_cond_init, iFpp_t) \
+	GO(pthread_cond_wait, iFpp_t) \
+	GO(pthread_condattr_getclock, iFpp_t) \
+	GO(pthread_condattr_getpshared, iFpp_t) \
+	GO(pthread_key_create, iFpp_t) \
+	GO(pthread_mutex_init, iFpp_t) \
+	GO(pthread_mutexattr_getkind_np, iFpp_t) \
+	GO(pthread_mutexattr_getprotocol, iFpp_t) \
+	GO(pthread_mutexattr_getrobust, iFpp_t) \
+	GO(pthread_mutexattr_gettype, iFpp_t) \
+	GO(pthread_once, iFpp_t) \
 	GO(sigaltstack, iFpp_t) \
 	GO(stat, iFpp_t) \
 	GO(stat64, iFpp_t) \
@@ -185,8 +241,13 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(dprintf, iFipV_t) \
 	GO(vdprintf, iFipA_t) \
 	GO(mprotect, iFpLi_t) \
+	GO(pthread_attr_setaffinity_np, iFpLp_t) \
+	GO(pthread_getaffinity_np, iFpLp_t) \
+	GO(pthread_setaffinity_np, iFpLp_t) \
 	GO(ftw, iFppi_t) \
 	GO(ftw64, iFppi_t) \
+	GO(pthread_barrier_init, iFppu_t) \
+	GO(pthread_attr_setstack, iFppL_t) \
 	GO(__cxa_atexit, iFppp_t) \
 	GO(__cxa_thread_atexit_impl, iFppp_t) \
 	GO(__isoc99_vfscanf, iFppp_t) \
@@ -194,6 +255,9 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(__vfprintf_chk, iFppp_t) \
 	GO(__vsscanf, iFppp_t) \
 	GO(execve, iFppp_t) \
+	GO(pthread_atfork, iFppp_t) \
+	GO(pthread_attr_getstack, iFppp_t) \
+	GO(pthread_cond_timedwait, iFppp_t) \
 	GO(__asprintf, iFppV_t) \
 	GO(__isoc23_fscanf, iFppV_t) \
 	GO(__isoc23_sscanf, iFppV_t) \
@@ -254,9 +318,11 @@ typedef int32_t (*iFppipppp_t)(void*, void*, int32_t, void*, void*, void*, void*
 	GO(vsnprintf, iFpLpA_t) \
 	GO(vswprintf, iFpLpA_t) \
 	GO(nftw64, iFppii_t) \
+	GO(pthread_cond_clockwait, iFppip_t) \
 	GO(makecontext, iFppiV_t) \
 	GO(__register_atfork, iFpppp_t) \
 	GO(__vsprintf_chk, iFpppp_t) \
+	GO(pthread_create, iFpppp_t) \
 	GO(scandir, iFpppp_t) \
 	GO(scandir64, iFpppp_t) \
 	GO(ptrace, lFuipp_t) \
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 643ed5eb..b197c9f8 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -932,6 +932,7 @@ typedef int32_t (*iFEpUp_t)(x64emu_t*, void*, uint64_t, void*);
 typedef int32_t (*iFEpLi_t)(x64emu_t*, void*, uintptr_t, int32_t);
 typedef int32_t (*iFEpLp_t)(x64emu_t*, void*, uintptr_t, void*);
 typedef int32_t (*iFEppi_t)(x64emu_t*, void*, void*, int32_t);
+typedef int32_t (*iFEppu_t)(x64emu_t*, void*, void*, uint32_t);
 typedef int32_t (*iFEppd_t)(x64emu_t*, void*, void*, double);
 typedef int32_t (*iFEppL_t)(x64emu_t*, void*, void*, uintptr_t);
 typedef int32_t (*iFEppp_t)(x64emu_t*, void*, void*, void*);
@@ -2968,7 +2969,6 @@ typedef int32_t (*iFipiip_t)(int32_t, void*, int32_t, int32_t, void*);
 #endif
 
 #if !defined(NOALIGN)
-typedef int32_t (*iFEppu_t)(x64emu_t*, void*, void*, uint32_t);
 typedef int32_t (*iFEiiip_t)(x64emu_t*, int32_t, int32_t, int32_t, void*);
 typedef int32_t (*iFEipii_t)(x64emu_t*, int32_t, void*, int32_t, int32_t);
 typedef int32_t (*iFEipiip_t)(x64emu_t*, int32_t, void*, int32_t, int32_t, void*);
@@ -3872,6 +3872,7 @@ void iFEpUp(x64emu_t *emu, uintptr_t fcn) { iFEpUp_t fn = (iFEpUp_t)fcn; R_RAX=(
 void iFEpLi(x64emu_t *emu, uintptr_t fcn) { iFEpLi_t fn = (iFEpLi_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (int32_t)R_RDX); }
 void iFEpLp(x64emu_t *emu, uintptr_t fcn) { iFEpLp_t fn = (iFEpLp_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX); }
 void iFEppi(x64emu_t *emu, uintptr_t fcn) { iFEppi_t fn = (iFEppi_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX); }
+void iFEppu(x64emu_t *emu, uintptr_t fcn) { iFEppu_t fn = (iFEppu_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX); }
 void iFEppd(x64emu_t *emu, uintptr_t fcn) { iFEppd_t fn = (iFEppd_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (void*)R_RSI, emu->xmm[0].d[0]); }
 void iFEppL(x64emu_t *emu, uintptr_t fcn) { iFEppL_t fn = (iFEppL_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX); }
 void iFEppp(x64emu_t *emu, uintptr_t fcn) { iFEppp_t fn = (iFEppp_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX); }
@@ -5908,7 +5909,6 @@ void iFipiip(x64emu_t *emu, uintptr_t fcn) { iFipiip_t fn = (iFipiip_t)fcn; R_RA
 #endif
 
 #if !defined(NOALIGN)
-void iFEppu(x64emu_t *emu, uintptr_t fcn) { iFEppu_t fn = (iFEppu_t)fcn; R_RAX=(int32_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX); }
 void iFEiiip(x64emu_t *emu, uintptr_t fcn) { iFEiiip_t fn = (iFEiiip_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (void*)R_RCX); }
 void iFEipii(x64emu_t *emu, uintptr_t fcn) { iFEipii_t fn = (iFEipii_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); }
 void iFEipiip(x64emu_t *emu, uintptr_t fcn) { iFEipiip_t fn = (iFEipiip_t)fcn; R_RAX=(int32_t)fn(emu, (int32_t)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 5634d504..02d10f13 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -933,6 +933,7 @@ void iFEpUp(x64emu_t *emu, uintptr_t fnc);
 void iFEpLi(x64emu_t *emu, uintptr_t fnc);
 void iFEpLp(x64emu_t *emu, uintptr_t fnc);
 void iFEppi(x64emu_t *emu, uintptr_t fnc);
+void iFEppu(x64emu_t *emu, uintptr_t fnc);
 void iFEppd(x64emu_t *emu, uintptr_t fnc);
 void iFEppL(x64emu_t *emu, uintptr_t fnc);
 void iFEppp(x64emu_t *emu, uintptr_t fnc);
@@ -2969,7 +2970,6 @@ void iFipiip(x64emu_t *emu, uintptr_t fnc);
 #endif
 
 #if !defined(NOALIGN)
-void iFEppu(x64emu_t *emu, uintptr_t fnc);
 void iFEiiip(x64emu_t *emu, uintptr_t fnc);
 void iFEipii(x64emu_t *emu, uintptr_t fnc);
 void iFEipiip(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedgdk3.c b/src/wrapped/wrappedgdk3.c
index aea28c68..f5683288 100644
--- a/src/wrapped/wrappedgdk3.c
+++ b/src/wrapped/wrappedgdk3.c
@@ -171,6 +171,12 @@ EXPORT uint32_t my3_gdk_threads_add_idle_full(x64emu_t* emu, int priority, void*
     return my->gdk_threads_add_idle_full(priority, findGSourceFunc(f), data, findGDestroyNotifyFct(d));
 }
 
+EXPORT uint32_t my3_gdk_threads_add_timeout_full(x64emu_t* emu, int priotity, uint32_t interval, void* f, void* data, void* d)
+{
+    return my->gdk_threads_add_timeout_full(priotity, interval, findGSourceFunc(f), data, findGDestroyNotifyFct(d));
+}
+
+
 #define PRE_INIT    \
     if(box64_nogtk) \
         return -1;
diff --git a/src/wrapped/wrappedgdk3_private.h b/src/wrapped/wrappedgdk3_private.h
index 97455ee0..65b6d5d3 100644
--- a/src/wrapped/wrappedgdk3_private.h
+++ b/src/wrapped/wrappedgdk3_private.h
@@ -567,7 +567,7 @@ GO(gdk_texture_get_height, uFp)
 //GOM(gdk_threads_add_idle, uFEpp)
 GOM(gdk_threads_add_idle_full, uFEippp)
 //GOM(gdk_threads_add_timeout, uFEupp)
-//GOM(gdk_threads_add_timeout_full, uFEiuppp)
+GOM(gdk_threads_add_timeout_full, uFEiuppp)
 //GOM(gdk_threads_add_timeout_seconds, uFEupp)
 //GOM(gdk_threads_add_timeout_seconds_full, uFEiuppp)
 GO(gdk_threads_enter, vFv)
diff --git a/src/wrapped/wrappedgdkx112.c b/src/wrapped/wrappedgdkx112.c
index cb627311..9b7bde77 100644
--- a/src/wrapped/wrappedgdkx112.c
+++ b/src/wrapped/wrappedgdkx112.c
@@ -57,7 +57,52 @@ static void* findFilterFct(void* fct)
     printf_log(LOG_NONE, "Warning, no more slot for gtk-2 GdkFilterFunc callback\n");
     return NULL;
 }
+// GSourceFunc
+#define GO(A)   \
+static uintptr_t my_GSourceFunc_fct_##A = 0;                                \
+static int my_GSourceFunc_##A(void* a)                                      \
+{                                                                           \
+    return (int)RunFunctionFmt(my_GSourceFunc_fct_##A, "p", a);       \
+}
+SUPER()
+#undef GO
+static void* findGSourceFunc(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_GSourceFunc_fct_##A == (uintptr_t)fct) return my_GSourceFunc_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_GSourceFunc_fct_##A == 0) {my_GSourceFunc_fct_##A = (uintptr_t)fct; return my_GSourceFunc_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gdk2 GSourceFunc callback\n");
+    return NULL;
+}
+// GDestroyNotify
+#define GO(A)   \
+static uintptr_t my_GDestroyNotify_fct_##A = 0;                         \
+static void my_GDestroyNotify_##A(void* data)                           \
+{                                                                       \
+    RunFunctionFmt(my_GDestroyNotify_fct_##A, "p", data);         \
+}
+SUPER()
+#undef GO
+static void* findGDestroyNotifyFct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_GDestroyNotify_fct_##A == (uintptr_t)fct) return my_GDestroyNotify_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_GDestroyNotify_fct_##A == 0) {my_GDestroyNotify_fct_##A = (uintptr_t)fct; return my_GDestroyNotify_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for gdk2 GDestroyNotify callback\n");
+    return NULL;
+}
 
+#undef SUPER
 
 static void my_event_handler(void* event, my_signal_t* sig)
 {
@@ -120,6 +165,11 @@ EXPORT void my_gdk_window_remove_filter(x64emu_t* emu, void* window, void* f, vo
     my->gdk_window_remove_filter(window, findFilterFct(f), data);
 }
 
+EXPORT uint32_t my_gdk_threads_add_timeout_full(x64emu_t* emu, int priotity, uint32_t interval, void* f, void* data, void* d)
+{
+    return my->gdk_threads_add_timeout_full(priotity, interval, findGSourceFunc(f), data, findGDestroyNotifyFct(d));
+}
+
 #define PRE_INIT    \
     if(box64_nogtk) \
         return -1;
diff --git a/src/wrapped/wrappedgdkx112_private.h b/src/wrapped/wrappedgdkx112_private.h
index f9c4d6b6..1a90ae4b 100644
--- a/src/wrapped/wrappedgdkx112_private.h
+++ b/src/wrapped/wrappedgdkx112_private.h
@@ -533,7 +533,7 @@ GO(gdk_text_width_wc, iFppi)
 //GOM(gdk_threads_add_idle, uFEpp)
 //GOM(gdk_threads_add_idle_full, uFEippp)
 //GOM(gdk_threads_add_timeout, uFEupp)
-//GOM(gdk_threads_add_timeout_full, uFEiuppp)
+GOM(gdk_threads_add_timeout_full, uFEiuppp)
 //GOM(gdk_threads_add_timeout_seconds, uFEupp)
 //GOM(gdk_threads_add_timeout_seconds_full, uFEiuppp)
 GO(gdk_threads_enter, vFv)