summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelmut Grohne <helmut@subdivi.de>2017-01-10 12:37:07 +0100
committerHelmut Grohne <helmut@subdivi.de>2017-01-10 12:37:07 +0100
commitf0109cd5051e4b32e038d0dc156e5a8e4fd08caf (patch)
treece87f31aee171e538421c22dc0f94aa95ec9464f
parenta39db1ed4fc8b6e66779f9ae5b9341763c9d4c1f (diff)
downloadtcvt-f0109cd5051e4b32e038d0dc156e5a8e4fd08caf.tar.gz
implement cursor position reporting (u7)
This is used by a number of programs (including vim) to determine utf8 terminal capabilities. The feed functions now return none or a bytes object. If a bytes object is returned, it is sent back to the requesting program.
-rwxr-xr-xtcvt.py22
1 files changed, 15 insertions, 7 deletions
diff --git a/tcvt.py b/tcvt.py
index c30f4e0..de62116 100755
--- a/tcvt.py
+++ b/tcvt.py
@@ -520,6 +520,10 @@ class Terminal:
self.screen.move(n - 1, x)
self.request_refresh()
+ def do_u7(self):
+ y, x = self.screen.getyx()
+ return b"\x1b[%d;%dR" % (y + 1, x + 1)
+
def feed_reset(self):
if self.graphics_font:
self.mode = (self.feed_graphics,)
@@ -527,7 +531,7 @@ class Terminal:
self.mode = (self.feed_simple,)
def feed(self, char):
- self.mode[0](char, *self.mode[1:])
+ return self.mode[0](char, *self.mode[1:])
feed_simple_table = {
ord('\a'): do_bel,
@@ -661,6 +665,8 @@ class Terminal:
self.request_refresh()
elif char == ord(b'K') and prev == b'1':
self.do_el1()
+ elif char == ord(b'n') and prev == b'6':
+ return self.do_u7()
else:
raise ValueError("feed esc [ %r %r" % (prev, char))
@@ -845,13 +851,15 @@ def main():
if not data:
break
for char in bytearray(data):
- if "TCVT_DEVEL" in os.environ:
- t.feed(char)
+ try:
+ response = t.feed(char)
+ except ValueError:
+ if "TCVT_DEVEL" in os.environ:
+ raise
+ t.feed_reset()
else:
- try:
- t.feed(char)
- except ValueError:
- t.feed_reset()
+ if response:
+ os.write(masterfd, response)
t.refresh(0.1)
else:
t.refresh()