From a294f21c704e122e11281916e64e7cec8f421c39 Mon Sep 17 00:00:00 2001 From: Hermes Date: Tue, 12 May 2026 00:55:03 +0000 Subject: [PATCH] Subagent review fixes: textarea ignore-w, hit-test recursion, select/tabbar position, X10 release, CSI param < digit, text-input truncation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CRITICAL: Remove (declare (ignore w)) from textarea render (textarea.lisp:251) w is used for horizontal truncation on the next line. Declaring it ignored while using it is undefined behavior in CL (SBCL warns). HIGH: hit-test recurses into children (mouse.lisp:18-34) Was returning the root component for any click within its bounds, ignoring nested widgets entirely. Now checks component-children first, returning the deepest match. MEDIUM: Select/TabBar position hardcoded to (0,0) Both rendered at terminal origin regardless of layout position. Now read layout-node-x/y for absolute positioning. MEDIUM: Text-input truncation missing Render drew full value string even when exceeding widget width. Now truncates to (min (length display) w). MEDIUM: X10 mouse release detection added (input.lisp:219-226) X10 encoding uses button=3 for release. Was detecting all events as press/drag. Now checks button=3 → :release. MEDIUM: parse-csi-params handles private markers (input.lisp:128-131) < = > ? characters (0x3c-0x3f) treated as parameter start markers instead of accumulating bogus digit values. Latent trap removed. Deferred (pre-existing design): - Scrollbox visibility cy vs orig-y: match for column layout (common case) - Nested scrollbox coordinates: assumes sequential layout positions - text-input cursor drawing: feature, not bugfix 392 tests pass. --- src/components/input.lisp | 18 +++++++++--------- src/components/mouse.lisp | 17 +++++++++++++---- src/components/select.lisp | 4 +++- src/components/tabbar.lisp | 6 ++++-- src/components/text-input.lisp | 5 +++-- src/components/textarea.fasl | Bin 0 -> 41447 bytes src/components/textarea.lisp | 1 - 7 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 src/components/textarea.fasl diff --git a/src/components/input.lisp b/src/components/input.lisp index 1996d49..419837f 100644 --- a/src/components/input.lisp +++ b/src/components/input.lisp @@ -124,7 +124,10 @@ ((and (>= b #x30) (<= b #x3f)) (if (char= (code-char b) #\;) (progn (push current params) (setf current 0)) - (setf current (+ (* current 10) (- b #x30))))) + ;; Non-digit parameter characters (< = > ?) start a new param at zero + (if (member b '(#x3c #x3d #x3e #x3f) :test #'=) + (setf current 0) + (setf current (+ (* current 10) (- b #x30)))))) ((and (>= b #x20) (<= b #x2f)) nil) ((and (>= b #x40) (<= b #x7e)) @@ -219,15 +222,12 @@ (y (third params)) (button (logand p0 #x03)) (motion (logand p0 #x20)) - (wheel (logand p0 #x40))) + (release (= button 3))) (make-mouse-event - :type (if motion :drag :press) - :button (cond (wheel (if (zerop (logand p0 #x01)) - :wheel-up :wheel-down)) - ((= button 0) :left) - ((= button 1) :middle) - ((= button 2) :right) - (t :none)) + :type (cond (release :release) + (motion :drag) + (t :press)) + :button (let ((b button)) (cond ((= b 0) :left) ((= b 1) :middle) ((= b 2) :right) (t :none))) :x x :y y :raw (format nil "~C[<~d;~d;~d~C" #\Esc p0 x y (code-char final-byte)))) (let* ((tilde-p (char= (code-char final-byte) #\~)) (param (or p0 0)) diff --git a/src/components/mouse.lisp b/src/components/mouse.lisp index 60e641f..db68be7 100644 --- a/src/components/mouse.lisp +++ b/src/components/mouse.lisp @@ -17,17 +17,26 @@ (defun hit-test (root x y) "Find the deepest component at (X, Y) by testing layout-node bounds. +Recurses into component-children to find the innermost match. Components without a layout-node or position return nil." (labels ((recurse (node) - (let ((ln (ignore-errors (component-layout-node node)))) + (let ((ln (ignore-errors (component-layout-node node))) + (best nil)) (when ln (let ((nx (layout-node-x ln)) (ny (layout-node-y ln)) (nw (layout-node-width ln)) (nh (layout-node-height ln))) - (when (and (>= x nx) (< x (+ nx nw)) - (>= y ny) (< y (+ ny nh))) - node)))))) + ;; Check children first for deeper match + (dolist (child (ignore-errors (component-children node))) + (let ((child-hit (recurse child))) + (when child-hit + (setf best child-hit)))) + ;; If no child matched, check self + (or best + (when (and (>= x nx) (< x (+ nx nw)) + (>= y ny) (< y (+ ny nh))) + node))))))) (recurse root))) ;; Selection diff --git a/src/components/select.lisp b/src/components/select.lisp index 436636e..fb57324 100644 --- a/src/components/select.lisp +++ b/src/components/select.lisp @@ -76,7 +76,9 @@ (subseq filtered start end))) (defmethod render ((sel select) backend) - (let* ((ln (select-layout-node sel)) (x 0) (y 0) + (let* ((ln (select-layout-node sel)) + (x (if ln (layout-node-x ln) 0)) + (y (if ln (layout-node-y ln) 0)) (w (if ln (layout-node-width ln) 80)) (visible (select-visible-options sel)) (sel-idx (select-selected-index sel))) (dolist (item visible) diff --git a/src/components/tabbar.lisp b/src/components/tabbar.lisp index f7b7f64..ff94fe6 100644 --- a/src/components/tabbar.lisp +++ b/src/components/tabbar.lisp @@ -35,9 +35,11 @@ (case (key-event-key event) (:left (tab-bar-prev tb) t) (:right (tab-bar-next tb) t) (t nil))) (defmethod render ((tb tab-bar) backend) - (let* ((ln (tab-bar-layout-node tb)) (y 0) + (let* ((ln (tab-bar-layout-node tb)) + (x (if ln (layout-node-x ln) 0)) + (y (if ln (layout-node-y ln) 0)) (w (if ln (layout-node-width ln) 80)) - (active-id (tab-bar-active tb)) (tabs (tab-bar-tabs tb)) (x-pos 0)) + (active-id (tab-bar-active tb)) (tabs (tab-bar-tabs tb)) (x-pos x)) (dolist (tab tabs) (let* ((id (getf tab :id)) (title (getf tab :title)) (label (format nil " ~A " title)) (label-len (length label)) diff --git a/src/components/text-input.lisp b/src/components/text-input.lisp index a00a659..4259f6b 100644 --- a/src/components/text-input.lisp +++ b/src/components/text-input.lisp @@ -165,6 +165,7 @@ (cursor (text-input-cursor in)) (display (if (plusp (length value)) value - (or (text-input-placeholder in) "")))) + (or (text-input-placeholder in) ""))) + (truncated (subseq display 0 (min (length display) w)))) (declare (ignore w cursor)) - (draw-text backend x y display nil nil))) + (draw-text backend x y truncated nil nil))) diff --git a/src/components/textarea.fasl b/src/components/textarea.fasl new file mode 100644 index 0000000000000000000000000000000000000000..e63852b309bd4be8653a6a6c8157e0521792be95 GIT binary patch literal 41447 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 literal 0 HcmV?d00001 diff --git a/src/components/textarea.lisp b/src/components/textarea.lisp index 2c9090e..5c8b1f0 100644 --- a/src/components/textarea.lisp +++ b/src/components/textarea.lisp @@ -248,7 +248,6 @@ (h (if ln (layout-node-height ln) 24)) (lines (textarea-lines ta)) (max-lines (min (length lines) h))) - (declare (ignore w)) (loop for i from 0 below max-lines for line in lines do (draw-text backend x (+ y i)