From 1c11dd4793a601874402eabd5d5a8138c3022132 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 7 Oct 2021 10:58:49 -0400 Subject: [PATCH] avoid cursor jitter when updating progress display When the progress display gets longer, and then shorter again, it causes the cursor to jitter back and forth. Somehow I never noticed this until this morning, but then it became intolerable to watch. To fix it, pad the progress display to the maximum length it's occupied. Sponsored-by: Svenne Krap on Patreon --- CHANGELOG | 1 + Utility/Metered.hs | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 25e9e7ace1..a66d4524d1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -16,6 +16,7 @@ git-annex (8.20210904) UNRELEASED; urgency=medium * reinject: Fix crash when reinjecting a file from outside the repository. (Reversion in version 8.20210621) * borg: Some improvements to memory use when importing a lot of archives. + * Avoid cursor jitter when updating progress display. -- Joey Hess Fri, 03 Sep 2021 12:02:55 -0400 diff --git a/Utility/Metered.hs b/Utility/Metered.hs index 21c9cd8455..8fd9c9b667 100644 --- a/Utility/Metered.hs +++ b/Utility/Metered.hs @@ -459,12 +459,14 @@ updateMeter (Meter totalsizev sv bv displaymeter) new = do -- | Display meter to a Handle. displayMeterHandle :: Handle -> RenderMeter -> DisplayMeter displayMeterHandle h rendermeter v msize old new = do + olds <- takeMVar v let s = rendermeter msize old new - olds <- swapMVar v s + let padding = replicate (length olds - length s) ' ' + let s' = s <> padding + putMVar v s' -- Avoid writing when the rendered meter has not changed. - when (olds /= s) $ do - let padding = replicate (length olds - length s) ' ' - hPutStr h ('\r':s ++ padding) + when (olds /= s') $ do + hPutStr h ('\r':s') hFlush h -- | Clear meter displayed by displayMeterHandle. May be called before