Index: main/cdk.lisp
===================================================================
--- main/cdk.lisp	(revision main,7)
+++ main/cdk.lisp	(revision main,8)
Index: main/flat-menu.lisp
===================================================================
--- main/flat-menu.lisp	(revision main,7)
+++ main/flat-menu.lisp	(revision main,8)
@@ -8,51 +8,54 @@
 
 (defclass entry ()
+  ((text :initarg :text)))
+
+(defun draw-entry (entry window row column)
+  (with-slots (text) entry
+    (cdk::move-and-add-string window row column text)))
+
+
+
+(defclass menu ()
   ((window :initarg :window)
    (row :initarg :row)
    (column :initarg :column)
-   (text :initarg :text)
-   (highlight :accessor highlight)))
+   (entries :type vector :initarg :entries)
+   (selected :type (integer 0) :initform 0 :accessor selected)))
 
-(defun draw-entry (entry)
-  (with-slots (window row column text highlight) entry
-    (when highlight
+(defun redraw-selected (menu with-highlight)
+  (with-slots (window row column entries selected) menu
+    (when with-highlight
       (cdk::c-wattron window 262144))
-    (cdk::move-and-add-string window row column text)
-    (when highlight
+    (draw-entry (aref entries selected) window (+ row selected) column)
+    (when with-highlight
       (cdk::c-wattroff window 262144))))
 
-(defmethod (setf highlight) :after (flag (entry entry))
-  (draw-entry entry))
+(defmethod (setf selected) :before (i (menu menu))
+  (redraw-selected menu nil))
 
-(defun activate-entry (entry)
-  (with-slots (window) entry
-    (setf (highlight entry) t)
-    (cdk::c-refresh-window window)
-    (let ((ch (cdk::c-wgetch window)))
-      (setf (highlight entry) nil)
-      ch)))
+(defun bound (a b c)
+  (min (max a b) c))
 
-(defclass menu ()
-  ((entries :type vector :initarg :entries)
-   (selected :type (integer 0) :accessor selected)))
+(defmethod (setf selected) :around (i (menu menu))
+  (call-next-method (bound 0 i (1- (length (slot-value menu 'entries)))) menu))
+
+(defmethod (setf selected) :after (i (menu menu))
+  (redraw-selected menu t))
 
 (defmethod initialize-instance :after ((menu menu) &rest initargs)
-  (with-slots (entries) menu
-    (dotimes (i (length entries))
-      (setf (highlight (aref entries i)) nil))
-    (setf (selected menu) 0)))
+  (declare (ignore initargs))
+  (setf (selected menu) 0))
 
 (defun activate-menu (menu)
-  (with-slots (entries selected) menu
-    (loop
-       (multiple-value-bind (exit) (activate-entry (aref entries selected))
-         (cond
-           ((= exit 258)
-            
-            (incf selected))
-           ((= exit 259)
-            (decf selected))
-           (t (break)))
-         (setf selected (mod selected (length entries)))))))
+  (with-slots (window) menu
+    (with-accessors ((selected selected)) menu
+      (loop
+         (let ((ch (cdk::c-wgetch window)))
+           (cond
+             ((= ch 258)
+              (incf selected))
+             ((= ch 259)
+              (decf selected))
+             (t (break))))))))
 
 (defun test ()
@@ -64,8 +67,7 @@
     (cdk::c-init-color)
     (cdk::c-erase-window screen)
-    (let ((entry1 (make-instance 'entry :window screen :row 5 :column 10 :text "Hello, world!"))
-          (entry2 (make-instance 'entry :window screen :row 6 :column 10 :text "Goodbye, galaxy!")))
-      (setf (highlight entry1) t)
-      (let ((menu (make-instance 'menu :entries (vector entry1 entry2))))
+    (let ((entry1 (make-instance 'entry :text "Hello, world!"))
+          (entry2 (make-instance 'entry :text "Goodbye, galaxy!")))
+      (let ((menu (make-instance 'menu :window screen :row 5 :column 10 :entries (vector entry1 entry2))))
         (activate-menu menu)
         (format t "Here~%")
