diff --git a/raylib/purego_windows.go b/raylib/purego_windows.go index 470d16d..a46c878 100644 --- a/raylib/purego_windows.go +++ b/raylib/purego_windows.go @@ -5,6 +5,7 @@ package rl import ( "fmt" + "syscall" "unsafe" "github.com/ebitengine/purego" @@ -16,6 +17,15 @@ const ( requiredVersion = "5.0" ) +var wvsprintfA uintptr + +func init() { + handle, err := windows.LoadLibrary("user32.dll") + if err == nil { + wvsprintfA, _ = windows.GetProcAddress(handle, "wvsprintfA") + } +} + // loadLibrary loads the raylib dll and panics on error func loadLibrary() uintptr { handle, err := windows.LoadLibrary(libname) @@ -37,7 +47,14 @@ func loadLibrary() uintptr { } func traceLogCallbackWrapper(fn TraceLogCallbackFun) uintptr { - return purego.NewCallback(func(logLevel int32, text *byte) uintptr { + return purego.NewCallback(func(logLevel int32, text *byte, args unsafe.Pointer) uintptr { + if wvsprintfA != 0 { + var buffer [1024]byte // Max size is 1024 (see https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-wvsprintfa) + _, _, errno := syscall.SyscallN(wvsprintfA, uintptr(unsafe.Pointer(&buffer[0])), uintptr(unsafe.Pointer(text)), uintptr(args)) + if errno == 0 { + text = &buffer[0] + } + } fn(int(logLevel), windows.BytePtrToString(text)) return 0 }) diff --git a/raylib/raylib_purego.go b/raylib/raylib_purego.go index ef58489..53d061d 100644 --- a/raylib/raylib_purego.go +++ b/raylib/raylib_purego.go @@ -4,6 +4,7 @@ package rl import ( + "fmt" "image" "image/color" "os" @@ -121,7 +122,7 @@ var unloadRandomSequence func(sequence *int32) var takeScreenshot func(fileName string) var setConfigFlags func(flags uint32) var openURL func(url string) -var traceLog func(logLevel int32, text string, args ...any) +var traceLog func(logLevel int32, text string) var setTraceLogLevel func(logLevel int32) var memAlloc func(size uint32) unsafe.Pointer var memRealloc func(ptr unsafe.Pointer, size uint32) unsafe.Pointer @@ -1556,7 +1557,7 @@ func OpenURL(url string) { // TraceLog - Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) func TraceLog(logLevel TraceLogLevel, text string, args ...any) { - traceLog(int32(logLevel), text, args...) + traceLog(int32(logLevel), fmt.Sprintf(text, args...)) } // SetTraceLogLevel - Set the current threshold (minimum) log level @@ -1580,8 +1581,6 @@ func MemFree(ptr unsafe.Pointer) { } // SetTraceLogCallback - Set custom trace log -// -// REVIEW NEEDED! 2023-11-15 JupiterRider: The argument list paramter isn't impelmented yet. func SetTraceLogCallback(fn TraceLogCallbackFun) { setTraceLogCallback(traceLogCallbackWrapper(fn)) } diff --git a/raylib/utils_log.c b/raylib/utils_log.c index 212a4ae..7d3d95e 100644 --- a/raylib/utils_log.c +++ b/raylib/utils_log.c @@ -3,7 +3,7 @@ #include // Required for: vprintf() #include // Required for: strcpy(), strcat() -#define MAX_TRACELOG_BUFFER_SIZE 128 // As defined in utils.c from raylib +#define MAX_TRACELOG_BUFFER_SIZE 256 // As defined in utils.c from raylib void rayLogWrapperCallback(int logType, const char *text, va_list args) { char buffer[MAX_TRACELOG_BUFFER_SIZE] = { 0 };