diff options
author | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2014-03-24 20:45:41 -0700 |
---|---|---|
committer | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2014-05-11 21:29:49 -0700 |
commit | 1a7964d4d509df88f61054513e3f7f074a627b71 (patch) | |
tree | 24d3d2d717db170a8de6df6728088f323664497b | |
parent | 33a2ea5a7dde93022635617c015363b52e749088 (diff) | |
download | urwid-1a7964d4d509df88f61054513e3f7f074a627b71.tar.gz |
Push input-watching down into the Screen.
-rwxr-xr-x | urwid/main_loop.py | 16 | ||||
-rw-r--r-- | urwid/raw_display.py | 13 |
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) |