From 35b6e146cb6a0b313d6297f0d91654aa21f58c1b Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Sat, 9 Apr 2011 22:18:36 +0200 Subject: Basic timed event implementation. --- src/core.py | 22 +++++++++++++++++----- src/keyboard.py | 13 ++++++++----- src/timed_events.py | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/src/core.py b/src/core.py index bf7283fe..8629ecc8 100644 --- a/src/core.py +++ b/src/core.py @@ -43,9 +43,10 @@ import tabs import xhtml import windows import connection +import timed_events from data_forms import DataFormsTab -from config import config +from config import config, options from logger import logger from user import User from room import Room @@ -619,9 +620,6 @@ class Core(object): tab.resize() self.refresh_window() - def check_timed_events(self): - pass - def read_keyboard(self): """ Get the next keyboard key pressed and returns it. @@ -631,6 +629,7 @@ class Core(object): """ res = read_char(self.stdscr) while res is None: + log.debug('checking events') self.check_timed_events() res = read_char(self.stdscr) return res @@ -705,7 +704,8 @@ class Core(object): curses.curs_set(1) curses.noecho() curses.nonl() - curses.raw() + if not options.debug: + curses.raw() theme.init_colors() stdscr.keypad(True) curses.ungetch(" ") # H4X: without this, the screen is @@ -1379,6 +1379,18 @@ class Core(object): self.focus_tab_named(roster_row.get_jid().full) self.refresh_window() + def add_timed_event(self, event): + self.timed_events.add(event) + + def check_timed_events(self): + now = datetime.now() + for event in self.timed_events: + if event.has_timed_out(now): + res = event() + if not res: + self.timed_events.remove(event) + break + def execute(self,line): """ Execute the /command or just send the line on the current room diff --git a/src/keyboard.py b/src/keyboard.py index 050859a8..cca854fa 100644 --- a/src/keyboard.py +++ b/src/keyboard.py @@ -35,7 +35,7 @@ def get_next_byte(s): try: c = s.getkey() except: - return (None, "KEY_RESIZE") + return (None, None) if len(c) >= 4: return (None, c) return (ord(c), c.encode('latin-1')) # returns a number and a bytes object @@ -47,9 +47,12 @@ def read_char(s): """ # We use a timer to know if we are pasting from the # clipboard or not - global last_char_time - last_char_time = time.time() + # global last_char_time + # last_char_time = time.time() + s.timeout(1000) (first, char) = get_next_byte(s) + if first is None: + return None if not isinstance(first, int): # Keyboard special, like KEY_HOME etc return char if first == 127 or first == 8: @@ -57,8 +60,8 @@ def read_char(s): if first < 127: # ASCII char on one byte if first <= 26: # transform Ctrl+* keys char = chr(first + 64) - if char == 'M' and time.time() - last_char_time < 0.0005: - char = 'J' + # if char == 'M' and time.time() - last_char_time < 0.0005: + # char = 'J' return "^"+char if first == 27: second = read_char(s) diff --git a/src/timed_events.py b/src/timed_events.py index 6e4da396..7cb92cde 100644 --- a/src/timed_events.py +++ b/src/timed_events.py @@ -14,15 +14,55 @@ # You should have received a copy of the GNU General Public License # along with Poezio. If not, see . +""" +To use these, just use core.add_timed_event(event) +where event is an instance of one of these classes +""" + +import logging + +log = logging.getLogger(__name__) + +import datetime class TimedEvent(object): """ An event with a callback that is called when the specified time is passed Note that these events can NOT be used for very small delay or a very precise date, since the check for events is done once per second, as - a maximum + a maximum. """ - def __init__(self, callback, *args, **kwargs): + def __init__(self, date, callback, *args): self._callback = callback self.args = args + self.repetive = False + self.next_call_date = date + + def __call__(self): + """ + the call should return False if this event should be remove from + the events list. + If it’s true, the date should be updated beforehand to a later date, + or else it will be called every second + """ + self._callback(*self.args) + return self.repetive + + def has_timed_out(self, current_date): + """ + returns True if the callback should be called + """ + if self.next_call_date < current_date: + return True + else: + return False + +class DelayedEvent(TimedEvent): + """ + The date is calculated from now + a delay in seconds + Use it if you want an event to happen in, e.g. 6 seconds + """ + def __init__(self, delay, callback, *args): + date = datetime.datetime.now() + datetime.timedelta(0, delay) + TimedEvent.__init__(self, date, callback, args) -- cgit v1.2.3