Fix flickering in Blinkenlights UI

Do not call resizeterm(), unless is_term_resized() returns True. This
breaks the busy-loop where resizeterm() pushes a KEY_RESIZE onto the
FIFO causing the screen to be redrawn indefinitely (Issue ).

Also, clear and refresh the main window after it has been resized. This
hopefully fixes the problem where Blinkenlights UI becomes unreadable
after terminal resize (Issue ).

Closes : blinkenlights display is broken
Closes : ncurses flicker with blinkenlights UI
Bug-Debian: https://bugs.debian.org/671087
Bug-Debian: https://bugs.debian.org/809676
Signed-off-by: Ilias Tsitsimpis <i.tsitsimpis@gmail.com>
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:
Ilias Tsitsimpis 2016-10-14 14:42:33 +03:00 committed by Nicolas Sebrecht
parent 5d705f26e2
commit 0a635bd236

@ -149,6 +149,7 @@ class CursesAccountFrame:
self.window = curses_win self.window = curses_win
self.acc_num = acc_num self.acc_num = acc_num
self.drawleadstr() self.drawleadstr()
self.ui.exec_locked(self.window.noutrefresh)
# Update the child ThreadFrames # Update the child ThreadFrames
for child in self.children: for child in self.children:
child.update(curses_win, self.location, 0) child.update(curses_win, self.location, 0)
@ -510,6 +511,7 @@ class Blinkenlights(UIBase, CursesUtil):
# received special KEY_RESIZE, resize terminal # received special KEY_RESIZE, resize terminal
if key == curses.KEY_RESIZE: if key == curses.KEY_RESIZE:
self.resizeterm() self.resizeterm()
return
if key < 1 or key > 255: if key < 1 or key > 255:
return return
@ -574,9 +576,12 @@ class Blinkenlights(UIBase, CursesUtil):
self.height, self.width = self.stdscr.getmaxyx() self.height, self.width = self.stdscr.getmaxyx()
self.logheight = self.height - len(self.accframes) - 1 self.logheight = self.height - len(self.accframes) - 1
if resize: if resize:
curses.resizeterm(self.height, self.width) if curses.is_term_resized(self.height, self.width):
curses.resizeterm(self.height, self.width)
self.bannerwin.resize(1, self.width) self.bannerwin.resize(1, self.width)
self.logwin.resize(self.logheight, self.width) self.logwin.resize(self.logheight, self.width)
self.stdscr.clear()
self.stdscr.noutrefresh()
else: else:
self.bannerwin = curses.newwin(1, self.width, 0, 0) self.bannerwin = curses.newwin(1, self.width, 0, 0)
self.logwin = curses.newwin(self.logheight, self.width, 1, 0) self.logwin = curses.newwin(self.logheight, self.width, 1, 0)
@ -621,8 +626,9 @@ class Blinkenlights(UIBase, CursesUtil):
else: else:
color = curses.A_NORMAL color = curses.A_NORMAL
self.logwin.move(0, 0) self.logwin.move(0, 0)
self.logwin.erase() self.logwin.clear()
self.logwin.bkgd(' ', color) self.logwin.bkgd(' ', color)
self.logwin.noutrefresh()
def getaccountframe(self, acc_name): def getaccountframe(self, acc_name):
"""Return an AccountFrame() corresponding to acc_name. """Return an AccountFrame() corresponding to acc_name.