def _process(self, data_buffer): """ Handle incoming packet from server. """ packet = json.loads(data_buffer.decode('utf-8')) if packet['cmd'] == 'out': # Call os.write manually. In Python2.6, sys.stdout.write doesn't use UTF-8. os.write(sys.stdout.fileno(), packet['data'].encode('utf-8')) elif packet['cmd'] == 'suspend': # Suspend client process to background. if hasattr(signal, 'SIGTSTP'): os.kill(os.getpid(), signal.SIGTSTP) elif packet['cmd'] == 'mode': # Set terminal to raw/cooked. action = packet['data'] if action == 'raw': cm = raw_mode(sys.stdin.fileno()) cm.__enter__() self._mode_context_managers.append(cm) elif action == 'cooked': cm = cooked_mode(sys.stdin.fileno()) cm.__enter__() self._mode_context_managers.append(cm) elif action == 'restore' and self._mode_context_managers: cm = self._mode_context_managers.pop() cm.__exit__()
def main(): stream = InputStream(callback) with raw_mode(sys.stdin.fileno()): while True: c = sys.stdin.read(1) stream.feed(c)
def attach(self, detach_other_clients=False, true_color=False): """ Attach client user interface. """ assert isinstance(detach_other_clients, bool) assert isinstance(true_color, bool) self._send_size() self._send_packet( { "cmd": "start-gui", "detach-others": detach_other_clients, "true-color": true_color, "term": os.environ.get("TERM", ""), "data": "", } ) with raw_mode(sys.stdin.fileno()): data_buffer = b"" stdin_fd = sys.stdin.fileno() socket_fd = self.socket.fileno() current_timeout = INPUT_TIMEOUT # Timeout, used to flush escape sequences. with call_on_sigwinch(self._send_size): while True: r, w, x = _select([stdin_fd, socket_fd], [], [], current_timeout) if socket_fd in r: # Received packet from server. data = self.socket.recv(1024) if data == b"": # End of file. Connection closed. # Reset terminal o = Vt100_Output.from_pty(sys.stdout) o.quit_alternate_screen() o.disable_mouse_support() o.disable_bracketed_paste() o.reset_attributes() o.flush() return else: data_buffer += data while b"\0" in data_buffer: pos = data_buffer.index(b"\0") self._process(data_buffer[:pos]) data_buffer = data_buffer[pos + 1 :] elif stdin_fd in r: # Got user input. self._process_stdin() current_timeout = INPUT_TIMEOUT else: # Timeout. (Tell the server to flush the vt100 Escape.) self._send_packet({"cmd": "flush-input"}) current_timeout = None
def _process(self, data_buffer): """ Handle incoming packet from server. """ packet = json.loads(data_buffer.decode("utf-8")) if packet["cmd"] == "out": # Call os.write manually. In Python2.6, sys.stdout.write doesn't use UTF-8. os.write(sys.stdout.fileno(), packet["data"].encode("utf-8")) elif packet["cmd"] == "suspend": # Suspend client process to background. if hasattr(signal, "SIGTSTP"): os.kill(os.getpid(), signal.SIGTSTP) elif packet["cmd"] == "mode": # Set terminal to raw/cooked. action = packet["data"] if action == "raw": cm = raw_mode(sys.stdin.fileno()) cm.__enter__() self._mode_context_managers.append(cm) elif action == "cooked": cm = cooked_mode(sys.stdin.fileno()) cm.__enter__() self._mode_context_managers.append(cm) elif action == "restore" and self._mode_context_managers: cm = self._mode_context_managers.pop() cm.__exit__()
def attach(self, detach_other_clients=False, ansi_colors_only=False, true_color=False): """ Attach client user interface. """ assert isinstance(detach_other_clients, bool) assert isinstance(ansi_colors_only, bool) assert isinstance(true_color, bool) self._send_size() self._send_packet({ 'cmd': 'start-gui', 'detach-others': detach_other_clients, 'ansi-colors-only': ansi_colors_only, 'true-color': true_color, 'term': os.environ.get('TERM', ''), 'data': '' }) with raw_mode(sys.stdin.fileno()): data_buffer = b'' stdin_fd = sys.stdin.fileno() socket_fd = self.socket.fileno() current_timeout = INPUT_TIMEOUT # Timeout, used to flush escape sequences. with call_on_sigwinch(self._send_size): while True: r = select_fds([stdin_fd, socket_fd], current_timeout) if socket_fd in r: # Received packet from server. data = self.socket.recv(1024) if data == b'': # End of file. Connection closed. # Reset terminal o = Vt100_Output.from_pty(sys.stdout) o.quit_alternate_screen() o.disable_mouse_support() o.disable_bracketed_paste() o.reset_attributes() o.flush() return else: data_buffer += data while b'\0' in data_buffer: pos = data_buffer.index(b'\0') self._process(data_buffer[:pos]) data_buffer = data_buffer[pos + 1:] elif stdin_fd in r: # Got user input. self._process_stdin() current_timeout = INPUT_TIMEOUT else: # Timeout. (Tell the server to flush the vt100 Escape.) self._send_packet({'cmd': 'flush-input'}) current_timeout = None
def attach(self, detach_other_clients=False, true_color=False): """ Attach client user interface. """ assert isinstance(detach_other_clients, bool) assert isinstance(true_color, bool) self._send_size() self._send_packet({ 'cmd': 'start-gui', 'detach-others': detach_other_clients, 'true-color': true_color, 'term': os.environ.get('TERM', ''), 'data': '' }) with raw_mode(sys.stdin.fileno()): data_buffer = b'' stdin_fd = sys.stdin.fileno() socket_fd = self.socket.fileno() current_timeout = INPUT_TIMEOUT # Timeout, used to flush escape sequences. with call_on_sigwinch(self._send_size): while True: r, w, x = _select([stdin_fd, socket_fd], [], [], current_timeout) if socket_fd in r: # Received packet from server. data = self.socket.recv(1024) if data == b'': # End of file. Connection closed. # Reset terminal o = Vt100_Output.from_pty(sys.stdout) o.quit_alternate_screen() o.disable_mouse_support() o.disable_bracketed_paste() o.reset_attributes() o.flush() return else: data_buffer += data while b'\0' in data_buffer: pos = data_buffer.index(b'\0') self._process(data_buffer[:pos]) data_buffer = data_buffer[pos + 1:] elif stdin_fd in r: # Got user input. self._process_stdin() current_timeout = INPUT_TIMEOUT else: # Timeout. (Tell the server to flush the vt100 Escape.) self._send_packet({'cmd': 'flush-input'}) current_timeout = None