From 5a735da968853c4a1a38723a296a35ac6fa9b9ef Mon Sep 17 00:00:00 2001 From: Olli Kallioinen Date: Mon, 4 Dec 2017 19:28:03 +0200 Subject: [PATCH] Fixed SDL_Log not working on windows if the output is being redirected. --- src/SDL_log.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/SDL_log.c b/src/SDL_log.c index 98978628e..2deb3ac57 100644 --- a/src/SDL_log.c +++ b/src/SDL_log.c @@ -303,7 +303,7 @@ SDL_LogMessageV(int category, SDL_LogPriority priority, const char *fmt, va_list } #if defined(__WIN32__) && !defined(HAVE_STDIO_H) && !defined(__WINRT__) -/* Flag tracking the attachment of the console: 0=unattached, 1=attached, -1=error */ +/* Flag tracking the attachment of the console: 0=unattached, 1=attached to a console, 2=attached to a file, -1=error */ static int consoleAttached = 0; /* Handle to stderr output of console. */ @@ -326,6 +326,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, BOOL attachResult; DWORD attachError; unsigned long charsWritten; + DWORD consoleMode; /* Maybe attach console and get stderr handle */ if (consoleAttached == 0) { @@ -350,9 +351,15 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, /* Newly attached */ consoleAttached = 1; } - + if (consoleAttached == 1) { stderrHandle = GetStdHandle(STD_ERROR_HANDLE); + + if (GetConsoleMode(stderrHandle, &consoleMode) == 0) { + /* WriteConsole fails if the output is redirected to a file. Must use WriteFile instead. */ + OutputDebugString(TEXT("Console ouput is being redirected\r\n")); + consoleAttached = 2; + } } } #endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */ @@ -374,6 +381,11 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority, OutputDebugString(TEXT("Insufficient heap memory to write message\r\n")); } } + + } else if (consoleAttached == 2) { + if (!WriteFile(stderrHandle, output, lstrlenA(output), &charsWritten, NULL)) { + OutputDebugString(TEXT("Error calling WriteFile\r\n")); + } } #endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */