Skip to content

Commit

Permalink
Include progress in error and warning states.
Browse files Browse the repository at this point in the history
  • Loading branch information
timcassell committed Aug 13, 2023
1 parent c9f7ce5 commit d75872f
Showing 1 changed file with 24 additions and 24 deletions.
48 changes: 24 additions & 24 deletions src/BenchmarkDotNet/Helpers/TaskbarProgress.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,7 @@ internal void SetProgress(float progressValue)
}

private void OnConsoleCancelEvent(object sender, ConsoleCancelEventArgs e)
{
Dispose();
}
=> Dispose();

public void Dispose()
{
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -141,17 +137,13 @@ private Com(IntPtr handle)
}

internal void SetState(TaskbarProgressState taskbarState)
{
taskbarInstance.SetProgressState(consoleWindowHandle, taskbarState);
}
=> taskbarInstance.SetProgressState(consoleWindowHandle, taskbarState);

/// <summary>
/// Sets the progress value out of 100.
/// </summary>
internal void SetValue(uint progressValue)
{
taskbarInstance.SetProgressValue(consoleWindowHandle, progressValue, 100);
}
=> taskbarInstance.SetProgressValue(consoleWindowHandle, progressValue, 100);
}

private sealed class Terminal
Expand Down Expand Up @@ -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)
{
Expand All @@ -206,52 +197,61 @@ 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);
}

/// <summary>
/// Sets the progress value out of 100.
/// </summary>
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\\");
}
}
}

0 comments on commit d75872f

Please sign in to comment.