[lice @ some bug fixes, a makefile, autoconf support]
[lice.git] / render.lisp
blob3270c8794e873dc7c10a0d972ece147fc2651c4f
1 ;;; frame rendering routines
3 (in-package "LICE")
5 ;; The defmethods are found in the *-render.lisp files
6 (defgeneric frame-start-render (frame)
7 (:documentation "Do any setup we need before we beginning rendering the frame."))
9 (defgeneric frame-end-render (frame)
10 (:documentation "Do any cleanup or refreshing after the frame is rendered."))
12 ;; the defmethods are found in the *-render.lisp files
13 (defgeneric window-render (window frame)
14 (:documentation "Render the window in the given frame."))
16 (defgeneric frame-read-event (frame)
17 (:documentation "Read a keyboard event for the specified frame."))
19 (defgeneric frame-move-cursor (frame window x y)
20 (:documentation "Move the cursor to the X,Y location in WINDOW on the frame, FRAME."))
22 (defun frame-render (frame)
23 "Render a frame."
24 (let (cursor-x cursor-y win)
25 (labels ((render (tree)
26 (cond ((null tree) nil)
27 ((atom tree)
28 ;; reset the cache
29 (window-reset-cache tree)
30 ;; Figure out what part to display
31 (window-framer tree
32 (window-point tree)
33 (truncate (window-height tree) 2))
34 (dformat +debug-vvv+ "after framer: ~a~%"
35 (lc-cache (window-cache tree)))
36 ;; display it
37 (multiple-value-bind (x y) (window-render tree frame)
38 (when (eq tree (frame-selected-window frame))
39 (setf win tree cursor-x x cursor-y y))))
40 (t (cons (render (car tree))
41 (render (cdr tree)))))))
42 (frame-start-render frame)
43 (render (frame-window-tree frame))
44 (when (and win cursor-x cursor-y)
45 (frame-move-cursor frame win cursor-x cursor-y))
46 (frame-end-render frame))))