Index: main/Makefile
===================================================================
--- main/Makefile	(revision main,1)
+++ main/Makefile	(revision main,2)
@@ -1,1 +1,3 @@
-menu2.so: menu2
+menu2.so: menu2.c
+	rm -f menu2.so
+	gcc -shared -fPIC -o menu2.so menu2.c -lmenu -Wall -pedantic
Index: main/curses.lisp
===================================================================
--- main/curses.lisp	(revision main,1)
+++ main/curses.lisp	(revision main,2)
@@ -22,33 +22,17 @@
 
 
-(define-foreign-library menu
-  (t (:default "libmenu")))
+(define-foreign-library menu2
+  (t "/home/dsowen/lisp/tui/menu2.so"))
 
-(use-foreign-library menu)
+(use-foreign-library menu2)
 
-(defctype item* :pointer)
-(defctype menu* :pointer)
-
-(defcfun new-item item* (name :string) (description :string))
-(defcfun free-item :int (item item*))
-(defcfun new-menu menu* (items :pointer))
-(defcfun post-menu :int (menu menu*))
-(defcfun menu-driver :int (menu menu*) (c :int))
+(defcfun menu2-create :int)
+(defcfun menu2-add-item :int (menu :int) (name :string) (description :string))
+(defcfun menu2-destroy :int (menu :int))
+(defcfun menu2-post :int (menu :int))
+(defcfun menu2-drive :int (menu :int) (c :int))
+(defcfun menu2-unpost :int (menu :int))
 
 
-
-(defun make-menu (items)
-  (let* ((items-vector
-          (map 'vector
-               (lambda (item)
-                 (etypecase item
-                   (string (new-item (foreign-string-alloc item) (foreign-string-alloc item)))
-                   (cons (new-item (foreign-string-alloc (car item)) (foreign-string-alloc (cdr item))))))
-               items))
-         (foreign-items (foreign-alloc 'item*
-                                       :count (length items-vector)
-                                       :initial-contents items-vector
-                                       :null-terminated-p t)))
-    (new-menu foreign-items)))
 
 (defun init-screen ()
Index: main/menu2.c
===================================================================
--- main/menu2.c	(revision main,1)
+++ main/menu2.c	(revision main,2)
@@ -12,5 +12,8 @@
 	char *item_names[_MAX_ITEMS];
 	char *item_descriptions[_MAX_ITEMS];
+	ITEM *item_structs[_MAX_ITEMS + 1];
 	int item_count;
+
+	MENU *menu_struct; /* Only set when posted. */
 };
 
@@ -43,13 +46,17 @@
 {
 	struct menu2_t *m = _menus[menu - 1];
+	int *i;
+
 	if(!m) return 0;
 
-	if(m->item_count == _MAX_ITEMS) return 0;
+	i = &(m->item_count);
+	if(*i == _MAX_ITEMS) return 0;
 
-	m->item_names[m->item_count] = strdup(name);
-	m->item_descriptions[m->item_count] =
-		strdup(description ? description : name);
+	m->item_names[*i] = strdup(name);
+	m->item_descriptions[*i] = strdup(description ? description : name);
+	m->item_structs[*i] =
+		new_item(m->item_names[*i], m->item_descriptions[*i]);
 	
-	++m->item_count;
+	++(*i);
 
 	return 1;
@@ -64,6 +71,7 @@
 
 	for(i = 0; i < m->item_count; i++) {
+		free_item(m->item_structs[i]);
+		free(m->item_descriptions[i]);
 		free(m->item_names[i]);
-		free(m->item_descriptions[i]);
 	}
 
@@ -79,7 +87,35 @@
 
 	if(!m) return 0;
+	if(m->menu_struct) return 0;
 
-	blah
+	m->menu_struct = new_menu(m->item_structs);
+	post_menu(m->menu_struct);
+
+	return 1;
 }
 
-menu2_drive(int, int);
+int menu2_drive(menu2_h menu, int c)
+{
+	struct menu2_t *m = _menus[menu - 1];
+
+	if(!m) return 0;
+	if(!m->menu_struct) return 0;
+
+	menu_driver(m->menu_struct, c);
+
+	return 1;
+}
+
+int menu2_unpost(menu2_h menu)
+{
+	struct menu2_t *m = _menus[menu - 1];
+
+	if(!m) return 0;
+	if(!m->menu_struct) return 0;
+
+	unpost_menu(m->menu_struct);
+	free_menu(m->menu_struct);
+	m->menu_struct = NULL;
+
+	return 1;
+}
