diff --git a/libs/pyTermTk/TermTk/TTkCore/TTkTerm/term_base.py b/libs/pyTermTk/TermTk/TTkCore/TTkTerm/term_base.py index f88f190d..048318aa 100644 --- a/libs/pyTermTk/TermTk/TTkCore/TTkTerm/term_base.py +++ b/libs/pyTermTk/TermTk/TTkCore/TTkTerm/term_base.py @@ -152,6 +152,7 @@ class TTkTermBase(): # those methods are supposed to be overwritten with the # compatible one in "term_unix.py" or "term_pyodide.py" setSigmask = lambda *args: None + getSigmask = lambda *args: 0x00 push = lambda *args: None flush = lambda *args: None setEcho = lambda *args: None diff --git a/libs/pyTermTk/TermTk/TTkCore/drivers/__init__.py b/libs/pyTermTk/TermTk/TTkCore/drivers/__init__.py index e270eee1..1a0f208a 100644 --- a/libs/pyTermTk/TermTk/TTkCore/drivers/__init__.py +++ b/libs/pyTermTk/TermTk/TTkCore/drivers/__init__.py @@ -10,17 +10,20 @@ elif platform.system() == 'Linux': if os.environ.get("TERMTK_GPM",False): from .unix_gpm import * - from .term_unix import * + # from .term_unix import * + from .term_unix_linux import * else: from .unix import * if os.environ.get("TERMTK_FORCESERIAL",False): from .term_unix_serial import * else: - from .term_unix import * + # from .term_unix import * + from .term_unix_linux import * elif platform.system() == 'Darwin': from .unix import * - from .term_unix import * + # from .term_unix import * + from .term_unix_darwin import * elif platform.system() == 'Windows': from .windows import * diff --git a/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix.py b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_common.py similarity index 61% rename from libs/pyTermTk/TermTk/TTkCore/drivers/term_unix.py rename to libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_common.py index d6225347..98382147 100644 --- a/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix.py +++ b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_common.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__all__ = ['TTkTerm'] +__all__ = ['_TTkTerm'] import sys, os, signal from threading import Thread, Lock @@ -33,7 +33,7 @@ except Exception as e: from ..TTkTerm.term_base import TTkTermBase from TermTk.TTkCore.log import TTkLog -class TTkTerm(TTkTermBase): +class _TTkTerm(TTkTermBase): _sigWinChCb = None # Save treminal attributes during the initialization in order to @@ -47,46 +47,20 @@ class TTkTerm(TTkTermBase): _termAttrBk = [] @staticmethod def saveTermAttr(): - TTkTerm._termAttrBk.append(termios.tcgetattr(sys.stdin)) + _TTkTerm._termAttrBk.append(termios.tcgetattr(sys.stdin)) @staticmethod def restoreTermAttr(): - if TTkTerm._termAttrBk: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, TTkTerm._termAttrBk.pop()) - elif TTkTerm._termAttr: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, TTkTerm._termAttr) - - @staticmethod - def _setSigmask(mask, value=True): - attr = termios.tcgetattr(sys.stdin) - if mask & TTkTerm.Sigmask.CTRL_C: - attr[6][termios.VINTR]= b'\x03' if value else 0 - if mask & TTkTerm.Sigmask.CTRL_S: - attr[6][termios.VSTOP]= b'\x13' if value else 0 - if mask & TTkTerm.Sigmask.CTRL_Z: - attr[6][termios.VSUSP]= b'\x1a' if value else 0 - if mask & TTkTerm.Sigmask.CTRL_Q: - attr[6][termios.VSTART]= b'\x11' if value else 0 - if mask & TTkTerm.Sigmask.CTRL_Y: - attr[6][termios.VDSUSP]= b'\x19' if value else 0 - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, attr) - TTkTermBase.setSigmask = _setSigmask - - @staticmethod - def getSigmask(): - mask = 0x00 - attr = termios.tcgetattr(sys.stdin) - mask |= TTkTerm.Sigmask.CTRL_C if attr[6][termios.VINTR] else 0 - mask |= TTkTerm.Sigmask.CTRL_S if attr[6][termios.VSTOP] else 0 - mask |= TTkTerm.Sigmask.CTRL_Z if attr[6][termios.VSUSP] else 0 - mask |= TTkTerm.Sigmask.CTRL_Q if attr[6][termios.VSTART] else 0 - return mask + if _TTkTerm._termAttrBk: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, _TTkTerm._termAttrBk.pop()) + elif _TTkTerm._termAttr: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, _TTkTerm._termAttr) @staticmethod def exit(): TTkTermBase.exit() - if TTkTerm._termAttr: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, TTkTerm._termAttr) + if _TTkTerm._termAttr: + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, _TTkTerm._termAttr) @staticmethod def _push(*args): @@ -136,21 +110,21 @@ class TTkTerm(TTkTermBase): @staticmethod def _sigWinChThreaded(): - if not TTkTerm._sigWinChMutex.acquire(blocking=False): return - while (TTkTerm.width, TTkTerm.height) != (wh:=TTkTerm.getTerminalSize()): - TTkTerm.width, TTkTerm.height = wh - if TTkTerm._sigWinChCb is not None: - TTkTerm._sigWinChCb(TTkTerm.width, TTkTerm.height) - TTkTerm._sigWinChMutex.release() + if not _TTkTerm._sigWinChMutex.acquire(blocking=False): return + while (_TTkTerm.width, _TTkTerm.height) != (wh:=_TTkTerm.getTerminalSize()): + _TTkTerm.width, _TTkTerm.height = wh + if _TTkTerm._sigWinChCb is not None: + _TTkTerm._sigWinChCb(_TTkTerm.width, _TTkTerm.height) + _TTkTerm._sigWinChMutex.release() @staticmethod def _sigWinCh(signum, frame): - Thread(target=TTkTerm._sigWinChThreaded).start() + Thread(target=_TTkTerm._sigWinChThreaded).start() @staticmethod def _registerResizeCb(callback): - TTkTerm._sigWinChCb = callback + _TTkTerm._sigWinChCb = callback # Dummy call to retrieve the terminal size - TTkTerm._sigWinCh(signal.SIGWINCH, None) - signal.signal(signal.SIGWINCH, TTkTerm._sigWinCh) + _TTkTerm._sigWinCh(signal.SIGWINCH, None) + signal.signal(signal.SIGWINCH, _TTkTerm._sigWinCh) TTkTermBase.registerResizeCb = _registerResizeCb diff --git a/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_darwin.py b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_darwin.py new file mode 100644 index 00000000..cacdfba8 --- /dev/null +++ b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_darwin.py @@ -0,0 +1,62 @@ +# MIT License +# +# Copyright (c) 2025 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +__all__ = ['TTkTerm'] + +import sys + +try: import termios +except Exception as e: + print(f'ERROR: {e}') + exit(1) + +from ..TTkTerm.term_base import TTkTermBase +from .term_unix_common import _TTkTerm + +class TTkTerm(_TTkTerm): + @staticmethod + def _setSigmask(mask, value=True): + attr = termios.tcgetattr(sys.stdin) + if mask & TTkTerm.Sigmask.CTRL_C: + attr[6][termios.VINTR]= b'\x03' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_S: + attr[6][termios.VSTOP]= b'\x13' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_Z: + attr[6][termios.VSUSP]= b'\x1a' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_Q: + attr[6][termios.VSTART]= b'\x11' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_Y: + attr[6][termios.VDSUSP]= b'\x19' if value else 0 + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, attr) + TTkTermBase.setSigmask = _setSigmask + + @staticmethod + def _getSigmask(): + mask = 0x00 + attr = termios.tcgetattr(sys.stdin) + mask |= TTkTerm.Sigmask.CTRL_C if attr[6][termios.VINTR] else 0 + mask |= TTkTerm.Sigmask.CTRL_S if attr[6][termios.VSTOP] else 0 + mask |= TTkTerm.Sigmask.CTRL_Z if attr[6][termios.VSUSP] else 0 + mask |= TTkTerm.Sigmask.CTRL_Q if attr[6][termios.VSTART] else 0 + mask |= TTkTerm.Sigmask.CTRL_Y if attr[6][termios.VDSUSP] else 0 + return mask + TTkTermBase.getSigmask = _getSigmask diff --git a/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_linux.py b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_linux.py new file mode 100644 index 00000000..3a7eb480 --- /dev/null +++ b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_linux.py @@ -0,0 +1,59 @@ +# MIT License +# +# Copyright (c) 2025 Eugenio Parodi +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +__all__ = ['TTkTerm'] + +import sys + +try: import termios +except Exception as e: + print(f'ERROR: {e}') + exit(1) + +from ..TTkTerm.term_base import TTkTermBase +from .term_unix_common import _TTkTerm + +class TTkTerm(_TTkTerm): + @staticmethod + def _setSigmask(mask, value=True): + attr = termios.tcgetattr(sys.stdin) + if mask & TTkTerm.Sigmask.CTRL_C: + attr[6][termios.VINTR]= b'\x03' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_S: + attr[6][termios.VSTOP]= b'\x13' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_Z: + attr[6][termios.VSUSP]= b'\x1a' if value else 0 + if mask & TTkTerm.Sigmask.CTRL_Q: + attr[6][termios.VSTART]= b'\x11' if value else 0 + termios.tcsetattr(sys.stdin, termios.TCSADRAIN, attr) + TTkTermBase.setSigmask = _setSigmask + + @staticmethod + def _getSigmask(): + mask = 0x00 + attr = termios.tcgetattr(sys.stdin) + mask |= TTkTerm.Sigmask.CTRL_C if attr[6][termios.VINTR] else 0 + mask |= TTkTerm.Sigmask.CTRL_S if attr[6][termios.VSTOP] else 0 + mask |= TTkTerm.Sigmask.CTRL_Z if attr[6][termios.VSUSP] else 0 + mask |= TTkTerm.Sigmask.CTRL_Q if attr[6][termios.VSTART] else 0 + return mask + TTkTermBase.getSigmask = _getSigmask diff --git a/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_serial.py b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_serial.py index b89b4467..7c16b1c1 100644 --- a/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_serial.py +++ b/libs/pyTermTk/TermTk/TTkCore/drivers/term_unix_serial.py @@ -23,7 +23,7 @@ __all__ = ['TTkTerm'] from ..TTkTerm.term_base import TTkTermBase -from .term_unix import * +from .term_unix_linux import * class _TTkTermSerial(): @staticmethod