From 21577c3c8dab2b63e2710ab1576234a6378b9880 Mon Sep 17 00:00:00 2001 From: Sören Tempel Date: Tue, 29 Jun 2021 03:11:20 +0200 Subject: Preliminary support for carriage return --- saneterm/pty.py | 8 ++++++++ saneterm/terminal.py | 6 ++++++ saneterm/termview.py | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/saneterm/pty.py b/saneterm/pty.py index 90bcf34..d294770 100644 --- a/saneterm/pty.py +++ b/saneterm/pty.py @@ -42,6 +42,8 @@ class Source(GLib.Source): class EventType(Enum): TEXT = auto() BELL = auto() + CARRIAGE_RETURN = auto() + NEWLINE = auto() class Parser(object): """ @@ -96,6 +98,12 @@ class Parser(object): if code == '\a': flush_until = pos special_ev = (EventType.BELL, None) + elif code == '\n': + flush_until = pos + special_ev = (EventType.NEWLINE, None) + elif code == '\r': + flush_until = pos + special_ev = (EventType.CARRIAGE_RETURN, None) pos += 1 diff --git a/saneterm/terminal.py b/saneterm/terminal.py index f0c5e4d..41044b4 100644 --- a/saneterm/terminal.py +++ b/saneterm/terminal.py @@ -168,6 +168,12 @@ class Terminal(Gtk.Window): for (ev, data) in self.pty_parser.parse(decoded): if ev is pty.EventType.TEXT: self.termview.insert_data(data) + elif ev is pty.EventType.NEWLINE: + self.termview.set_replace(False) + self.termview.insert_data("\n") + elif ev is pty.EventType.CARRIAGE_RETURN: + self.termview.goto_line_start() + self.termview.set_replace(True) elif ev is pty.EventType.BELL: self.termview.error_bell() self.set_urgency_hint(True) diff --git a/saneterm/termview.py b/saneterm/termview.py index c697fae..0d48b66 100644 --- a/saneterm/termview.py +++ b/saneterm/termview.py @@ -82,6 +82,7 @@ class TermView(Gtk.TextView): # TODO: set insert-hypens to false in GTK 4 # https://docs.gtk.org/gtk4/property.TextTag.insert-hyphens.html Gtk.TextView.__init__(self) + self.__replace = False self._textbuffer = TermBuffer(limit) self._textbuffer.connect("end-user-action", self.__end_user_action) @@ -122,12 +123,29 @@ class TermView(Gtk.TextView): (GObject.TYPE_PYOBJECT,)) def insert_data(self, str): + if self.__replace: + self.do_delete_from_cursor(Gtk.DeleteType.CHARS, len(str)) self._textbuffer.insert(self._textbuffer.get_end_iter(), str) end = self._textbuffer.get_end_iter() self._last_mark = self._textbuffer.create_mark(None, end, True) self._last_output_mark = self._last_mark + def set_replace(self, value): + self.__replace = value + if not value: # FIXME + buffer = self.get_buffer() + buffer.place_cursor(buffer.get_end_iter()) + + def goto_line_start(self): + buffer = self.get_buffer() + + lstart = buffer.get_end_iter() + lstart.set_line_offset(0) + + self.__replace = True + buffer.place_cursor(lstart) + def flush(self): end = self._textbuffer.get_end_iter() -- cgit 1.4.1