diff options
| author | Mattias Andrée <maandree@operamail.com> | 2013-07-26 18:58:06 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@operamail.com> | 2013-07-26 18:58:06 +0200 |
| commit | 69407c8e0b236ca95f5d8f352099bcb8c4ef7cb3 (patch) | |
| tree | ca4716ac0404dab3576e5ccefbb6170d982b532f /src/trees.py | |
| parent | misc (diff) | |
| download | pytagomacs-69407c8e0b236ca95f5d8f352099bcb8c4ef7cb3.tar.gz pytagomacs-69407c8e0b236ca95f5d8f352099bcb8c4ef7cb3.tar.bz2 pytagomacs-69407c8e0b236ca95f5d8f352099bcb8c4ef7cb3.tar.xz | |
add support for the rat in xterm-compatible terminals
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
| -rw-r--r-- | src/trees.py | 72 |
1 files changed, 69 insertions, 3 deletions
diff --git a/src/trees.py b/src/trees.py index ce73e31..5cf9ab7 100644 --- a/src/trees.py +++ b/src/trees.py @@ -133,11 +133,77 @@ class Tree(): global height, width self.print_tree() - buf = '' + buf = '\0' * 10 + queued = '' while True: - buf += sys.stdin.read(1) + if queued == '': + buf += chr(sys.stdin.buffer.read(1)[0]) + else: + buf += queued[:1] + queued = queued[1:] buf = buf[-10:] - if buf.endswith('\033[A'): + if buf[-4 : -1] == '%s%s%s' % (chr(27), chr(91), chr(77)): + pass + elif buf[-5 : -2] == '%s%s%s' % (chr(27), chr(91), chr(77)): + pass + elif buf[-6 : -3] == '%s%s%s' % (chr(27), chr(91), chr(77)): + a, x, y = ord(buf[-3]), ord(buf[-2]), ord(buf[-1]) + if a == 96: + queued += '\033[A' * 3 + elif a == 97: + queued += '\033[B' * 3 + elif a == 32: + y -= 33 + if y < 0: + y += 256 + line = self.lineoff + y + last = self.select_stack[-1][0] + backup = self.select_stack[:] + self.select_stack[:] = self.select_stack[:1] + tline = 0 + if line > 0: + while tline != line: + if self.select_stack[-1][0] is None: + if len(self.feeds) > 0: + self.select_stack.append((self.feeds[0], 0)) + tline += 1 + else: + cur = self.select_stack[-1][0] + curi = self.select_stack[-1][1] + if ('inner' in cur) and self.is_expanded(cur): + self.select_stack.append((cur['inner'][0], 0)) + tline += 1 + else: + has_next = False + while len(self.select_stack) > 1: + par = self.select_stack[-2][0] + par = self.feeds if par is None else par['inner'] + self.select_stack.pop() + if curi + 1 < len(par): + self.select_stack.append((par[curi + 1], curi + 1)) + has_next = True + break + cur = self.select_stack[-1][0] + curi = self.select_stack[-1][1] + if not has_next: + break + else: + tline += 1 + if tline == line: + backup = None + else: + backup = None + if backup is None: + if self.select_stack[-1][0] is last: + if (last is None) or ('inner' in last): + queued += ' ' + else: + queued += '\n' + else: + self.print_tree() + else: + self.select_stack[:] = backup + elif buf.endswith('\033[A'): if self.select_stack[-1][0] is not None: cur = self.select_stack[-1][0] curi = self.select_stack[-1][1] |
