From e34b042f93e21ed6ccc8bcd1cd6fcca10fbd0b19 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 23 Oct 2015 22:42:32 +0300 Subject: Reduce flickering --- ttystatus/area.py | 19 ++++++++++++++++++- ttystatus/messager.py | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ttystatus/area.py b/ttystatus/area.py index 574ea1b..370f422 100644 --- a/ttystatus/area.py +++ b/ttystatus/area.py @@ -28,6 +28,23 @@ class AreaManager(object): width, _ = self._terminal.get_size() return width - 1 + def prepare_to_overwrite(self, displayed_message): + '''Prepare to overwrite currently displayed message. + + This is like clear, but it only moves the cursor to the top of + the message, but does not clear all the lines. This is helpful + for avoiding flickering. + + The cursor is assumed to be on the last line of the displayed + message. + + ''' + + num_lines = len(displayed_message.split('\n')) + up = self._terminal.get_up_sequence() + cr = self._terminal.get_carriage_return_sequence() + self._terminal.write(up * (num_lines - 1) + cr) + def make_space(self, num_lines): '''Make space for a message needing a given number of lines. @@ -56,7 +73,7 @@ class AreaManager(object): lines = message.split('\n') parts = [up * (len(lines) - 1)] - for i, line in enumerate(message.split('\n')): + for i, line in enumerate(lines): if i > 0: parts.append(down) parts.append(cr) diff --git a/ttystatus/messager.py b/ttystatus/messager.py index 91206bb..3a2da02 100644 --- a/ttystatus/messager.py +++ b/ttystatus/messager.py @@ -84,7 +84,8 @@ class Messager(object): ''' if self.enabled and (force or self.time_to_write()): - self.clear() + if self._displayed_message is not None: + self._area.prepare_to_overwrite(self._displayed_message) num_lines = len(message.split('\n')) self._area.make_space(num_lines) self._area.display(message) -- cgit v1.2.1