Index: main/Makefile
===================================================================
--- main/Makefile	(revision main,1)
+++ main/Makefile	(revision main,1)
@@ -0,0 +1,1 @@
+menu2.so: menu2
Index: main/curses.lisp
===================================================================
--- main/curses.lisp	(revision main,1)
+++ main/curses.lisp	(revision main,1)
@@ -0,0 +1,57 @@
+(defpackage #:curses
+  (:use #:cl #:cffi))
+
+(in-package #:curses)
+
+
+
+(define-foreign-library ncurses
+  (t (:default "libncurses")))
+
+(use-foreign-library ncurses)
+
+(defctype window* :pointer)
+
+(defcfun initscr window*)
+(defcfun endwin :int)
+(defcfun refresh :int)
+(defcfun cbreak :int)
+(defcfun noecho :int)
+(defcfun getch :int)
+
+
+
+(define-foreign-library menu
+  (t (:default "libmenu")))
+
+(use-foreign-library menu)
+
+(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))
+
+
+
+(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 ()
+  (initscr)
+  (cbreak)
+  (noecho))
Index: main/menu2.c
===================================================================
--- main/menu2.c	(revision main,1)
+++ main/menu2.c	(revision main,1)
@@ -0,0 +1,85 @@
+#include <menu.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+typedef int menu2_h;
+
+#define _MAX_ITEMS 16
+
+struct menu2_t {
+	char *item_names[_MAX_ITEMS];
+	char *item_descriptions[_MAX_ITEMS];
+	int item_count;
+};
+
+static const int _MAX_MENUS = 16;
+
+
+
+static struct menu2_t *_menus[16];
+
+
+
+static int menu2_init(int i)
+{
+	_menus[i] = calloc(1, sizeof(struct menu2_t));
+	if(!_menus[i]) return 0;
+	return i + 1;
+}
+
+menu2_h menu2_create(void)
+{
+	int i;
+
+	for(i = 0; i < _MAX_MENUS; i++)
+		if(!_menus[i]) return menu2_init(i);
+
+	return 0;
+}
+
+int menu2_add_item(menu2_h menu, const char *name, const char *description)
+{
+	struct menu2_t *m = _menus[menu - 1];
+	if(!m) return 0;
+
+	if(m->item_count == _MAX_ITEMS) return 0;
+
+	m->item_names[m->item_count] = strdup(name);
+	m->item_descriptions[m->item_count] =
+		strdup(description ? description : name);
+	
+	++m->item_count;
+
+	return 1;
+}
+
+int menu2_destroy(menu2_h menu)
+{
+	struct menu2_t *m = _menus[menu - 1];
+	int i;
+
+	if(!m) return 0;
+
+	for(i = 0; i < m->item_count; i++) {
+		free(m->item_names[i]);
+		free(m->item_descriptions[i]);
+	}
+
+	free(m);
+	_menus[menu - 1] = NULL;
+
+	return 1;
+}
+
+int menu2_post(menu2_h menu)
+{
+	struct menu2_t *m = _menus[menu - 1];
+
+	if(!m) return 0;
+
+	blah
+}
+
+menu2_drive(int, int);
Index: main/tui.asd
===================================================================
--- main/tui.asd	(revision main,1)
+++ main/tui.asd	(revision main,1)
@@ -0,0 +1,5 @@
+;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp -*-
+
+(asdf:defsystem #:tui
+  :depends-on (#:cffi)
+  :components ((:file "curses")))
