54 lines
1.7 KiB
Common Lisp
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))))
|