v0.8.0: tangle to XDG (~/.local/share/cl-tty/), remove stale memex .lisp files
This commit is contained in:
@@ -53,7 +53,7 @@ covers one logical behavior.
|
||||
The test package uses =cl-tty.backend= to access internal symbols for
|
||||
white-box testing of escape generation.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(defpackage :cl-tty-modern-backend-test
|
||||
(:use :cl :fiveam :cl-tty.backend)
|
||||
(:export #:run-tests))
|
||||
@@ -64,7 +64,7 @@ white-box testing of escape generation.
|
||||
|
||||
A single suite groups all modern backend tests.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(def-suite modern-backend-suite :description "Modern backend tests")
|
||||
(in-suite modern-backend-suite)
|
||||
#+END_SRC
|
||||
@@ -73,7 +73,7 @@ A single suite groups all modern backend tests.
|
||||
|
||||
The =run-tests= entry point is called by the CI test harness.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(defun run-tests ()
|
||||
(let ((result (run 'modern-backend-suite)))
|
||||
(fiveam:explain! result)
|
||||
@@ -85,7 +85,7 @@ The =run-tests= entry point is called by the CI test harness.
|
||||
Verifies that =make-modern-backend= returns an instance of the correct
|
||||
class. This is the most basic smoke test for the backend factory.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test make-modern-backend-creates
|
||||
"make-modern-backend returns a modern-backend instance"
|
||||
(let ((b (make-modern-backend)))
|
||||
@@ -97,7 +97,7 @@ class. This is the most basic smoke test for the backend factory.
|
||||
Ensures a 6-digit hex string produces the correct 24-bit foreground
|
||||
escape sequence with red, green, and blue components in the right order.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test sgr-truecolor-foreground
|
||||
"SGR truecolor foreground escape is correct"
|
||||
(is (equal (cl-tty.backend::sgr-fg "#FFD700")
|
||||
@@ -108,7 +108,7 @@ escape sequence with red, green, and blue components in the right order.
|
||||
|
||||
Same as foreground but uses the =48= background prefix instead of =38=.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test sgr-truecolor-background
|
||||
"SGR truecolor background escape is correct"
|
||||
(is (equal (cl-tty.backend::sgr-bg "#1a1b26")
|
||||
@@ -120,7 +120,7 @@ Same as foreground but uses the =48= background prefix instead of =38=.
|
||||
Verifies that keyword symbols like =:red= and =:blue= resolve to the
|
||||
standard 8-color SGR codes (=31= foreground, =44= background).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test sgr-named-colors
|
||||
"SGR named colors resolve to 8-color codes"
|
||||
(is (equal (cl-tty.backend::sgr-fg :red)
|
||||
@@ -134,7 +134,7 @@ standard 8-color SGR codes (=31= foreground, =44= background).
|
||||
Each attribute keyword (=:bold=, =:italic=, =:underline=, =:reset=)
|
||||
should map to the correct SGR number.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test sgr-bold-italic
|
||||
"SGR attribute escapes are correct"
|
||||
(is (equal (cl-tty.backend::sgr-attr :bold) (format nil "~C[1m" #\Esc)))
|
||||
@@ -148,7 +148,7 @@ should map to the correct SGR number.
|
||||
Verifies that =cursor-move-escape= produces a CSI =H= sequence with
|
||||
1-indexed row and column.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test cursor-move-escape
|
||||
"cursor-move generates correct CSI escape"
|
||||
(let ((b (make-modern-backend)))
|
||||
@@ -160,7 +160,7 @@ Verifies that =cursor-move-escape= produces a CSI =H= sequence with
|
||||
|
||||
Verifies the DECSTR escape for a block cursor without blinking (code 2).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test cursor-style-block
|
||||
"cursor-style :block generate correct escape"
|
||||
(let ((b (make-modern-backend)))
|
||||
@@ -172,7 +172,7 @@ Verifies the DECSTR escape for a block cursor without blinking (code 2).
|
||||
|
||||
Verifies the DECSTR escape for a bar cursor without blinking (code 6).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test cursor-style-bar
|
||||
"cursor-style :bar generate correct escape"
|
||||
(let ((b (make-modern-backend)))
|
||||
@@ -185,7 +185,7 @@ Verifies the DECSTR escape for a bar cursor without blinking (code 6).
|
||||
Verifies that =:underline= with =blink=t= produces code 5 (underline
|
||||
blinking), which is base 4 + blink offset 1.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test cursor-style-underline-blink
|
||||
"cursor-style :underline with blink"
|
||||
(let ((b (make-modern-backend)))
|
||||
@@ -198,7 +198,7 @@ blinking), which is base 4 + blink offset 1.
|
||||
Confirms that =decicm-begin= and =decicm-end= produce =?2026h= and
|
||||
=?2026l= respectively.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test decicm-escapes
|
||||
"DECICM synchronized update escapes"
|
||||
(is (equal (cl-tty.backend::decicm-begin) (format nil "~C[?2026h" #\Esc)))
|
||||
@@ -211,7 +211,7 @@ Verifies the full OSC 8 wrapping: opening sequence with URL, the text,
|
||||
and the closing sequence. The FORMAT string uses ~~ for literal tilde
|
||||
and ~\\ for literal backslash.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test osc8-escape
|
||||
"OSC 8 hyperlink escape wraps text"
|
||||
(is (equal (cl-tty.backend::osc8-link "http://example.com" "click here")
|
||||
@@ -223,7 +223,7 @@ and ~\\ for literal backslash.
|
||||
|
||||
Verifies that ="#FFD700"= parses to (255, 215, 0).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test hex-color-parsing
|
||||
"hex-to-rgb parses valid hex colors"
|
||||
(multiple-value-bind (r g b) (cl-tty.backend::hex-to-rgb "#FFD700")
|
||||
@@ -236,7 +236,7 @@ Verifies that ="#FFD700"= parses to (255, 215, 0).
|
||||
|
||||
Verifies all-zero parsing.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test hex-color-black
|
||||
"hex-to-rgb parses black"
|
||||
(multiple-value-bind (r g b) (cl-tty.backend::hex-to-rgb "#000000")
|
||||
@@ -249,7 +249,7 @@ Verifies all-zero parsing.
|
||||
|
||||
Verifies that ="#F00"= expands to ="#FF0000"= = (255, 0, 0).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test hex-color-short-form
|
||||
"hex-to-rgb parses 3-digit hex"
|
||||
(multiple-value-bind (r g b) (cl-tty.backend::hex-to-rgb "#F00")
|
||||
@@ -263,7 +263,7 @@ Verifies that ="#F00"= expands to ="#FF0000"= = (255, 0, 0).
|
||||
Confirms that =:rounded= style maps to the Unicode box-drawing
|
||||
characters for the four corners and edges.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test border-char-rounded
|
||||
"modern-border-char returns Unicode box-drawing for rounded style"
|
||||
(is (equal (cl-tty.backend::border-char :rounded :top-left) "╭"))
|
||||
@@ -276,7 +276,7 @@ characters for the four corners and edges.
|
||||
|
||||
Confirms that =:double= style maps to double-line box-drawing characters.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test border-char-double
|
||||
"modern-border-char returns double-line chars"
|
||||
(is (equal (cl-tty.backend::border-char :double :top-left) "╔"))
|
||||
@@ -289,7 +289,7 @@ Confirms that =:double= style maps to double-line box-drawing characters.
|
||||
Verifies that suspend-backend and resume-backend are no-ops when called
|
||||
on a backend not attached to a real terminal (no errors, return nil).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern-tests.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern-tests.lisp
|
||||
(test suspend-resume-noop
|
||||
"suspend-backend and resume-backend are no-ops in test context"
|
||||
(let ((b (make-modern-backend)))
|
||||
@@ -307,7 +307,7 @@ on a backend not attached to a real terminal (no errors, return nil).
|
||||
both 6-digit (fully specified) and 3-digit (shorthand) formats. The
|
||||
3-digit form expands each hexit by duplicating it (=#F00= => =#FF0000=).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(in-package :cl-tty.backend)
|
||||
|
||||
(defun hex-to-rgb (hex)
|
||||
@@ -331,7 +331,7 @@ Maps keyword color names to 8-color SGR index values. Used as the
|
||||
primary lookup in =sgr-fg= and =sgr-bg= before falling back to the
|
||||
theme colors hash table.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defparameter *named-colors*
|
||||
'((:black . 0) (:red . 1) (:green . 2) (:yellow . 3)
|
||||
(:blue . 4) (:magenta . 5) (:cyan . 6) (:white . 7)))
|
||||
@@ -344,7 +344,7 @@ Populated by the theme system's =load-preset=. When a keyword is not in
|
||||
=*named-colors*=, =sgr-fg= and =sgr-bg= consult this table as a
|
||||
fallback, enabling user themes to define custom color roles.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defvar *theme-colors* (make-hash-table :test 'eq)
|
||||
"Hash table mapping theme keywords to hex color strings.
|
||||
Populated by the theme system's load-preset. Checked by sgr-fg/sgr-bg
|
||||
@@ -357,7 +357,7 @@ as a fallback when a keyword is not in *named-colors*.")
|
||||
hex string => named color => semantic theme role => empty string if
|
||||
unresolved. Truecolor uses =38;2;R;G;B=, named colors use =3n=.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun sgr-fg (color)
|
||||
"Return SGR foreground escape for COLOR."
|
||||
(if (null color) ""
|
||||
@@ -381,7 +381,7 @@ unresolved. Truecolor uses =38;2;R;G;B=, named colors use =3n=.
|
||||
~sgr-bg~ produces the SGR background escape. Same resolution chain as
|
||||
=sgr-fg= but uses =48;2;R;G;B= for truecolor and =4n= for named colors.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun sgr-bg (color)
|
||||
"Return SGR background escape for COLOR."
|
||||
(if (null color) ""
|
||||
@@ -405,7 +405,7 @@ unresolved. Truecolor uses =38;2;R;G;B=, named colors use =3n=.
|
||||
Maps attribute keywords to SGR parameter numbers. Covers bold, dim,
|
||||
italic, underline, blink, reverse video, and reset.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defparameter *sgr-attr-codes*
|
||||
'((:bold . 1) (:dim . 2) (:italic . 3) (:underline . 4)
|
||||
(:blink . 5) (:reverse . 7) (:reset . 0)))
|
||||
@@ -416,7 +416,7 @@ italic, underline, blink, reverse video, and reset.
|
||||
~sgr-attr~ looks up the keyword in =*sgr-attr-codes*= and produces the
|
||||
matching SGR escape.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun sgr-attr (attr)
|
||||
"Return SGR attribute escape for ATTR keyword."
|
||||
(let ((code (cdr (assoc attr *sgr-attr-codes*))))
|
||||
@@ -432,7 +432,7 @@ matching SGR escape.
|
||||
Produces a CSI =H= (CUP) sequence to position the cursor. Coordinates
|
||||
are 1-indexed: =cursor-move-escape 0 0= moves to row 1, column 1.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun cursor-move-escape (x y)
|
||||
"Return CSI escape to move cursor to (x, y), 1-indexed."
|
||||
(format nil "~C[~d;~dH" #\Esc (1+ y) (1+ x)))
|
||||
@@ -444,7 +444,7 @@ Produces a DECSTR sequence (=CSI Ps q=) to set the cursor shape.
|
||||
Base codes: block=2, underline=4, bar=6. When =blink= is true the code
|
||||
is incremented by 1 (e.g. blinking block = code 3).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun cursor-style-escape (shape blink)
|
||||
"Return DECSTR escape for cursor shape."
|
||||
(let* ((base (case shape
|
||||
@@ -462,7 +462,7 @@ Enables DEC private mode 2026 (synchronized updates). All output
|
||||
between =begin= and =end= is buffered by the terminal and rendered
|
||||
atomically.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun decicm-begin ()
|
||||
"Return escape to enable synchronized updates."
|
||||
(format nil "~C[?2026h" #\Esc))
|
||||
@@ -473,7 +473,7 @@ atomically.
|
||||
Disables DEC private mode 2026, flushing the buffered frame to the
|
||||
display.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun decicm-end ()
|
||||
"Return escape to disable synchronized updates."
|
||||
(format nil "~C[?2026l" #\Esc))
|
||||
@@ -485,7 +485,7 @@ Wraps text in an OSC 8 hyperlink. The opening sequence carries the URL,
|
||||
the closing sequence (=ESC]8;;ESC\)=) terminates the link. This
|
||||
allows clickable text in terminals that support the protocol.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun osc8-link (url text)
|
||||
"Wrap TEXT in an OSC 8 hyperlink to URL."
|
||||
(format nil "~C]8;;~A~C\\~A~C]8;;~C\\"
|
||||
@@ -500,7 +500,7 @@ Lookup alist mapping =(style position)= pairs to Unicode box-drawing
|
||||
characters. Covers single, double, and rounded styles with all four
|
||||
corners plus horizontal and vertical connectors.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defparameter *border-chars*
|
||||
'(((:single :top-left) . "┌") ((:single :top-right) . "┐")
|
||||
((:single :bottom-left) . "└") ((:single :bottom-right) . "┘")
|
||||
@@ -520,7 +520,7 @@ horizontal/vertical lines (=U+2500=, =U+2502=) if the style is unknown
|
||||
for edge positions, or =+= for corners --- ensuring the UI never shows
|
||||
a blank gap.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun border-char (style pos)
|
||||
"Return the Unicode box-drawing character for STYLE at POS."
|
||||
(let ((char (cdr (assoc (list style pos) *border-chars* :test #'equal))))
|
||||
@@ -537,7 +537,7 @@ Subclasses the abstract =backend= class. =output-stream= is where escape
|
||||
sequences are written; =in-sync-p= tracks whether we are inside a
|
||||
DECICM synchronized update block.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defclass modern-backend (backend)
|
||||
((output-stream :initform *standard-output*
|
||||
:initarg :output-stream
|
||||
@@ -552,7 +552,7 @@ optional =output-stream=; defaults to =*standard-output*=. The
|
||||
=color-palette= argument is ignored in favor of the dynamic
|
||||
=*theme-colors*= hash table.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defun make-modern-backend (&key color-palette output-stream)
|
||||
(declare (ignore color-palette))
|
||||
(make-instance 'modern-backend :output-stream (or output-stream *standard-output*)))
|
||||
@@ -567,7 +567,7 @@ drag + SGR), bracketed paste mode, and the Kitty keyboard protocol.
|
||||
Hides the cursor and flushes the stream. Returns the backend instance
|
||||
for chaining.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod initialize-backend ((b modern-backend))
|
||||
(backend-write b (format nil "~C[?1049h" #\Esc)) ; alt screen
|
||||
(backend-write b (format nil "~C[?1000h" #\Esc)) ; mouse basic
|
||||
@@ -586,7 +586,7 @@ Restores the terminal: shows the cursor, disables the Kitty keyboard
|
||||
protocol, bracketed paste, SGR mouse, drag, basic mouse, and finally
|
||||
leaves the alternate screen. Returns =nil= (via =(values)=).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod shutdown-backend ((b modern-backend))
|
||||
(cursor-show b)
|
||||
(backend-write b (format nil "~C[?u" #\Esc))
|
||||
@@ -611,7 +611,7 @@ kitty keyboard — those would add ~100ms of overhead on every
|
||||
suspend/resume cycle and are harmless while suspended (the terminal
|
||||
just ignores the escape sequences).
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod suspend-backend ((b modern-backend))
|
||||
(cursor-show b)
|
||||
(backend-write b (format nil "~C[?1049l" #\Esc)) ; normal screen
|
||||
@@ -629,7 +629,7 @@ Re-enters the alternate screen buffer and re-enables all input
|
||||
features (mouse, bracketed paste, kitty keyboard). The application
|
||||
is responsible for redrawing the full screen after resume.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod resume-backend ((b modern-backend))
|
||||
(backend-write b (format nil "~C[?1049h" #\Esc)) ; alt screen
|
||||
(backend-write b (format nil "~C[?1000h" #\Esc)) ; mouse basic
|
||||
@@ -649,7 +649,7 @@ is responsible for redrawing the full screen after resume.
|
||||
Uses ioctl (TIOCGWINSZ = 21523) to query actual terminal dimensions
|
||||
from the kernel, with a ~/dev/tty~ fallback and 80x24 last resort.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod backend-size ((b modern-backend))
|
||||
;; Try ioctl on stdout, fall back to /dev/tty, then 80x24.
|
||||
;; Each arm uses multiple-value-bind/values to preserve both cols and rows
|
||||
@@ -695,7 +695,7 @@ caller is responsible for calling ~finish-output~ at appropriate sync
|
||||
points (frame boundaries via ~end-sync~, initialization, shutdown).
|
||||
Returns the string length for protocol compatibility.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod backend-write ((b modern-backend) string)
|
||||
(let ((stream (backend-output-stream b)))
|
||||
(write-string string stream)
|
||||
@@ -708,7 +708,7 @@ Advertises which features this backend supports. =modern-backend=
|
||||
supports truecolor, OSC 8 hyperlinks, DECICM sync, SGR mouse,
|
||||
bracketed paste, cursor style control, and the Kitty keyboard protocol.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod capable-p ((b modern-backend) feature)
|
||||
(member feature '(:truecolor :osc8 :sync :mouse
|
||||
:bracketed-paste :cursor-style
|
||||
@@ -724,7 +724,7 @@ itself, and a reset into a single concatenated string. Minimizes output
|
||||
calls --- one =backend-write= per draw operation --- by packing everything
|
||||
into one buffer.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod draw-text ((b modern-backend) x y string fg bg
|
||||
&key bold italic underline reverse dim blink
|
||||
&allow-other-keys)
|
||||
@@ -748,7 +748,7 @@ title, repeated mid sections, bottom) and writes them with minimal
|
||||
output calls. The title can be left-aligned or centered within the top
|
||||
border line. Uses the border character lookup for the chosen style.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod draw-border ((b modern-backend) x y width height
|
||||
&key style fg bg title title-align)
|
||||
(let* ((s (or style :single))
|
||||
@@ -810,7 +810,7 @@ the cursor and writes a filled line. This is simpler than =draw-border=
|
||||
because it has no border characters --- just spaces with a background
|
||||
color.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod draw-rect ((b modern-backend) x y width height &key bg)
|
||||
(let* ((bg-esc (sgr-bg bg))
|
||||
(reset (sgr-attr :reset))
|
||||
@@ -830,7 +830,7 @@ positioning, optional fg/bg colors, the OSC 8 link wrapper around the
|
||||
text, and a reset. This lets the user click the text to open the URL
|
||||
in terminals that support OSC 8.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod draw-link ((b modern-backend) x y string url
|
||||
&key fg bg)
|
||||
(let ((parts (list (cursor-move-escape x y)
|
||||
@@ -846,7 +846,7 @@ Draws a three-dot ellipsis at the given position. The =width= parameter
|
||||
is ignored since dots have a fixed visual length; delegates to
|
||||
=draw-text= for uniform rendering.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod draw-ellipsis ((b modern-backend) x y width
|
||||
&key fg bg)
|
||||
(declare (ignore width))
|
||||
@@ -861,7 +861,7 @@ is ignored since dots have a fixed visual length; delegates to
|
||||
Delegates to =cursor-move-escape= and writes the resulting CSI sequence
|
||||
to the output stream.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod cursor-move ((b modern-backend) x y)
|
||||
(backend-write b (cursor-move-escape x y)))
|
||||
#+END_SRC
|
||||
@@ -870,7 +870,7 @@ to the output stream.
|
||||
|
||||
Sends the DECTCEM private mode =?25l= to hide the cursor.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod cursor-hide ((b modern-backend))
|
||||
(backend-write b (format nil "~C[?25l" #\Esc)))
|
||||
#+END_SRC
|
||||
@@ -879,7 +879,7 @@ Sends the DECTCEM private mode =?25l= to hide the cursor.
|
||||
|
||||
Sends =?25h= to restore the cursor visibility.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod cursor-show ((b modern-backend))
|
||||
(backend-write b (format nil "~C[?25h" #\Esc)))
|
||||
#+END_SRC
|
||||
@@ -889,7 +889,7 @@ Sends =?25h= to restore the cursor visibility.
|
||||
Sets the cursor shape (block/underline/bar, optionally blinking) by
|
||||
delegating to =cursor-style-escape=.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod cursor-style ((b modern-backend) shape &key blink)
|
||||
(backend-write b (cursor-style-escape shape blink)))
|
||||
#+END_SRC
|
||||
@@ -900,7 +900,7 @@ Enables basic mouse tracking, button-event tracking (drag), and SGR
|
||||
extended mouse mode. These three modes together give full mouse
|
||||
support while staying compatible with modern terminal emulators.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod enable-mouse ((b modern-backend))
|
||||
(backend-write b (format nil "~C[?1000h" #\Esc))
|
||||
(backend-write b (format nil "~C[?1002h" #\Esc))
|
||||
@@ -914,7 +914,7 @@ Enables bracketed paste mode, where the terminal wraps pasted text in
|
||||
=ESC[200~= and =ESC[201~= delimiters. This allows the application to
|
||||
distinguish user input from pasted content.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod enable-bracketed-paste ((b modern-backend))
|
||||
(backend-write b (format nil "~C[?2004h" #\Esc))
|
||||
(finish-output (backend-output-stream b)))
|
||||
@@ -925,7 +925,7 @@ distinguish user input from pasted content.
|
||||
Begins a synchronized update frame using DECICM. Sets the =in-sync-p=
|
||||
slot so other methods can check whether we are inside a sync block.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod begin-sync ((b modern-backend))
|
||||
(setf (in-sync-p b) t)
|
||||
(backend-write b (decicm-begin)))
|
||||
@@ -936,7 +936,7 @@ slot so other methods can check whether we are inside a sync block.
|
||||
Ends the synchronized update frame and flushes the output, causing the
|
||||
terminal to render the buffered changes atomically.
|
||||
|
||||
#+BEGIN_SRC lisp :tangle ../src/backend/modern.lisp
|
||||
#+BEGIN_SRC lisp :tangle ~/.local/share/cl-tty/src/backend/modern.lisp
|
||||
(defmethod end-sync ((b modern-backend))
|
||||
(setf (in-sync-p b) nil)
|
||||
(backend-write b (decicm-end))
|
||||
|
||||
Reference in New Issue
Block a user