Commit 273d2de099

Alexandros Naskos <alex_naskos@hotmail.com>
2020-04-29 18:49:02
Progress will now use ANSI escape codes on windows for terminals that support it
1 parent 15141d8
Changed files (1)
lib
lib/std/progress.zig
@@ -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;