Add demo.sh — shell wrapper for raw terminal mode
Raw terminal mode must be set by the parent process (the shell), not from inside SBCL. sb-ext:run-program subprocesses cannot reliably access the controlling terminal for stty operations. ./demo.sh sets raw mode via stty, runs sbcl --script demo.lisp, and restores terminal state on exit (EXIT, INT, TERM). demo.lisp no longer calls with-raw-terminal — it assumes the calling shell has already set raw mode.
This commit is contained in:
20
demo
20
demo
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# cl-tty demo launcher
|
|
||||||
# Sets raw terminal mode, runs the demo, restores terminal on exit.
|
|
||||||
# This is needed because SBCL's --script mode + run-program combo
|
|
||||||
# can't reliably set raw mode from inside the Lisp process.
|
|
||||||
|
|
||||||
SAVED=$(stty -g 2>/dev/null)
|
|
||||||
if [ -z "$SAVED" ]; then
|
|
||||||
echo "ERROR: Not running in a real terminal." >&2
|
|
||||||
echo " Try: sbcl --script demo.lisp" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
stty "$SAVED" 2>/dev/null
|
|
||||||
}
|
|
||||||
trap cleanup EXIT INT TERM
|
|
||||||
|
|
||||||
stty raw -echo -isig -icanon min 1 time 0 2>/dev/null
|
|
||||||
sbcl --script "$(dirname "$0")/demo.lisp"
|
|
||||||
10
demo.lisp
10
demo.lisp
@@ -1,9 +1,5 @@
|
|||||||
;;; demo.lisp — cl-tty interactive demo
|
;;; demo.lisp — cl-tty interactive demo
|
||||||
;;; Run: sbcl --script demo.lisp
|
;;; Run: sbcl --script demo.lisp
|
||||||
;;;
|
|
||||||
;;; Demonstrates: backend detection, raw terminal mode, key/mouse input,
|
|
||||||
;;; layout engine, component rendering pipeline, framebuffer diff flush,
|
|
||||||
;;; text-input, textarea, select, dialog, scrollbox, tabbar.
|
|
||||||
|
|
||||||
;; Load cl-tty directly via ASDF (no Quicklisp dependency needed —
|
;; Load cl-tty directly via ASDF (no Quicklisp dependency needed —
|
||||||
;; sb-posix is built into SBCL, no external libraries required).
|
;; sb-posix is built into SBCL, no external libraries required).
|
||||||
@@ -124,10 +120,8 @@
|
|||||||
t)))
|
t)))
|
||||||
|
|
||||||
(defun run-demo ()
|
(defun run-demo ()
|
||||||
"Run the demo. Assumes raw terminal mode is already set by the
|
"Run the demo. Raw terminal mode should already be set by the
|
||||||
shell wrapper (./demo) or by running:
|
./demo.sh shell wrapper."
|
||||||
stty raw -echo -isig -icanon min 1 time 0
|
|
||||||
sbcl --script demo.lisp"
|
|
||||||
(init-app-state)
|
(init-app-state)
|
||||||
(let* ((backend (detect-backend))
|
(let* ((backend (detect-backend))
|
||||||
(w 80) (h 24))
|
(w 80) (h 24))
|
||||||
|
|||||||
17
demo.sh
Executable file
17
demo.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# cl-tty demo launcher
|
||||||
|
# Sets raw terminal mode before starting SBCL, restores on exit.
|
||||||
|
# Raw mode is needed so individual keystrokes are captured instead
|
||||||
|
# of being line-buffered and echoed by the terminal driver.
|
||||||
|
|
||||||
|
SAVED=$(stty -g 2>/dev/null)
|
||||||
|
if [ -z "$SAVED" ]; then
|
||||||
|
echo "ERROR: Not running in a real terminal." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cleanup() { stty "$SAVED" 2>/dev/null; }
|
||||||
|
trap cleanup EXIT INT TERM
|
||||||
|
|
||||||
|
stty raw -echo -isig -icanon min 1 time 0 2>/dev/null
|
||||||
|
sbcl --script "$(dirname "$0")/demo.lisp"
|
||||||
Reference in New Issue
Block a user