home · contact · privacy
More TUI client refactoring.
[plomrogue2] / plomrogue_client / tui.py
index 7cfc01139c35a8cbb75aa0039640fc353b98a109..9f28a04c542ba586ad3650679c43c70b3fd24734 100644 (file)
@@ -3,10 +3,17 @@ import curses
 
 
 
+class AbortOnGetkey(Exception):
+    pass
+
+
+
 class TUI:
 
     def __init__(self):
         self._log = []
+        self.do_refresh = True
+        self.store_widechar = False
         curses.wrapper(self.run_loop)
 
     def addstr(self, y, x, line, attr=0):
@@ -35,11 +42,32 @@ class TUI:
         self.stdscr = stdscr
         self.init_loop()
         while True:
-            self.loop()
+            try:
+                self.loop()
+            except AbortOnGetkey:
+                continue
+            self.do_refresh = True
 
     def log(self, msg):
         self._log += [msg]
+        self.do_refresh = True
 
+    def get_key_and_keycode(self):
+        try:
+            key = self.stdscr.getkey()
+        except curses.error:
+            raise AbortOnGetkey
+        keycode = None
+        if len(key) == 1:
+            keycode = ord(key)
+            # workaround for <https://stackoverflow.com/a/56390915>
+            if self.store_widechar:
+                self.store_widechar = False
+                key = bytes([195, keycode]).decode()
+            if keycode == 195:
+                self.store_widechar = True
+                raise AbortOnGetkey
+        return key, keycode
 
 
 def msg_into_lines_of_width(msg, width):