about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSören Tempel <soeren+git@soeren-tempel.net>2021-05-15 14:49:07 +0200
committerSören Tempel <soeren+git@soeren-tempel.net>2021-05-15 14:49:07 +0200
commit12ef0906492ffaaa651a8b6e520c9e87ce15bb9b (patch)
tree913dfbbd7dd380a644e05672afc7241dac0301ad
parentdbe2fddf37bd926b5500abe63ed05bcfed2093bd (diff)
Use an incremental decoder for data received from the PTY
-rw-r--r--src/terminal.py7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/terminal.py b/src/terminal.py
index 82b0bf2..6288a9f 100644
--- a/src/terminal.py
+++ b/src/terminal.py
@@ -1,6 +1,7 @@
 import sys
 import pty
 import os
+import codecs
 
 import gi
 gi.require_version("Gtk", "3.0")
@@ -58,15 +59,19 @@ class Terminal(Gtk.Window):
         end = self.textbuffer.get_end_iter()
         self.last_mark = self.textbuffer.create_mark(None, end, True)
 
+        # Block-wise reading from the PTY requires an incremental decoder.
+        self.decoder = codecs.getincrementaldecoder('UTF-8')()
+
         self.add(self.textview)
 
     def handle_pty(self, master):
+        # XXX: Should be possible to read more than one byte here.
         data = os.read(master, 1)
         if not data:
             raise AssertionError("expected data but did not receive any")
 
         end = self.textbuffer.get_end_iter()
-        self.textbuffer.insert(end, data.decode('UTF-8'))
+        self.textbuffer.insert(end, self.decoder.decode(data))
 
         end = self.textbuffer.get_end_iter()
         self.last_mark = self.textbuffer.create_mark(None, end, True)