dotfiles/sbcl/.quicklisp/dists/quicklisp/software/croatoan-20191227-git/src/addstr.lisp
2020-02-18 14:21:14 -05:00

42 lines
1.8 KiB
Common Lisp

(in-package :de.anvi.croatoan)
(defun add-string (window string &key attributes fgcolor bgcolor color-pair style y x position n)
"Add the unrendered string to the window.
If n is given, add at most n chars from the string. If n is -1, as
many chars will be added that will fit on the line.
If the position coordinates y (row) and x (column) are given, move the
cursor to the position first and then add the object.
The position can also be passed in form of a two-element list."
(when (and y x) (move window y x))
(when position (apply #'move window position))
(let ((count (if n
(if (= n -1)
(- (width window) (cadr (cursor-position window)))
n)
;; we cant use length to determine the length of a complex string
;; because it is not a sequence.
(typecase string
(string (length string))
(complex-string (length (complex-char-array string)))))))
(typecase string
(string
;;(if (or attributes fgcolor bgcolor color-pair style)
;; lisp string combined with attributes and colors
(loop
repeat count
for ch across string
do (add-wide-char window ch :attributes attributes :fgcolor fgcolor :bgcolor bgcolor
:color-pair color-pair :style style)) )
;; simple lisp string, no attributes or colors
;; TODO 190826 we dont want to use this because we want to force color-set and bkgd to use separate colors
;;(if n
;; (%waddnstr (winptr window) string n)
;; (%waddstr (winptr window) string))))
(complex-string
(loop
repeat count
for ch across (complex-char-array string)
do (add-wide-char window ch))))))