v0.15.0: Rewrite demo, update README, fix read-raw-byte buffer, export textarea-lines
Demo (demo.lisp):
- Full interactive demo with 3 tabs: Home, Widgets, Console
- Uses read-event/SGR mouse paths (exercises real terminal input)
- Demonstrates text-input, textarea, backend drawing, tab navigation
- Event log console shows keyboard and mouse events in real time
- Proper terminal cleanup via shutdown-backend + unwind-protect
README.org:
- Complete rewrite with getting-started guide, architecture overview
- API reference for all components with signatures and examples
- Event loop pattern, layout system, rendering pipeline docs
- Backend features table, development guide, project structure
Bug fixes:
- read-raw-byte (input.lisp:89-109): use sb-sys:with-pinned-objects +
vector-sap for proper sb-posix:read buffer handling (SBCL type error
with plain (unsigned-byte 8) arrays)
- input-package.lisp: export textarea-lines (was missing from package)
Version bump: v0.14.0 → v0.15.0
392 tests pass.
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
#:textarea-value #:textarea-cursor-row #:textarea-cursor-col
|
||||
#:textarea-on-submit #:textarea-undo-stack #:textarea-redo-stack
|
||||
#:textarea-layout-node
|
||||
#:textarea-lines
|
||||
#:handle-textarea-input #:render-textarea
|
||||
;; Keybindings
|
||||
#:keymap #:make-keymap #:keymap-name #:keymap-bindings #:keymap-parent
|
||||
|
||||
@@ -87,26 +87,27 @@
|
||||
;;; Low-level byte reading
|
||||
;;; ---------------------------------------------------------------------------
|
||||
(defun read-raw-byte (&key timeout)
|
||||
(if timeout
|
||||
(let ((deadline (+ (get-universal-time) timeout)))
|
||||
(loop while (< (get-universal-time) deadline)
|
||||
do (handler-case
|
||||
(let ((buf (make-array 1 :element-type '(unsigned-byte 8))))
|
||||
(let ((n (sb-posix:read 0 buf 1)))
|
||||
(when (plusp n)
|
||||
(return-from read-raw-byte (aref buf 0)))))
|
||||
(sb-posix:syscall-error ()
|
||||
(return-from read-raw-byte nil)))
|
||||
(sleep 0.01))
|
||||
nil)
|
||||
(let ((buf (make-array 1 :element-type '(unsigned-byte 8))))
|
||||
(multiple-value-bind (n err)
|
||||
(ignore-errors (sb-posix:read 0 buf 1))
|
||||
(if (and (integerp n) (plusp n))
|
||||
(aref buf 0)
|
||||
(progn
|
||||
(when err (format *error-output* "read error: ~A~%" err))
|
||||
nil))))))
|
||||
(flet ((read-one ()
|
||||
(let ((buf (make-array 1 :element-type '(unsigned-byte 8))))
|
||||
;; Use sb-sys:with-pinned-objects so sb-posix:read can access the buffer
|
||||
(sb-sys:with-pinned-objects (buf)
|
||||
(let ((n (sb-posix:read 0 (sb-sys:vector-sap buf) 1)))
|
||||
(when (plusp n)
|
||||
(return-from read-raw-byte (aref buf 0))))))))
|
||||
(if timeout
|
||||
(let ((deadline (+ (get-universal-time) timeout)))
|
||||
(loop while (< (get-universal-time) deadline)
|
||||
do (handler-case
|
||||
(read-one)
|
||||
(sb-posix:syscall-error ()
|
||||
(return-from read-raw-byte nil)))
|
||||
(sleep 0.01))
|
||||
nil)
|
||||
(handler-case
|
||||
(read-one)
|
||||
(sb-posix:syscall-error (e)
|
||||
(format *error-output* "read error: ~A~%" e)
|
||||
nil)))))
|
||||
|
||||
;;; ---------------------------------------------------------------------------
|
||||
;;; CSI parameter parser
|
||||
|
||||
Reference in New Issue
Block a user