mirror of
https://github.com/nsnail/spectre.console.git
synced 2025-04-16 00:42:51 +08:00
49 lines
1.5 KiB
C#
49 lines
1.5 KiB
C#
using System;
|
|
|
|
namespace Spectre.Console
|
|
{
|
|
/// <summary>
|
|
/// Contains extension methods for <see cref="IAnsiConsole"/>.
|
|
/// </summary>
|
|
public static partial class AnsiConsoleExtensions
|
|
{
|
|
/// <summary>
|
|
/// Switches to an alternate screen buffer if the terminal supports it.
|
|
/// </summary>
|
|
/// <param name="console">The console.</param>
|
|
/// <param name="action">The action to execute within the alternate screen buffer.</param>
|
|
public static void AlternateScreen(this IAnsiConsole console, Action action)
|
|
{
|
|
if (console is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(console));
|
|
}
|
|
|
|
if (!console.Profile.Capabilities.Ansi)
|
|
{
|
|
throw new NotSupportedException("Alternate buffers are not supported since your terminal does not support ANSI.");
|
|
}
|
|
|
|
if (!console.Profile.Capabilities.AlternateBuffer)
|
|
{
|
|
throw new NotSupportedException("Alternate buffers are not supported by your terminal.");
|
|
}
|
|
|
|
console.ExclusivityMode.Run<object?>(() =>
|
|
{
|
|
// Switch to alternate screen
|
|
console.Write(new ControlCode("\u001b[?1049h\u001b[H"));
|
|
|
|
// Execute custom action
|
|
action();
|
|
|
|
// Switch back to primary screen
|
|
console.Write(new ControlCode("\u001b[?1049l"));
|
|
|
|
// Dummy result
|
|
return null;
|
|
});
|
|
}
|
|
}
|
|
}
|