diff options
author | Sören Tempel <soeren+git@soeren-tempel.net> | 2021-05-15 14:49:07 +0200 |
---|---|---|
committer | Sören Tempel <soeren+git@soeren-tempel.net> | 2021-05-15 14:49:07 +0200 |
commit | 12ef0906492ffaaa651a8b6e520c9e87ce15bb9b (patch) | |
tree | 913dfbbd7dd380a644e05672afc7241dac0301ad | |
parent | dbe2fddf37bd926b5500abe63ed05bcfed2093bd (diff) |
Use an incremental decoder for data received from the PTY
-rw-r--r-- | src/terminal.py | 7 |
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) |