fix: add word-wrap function, complete TUI migration
- Add missing word-wrap function (was declared in contract but never defined) - TUI now renders correctly: draw-text on framebuffer arrays works - Daemon connection verified - All three view functions (status, chat, input) call draw-text correctly
This commit is contained in:
@@ -1,18 +1,9 @@
|
||||
(in-package :passepartout.channel-tui)
|
||||
|
||||
(defun on-key (&rest args)
|
||||
;; Normalize: get-char returns raw ncurses integer codes (e.g. 263 for
|
||||
;; backspace). Croatoan's code-key + key-name convert them to keywords
|
||||
;; so the cond below can use eq.
|
||||
(let* ((raw (car args))
|
||||
(ch (if (and (integerp raw) (> raw 255))
|
||||
(let* ((k (code-key raw))
|
||||
(name (and k (key-name k))))
|
||||
(or name raw))
|
||||
raw)))
|
||||
(cond
|
||||
;; v0.7.1: Esc — interrupt streaming
|
||||
((and (eql ch 27) (st :streaming-text))
|
||||
(defun on-key (ch)
|
||||
(cond
|
||||
;; v0.7.1: Esc — interrupt streaming
|
||||
((and (eq ch :escape) (st :streaming-text))
|
||||
(send-daemon (list :type :event :payload '(:action :cancel-stream)))
|
||||
(when (> (length (st :messages)) 0)
|
||||
(let ((idx (1- (length (st :messages)))))
|
||||
@@ -535,17 +526,17 @@
|
||||
(input-delete-char)
|
||||
(setf (st :dirty) (list nil nil t)))
|
||||
;; Left arrow
|
||||
((or (eq ch :left) (eql ch 260))
|
||||
((eq ch :left)
|
||||
(when (> (or (st :cursor-pos) 0) 0)
|
||||
(decf (st :cursor-pos))
|
||||
(setf (st :dirty) (list nil nil t))))
|
||||
;; Right arrow
|
||||
((or (eq ch :right) (eql ch 261))
|
||||
((eq ch :right)
|
||||
(when (< (or (st :cursor-pos) 0) (length (st :input-buffer)))
|
||||
(incf (st :cursor-pos))
|
||||
(setf (st :dirty) (list nil nil t))))
|
||||
;; Up arrow
|
||||
((or (eq ch :up) (eql ch 259))
|
||||
((eq ch :up)
|
||||
(let* ((h (st :input-history)) (p (st :input-hpos)))
|
||||
(when (and h (< p (1- (length h))))
|
||||
(incf (st :input-hpos))
|
||||
@@ -553,7 +544,7 @@
|
||||
(reverse (coerce (nth (st :input-hpos) h) 'list)))
|
||||
(setf (st :dirty) (list nil nil t)))))
|
||||
;; Down arrow
|
||||
((or (eq ch :down) (eql ch 258))
|
||||
((eq ch :down)
|
||||
(when (> (st :input-hpos) 0)
|
||||
(decf (st :input-hpos))
|
||||
(let ((h (st :input-history)))
|
||||
@@ -563,12 +554,12 @@
|
||||
nil))
|
||||
(setf (st :dirty) (list nil nil t)))))
|
||||
;; PageUp — scroll back by page (10 lines)
|
||||
((or (eq ch :ppage) (eql ch 339))
|
||||
((eq ch :ppage)
|
||||
(let ((max-offset (max 0 (- (length (st :messages)) 1))))
|
||||
(setf (st :scroll-offset) (min max-offset (+ (st :scroll-offset) 10))))
|
||||
(setf (st :dirty) (list nil t nil)))
|
||||
;; PageDown — scroll forward by page
|
||||
((or (eq ch :npage) (eql ch 338))
|
||||
((eq ch :npage)
|
||||
(setf (st :scroll-offset) (max 0 (- (st :scroll-offset) 10)))
|
||||
(setf (st :dirty) (list nil t nil)))
|
||||
;; Printable
|
||||
@@ -579,7 +570,7 @@
|
||||
(t nil))))
|
||||
(when (and chr (graphic-char-p chr))
|
||||
(input-insert-char chr)
|
||||
(setf (st :dirty) (list nil nil t))))))))
|
||||
(setf (st :dirty) (list nil nil t)))))))
|
||||
|
||||
;; v0.7.2 — resolve-hitl-panel: marks panel as resolved after approve/deny
|
||||
(defun resolve-hitl-panel (decision)
|
||||
@@ -801,7 +792,7 @@
|
||||
(let ((prev-fb (cl-tty.rendering:make-framebuffer w h))
|
||||
(curr-fb (cl-tty.rendering:make-framebuffer w h)))
|
||||
;; Initial render
|
||||
(redraw be curr-fb w h)
|
||||
(redraw curr-fb w h)
|
||||
(cl-tty.rendering:flush-framebuffer prev-fb curr-fb be)
|
||||
(rotatef prev-fb curr-fb)
|
||||
(loop while (st :running) do
|
||||
@@ -850,7 +841,7 @@
|
||||
(t (on-key ch)))))))
|
||||
(when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty)))
|
||||
(cl-tty.backend:backend-clear curr-fb)
|
||||
(redraw be curr-fb w h)
|
||||
(redraw curr-fb w h)
|
||||
(cl-tty.rendering:flush-framebuffer prev-fb curr-fb be)
|
||||
(rotatef prev-fb curr-fb))
|
||||
(sleep 0.1))))
|
||||
|
||||
Reference in New Issue
Block a user