diff --git a/tb/main.cpp b/tb/main.cpp index 9bb7bf3..a5b8d43 100644 --- a/tb/main.cpp +++ b/tb/main.cpp @@ -38,6 +38,10 @@ using namespace std::placeholders; #include #endif +#ifndef STDOUT_FILENO + #define STDOUT_FILENO 1 +#endif + #define STDOUT_FASTPATH_FD 3 using termbench::TerminalSize; @@ -55,8 +59,15 @@ TerminalSize getTerminalSize() noexcept return DefaultSize; return { ws.ws_col, ws.ws_row }; #else - // TODO: Windows - return DefaultSize; + CONSOLE_SCREEN_BUFFER_INFOEX info { + .cbSize = sizeof(info), + }; + if (!GetConsoleScreenBufferInfoEx(GetStdHandle(STD_OUTPUT_HANDLE), &info)) + return DefaultSize; + return { + static_cast(info.srWindow.Right - info.srWindow.Left + 1), + static_cast(info.srWindow.Bottom - info.srWindow.Top + 1), + }; #endif } @@ -205,7 +216,7 @@ bool addTestsToBenchmark(termbench::Benchmark& tb, BenchSettings const& settings cerr << std::format("Failed to load file '{}'.\n", test.string()); return false; } - tb.add(termbench::tests::crafted(test.filename(), "", std::move(content))); + tb.add(termbench::tests::crafted(test.filename().string(), "", std::move(content))); } if (settings.columnByColumn) @@ -254,11 +265,15 @@ struct WithScopedTerminalSize int main(int argc, char const* argv[]) { #if defined(_WIN32) - { - HANDLE stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); - SetConsoleMode(stdoutHandle, ENABLE_VIRTUAL_TERMINAL_PROCESSING); - } + const auto stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); + const auto stdoutCP = GetConsoleOutputCP(); + DWORD stdoutMode; + GetConsoleMode(stdoutHandle, &stdoutMode); + SetConsoleMode(stdoutHandle, + ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + SetConsoleOutputCP(CP_UTF8); #endif + auto const initialTerminalSize = getTerminalSize(); auto const settings = parseArguments(argc, argv, initialTerminalSize); @@ -294,5 +309,9 @@ int main(int argc, char const* argv[]) tb.summarize(writerToFile); } +#if defined(_WIN32) + SetConsoleMode(stdoutHandle, stdoutMode); + SetConsoleOutputCP(stdoutCP); +#endif return EXIT_SUCCESS; }