[tor-commits] [nyx/master] Lighter routine redraws

atagar at torproject.org atagar at torproject.org
Sun Jul 17 18:49:14 UTC 2016


commit d9a84b0ab7f9065e899282b4d0f2ff2a0b7c818b
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jul 17 11:35:43 2016 -0700

    Lighter routine redraws
    
    Our old draw() method had a 'force' flag that, if false, would cause us to only
    be redrawn if our dimensions had changed. We did a 'soft redraw' on every
    keypress so dropping this flag was very noticeable, causing flickering and the
    interface to be laggy on things like the config panel.
    
    Inverting this flag so we force by default. This is because just about every
    time we called redraw we wanted to 'force' it. Soft redraws are the exception,
    not the rule.
---
 nyx/controller.py     |  2 +-
 nyx/curses.py         | 13 ++++++++++++-
 nyx/panel/__init__.py | 16 ++++++++++++++--
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/nyx/controller.py b/nyx/controller.py
index c5b90d6..d2f202f 100644
--- a/nyx/controller.py
+++ b/nyx/controller.py
@@ -292,7 +292,7 @@ class Controller(object):
         stdscr.clear()
 
     for panel_impl in display_panels:
-      panel_impl.redraw()
+      panel_impl.redraw(force = force)
 
     if force:
       self._last_drawn = current_time
diff --git a/nyx/curses.py b/nyx/curses.py
index 6e605a7..53a2c43 100644
--- a/nyx/curses.py
+++ b/nyx/curses.py
@@ -499,7 +499,7 @@ def is_wide_characters_supported():
   return False
 
 
-def draw(func, left = 0, top = 0, width = None, height = None, background = None):
+def draw(func, left = 0, top = 0, width = None, height = None, background = None, draw_if_resized = None):
   """
   Renders a subwindow. This calls the given draw function with a
   :class:`~nyx.curses._Subwindow`.
@@ -510,6 +510,10 @@ def draw(func, left = 0, top = 0, width = None, height = None, background = None
   :param int width: panel width, uses all available space if **None**
   :param int height: panel height, uses all available space if **None**
   :param nyx.curses.Color background: background color, unset if **None**
+  :param nyx.curses.Dimension draw_if_resized: only draw content if
+    dimentions have changed from this
+
+  :returns: :class:`~nyx.curses.Dimension` for the space we drew within
   """
 
   with CURSES_LOCK:
@@ -526,6 +530,11 @@ def draw(func, left = 0, top = 0, width = None, height = None, background = None
     if height:
       subwindow_height = min(height, subwindow_height)
 
+    subwindow_dimensions = Dimensions(subwindow_width, subwindow_height)
+
+    if subwindow_dimensions == draw_if_resized:
+      return subwindow_dimensions  # draw size hasn't changed
+
     curses_subwindow = CURSES_SCREEN.subwin(subwindow_height, subwindow_width, top, left)
     curses_subwindow.erase()
 
@@ -535,6 +544,8 @@ def draw(func, left = 0, top = 0, width = None, height = None, background = None
     func(_Subwindow(subwindow_width, subwindow_height, curses_subwindow))
     curses_subwindow.refresh()
 
+    return subwindow_dimensions
+
 
 class _Subwindow(object):
   """
diff --git a/nyx/panel/__init__.py b/nyx/panel/__init__.py
index 85d1b78..ec13aaf 100644
--- a/nyx/panel/__init__.py
+++ b/nyx/panel/__init__.py
@@ -90,6 +90,9 @@ class Panel(object):
     self._top = 0
     self._visible = False
 
+    self._last_draw_top = 0
+    self._last_draw_size = nyx.curses.Dimensions(0, 0)
+
   def get_top(self):
     """
     Provides our top position in the overall screen.
@@ -135,15 +138,24 @@ class Panel(object):
 
     return ()
 
-  def redraw(self):
+  def redraw(self, force = True):
     """
     Renders our panel's content to the screen.
+
+    :param bool force: if **False** only redraws content if the panel's
+      dimensions have changed
     """
 
     if not self._visible:
       return  # not currently visible
 
-    nyx.curses.draw(self._draw, top = self._top, height = self.get_height())
+    if not force and self._last_draw_top == self._top:
+      draw_dimension = self._last_draw_size
+    else:
+      draw_dimension = None  # force redraw
+
+    self._last_draw_top = self._top
+    self._last_draw_size = nyx.curses.draw(self._draw, top = self._top, height = self.get_height(), draw_if_resized = draw_dimension)
 
   def _draw(self, subwindow):
     pass



More information about the tor-commits mailing list