From c9390a98a88335d7d198ef95d6f7589efde3198b Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Thu, 28 Jul 2022 23:57:54 +0100 Subject: [PATCH] Added configurable sigmask for CTRL-C, CTRL-Z, CTRL-S --- .../TTkCore/TTkTerm/readinputlinux_thread.py | 2 +- TermTk/TTkCore/TTkTerm/term.py | 21 ++++++++++++++++++- TermTk/TTkCore/ttk.py | 4 +++- demo/showcase/textedit.py | 9 +++++--- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/TermTk/TTkCore/TTkTerm/readinputlinux_thread.py b/TermTk/TTkCore/TTkTerm/readinputlinux_thread.py index f56ef8ab..00283ded 100644 --- a/TermTk/TTkCore/TTkTerm/readinputlinux_thread.py +++ b/TermTk/TTkCore/TTkTerm/readinputlinux_thread.py @@ -41,7 +41,7 @@ class ReadInput(): threading.Thread(target=self._pullInputThread).start() def _pullInputThread(self): - _fn = sys.stdin.fileno() + _fn = sys.stdin _attr = termios.tcgetattr(_fn) tty.setcbreak(_fn) diff --git a/TermTk/TTkCore/TTkTerm/term.py b/TermTk/TTkCore/TTkTerm/term.py index d6569761..7256449a 100644 --- a/TermTk/TTkCore/TTkTerm/term.py +++ b/TermTk/TTkCore/TTkTerm/term.py @@ -80,6 +80,11 @@ class TTkTerm(): def hide(): TTkTerm.push(TTkTerm.Cursor.HIDE) + class Sigmask(): + CTRL_C = 0x0001 + CTRL_S = 0x0002 + CTRL_Z = 0x0004 + title: str = "TermTk" mouse: bool = True width: int = 0 @@ -87,20 +92,34 @@ class TTkTerm(): _sigWinChCb = None + # Save treminal attributes during the initialization in order to + # restore later the original states + _termAttr = termios.tcgetattr(sys.stdin) + @staticmethod - def init(mouse: bool = True, title: str = "TermTk"): + def init(mouse: bool = True, title: str = "TermTk", sigmask=0): TTkTerm.title = title TTkTerm.mouse = mouse TTkTerm.push(TTkTerm.ALT_SCREEN + TTkTerm.CLEAR + TTkTerm.Cursor.HIDE + TTkTerm.escTitle(TTkTerm.title)) if TTkTerm.mouse: TTkTerm.push(TTkTerm.Mouse.ON) TTkTerm.setEcho(False) + if sigmask: + attr = termios.tcgetattr(sys.stdin) + if sigmask & TTkTerm.Sigmask.CTRL_C: + attr[6][termios.VINTR]=0 + if sigmask & TTkTerm.Sigmask.CTRL_S: + attr[6][termios.VSTOP]=0 + if sigmask & TTkTerm.Sigmask.CTRL_Z: + attr[6][termios.VSUSP]=0 + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, attr) @staticmethod def exit(): TTkTerm.push(TTkTerm.Mouse.OFF + TTkTerm.Mouse.DIRECT_OFF) TTkTerm.push(TTkTerm.CLEAR + TTkTerm.NORMAL_SCREEN + TTkTerm.Cursor.SHOW + TTkTerm.escTitle()) TTkTerm.setEcho(True) + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, TTkTerm._termAttr) @staticmethod def stop(): diff --git a/TermTk/TTkCore/ttk.py b/TermTk/TTkCore/ttk.py index c630350b..406bd075 100644 --- a/TermTk/TTkCore/ttk.py +++ b/TermTk/TTkCore/ttk.py @@ -44,6 +44,7 @@ class TTk(TTkWidget): '_name', '_running', '_input', '_events', '_key_events', '_mouse_events', '_screen_events', '_title', + '_sigmask', #Signals 'eventKeyPress', 'eventMouse' ) @@ -59,6 +60,7 @@ class TTk(TTkWidget): self._mouse_events = queue.Queue() self._screen_events = queue.Queue() self._title = kwargs.get('title','TermTk') + self._sigmask = kwargs.get('sigmask', TTkK.NONE) self.setFocusPolicy(TTkK.ClickFocus) self.hide() try: @@ -113,7 +115,7 @@ class TTk(TTkWidget): self._running = True # Keep track of the multiTap to avoid the extra key release lastMultiTap = False - TTkTerm.init(title=self._title) + TTkTerm.init(title=self._title, sigmask=self._sigmask) self._mainloop() #except Exception as e: # TTkLog.error(f"{e}") diff --git a/demo/showcase/textedit.py b/demo/showcase/textedit.py index d4162483..6c78415a 100755 --- a/demo/showcase/textedit.py +++ b/demo/showcase/textedit.py @@ -226,17 +226,20 @@ def main(): ttk.TTkLog.use_default_file_logging() - root = ttk.TTk() + root = ttk.TTk(sigmask=ttk.TTkTerm.Sigmask.CTRL_S | ttk.TTkTerm.Sigmask.CTRL_Z | ttk.TTkTerm.Sigmask.CTRL_C) if windowed: rootTree = ttk.TTkWindow(parent=root,pos = (0,0), size=(70,40), title="Test Text Edit", layout=ttk.TTkGridLayout(), border=True) else: rootTree = root root.setLayout(ttk.TTkGridLayout()) - split = ttk.TTkSplitter(parent=rootTree) + split = ttk.TTkSplitter() document = ttk.TTkTextDocument() demoTextEdit(split, document) demoTextEditSecondary(split, document) - rootTree.layout().addWidget(ttk.TTkKeyPressView(maxHeight=3),1,0) + rootTree.layout().addWidget(split,0,0,1,2) + rootTree.layout().addWidget(quitbtn := ttk.TTkButton(border=True, text="Quit", maxWidth=6),1,0) + rootTree.layout().addWidget(ttk.TTkKeyPressView(maxHeight=3),1,1) + quitbtn.clicked.connect(root.quit) root.mainloop() if __name__ == "__main__":