Commit b0724a350f

LemonBoy <thatlemon@gmail.com>
2021-03-12 17:14:50
Handle some weird edge cases of Win32 API
Sometimes the viewport srWindow may report an invalid rectangle where the top row is below the bottom one.
1 parent b5a50a2
Changed files (1)
lib
lib/std/Progress.zig
@@ -210,13 +210,15 @@ fn refreshWithHeldLock(self: *Progress) void {
 
         saved_cursor_pos = info.dwCursorPosition;
 
-        const window_height = @intCast(windows.DWORD, info.srWindow.Bottom - info.srWindow.Top) + 1;
-        const window_width = @intCast(windows.DWORD, info.srWindow.Right - info.srWindow.Left) + 1;
+        const window_height = @intCast(windows.DWORD, info.srWindow.Bottom - info.srWindow.Top + 1);
+        const window_width = @intCast(windows.DWORD, info.srWindow.Right - info.srWindow.Left + 1);
         // Number of terminal cells to clear, starting from the cursor position
         // and ending at the window bottom right corner.
-        const fill_chars = window_width * (window_height -
-            @intCast(windows.DWORD, info.dwCursorPosition.Y - info.srWindow.Top)) -
-            @intCast(windows.DWORD, info.dwCursorPosition.X - info.srWindow.Left);
+        const fill_chars = if (window_width == 0 or window_height == 0) 0 else chars: {
+            break :chars window_width * (window_height -
+                @intCast(windows.DWORD, info.dwCursorPosition.Y - info.srWindow.Top)) -
+                @intCast(windows.DWORD, info.dwCursorPosition.X - info.srWindow.Left);
+        };
 
         var written: windows.DWORD = undefined;
         if (windows.kernel32.FillConsoleOutputAttribute(