Fixed SDL_Log not working on windows if the output is being redirected.

This commit is contained in:
Olli Kallioinen 2017-12-04 19:28:03 +02:00
parent 14452e9550
commit 5a735da968
1 changed files with 14 additions and 2 deletions

View File

@ -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__) #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; static int consoleAttached = 0;
/* Handle to stderr output of console. */ /* Handle to stderr output of console. */
@ -326,6 +326,7 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority,
BOOL attachResult; BOOL attachResult;
DWORD attachError; DWORD attachError;
unsigned long charsWritten; unsigned long charsWritten;
DWORD consoleMode;
/* Maybe attach console and get stderr handle */ /* Maybe attach console and get stderr handle */
if (consoleAttached == 0) { if (consoleAttached == 0) {
@ -350,9 +351,15 @@ SDL_LogOutput(void *userdata, int category, SDL_LogPriority priority,
/* Newly attached */ /* Newly attached */
consoleAttached = 1; consoleAttached = 1;
} }
if (consoleAttached == 1) { if (consoleAttached == 1) {
stderrHandle = GetStdHandle(STD_ERROR_HANDLE); 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__) */ #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")); 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__) */ #endif /* !defined(HAVE_STDIO_H) && !defined(__WINRT__) */