From 0008519191fac6d72c4f23d6b02acf462e784978 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 12 Aug 2023 22:19:34 -0400 Subject: [PATCH] Include progress in error and warning states. --- .../Helpers/TaskbarProgress.cs | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/BenchmarkDotNet/Helpers/TaskbarProgress.cs b/src/BenchmarkDotNet/Helpers/TaskbarProgress.cs index 116ab302c7..9d59188795 100644 --- a/src/BenchmarkDotNet/Helpers/TaskbarProgress.cs +++ b/src/BenchmarkDotNet/Helpers/TaskbarProgress.cs @@ -56,9 +56,7 @@ internal void SetProgress(float progressValue) } private void OnConsoleCancelEvent(object sender, ConsoleCancelEventArgs e) - { - Dispose(); - } + => Dispose(); public void Dispose() { @@ -104,9 +102,7 @@ private interface ITaskbarList3 [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")] [ClassInterface(ClassInterfaceType.None)] [ComImport] - private class TaskbarInstance - { - } + private class TaskbarInstance { } [DllImport("kernel32.dll")] private static extern IntPtr GetConsoleWindow(); @@ -141,17 +137,13 @@ private Com(IntPtr handle) } internal void SetState(TaskbarProgressState taskbarState) - { - taskbarInstance.SetProgressState(consoleWindowHandle, taskbarState); - } + => taskbarInstance.SetProgressState(consoleWindowHandle, taskbarState); /// /// Sets the progress value out of 100. /// internal void SetValue(uint progressValue) - { - taskbarInstance.SetProgressValue(consoleWindowHandle, progressValue, 100); - } + => taskbarInstance.SetProgressValue(consoleWindowHandle, progressValue, 100); } private sealed class Terminal @@ -185,11 +177,10 @@ private enum ConsoleModes : uint private const int STD_OUTPUT_HANDLE = -11; private readonly IntPtr consoleHandle; + private uint currentProgress; private Terminal(IntPtr handle) - { - consoleHandle = handle; - } + => consoleHandle = handle; internal static Terminal? MaybeCreateInstanceAndSetInitialState(TaskbarProgressState initialTaskbarState) { @@ -206,39 +197,44 @@ private Terminal(IntPtr handle) // If we try to write without VT mode, the sequence will be printed for the user to see, which clutters the output. return null; } - SetStateThenRevertConsoleMode(handle, initialTaskbarState, previousConsoleMode); - return new Terminal(handle); + var terminal = new Terminal(handle); + terminal.WriteStateSequence(initialTaskbarState); + SetConsoleMode(handle, previousConsoleMode); + return terminal; } internal void SetState(TaskbarProgressState taskbarState) { GetConsoleMode(consoleHandle, out ConsoleModes previousConsoleMode); SetConsoleMode(consoleHandle, ConsoleModes.ENABLE_VIRTUAL_TERMINAL_PROCESSING | ConsoleModes.ENABLE_PROCESSED_OUTPUT); - SetStateThenRevertConsoleMode(consoleHandle, taskbarState, previousConsoleMode); + WriteStateSequence(taskbarState); + SetConsoleMode(consoleHandle, previousConsoleMode); } - private static void SetStateThenRevertConsoleMode(IntPtr handle, TaskbarProgressState taskbarState, ConsoleModes previousConsoleMode) + private void WriteStateSequence(TaskbarProgressState taskbarState) { // Write progress state to console for Windows Terminal (https://github.com/microsoft/terminal/issues/6700). switch (taskbarState) { case TaskbarProgressState.NoProgress: + currentProgress = 100; Console.Write("\x1b]9;4;0;0\x1b\\"); break; case TaskbarProgressState.Indeterminate: + currentProgress = 100; Console.Write("\x1b]9;4;3;0\x1b\\"); break; case TaskbarProgressState.Normal: - // Do nothing, this is set automatically when SetValue is called (and WT has no documented way to set this). + // Normal state is set when progress is set. + WriteProgressSequence(currentProgress); break; case TaskbarProgressState.Error: - Console.Write("\x1b]9;4;2;0\x1b\\"); + Console.Write($"\x1b]9;4;2;{currentProgress}\x1b\\"); break; case TaskbarProgressState.Warning: - Console.Write("\x1b]9;4;4;0\x1b\\"); + Console.Write($"\x1b]9;4;4;{currentProgress}\x1b\\"); break; } - SetConsoleMode(handle, previousConsoleMode); } /// @@ -246,12 +242,16 @@ private static void SetStateThenRevertConsoleMode(IntPtr handle, TaskbarProgress /// internal void SetValue(uint progressValue) { + currentProgress = progressValue; // Write progress sequence to console for Windows Terminal (https://github.com/microsoft/terminal/discussions/14268). GetConsoleMode(consoleHandle, out ConsoleModes previousConsoleMode); SetConsoleMode(consoleHandle, ConsoleModes.ENABLE_VIRTUAL_TERMINAL_PROCESSING | ConsoleModes.ENABLE_PROCESSED_OUTPUT); - Console.Write($"\x1b]9;4;1;{progressValue}\x1b\\"); + WriteProgressSequence(progressValue); SetConsoleMode(consoleHandle, previousConsoleMode); } + + private static void WriteProgressSequence(uint progressValue) + => Console.Write($"\x1b]9;4;1;{progressValue}\x1b\\"); } } }