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