Use cswin32 in ansi detector

pull/554/head
Pavel Djundik 1 year ago
parent 33738aeb49
commit 926c41e7e0

@ -7,6 +7,9 @@ using System;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Microsoft.Win32.SafeHandles;
using Windows.Win32;
using Windows.Win32.System.Console;
namespace Spectre.Console; namespace Spectre.Console;
@ -45,7 +48,7 @@ internal static class AnsiDetector
return (true, false); return (true, false);
} }
var supportsAnsi = Windows.SupportsAnsi(upgrade, stdError, out var legacyConsole); var supportsAnsi = WindowsSupportsAnsi(upgrade, stdError, out var legacyConsole);
return (supportsAnsi, legacyConsole); return (supportsAnsi, legacyConsole);
} }
@ -67,33 +70,16 @@ internal static class AnsiDetector
return (false, true); return (false, true);
} }
private static class Windows private static bool WindowsSupportsAnsi(bool upgrade, bool stdError, out bool isLegacy)
{
private const int STD_OUTPUT_HANDLE = -11;
private const int STD_ERROR_HANDLE = -12;
private const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;
private const uint DISABLE_NEWLINE_AUTO_RETURN = 0x0008;
[DllImport("kernel32.dll")]
private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll")]
private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
public static extern uint GetLastError();
public static bool SupportsAnsi(bool upgrade, bool stdError, out bool isLegacy)
{ {
isLegacy = false; isLegacy = false;
try try
{ {
var @out = GetStdHandle(stdError ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE); var @out = PInvoke.GetStdHandle(stdError ? STD_HANDLE.STD_ERROR_HANDLE :STD_HANDLE.STD_OUTPUT_HANDLE);
if (!GetConsoleMode(@out, out var mode)) var safeHandle = new SafeFileHandle(@out, ownsHandle: false);
if (!PInvoke.GetConsoleMode(safeHandle, out var mode))
{ {
// Could not get console mode, try TERM (set in cygwin, WSL-Shell). // Could not get console mode, try TERM (set in cygwin, WSL-Shell).
var (ansiFromTerm, legacyFromTerm) = DetectFromTerm(); var (ansiFromTerm, legacyFromTerm) = DetectFromTerm();
@ -102,7 +88,7 @@ internal static class AnsiDetector
return ansiFromTerm; return ansiFromTerm;
} }
if ((mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) if ((mode & CONSOLE_MODE.ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0||true)
{ {
isLegacy = true; isLegacy = true;
@ -112,8 +98,8 @@ internal static class AnsiDetector
} }
// Try enable ANSI support. // Try enable ANSI support.
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN; mode |= CONSOLE_MODE.ENABLE_VIRTUAL_TERMINAL_PROCESSING | CONSOLE_MODE.DISABLE_NEWLINE_AUTO_RETURN;
if (!SetConsoleMode(@out, mode)) if (!PInvoke.SetConsoleMode(@out, mode))
{ {
// Enabling failed. // Enabling failed.
return false; return false;
@ -130,5 +116,4 @@ internal static class AnsiDetector
return false; return false;
} }
} }
}
} }

@ -1,2 +1,5 @@
GetConsoleMode
GetConsoleProcessList GetConsoleProcessList
GetStdHandle
MessageBox MessageBox
SetConsoleMode

Loading…
Cancel
Save