about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSören Tempel <soeren+git@soeren-tempel.net>2021-06-29 03:11:20 +0200
committerSören Tempel <soeren+git@soeren-tempel.net>2021-06-29 03:11:20 +0200
commit21577c3c8dab2b63e2710ab1576234a6378b9880 (patch)
tree3f0741eafa75754ad1ca90ff3edb9a2da67d87ee
parentc7a0620eb2cca0595a57489d68aa8a535733b96d (diff)
Preliminary support for carriage return
-rw-r--r--saneterm/pty.py8
-rw-r--r--saneterm/terminal.py6
-rw-r--r--saneterm/termview.py18
3 files changed, 32 insertions, 0 deletions
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()