def __init__(self, eventloop, invalidate, exec_func, bell_func=None, done_callback=None, has_priority=None): assert isinstance(eventloop, EventLoop) assert callable(invalidate) assert callable(exec_func) assert bell_func is None or callable(bell_func) assert done_callback is None or callable(done_callback) assert has_priority is None or callable(has_priority) self.eventloop = eventloop self.invalidate = invalidate self.exec_func = exec_func self.done_callback = done_callback self.has_priority = has_priority or (lambda: True) self.pid = None self.is_terminated = False self.suspended = False self._reader_connected = False # Create pseudo terminal for this pane. self.master, self.slave = os.openpty() # Master side -> attached to terminal emulator. self._reader = PosixStdinReader(self.master, errors='replace') # Create output stream and attach to screen self.sx = 0 self.sy = 0 self.screen = BetterScreen(self.sx, self.sy, write_process_input=self.write_input, bell_func=bell_func) self.stream = BetterStream(self.screen) self.stream.attach(self.screen)
def __init__(self, socket_name): self.socket_name = socket_name self._mode_context_managers = [] # Connect to socket. self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.socket.connect(socket_name) self.socket.setblocking(1) # Input reader. # Some terminals, like lxterminal send non UTF-8 input sequences, # even when the input encoding is supposed to be UTF-8. This # happens in the case of mouse clicks in the right area of a wide # terminal. Apparently, these are some binary blobs in between the # UTF-8 input.) # We should not replace these, because this would break the # decoding otherwise. (Also don't pass errors='ignore', because # that doesn't work for parsing mouse input escape sequences, which # consist of a fixed number of bytes.) self._stdin_reader = PosixStdinReader(sys.stdin.fileno(), errors='replace')
def __init__(self, fileno, lexer=None, name='<stdin>'): assert isinstance(fileno, int) assert lexer is None or isinstance(lexer, Lexer) assert isinstance(name, six.text_type) self.fileno = fileno self.lexer = lexer self.name = name self._line_tokens = [] self._eof = False # Default style attributes. self._attrs = Attrs( color=None, bgcolor=None, bold=False, underline=False, italic=False, blink=False, reverse=False) # Start input parser. self._parser = self._parse_corot() next(self._parser) self._stdin_reader = PosixStdinReader(fileno)
def __init__(self, eventloop, invalidate, exec_func, bell_func=None, done_callback=None): assert isinstance(eventloop, EventLoop) assert callable(invalidate) assert callable(exec_func) assert bell_func is None or callable(bell_func) assert done_callback is None or callable(done_callback) self.eventloop = eventloop self.invalidate = invalidate self.exec_func = exec_func self.done_callback = done_callback self.pid = None self.is_terminated = False self.suspended = False self.slow_motion = False # For debugging # Create pseudo terminal for this pane. self.master, self.slave = os.openpty() # Master side -> attached to terminal emulator. self._reader = PosixStdinReader(self.master) # Create output stream and attach to screen self.sx = 120 self.sy = 24 self.screen = BetterScreen(self.sx, self.sy, write_process_input=self.write_input, bell_func=bell_func) self.stream = BetterStream(self.screen) self.stream.attach(self.screen)
def run(self, stdin, callbacks): inputstream = InputStream(callbacks.feed_key) stdin_reader = PosixStdinReader(stdin.fileno()) self._callbacks = callbacks if in_main_thread(): ctx = call_on_sigwinch(self.received_winch) else: ctx = DummyContext() select_timeout = INPUT_TIMEOUT with ctx: while self._running: r, _, _ = select.select( [stdin.fileno(), self._schedule_pipe_read], [], [], select_timeout) if stdin.fileno() in r: select_timeout = INPUT_TIMEOUT data = stdin_reader.read() inputstream.feed(data) if stdin_reader.closed: break elif self._schedule_pipe_read in r: os.read(self._schedule_pipe_read, 8192) while True: try: task = self._calls_from_executor.pop(0) except IndexError: break else: task() else: # timeout inputstream.flush() callbacks.input_timeout() select_timeout = None self._callbacks = None