diff --git a/squinnondation/squinnondation.py b/squinnondation/squinnondation.py index 32b82d1..a1b4507 100644 --- a/squinnondation/squinnondation.py +++ b/squinnondation/squinnondation.py @@ -39,7 +39,8 @@ class Squinnondation: help="Don't replace emojis.") self.args = parser.parse_args() - if not (1024 <= self.args.bind_port <= 65535) or not (1024 <= self.args.client_port <= 65535): + if not (1024 <= self.args.bind_port <= 65535) or\ + not (not self.args.client_port or 1024 <= self.args.client_port <= 65535): raise ValueError("Ports must be between 1024 and 65535.") self.bind_address = self.args.bind_address @@ -56,7 +57,9 @@ class Squinnondation: screen = term_manager.screen instance.screen = screen screen.addstr(0, 0, "Enter your nickname: ") + curses.echo() nickname = screen.getstr().decode("UTF-8") + curses.noecho() squirrel = Squirrel(instance, nickname) squirrel.refresh_history() @@ -71,7 +74,20 @@ class Squinnondation: while True: squirrel.refresh_history() squirrel.refresh_input() - msg = screen.getstr(curses.LINES - 1, 3 + len(squirrel.nickname)).decode("UTF-8") + key = screen.getkey(curses.LINES - 1, 3 + len(squirrel.nickname) + len(squirrel.input_buffer)) + if key == "\x7f": # backspace + squirrel.input_buffer = squirrel.input_buffer[:-1] + continue + elif len(key) > 1: + squirrel.history.append(f" *unmanaged key press: {key}*") + continue + elif key != "\n": + squirrel.input_buffer += key + continue + + msg = squirrel.input_buffer + squirrel.input_buffer = "" + if not msg: continue @@ -391,6 +407,8 @@ class Squirrel(Hazelnut): self.squinnondation = instance + self.input_buffer = "" + self.history = [] self.history_pad = curses.newpad(curses.LINES - 2, curses.COLS) self.input_pad = curses.newpad(1, curses.COLS) @@ -549,6 +567,7 @@ class Squirrel(Hazelnut): self.input_pad.addstr(0, 0, "<") self.input_pad.addstr(0, 1, self.nickname, curses.A_BOLD | curses.color_pair(color_id + 1)) self.input_pad.addstr(0, 1 + len(self.nickname), "> ") + self.input_pad.addstr(0, 3 + len(self.nickname), self.input_buffer) self.input_pad.refresh(0, 0, curses.LINES - 1, 0, curses.LINES - 1, curses.COLS - 1) @@ -571,3 +590,4 @@ class Worm(Thread): else: self.squirrel.history.append(pkt.body[0].data.decode('UTF-8')) self.squirrel.refresh_history() + self.squirrel.refresh_input() diff --git a/squinnondation/term_manager.py b/squinnondation/term_manager.py index aba856e..a5eea9d 100644 --- a/squinnondation/term_manager.py +++ b/squinnondation/term_manager.py @@ -14,8 +14,12 @@ class TermManager: # pragma: no cover self.screen = curses.initscr() # convert escapes sequences to curses abstraction self.screen.keypad(True) + # stop printing typed keys to the terminal + curses.noecho() + # send keys through without having to press + curses.cbreak() # make cursor invisible - curses.curs_set(False) + # curses.curs_set(False) # Catch mouse events curses.mousemask(True) # Enable colors @@ -28,5 +32,7 @@ class TermManager: # pragma: no cover exc_traceback: TracebackType) -> None: # restore the terminal to its original state self.screen.keypad(False) - curses.curs_set(True) + curses.nocbreak() + curses.echo() + # curses.curs_set(True) curses.endwin()