Browse Source

support bracketed paste in TTkTerminal

pull/172/head
Eugenio Parodi 3 years ago
parent
commit
2ae1f1047b
  1. 32
      TermTk/TTkWidgets/TTkTerminal/terminal.py

32
TermTk/TTkWidgets/TTkTerminal/terminal.py

@ -58,6 +58,10 @@ from TermTk.TTkCore.TTkTerm.colors_ansi_map import ansiMap16, ansiMap256
__all__ = ['TTkTerminal']
class TTkTerminal(TTkWidget):
@dataclass
class _Terminal():
bracketedMode: bool = False
@dataclass
class _Keyboard():
flags: int = 0
@ -70,7 +74,9 @@ class TTkTerminal(TTkWidget):
sgrMode: bool = False
__slots__ = ('_shell', '_fd', '_inout', '_proc', '_quit_pipe', '_mode_normal'
'_buffer_lines', '_buffer_screen', '_keyboard', '_mouse',
'_clipboard',
'_buffer_lines', '_buffer_screen',
'_keyboard', '_mouse', '_terminal',
'_screen_current', '_screen_normal', '_screen_alt')
def __init__(self, *args, **kwargs):
self._shell = os.environ.get('SHELL', 'sh')
@ -78,6 +84,7 @@ class TTkTerminal(TTkWidget):
self._proc = None
self._mode_normal = True
self._quit_pipe = None
self._terminal = TTkTerminal._Terminal()
self._keyboard = TTkTerminal._Keyboard()
self._mouse = TTkTerminal._Mouse()
self._buffer_lines = [TTkString()]
@ -85,6 +92,7 @@ class TTkTerminal(TTkWidget):
self._screen_normal = _TTkTerminalAltScreen()
self._screen_alt = _TTkTerminalAltScreen()
self._screen_current = self._screen_normal
self._clipboard = TTkClipboard()
super().__init__(*args, **kwargs)
@ -304,18 +312,25 @@ class TTkTerminal(TTkWidget):
self.setWidgetCursor(pos=self._screen_current.getCursor())
TTkLog.debug(f"wc:{self._screen_current.getCursor()} {self._proc=}")
def mousePressEvent(self, evt):
def pasteEvent(self, txt:str):
if self._terminal.bracketedMode:
txt = "\033[200~"+txt+"\033[201~"
self._inout.write(txt.encode())
return True
def keyEvent(self, evt):
# TTkLog.debug(f"Key: {evt.code=}")
TTkLog.debug(f"Key: {str(evt)=}")
if evt.type == TTkK.SpecialKey:
if evt.mod == TTkK.ControlModifier and evt.key == TTkK.Key_V:
txt = self._clipboard.text()
self.pasteEvent(str(txt))
return True
if self._keyboard.flags & TTkTerminalModes.DECCKM:
if code := {TTkK.Key_Up: b"\033OA",
TTkK.Key_Down: b"\033OB",
TTkK.Key_Right: b"\033OC",
TTkK.Key_Left: b"\033OD"}.get(evt.key):
if code := {TTkK.Key_Up: b"\033OA",
TTkK.Key_Down: b"\033OB",
TTkK.Key_Right: b"\033OC",
TTkK.Key_Left: b"\033OD"}.get(evt.key):
self._inout.write(code)
return True
if evt.key == TTkK.Key_Enter:
@ -634,7 +649,7 @@ class TTkTerminal(TTkWidget):
# DEC Private Mode Reset (DECRST).
# Ps = 2 0 0 4 ⇒ Reset bracketed paste mode, xterm.
def _CSI_DEC_SR_2004(self, s):
pass
self._terminal.bracketedMode = s
_CSI_DEC_SET_RST_MAP = {
1 : _CSI_DEC_SR_1_DECCKM,
@ -644,5 +659,6 @@ class TTkTerminal(TTkWidget):
1006: _CSI_DEC_SR_1006,
1015: _CSI_DEC_SR_1015,
1047: _CSI_DEC_SR_1047,
1049: _CSI_DEC_SR_1049
1049: _CSI_DEC_SR_1049,
2004: _CSI_DEC_SR_2004
}
Loading…
Cancel
Save