summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2015-10-23 22:42:32 +0300
committerLars Wirzenius <liw@liw.fi>2015-10-23 22:42:32 +0300
commite34b042f93e21ed6ccc8bcd1cd6fcca10fbd0b19 (patch)
tree9c57d03049ce7be9a65c491f4a0a8797b0ab1a3c
parent4c57a5cf4223b6c6085e3cfa60c8b1c908b98e48 (diff)
downloadttystatus-e34b042f93e21ed6ccc8bcd1cd6fcca10fbd0b19.tar.gz
Reduce flickering
-rw-r--r--ttystatus/area.py19
-rw-r--r--ttystatus/messager.py3
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)