summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2014-03-24 20:45:41 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2014-05-11 21:29:49 -0700
commit1a7964d4d509df88f61054513e3f7f074a627b71 (patch)
tree24d3d2d717db170a8de6df6728088f323664497b
parent33a2ea5a7dde93022635617c015363b52e749088 (diff)
downloadurwid-1a7964d4d509df88f61054513e3f7f074a627b71.tar.gz
Push input-watching down into the Screen.
-rwxr-xr-xurwid/main_loop.py16
-rw-r--r--urwid/raw_display.py13
2 files changed, 18 insertions, 11 deletions
diff --git a/urwid/main_loop.py b/urwid/main_loop.py
index 0a93b5e..9b9cee0 100755
--- a/urwid/main_loop.py
+++ b/urwid/main_loop.py
@@ -319,16 +319,8 @@ class MainLoop(object):
fd_handles = []
def reset_input_descriptors(only_remove=False):
- for handle in fd_handles:
- self.event_loop.remove_watch_file(handle)
- if only_remove:
- del fd_handles[:]
- else:
- fd_handles[:] = [
- self.event_loop.watch_file(fd, self._update)
- for fd in self.screen.get_input_descriptors()]
- if not fd_handles and self._input_timeout is not None:
- self.event_loop.remove_alarm(self._input_timeout)
+ self.screen.unhook_event_loop(self.event_loop)
+ self.screen.hook_event_loop(self.event_loop, self._update)
try:
signals.connect_signal(self.screen, INPUT_DESCRIPTORS_CHANGED,
@@ -344,9 +336,11 @@ class MainLoop(object):
# tidy up
self.event_loop.remove_enter_idle(idle_handle)
- reset_input_descriptors(True)
signals.disconnect_signal(self.screen, INPUT_DESCRIPTORS_CHANGED,
reset_input_descriptors)
+ self.screen.unhook_event_loop(self.event_loop)
+ if self._input_timeout is not None:
+ self.event_loop.remove_alarm(self._input_timeout)
def _update(self, timeout=False):
"""
diff --git a/urwid/raw_display.py b/urwid/raw_display.py
index 185f1ab..27cf60a 100644
--- a/urwid/raw_display.py
+++ b/urwid/raw_display.py
@@ -364,6 +364,19 @@ class Screen(BaseScreen, RealTerminal):
fd_list.append(self.gpm_mev.stdout.fileno())
return fd_list
+ _current_event_loop_handles = ()
+
+ def unhook_event_loop(self, event_loop):
+ for handle in self._current_event_loop_handles:
+ event_loop.remove_watch_file(handle)
+
+ def hook_event_loop(self, event_loop, callback):
+ fds = self.get_input_descriptors()
+ handles = []
+ for fd in fds:
+ event_loop.watch_file(fd, callback)
+ self._current_event_loop_handles = handles
+
def get_input_nonblocking(self):
"""
Return a (next_input_timeout, keys_pressed, raw_keycodes)