From f57809c87658ab56630db0923daeb5af48415a11 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Tue, 1 Aug 2023 11:41:13 +0100 Subject: [PATCH] FIX: #153 Non blocking SIGWINCH --- TermTk/TTkCore/TTkTerm/term_unix.py | 16 +++++++++++++--- tools/check.import.sh | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/TermTk/TTkCore/TTkTerm/term_unix.py b/TermTk/TTkCore/TTkTerm/term_unix.py index 56bbefa7..274f24ea 100644 --- a/TermTk/TTkCore/TTkTerm/term_unix.py +++ b/TermTk/TTkCore/TTkTerm/term_unix.py @@ -23,6 +23,7 @@ # SOFTWARE. import sys, os, signal +from threading import Thread, Lock try: import termios except Exception as e: @@ -118,11 +119,20 @@ def _getTerminalSize(): print(f'ERROR: {e}') TTkTermBase.getTerminalSize = _getTerminalSize + _sigWinChMutex = Lock() + + @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() + @staticmethod def _sigWinCh(signum, frame): - TTkTerm.width, TTkTerm.height = TTkTerm.getTerminalSize() - if TTkTerm._sigWinChCb is not None: - TTkTerm._sigWinChCb(TTkTerm.width, TTkTerm.height) + Thread(target=TTkTerm._sigWinChThreaded).start() @staticmethod def _registerResizeCb(callback): diff --git a/tools/check.import.sh b/tools/check.import.sh index 61d994e4..3de1d394 100755 --- a/tools/check.import.sh +++ b/tools/check.import.sh @@ -24,6 +24,7 @@ __check(){ -e "term.*.py:import sys, os, signal" \ -e "term.*.py:from .term_base import TTkTermBase" \ -e "term_pyodide.py:import pyodideProxy" \ + -e "term_unix.py:from threading import Thread, Lock" \ -e "timer.py:import importlib" \ -e "timer_unix.py:import threading" \ -e "timer_pyodide.py:import pyodideProxy" \