summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Ward <ian@excess.org>2013-12-26 16:31:14 -0500
committerIan Ward <ian@excess.org>2013-12-26 16:31:14 -0500
commit02ef30a1b488d7f6a449e64b3b879c92b120d03f (patch)
treea5af9fb9122316378040c965b5863e531aec6fbd
parente2e35cacf6c691ec9b0f00f40f671ca05efc9730 (diff)
downloadurwid-02ef30a1b488d7f6a449e64b3b879c92b120d03f.tar.gz
fix TornadoEventLoop enter idle
-rwxr-xr-xurwid/main_loop.py28
1 files changed, 25 insertions, 3 deletions
diff --git a/urwid/main_loop.py b/urwid/main_loop.py
index 11ef66e..12ffc40 100755
--- a/urwid/main_loop.py
+++ b/urwid/main_loop.py
@@ -879,15 +879,37 @@ class TornadoEventLoop(object):
def __init__(self, poll_obj, idle_map):
self.__poll_obj = poll_obj
self.__idle_map = idle_map
+ self._idle_done = False
+ self._prev_timeout = 0
def __getattr__(self, name):
return getattr(self.__poll_obj, name)
def poll(self, timeout):
- if timeout >= 0.01: # only trigger idle event if the delay is big enough
- for callback in list(self.__idle_map.values()):
+ if timeout > self._prev_timeout:
+ # if timeout increased we assume a timer event was handled
+ self._idle_done = False
+ self._prev_timeout = timeout
+ start = time.time()
+
+ # any IO pending wins
+ events = self.__poll_obj.poll(0)
+ if events:
+ self._idle_done = False
+ return events
+
+ # our chance to enter idle
+ if not self._idle_done:
+ for callback in self.__idle_map.values():
callback()
- return self.__poll_obj.poll(timeout)
+ self._idle_done = True
+
+ # then complete the actual request (adjusting timeout)
+ timeout = max(0, min(timeout, timeout + start - time.time()))
+ events = self.__poll_obj.poll(timeout)
+ if events:
+ self._idle_done = False
+ return events
@classmethod
def _patch_poll_impl(cls, ioloop):