;;; -*- Mode:LISP; Package:USER; Readtable:ZL; Base:10 -*- ;;; Compile this and run (start-my-scroll). ;;; Until you press C-Abort, the window will display and update the ;;; numbers maintained in the window's value array. In this example, the ;;; values are just incremented forever; a real application would ;;; presumably be monitoring the values maintained by an external source. (defflavor my-scroll-window () (tv:scroll-window)) (defvar *my-scroll-window* nil "Current scroll window [for debugging]") (defvar *my-scroll-size* 5 "Number of entries in the value array") ;;; UPDATE-MY-SCROLL demonstrates how to insert new values into ;;; the value array. INIT-MY-SCROLL provides the initial values. (defun init-my-scroll(window) (let((v (send window :value-array))) (dotimes(i *my-scroll-size*) (setf (aref v i) 100.0)))) (defun update-my-scroll(window) (let((v (send window :value-array))) (do-forever (dotimes (j 100) (dotimes(i *my-scroll-size*) (setf (aref v i) (+ (aref v i) i))) ;;Force window to redisplay values (send window :redisplay)) ;emergency escape by C-Abort (sleep 1)))) (defun start-my-scroll() (setq *my-scroll-window* (make-instance 'my-scroll-window :value-array (make-array *my-scroll-size*) :display-item (append (list () (tv:scroll-parse-item '(:string "The root item"))) (set-scroll-items)))) (unwind-protect (progn (init-my-scroll *my-scroll-window*) (send *my-scroll-window* :activate) (send *my-scroll-window* :expose) (send *my-scroll-window* :select) (update-my-scroll *my-scroll-window*)) (progn (send terminal-io :select) (if (y-or-n-p "Kill scroll window (answer 'N' to debug it) ?") (send *my-scroll-window* :kill))))) (defun set-scroll-items (&rest ignore) (loop for i from 0 to (1- *my-scroll-size*) collect (tv:scroll-parse-item `(:value ,i nil (,(string-append (format nil " This is item ~s" i) " = ~s"))))))