From 0dfd8366e1c4a750c24949b2aeed7666162af528 Mon Sep 17 00:00:00 2001 From: "louiz@4325f9fc-e183-4c21-96ce-0ab188b42d13" Date: Tue, 5 Oct 2010 00:14:13 +0000 Subject: use a timer to refresh only after a short delay. Limit the useless software refresh. --- src/gui.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gui.py b/src/gui.py index a35dfd96..574368d1 100644 --- a/src/gui.py +++ b/src/gui.py @@ -25,6 +25,7 @@ import re import sys import shlex import curses +import threading import webbrowser from datetime import datetime @@ -65,6 +66,9 @@ SHOW_NAME = { 'chat': _('chatty'), '': _('available') } + +resize_lock = threading.Lock() + def doupdate(): curses.doupdate() @@ -86,6 +90,7 @@ class Gui(object): self.information_buffer = TextBuffer() self.information_win_size = 2 # Todo, get this from config self.ignores = {} + self.resize_timer = None self.commands = { 'help': (self.command_help, '\_o< KOIN KOIN KOIN'), @@ -129,7 +134,7 @@ class Gui(object): "KEY_F(7)": self.shrink_information_win, "KEY_F(8)": self.grow_information_win, "^N": self.rotate_rooms_right, - "KEY_RESIZE": self.resize_window, + "KEY_RESIZE": self.call_for_resize, '^X': self.go_to_important_room, '^V': self.move_separator, } @@ -486,13 +491,31 @@ class Gui(object): # TODO refresh roster_win only 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): """ Resize the whole screen """ - for tab in self.tabs: - tab.resize(self.stdscr) - self.refresh_window() + with resize_lock: + self.resize_timer = None + for tab in self.tabs: + tab.resize(self.stdscr) + self.refresh_window() def main_loop(self): """ -- cgit v1.2.3