Curses UI: make resize behave better

Resizing a Blinkenlights terminal doesn't crash anymore, and actually
seems to be changing the size, with this patch.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
This commit is contained in:
Sebastian Spaeth 2011-11-02 17:03:40 +01:00
parent bfbd378025
commit 70125d58e6

View File

@ -119,6 +119,7 @@ class CursesAccountFrame:
self.children = []
self.accountname = accountname
self.ui = ui
self.window = None
def drawleadstr(self, secs = None):
#TODO: does what?
@ -178,7 +179,7 @@ class CursesThreadFrame:
self.curses_color = curses.color_pair(0) #default color
def setcolor(self, color, modifier=0):
"""Draw the thread symbol '.' in the specified color
"""Draw the thread symbol '@' in the specified color
:param modifier: Curses modified, such as curses.A_BOLD"""
self.curses_color = modifier | self.ui.curses_colorpair(color)
self.colorname = color
@ -186,7 +187,7 @@ class CursesThreadFrame:
def display(self):
def locked_display():
self.window.addch(self.y, self.x, '.', self.curses_color)
self.window.addch(self.y, self.x, '@', self.curses_color)
self.window.refresh()
# lock the curses IO while fudging stuff
self.ui.exec_locked(locked_display)
@ -289,7 +290,7 @@ class CursesLogHandler(logging.StreamHandler):
finally:
self.ui.unlock()
self.ui.tframe_lock.release()
self.ui.logwin.refresh()
self.ui.logwin.noutrefresh()
self.ui.stdscr.refresh()
class Blinkenlights(UIBase, CursesUtil):
@ -509,7 +510,7 @@ class Blinkenlights(UIBase, CursesUtil):
def resizeterm(self):
"""Resize the current windows"""
self.exec_locked(self.setupwindows(True))
self.exec_locked(self.setupwindows, True)
def mainException(self):
UIBase.mainException(self)
@ -537,33 +538,30 @@ class Blinkenlights(UIBase, CursesUtil):
If `resize`, don't create new windows, just adapt size"""
self.height, self.width = self.stdscr.getmaxyx()
if resize:
raise Exception("resizehandler %d" % self.width)
self.logheight = self.height - len(self.accframes) - 1
if resize:
curses.resizeterm(self.height, self.width)
self.bannerwin.resize(1, self.width)
self.logwin.resize(self.logheight, self.width)
else:
self.bannerwin = curses.newwin(1, self.width, 0, 0)
self.logwin = curses.newwin(self.logheight, self.width, 1, 0)
self.draw_bannerwin()
self.logwin.idlok(1)
self.logwin.scrollok(1)
self.logwin.idlok(True) # needed for scrollok below
self.logwin.scrollok(True) # scroll window when too many lines added
self.logwin.move(self.logheight - 1, 0)
self.draw_logwin()
self.accounts = reversed(sorted(self.accframes.keys()))
pos = self.height - 1
index = 0
self.hotkeys = []
for account in self.accounts:
acc_win = curses.newwin(1, self.width, pos, 0)
self.accframes[account].setwindow(acc_win, acctkeys[index])
self.hotkeys.append(account)
index += 1
pos -= 1
acc_win = curses.newwin(1, self.width, pos, 0)
self.accframes[account].setwindow(acc_win, acctkeys[index])
self.hotkeys.append(account)
index += 1
pos -= 1
curses.doupdate()
def draw_bannerwin(self):
@ -572,6 +570,7 @@ class Blinkenlights(UIBase, CursesUtil):
color = curses.A_BOLD | self.curses_colorpair('banner')
else:
color = curses.A_REVERSE
self.bannerwin.clear() # Delete old content (eg before resizes)
self.bannerwin.bkgd(' ', color) # Fill background with that color
string = "%s %s" % (offlineimap.__productname__,
offlineimap.__version__)
@ -581,10 +580,12 @@ class Blinkenlights(UIBase, CursesUtil):
self.bannerwin.noutrefresh()
def draw_logwin(self):
#if curses.has_colors():
# color = s.c.getpair(curses.COLOR_WHITE, curses.COLOR_BLACK)
#else:
color = curses.A_NORMAL
"""(Re)draw the current logwindow"""
if curses.has_colors():
color = curses.color_pair(0) #default colors
else:
color = curses.A_NORMAL
self.logwin.clear()
self.logwin.bkgd(' ', color)
for line, color in self.text:
self.logwin.addstr("\n" + line, color)
@ -598,7 +599,8 @@ class Blinkenlights(UIBase, CursesUtil):
# 1) Return existing or 2) create a new CursesAccountFrame.
if acc_name in self.accframes: return self.accframes[acc_name]
self.accframes[acc_name] = CursesAccountFrame(self, acc_name)
self.setupwindows()
# update the window layout
self.setupwindows(resize= True)
return self.accframes[acc_name]
def terminate(self, *args, **kwargs):