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\\");
}
}
}