use a timer to refresh only after a short delay. Limit the useless software refresh.

parent 53a5536c
...@@ -25,6 +25,7 @@ import re ...@@ -25,6 +25,7 @@ import re
import sys import sys
import shlex import shlex
import curses import curses
import threading
import webbrowser import webbrowser
from datetime import datetime from datetime import datetime
...@@ -65,6 +66,9 @@ SHOW_NAME = { ...@@ -65,6 +66,9 @@ SHOW_NAME = {
'chat': _('chatty'), 'chat': _('chatty'),
'': _('available') '': _('available')
} }
resize_lock = threading.Lock()
def doupdate(): def doupdate():
curses.doupdate() curses.doupdate()
...@@ -86,6 +90,7 @@ class Gui(object): ...@@ -86,6 +90,7 @@ class Gui(object):
self.information_buffer = TextBuffer() self.information_buffer = TextBuffer()
self.information_win_size = 2 # Todo, get this from config self.information_win_size = 2 # Todo, get this from config
self.ignores = {} self.ignores = {}
self.resize_timer = None
self.commands = { self.commands = {
'help': (self.command_help, '\_o< KOIN KOIN KOIN'), 'help': (self.command_help, '\_o< KOIN KOIN KOIN'),
...@@ -129,7 +134,7 @@ class Gui(object): ...@@ -129,7 +134,7 @@ class Gui(object):
"KEY_F(7)": self.shrink_information_win, "KEY_F(7)": self.shrink_information_win,
"KEY_F(8)": self.grow_information_win, "KEY_F(8)": self.grow_information_win,
"^N": self.rotate_rooms_right, "^N": self.rotate_rooms_right,
"KEY_RESIZE": self.resize_window, "KEY_RESIZE": self.call_for_resize,
'^X': self.go_to_important_room, '^X': self.go_to_important_room,
'^V': self.move_separator, '^V': self.move_separator,
} }
...@@ -486,13 +491,31 @@ class Gui(object): ...@@ -486,13 +491,31 @@ class Gui(object):
# TODO refresh roster_win only # TODO refresh roster_win only
self.refresh_window() self.refresh_window()
def call_for_resize(self):
"""
Starts a very short timer. If no other terminal resize
occured in this delay then poezio is REALLY resize.
This is to avoid multiple unnecessary software resizes (this
can be heavy on resource on slow computers or networks)
"""
with resize_lock:
if self.resize_timer:
# a recent terminal resize occured.
# Cancel the programmed software resize
self.resize_timer.cancel()
# add the new timer
self.resize_timer = threading.Timer(0.15, self.resize_window)
self.resize_timer.start()
def resize_window(self): def resize_window(self):
""" """
Resize the whole screen Resize the whole screen
""" """
for tab in self.tabs: with resize_lock:
tab.resize(self.stdscr) self.resize_timer = None
self.refresh_window() for tab in self.tabs:
tab.resize(self.stdscr)
self.refresh_window()
def main_loop(self): def main_loop(self):
""" """
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment