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

54 lines
1.7 KiB
Common Lisp

(in-package :de.anvi.croatoan)
;; panel
;; panel stack extension for curses
;; http://invisible-island.net/ncurses/man/panel.3x.html
;; defined in source/classes.lisp
;; (defparameter *window-stack* nil)
(defun raise (win)
"Raise window one position in the stack."
(when (not (eq win (car *window-stack*)))
(let ((pos (position win *window-stack*)))
(rotatef (nth (1- pos) *window-stack*)
(nth pos *window-stack*)))))
(defun raise-to-top (win)
"Raise window to the top of the window stack."
(setf *window-stack* (cons win (remove win *window-stack*))))
(defun lower (win)
"Lower window one position in the stack."
(when (not (eq win (car (last *window-stack*))))
(let ((pos (position win *window-stack*)))
(rotatef (nth (1+ pos) *window-stack*)
(nth pos *window-stack*)))))
(defun lower-to-bottom (win)
"Lower window to the bottom of the window stack."
(when (not (eq win (car (last *window-stack*))))
(setf *window-stack* (append (remove win *window-stack*) (list win)))))
(defun empty-stack ()
"Remove all windows from the stack."
(setf *window-stack* nil))
(defun refresh-stack ()
"Touch and refresh visible windows in the window stack."
(if *window-stack*
(progn
(mapc #'(lambda (w)
(when (visiblep w)
(touch w)
(mark-for-refresh w)))
(reverse *window-stack*))
(refresh-marked))
(error "refresh stack: stack empty")))
;; https://www.informatimago.com/develop/lisp/l99/p19.lisp
;; todo: what if count is longer than a list? use mod
(defun rotate (list count)
(if (minusp count)
(rotate list (+ (length list) count))
(nconc (subseq list count) (subseq list 0 count))))