diff --git a/editor/editor.lisp b/editor/editor.lisp index 6503fb8..e0ffcaf 100644 --- a/editor/editor.lisp +++ b/editor/editor.lisp @@ -82,6 +82,21 @@ serial connection the editor normally runs under.") (defmethod stream-finish-output ((stream hybrid-stream)) (finish-output (output-stream stream))) +(defclass terminal-stream (hybrid-stream) + ((%cursor-visibility :accessor cursor-visibility :initform 0))) + +(defmethod terminal-hide-cursor ((stream terminal-stream)) + (when (zerop (cursor-visibility stream)) + (write-byte #x1B *eio*) + (write-string "[?25l" *eio*)) + (decf (cursor-visibility stream))) + +(defmethod terminal-show-cursor ((stream terminal-stream)) + (incf (cursor-visibility stream)) + (when (zerop (cursor-visibility stream)) + (write-byte #x1B *eio*) + (write-string "[?25h" *eio*))) + (defun open-terminal (path) @@ -92,8 +107,8 @@ serial connection the editor normally runs under.") :element-type '(unsigned-byte 8) :if-exists :overwrite)) (handler-case - (make-instance 'hybrid-stream :input-stream input-stream - :output-stream output-stream) + (make-instance 'terminal-stream :input-stream input-stream + :output-stream output-stream) (error () (close input-stream) (close output-stream))))) @@ -192,12 +207,10 @@ serial connection the editor normally runs under.") (restore-cursor)) (defun hide-cursor () - (write-byte #x1B *eio*) - (write-string "[?25l" *eio*)) + (terminal-hide-cursor *eio*)) (defun show-cursor () - (write-byte #x1B *eio*) - (write-string "[?25h" *eio*)) + (terminal-show-cursor *eio*)) (defun invert-text () (write-byte #x1B *eio*)