fix: use read-event with ctrl flag, add resize handling

- Switched back to read-event be :timeout 0.01 for proper key-event
  dispatch with the ctrl/alt/shift flags
- Fixed Ctrl+P/B/Q/L dispatch: check key-event-ctrl flag to
  construct :CTRL-<key> keyword symbol (read-event returns :P + ctrl=t,
  not :CTRL-P)
- Added :size-queried state flag and post-handshake backend-size re-query
- Removed hardcoded Connected v0.5.0 message from connect-daemon
- Removed Connected v0.7.2 system message (version shown in status bar)
- view-status now uses draw-rect for background (instead of dotimes loop)
- Added startup message showing backend type and detected dimensions
This commit is contained in:
2026-05-14 09:31:16 -04:00
parent adca69d29c
commit 21d054bc38
5 changed files with 39 additions and 55 deletions

View File

@@ -672,8 +672,7 @@
(text (setf (st :busy) nil)
(add-msg :agent text :gate-trace gate-trace))
((eq action :handshake)
(setf (st :daemon-version) (getf payload :version))
(add-msg :system (format nil "Connected v~a" (getf payload :version))))
(setf (st :daemon-version) (getf payload :version)))
(t (add-msg :agent (format nil "~a" msg))))))
(defun send-daemon (msg)
@@ -864,8 +863,11 @@
(add-msg :system "* Swank unavailable *"))))
(cl-tty.input:with-raw-terminal
(cl-tty.backend:with-terminal (be w h)
(let ((tty (sb-sys:make-fd-stream 0 :input t :buffering :none)))
;; Initial render
;; Log backend info and terminal dimensions
(let ((backend-type (if (typep be 'cl-tty.backend:modern-backend)
"modern" "simple")))
(add-msg :system (format nil "* ~a backend ~dx~d *" backend-type w h)))
;; Initial render
(cl-tty.backend:backend-clear be)
(view-status be w h)
(view-chat be w h)
@@ -881,35 +883,33 @@
(setf (st :connected) nil
(st :busy) nil)
(add-msg :system "* Connection lost — type /reconnect to retry *"))))
;; Check for terminal resize (SIGWINCH sets this flag)
(when (boundp 'cl-tty.input::*terminal-resized-p*)
(when cl-tty.input::*terminal-resized-p*
(setf cl-tty.input::*terminal-resized-p* nil)
;; Read key input via cl-tty read-event (10ms timeout)
(multiple-value-bind (type data)
(cl-tty.input:read-event be :timeout 0.01)
(when (eq type :resize)
(multiple-value-setq (w h) (cl-tty.backend:backend-size be))
(setf (st :dirty) (list t t t))))
;; Read key input from fd 0 (blocking via listen + read-char)
(let ((raw-ch (when (listen tty) (read-char tty nil nil))))
(when raw-ch
(let ((code (char-code raw-ch)))
(let ((ch (cond
((= code 13) :enter)
((= code 10) :enter)
((= code 27) :escape)
((= code 9) :tab)
((or (= code 127) (= code 8)) :backspace)
((and (>= code 1) (<= code 26))
(intern (string-upcase (format nil "CTRL-~a"
(code-char (+ #x60 code))))
:keyword))
(t raw-ch))))
(case ch
(:CTRL-Q (setf (st :running) nil))
(:CTRL-P (command-palette-show-commands))
(:CTRL-B (setf (st :sidebar-visible) (not (st :sidebar-visible)))
(setf (st :dirty) (list t t nil)))
(:CTRL-L (setf (st :dirty) (list t t t)))
(t (on-key ch)))))))
(when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty)))
(setf (st :dirty) (list t t t)))
(when data
(let* ((ke data)
(ch (if (cl-tty.input:key-event-p ke)
(let ((k (cl-tty.input:key-event-key ke)))
(if (cl-tty.input:key-event-ctrl ke)
(intern (format nil "CTRL-~a" k) :keyword)
k))
ke)))
(case ch
(:CTRL-Q (setf (st :running) nil))
(:CTRL-P (command-palette-show-commands))
(:CTRL-B (setf (st :sidebar-visible) (not (st :sidebar-visible)))
(setf (st :dirty) (list t t nil)))
(:CTRL-L (setf (st :dirty) (list t t t)))
(t (on-key ch))))))
;; Re-query terminal size once after daemon handshake
(when (and (st :connected) (st :daemon-version) (not (st :size-queried)))
(multiple-value-setq (w h) (cl-tty.backend:backend-size be))
(setf (st :dirty) (list t t t))
(setf (st :size-queried) t))
(when (or (first (st :dirty)) (second (st :dirty)) (third (st :dirty)))
(cl-tty.backend:backend-clear be)
(view-status be w h)
(view-chat be w h)
@@ -951,8 +951,7 @@
(t (theme-color :agent-fg)))
nil :bold sel-p)
(incf y-off)))))))
(sleep 0.1))))
(close tty))
(sleep 0.1))))
(disconnect-daemon)))
(eval-when (:compile-toplevel :load-toplevel :execute)

View File

@@ -178,6 +178,7 @@
:command-palette-dialog nil ; v0.8.0
:session-cost 0.0 ; v0.9.0
:daemon-version nil ; filled by handshake
:size-queried nil ; re-query once post-handshake
:dirty (list nil nil nil))))
(defvar *sidebar-panels*

View File

@@ -25,8 +25,7 @@ Returns a list of strings, one per line."
(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))
(cl-tty.backend:draw-rect fb 0 (- h 1) w 1 :bg bg)
(cl-tty.backend:draw-text fb 1 (- h 1) left fg nil)
(cl-tty.backend:draw-text fb (- w (length right) 2) (- h 1) right fg nil)))