diff --git a/lisp/channel-tui-main.lisp b/lisp/channel-tui-main.lisp index 825d0cd..b9cec7c 100644 --- a/lisp/channel-tui-main.lisp +++ b/lisp/channel-tui-main.lisp @@ -932,17 +932,31 @@ ((eql btn :scroll-down) (setf (st :scroll-offset) (max 0 (- (st :scroll-offset) 3))) (setf (st :dirty) (list nil t nil)))))) - ((cl-tty.input:dispatch-key-event data) - nil) - (t (on-key ch))))))) - (when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty))) - (cl-tty.backend:backend-clear be) - (redraw curr-fb w h) - (cl-tty.rendering:flush-framebuffer prev-fb curr-fb be) - ;; Draw separator line above input - (cl-tty.backend:draw-text be 0 (- h 4) (make-string w :initial-element #\─) - (theme-color :separator) nil) - (rotatef prev-fb curr-fb)) + ((member ch '(:enter 13 10 #\Newline #\Return 343)) + (on-key :enter)) + ((cl-tty.input:dispatch-key-event data) + nil) + (t (on-key ch))))))) + (when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty))) + (cl-tty.backend:backend-clear be) + (redraw curr-fb w h) + ;; Draw all rows from framebuffer directly + (dotimes (row h) + (let ((line (make-string w :initial-element #\Space)) + (fg (theme-color :agent-fg)) (bg nil)) + (dotimes (col w) + (let* ((cell (aref curr-fb row col)) + (ch (cl-tty.rendering:cell-char cell)) + (cf (cl-tty.rendering:cell-fg cell)) + (cb (cl-tty.rendering:cell-bg cell))) + (when ch (setf (char line col) ch)) + (when cf (setf fg cf)) + (when cb (setf bg cb)))) + (cl-tty.backend:draw-text be 0 row line fg bg))) + ;; Draw separator line above input + (cl-tty.backend:draw-text be 0 (- h 4) (make-string w :initial-element #\─) + (theme-color :separator) nil) + (rotatef prev-fb curr-fb)) (let ((ds (st :dialog-stack))) (when ds (let* ((dlg (car ds)) diff --git a/lisp/channel-tui-view.lisp b/lisp/channel-tui-view.lisp index 0264cbf..32c3faf 100644 --- a/lisp/channel-tui-view.lisp +++ b/lisp/channel-tui-view.lisp @@ -16,9 +16,11 @@ Returns a list of strings, one per line." (defun view-status (fb w h) (let* ((bg (theme-color :status-bg)) (fg (theme-color :status-fg)) - (left (format nil " ~a ~a Rules:~a" - (if (st :connected) "●" "○") - (or (st :foveal-id) "passepartout") (or (st :rule-count) 0))) + (left (format nil " ~a ~a msgs:~d Rules:~a" + (if (st :connected) "●" "○") + (or (st :foveal-id) "passepartout") + (length (st :messages)) + (or (st :rule-count) 0))) (right (format nil "$~,2f ~a" (or (st :session-cost) 0.0) (now)))) (dotimes (col w) (cl-tty.backend:draw-text fb 0 (- h 1) (make-string w :initial-element #\Space) nil bg)) diff --git a/org/channel-tui-main.org b/org/channel-tui-main.org index db5c6b2..1a6991c 100644 --- a/org/channel-tui-main.org +++ b/org/channel-tui-main.org @@ -976,17 +976,31 @@ Event handlers + daemon I/O + main loop. ((eql btn :scroll-down) (setf (st :scroll-offset) (max 0 (- (st :scroll-offset) 3))) (setf (st :dirty) (list nil t nil)))))) - ((cl-tty.input:dispatch-key-event data) - nil) - (t (on-key ch))))))) - (when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty))) - (cl-tty.backend:backend-clear be) - (redraw curr-fb w h) - (cl-tty.rendering:flush-framebuffer prev-fb curr-fb be) - ;; Draw separator line above input - (cl-tty.backend:draw-text be 0 (- h 4) (make-string w :initial-element #\─) - (theme-color :separator) nil) - (rotatef prev-fb curr-fb)) + ((member ch '(:enter 13 10 #\Newline #\Return 343)) + (on-key :enter)) + ((cl-tty.input:dispatch-key-event data) + nil) + (t (on-key ch))))))) + (when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty))) + (cl-tty.backend:backend-clear be) + (redraw curr-fb w h) + ;; Draw all rows from framebuffer directly + (dotimes (row h) + (let ((line (make-string w :initial-element #\Space)) + (fg (theme-color :agent-fg)) (bg nil)) + (dotimes (col w) + (let* ((cell (aref curr-fb row col)) + (ch (cl-tty.rendering:cell-char cell)) + (cf (cl-tty.rendering:cell-fg cell)) + (cb (cl-tty.rendering:cell-bg cell))) + (when ch (setf (char line col) ch)) + (when cf (setf fg cf)) + (when cb (setf bg cb)))) + (cl-tty.backend:draw-text be 0 row line fg bg))) + ;; Draw separator line above input + (cl-tty.backend:draw-text be 0 (- h 4) (make-string w :initial-element #\─) + (theme-color :separator) nil) + (rotatef prev-fb curr-fb)) (let ((ds (st :dialog-stack))) (when ds (let* ((dlg (car ds)) diff --git a/org/channel-tui-view.org b/org/channel-tui-view.org index d69c007..c5fb9fc 100644 --- a/org/channel-tui-view.org +++ b/org/channel-tui-view.org @@ -61,9 +61,11 @@ Returns a list of strings, one per line." (defun view-status (fb w h) (let* ((bg (theme-color :status-bg)) (fg (theme-color :status-fg)) - (left (format nil " ~a ~a Rules:~a" - (if (st :connected) "●" "○") - (or (st :foveal-id) "passepartout") (or (st :rule-count) 0))) + (left (format nil " ~a ~a msgs:~d Rules:~a" + (if (st :connected) "●" "○") + (or (st :foveal-id) "passepartout") + (length (st :messages)) + (or (st :rule-count) 0))) (right (format nil "$~,2f ~a" (or (st :session-cost) 0.0) (now)))) (dotimes (col w) (cl-tty.backend:draw-text fb 0 (- h 1) (make-string w :initial-element #\Space) nil bg))