Progress will now use ANSI escape codes on windows for terminals that support it

master
Alexandros Naskos 2020-04-29 19:49:02 +03:00
parent 15141d865a
commit 273d2de099
1 changed files with 6 additions and 2 deletions

View File

@ -13,6 +13,9 @@ pub const Progress = struct {
/// not print on update()
terminal: ?std.fs.File = undefined,
/// Whether the terminal supports ANSI escape codes.
supports_ansi_escape_codes: bool = false,
root: Node = undefined,
/// Keeps track of how much time has passed since the beginning.
@ -103,6 +106,7 @@ pub const Progress = struct {
self.terminal = null;
if (stderr.supportsAnsiEscapeCodes()) {
self.terminal = stderr;
self.supports_ansi_escape_codes = true;
} else if (std.builtin.os.tag == .windows and stderr.isTty()) {
self.terminal = stderr;
}
@ -138,10 +142,10 @@ pub const Progress = struct {
// restore the cursor position by moving the cursor
// `columns_written` cells to the left, then clear the rest of the
// line
if (std.builtin.os.tag != .windows) {
if (self.supports_ansi_escape_codes) {
end += (std.fmt.bufPrint(self.output_buffer[end..], "\x1b[{}D", .{self.columns_written}) catch unreachable).len;
end += (std.fmt.bufPrint(self.output_buffer[end..], "\x1b[0K", .{}) catch unreachable).len;
} else {
} else if (std.builtin.os.tag == .windows) {
var info: windows.CONSOLE_SCREEN_BUFFER_INFO = undefined;
if (windows.kernel32.GetConsoleScreenBufferInfo(file.handle, &info) != windows.TRUE)
unreachable;