From c93f7e73858be5015219ecdc75d9c38f990b6295 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 4 Apr 2025 22:23:17 -0500 Subject: [PATCH] Output CLI error/info messages to the console on Windows Fixes #1554 --- app/cli/commandlineparser.cpp | 7 ------- app/main.cpp | 39 ++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/app/cli/commandlineparser.cpp b/app/cli/commandlineparser.cpp index 9c085ed7..16725ba2 100644 --- a/app/cli/commandlineparser.cpp +++ b/app/cli/commandlineparser.cpp @@ -59,13 +59,6 @@ public: void showMessage(QString message, MessageType type) const { - #if defined(Q_OS_WIN32) - UINT flags = MB_OK | MB_TOPMOST | MB_SETFOREGROUND; - flags |= (type == Info ? MB_ICONINFORMATION : MB_ICONERROR); - QString title = "Moonlight"; - MessageBoxW(nullptr, reinterpret_cast(message.utf16()), - reinterpret_cast(title.utf16()), flags); - #endif message = message.endsWith('\n') ? message : message + '\n'; fputs(qPrintable(message), type == Info ? stdout : stderr); } diff --git a/app/main.cpp b/app/main.cpp index c096dede..bbef4bc3 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -588,31 +588,32 @@ int main(int argc, char *argv[]) } #endif +#ifdef Q_OS_WIN32 + // If we don't have stdout or stderr handles (which will normally be the case + // since we're a /SUBSYSTEM:WINDOWS app), attach to our parent console and use + // that for stdout and stderr. + // + // If we do have stdout or stderr handles, that means the user has used standard + // handle redirection. In that case, we don't want to override those handles. + if (AttachConsole(ATTACH_PARENT_PROCESS)) { + // If we didn't have an old stdout/stderr handle, use the new CONOUT$ handle + if (IS_UNSPECIFIED_HANDLE(oldConOut)) { + freopen("CONOUT$", "w", stdout); + setvbuf(stdout, NULL, _IONBF, 0); + } + if (IS_UNSPECIFIED_HANDLE(oldConErr)) { + freopen("CONOUT$", "w", stderr); + setvbuf(stderr, NULL, _IONBF, 0); + } + } +#endif + GlobalCommandLineParser parser; GlobalCommandLineParser::ParseResult commandLineParserResult = parser.parse(app.arguments()); switch (commandLineParserResult) { case GlobalCommandLineParser::ListRequested: // Don't log to the console since it will jumble the command output s_SuppressVerboseOutput = true; -#ifdef Q_OS_WIN32 - // If we don't have stdout or stderr handles (which will normally be the case - // since we're a /SUBSYSTEM:WINDOWS app), attach to our parent console and use - // that for stdout and stderr. - // - // If we do have stdout or stderr handles, that means the user has used standard - // handle redirection. In that case, we don't want to override those handles. - if (AttachConsole(ATTACH_PARENT_PROCESS)) { - // If we didn't have an old stdout/stderr handle, use the new CONOUT$ handle - if (IS_UNSPECIFIED_HANDLE(oldConOut)) { - freopen("CONOUT$", "w", stdout); - setvbuf(stdout, NULL, _IONBF, 0); - } - if (IS_UNSPECIFIED_HANDLE(oldConErr)) { - freopen("CONOUT$", "w", stderr); - setvbuf(stderr, NULL, _IONBF, 0); - } - } -#endif break; default: break;