]> Zhao Yanbai Git Server - minix.git/commitdiff
Importing lib/libmenu 43/1143/1
authorThomas Cort <tcort@minix3.org>
Tue, 12 Nov 2013 12:39:59 +0000 (07:39 -0500)
committerThomas Cort <tcort@minix3.org>
Tue, 12 Nov 2013 12:39:59 +0000 (07:39 -0500)
No Minix-specific changes needed.

Change-Id: Ifab9a44bd401aebf99ab019697937620d88d47de

36 files changed:
distrib/sets/lists/minix/mi
lib/Makefile
lib/libmenu/Makefile [new file with mode: 0644]
lib/libmenu/attributes.c [new file with mode: 0644]
lib/libmenu/driver.c [new file with mode: 0644]
lib/libmenu/eti.h [new file with mode: 0644]
lib/libmenu/internals.c [new file with mode: 0644]
lib/libmenu/internals.h [new file with mode: 0644]
lib/libmenu/item.c [new file with mode: 0644]
lib/libmenu/menu.c [new file with mode: 0644]
lib/libmenu/menu.h [new file with mode: 0644]
lib/libmenu/menu_attributes.3 [new file with mode: 0644]
lib/libmenu/menu_cursor.3 [new file with mode: 0644]
lib/libmenu/menu_driver.3 [new file with mode: 0644]
lib/libmenu/menu_format.3 [new file with mode: 0644]
lib/libmenu/menu_hook.3 [new file with mode: 0644]
lib/libmenu/menu_item_current.3 [new file with mode: 0644]
lib/libmenu/menu_item_name.3 [new file with mode: 0644]
lib/libmenu/menu_item_new.3 [new file with mode: 0644]
lib/libmenu/menu_item_opts.3 [new file with mode: 0644]
lib/libmenu/menu_item_userptr.3 [new file with mode: 0644]
lib/libmenu/menu_item_value.3 [new file with mode: 0644]
lib/libmenu/menu_item_visible.3 [new file with mode: 0644]
lib/libmenu/menu_items.3 [new file with mode: 0644]
lib/libmenu/menu_mark.3 [new file with mode: 0644]
lib/libmenu/menu_new.3 [new file with mode: 0644]
lib/libmenu/menu_opts.3 [new file with mode: 0644]
lib/libmenu/menu_pattern.3 [new file with mode: 0644]
lib/libmenu/menu_post.3 [new file with mode: 0644]
lib/libmenu/menu_userptr.3 [new file with mode: 0644]
lib/libmenu/menu_win.3 [new file with mode: 0644]
lib/libmenu/menus.3 [new file with mode: 0644]
lib/libmenu/post.c [new file with mode: 0644]
lib/libmenu/shlib_version [new file with mode: 0644]
lib/libmenu/userptr.c [new file with mode: 0644]
releasetools/nbsd_ports

index 3d8b83316659b8db3d4458fc5d10cbfa5b7062d0..caa2f4353e40ca99fe0943a206d35c895fc1a9f4 100644 (file)
 ./usr/include/env.h                    minix-sys
 ./usr/include/err.h                    minix-sys
 ./usr/include/errno.h                  minix-sys
+./usr/include/eti.h                    minix-sys
 ./usr/include/fcntl.h                  minix-sys
 ./usr/include/fenv.h                   minix-sys
 ./usr/include/fetch.h                  minix-sys
 ./usr/include/md4.h                    minix-sys
 ./usr/include/md5.h                    minix-sys
 ./usr/include/memory.h                 minix-sys
+./usr/include/menu.h                   minix-sys
 ./usr/include/minix                    minix-sys
 ./usr/include/minix/acpi.h             minix-sys
 ./usr/include/minix/audio_fw.h         minix-sys
 ./usr/lib/libmagic.so.0.0              minix-sys
 ./usr/lib/libmagic.so.0                        minix-sys
 ./usr/lib/libmagic.so                  minix-sys
+./usr/lib/libmenu.a                    minix-sys
+./usr/lib/libmenu.so                   minix-sys
+./usr/lib/libmenu.so.6                 minix-sys
+./usr/lib/libmenu.so.6.0               minix-sys
+./usr/lib/libmenu_pic.a                        minix-sys
 ./usr/lib/libminc.a                    minix-sys
 ./usr/lib/libminc_pic.a                        minix-sys
 ./usr/lib/libminixfs.a                 minix-sys
 ./usr/man/man3/ctime_r.3                               minix-sys
 ./usr/man/man3/ctime_rz.3                              minix-sys
 ./usr/man/man3/ctype.3                                 minix-sys
+./usr/man/man3/current_item.3                          minix-sys
 ./usr/man/man3/curses.3                                        minix-sys
 ./usr/man/man3/curses_addch.3                          minix-sys
 ./usr/man/man3/curses_addchstr.3                       minix-sys
 ./usr/man/man3/fputws.3                                        minix-sys
 ./usr/man/man3/fread.3                                 minix-sys
 ./usr/man/man3/free.3                                  minix-sys
+./usr/man/man3/free_item.3                             minix-sys
+./usr/man/man3/free_menu.3                             minix-sys
 ./usr/man/man3/freeaddrinfo.3                          minix-sys
 ./usr/man/man3/freeifaddrs.3                           minix-sys
 ./usr/man/man3/freopen.3                               minix-sys
 ./usr/man/man3/iswupper.3                                      minix-sys
 ./usr/man/man3/iswxdigit.3                                     minix-sys
 ./usr/man/man3/isxdigit.3                                      minix-sys
+./usr/man/man3/item_count.3                            minix-sys
+./usr/man/man3/item_description.3                      minix-sys
+./usr/man/man3/item_index.3                            minix-sys
+./usr/man/man3/item_init.3                             minix-sys
+./usr/man/man3/item_name.3                             minix-sys
+./usr/man/man3/item_opts.3                             minix-sys
+./usr/man/man3/item_opts_off.3                         minix-sys
+./usr/man/man3/item_opts_on.3                          minix-sys
+./usr/man/man3/item_selected.3                         minix-sys
+./usr/man/man3/item_term.3                             minix-sys
+./usr/man/man3/item_userptr.3                          minix-sys
+./usr/man/man3/item_value.3                            minix-sys
+./usr/man/man3/item_visible.3                          minix-sys
 ./usr/man/man3/j0.3                                    minix-sys
 ./usr/man/man3/j0f.3                                   minix-sys
 ./usr/man/man3/j1.3                                    minix-sys
 ./usr/man/man3/memory.3                                        minix-sys
 ./usr/man/man3/memrchr.3                                       minix-sys
 ./usr/man/man3/memset.3                                        minix-sys
+./usr/man/man3/menu_attributes.3                       minix-sys
+./usr/man/man3/menu_back.3                             minix-sys
+./usr/man/man3/menu_cursor.3                           minix-sys
+./usr/man/man3/menu_driver.3                           minix-sys
+./usr/man/man3/menu_fore.3                             minix-sys
+./usr/man/man3/menu_format.3                           minix-sys
+./usr/man/man3/menu_grey.3                             minix-sys
+./usr/man/man3/menu_hook.3                             minix-sys
+./usr/man/man3/menu_init.3                             minix-sys
+./usr/man/man3/menu_item_current.3                     minix-sys
+./usr/man/man3/menu_item_name.3                                minix-sys
+./usr/man/man3/menu_item_new.3                         minix-sys
+./usr/man/man3/menu_item_opts.3                                minix-sys
+./usr/man/man3/menu_item_userptr.3                     minix-sys
+./usr/man/man3/menu_item_value.3                       minix-sys
+./usr/man/man3/menu_item_visible.3                     minix-sys
+./usr/man/man3/menu_items.3                            minix-sys
+./usr/man/man3/menu_mark.3                             minix-sys
+./usr/man/man3/menu_new.3                              minix-sys
+./usr/man/man3/menu_opts.3                             minix-sys
+./usr/man/man3/menu_opts_off.3                         minix-sys
+./usr/man/man3/menu_opts_on.3                          minix-sys
+./usr/man/man3/menu_pad.3                              minix-sys
+./usr/man/man3/menu_pattern.3                          minix-sys
+./usr/man/man3/menu_post.3                             minix-sys
+./usr/man/man3/menu_sub.3                              minix-sys
+./usr/man/man3/menu_term.3                             minix-sys
+./usr/man/man3/menu_unmark.3                           minix-sys
+./usr/man/man3/menu_userptr.3                          minix-sys
+./usr/man/man3/menu_win.3                              minix-sys
+./usr/man/man3/menus.3                                 minix-sys
 ./usr/man/man3/mergesort.3                                     minix-sys
 ./usr/man/man3/meta.3                                  minix-sys
 ./usr/man/man3/mi_vector_hash.3                                        minix-sys
 ./usr/man/man3/napms.3                                 minix-sys
 ./usr/man/man3/ndbm.3                                  minix-sys
 ./usr/man/man3/network.3                                       minix-sys
+./usr/man/man3/new_item.3                              minix-sys
+./usr/man/man3/new_menu.3                              minix-sys
 ./usr/man/man3/newpad.3                                        minix-sys
 ./usr/man/man3/newterm.3                                       minix-sys
 ./usr/man/man3/newwin.3                                        minix-sys
 ./usr/man/man3/popcountl.3                                     minix-sys
 ./usr/man/man3/popcountll.3                                    minix-sys
 ./usr/man/man3/popen.3                                 minix-sys
+./usr/man/man3/pos_menu_cursor.3                       minix-sys
 ./usr/man/man3/posix2time.3                                    minix-sys
 ./usr/man/man3/posix2time_z.3                                  minix-sys
 ./usr/man/man3/posix_memalign.3                                        minix-sys
 ./usr/man/man3/posix_spawn_file_actions_destroy.3                      minix-sys
 ./usr/man/man3/posix_spawn_file_actions_init.3                 minix-sys
 ./usr/man/man3/posix_spawnp.3                  minix-sys
+./usr/man/man3/post_menu.3                             minix-sys
 ./usr/man/man3/pow.3                                   minix-sys
 ./usr/man/man3/powf.3                                  minix-sys
 ./usr/man/man3/p_query.3                                       minix-sys
 ./usr/man/man3/scalbf.3                                        minix-sys
 ./usr/man/man3/scalbn.3                                        minix-sys
 ./usr/man/man3/scalbnf.3                                       minix-sys
+./usr/man/man3/scale_menu.3                            minix-sys
 ./usr/man/man3/scandir.3                                       minix-sys
 ./usr/man/man3/scanf.3                                 minix-sys
 ./usr/man/man3/scanw.3                                 minix-sys
 ./usr/man/man3/secure_path.3                                   minix-sys
 ./usr/man/man3/seed48.3                                        minix-sys
 ./usr/man/man3/seekdir.3                                       minix-sys
+./usr/man/man3/set_current_item.3                      minix-sys
+./usr/man/man3/set_item_init.3                         minix-sys
+./usr/man/man3/set_item_term.3                         minix-sys
+./usr/man/man3/set_item_userptr.3                      minix-sys
+./usr/man/man3/set_item_value.3                                minix-sys
+./usr/man/man3/set_menu_back.3                         minix-sys
+./usr/man/man3/set_menu_fore.3                         minix-sys
+./usr/man/man3/set_menu_format.3                       minix-sys
+./usr/man/man3/set_menu_grey.3                         minix-sys
+./usr/man/man3/set_menu_init.3                         minix-sys
+./usr/man/man3/set_menu_items.3                                minix-sys
+./usr/man/man3/set_menu_mark.3                         minix-sys
+./usr/man/man3/set_menu_opts.3                         minix-sys
+./usr/man/man3/set_menu_pad.3                          minix-sys
+./usr/man/man3/set_menu_sub.3                          minix-sys
+./usr/man/man3/set_menu_term.3                         minix-sys
+./usr/man/man3/set_menu_unmark.3                       minix-sys
+./usr/man/man3/set_menu_userptr.3                      minix-sys
+./usr/man/man3/set_menu_win.3                          minix-sys
+./usr/man/man3/set_top_row.3                           minix-sys
 ./usr/man/man3/setbuf.3                                        minix-sys
 ./usr/man/man3/setbuffer.3                                     minix-sys
 ./usr/man/man3/setclasscontext.3                                       minix-sys
 ./usr/man/man3/tok_reset.3             minix-sys
 ./usr/man/man3/tok_str.3               minix-sys
 ./usr/man/man3/tolower.3                                       minix-sys
+./usr/man/man3/top_row.3                                       minix-sys
 ./usr/man/man3/touchline.3                                     minix-sys
 ./usr/man/man3/touchoverlap.3                                  minix-sys
 ./usr/man/man3/touchwin.3                                      minix-sys
 ./usr/man/man3/ungetch.3                                       minix-sys
 ./usr/man/man3/ungetwc.3                                       minix-sys
 ./usr/man/man3/unlockpt.3                                      minix-sys
+./usr/man/man3/unpost_menu.3                                   minix-sys
 ./usr/man/man3/unsetenv.3                                      minix-sys
 ./usr/man/man3/untouchwin.3                                    minix-sys
 ./usr/man/man3/unvis.3                                 minix-sys
index acf1819ce42c53266f2d9fd2f3efc5ad2862d0ac..f8bcb51b73c65912a5b23a175c7a5cb948d7135d 100644 (file)
@@ -180,7 +180,7 @@ SUBDIR+=    ../external/bsd/lutok/lib       # depends on lua and libstdc++
 .endif # (defined(__MINIX) && ${MKGCCCMDS} == "yes")
 
 #SUBDIR+=      libform         # depends on libcurses
-#SUBDIR+=      libmenu         # depends on libcurses
+SUBDIR+=       libmenu         # depends on libcurses
 #SUBDIR+=      libradius       # depends on libcrypto if (${MKCRYPTO} != "no")
 .if (${MKRUMP} != "no")
 SUBDIR+=       librump         # depends on librumpuser
diff --git a/lib/libmenu/Makefile b/lib/libmenu/Makefile
new file mode 100644 (file)
index 0000000..e219d6c
--- /dev/null
@@ -0,0 +1,77 @@
+#      $NetBSD: Makefile,v 1.9 2012/06/27 22:18:07 jdf Exp $
+#
+
+CPPFLAGS+=-I${.CURDIR}
+.if defined(DEBUG_MENUS)
+CFLAGS+=-g
+CPPFLAGS+=-DDEBUG
+LDFLAGS+=-g
+.endif
+LIB=   menu
+
+LIBDPLIBS+=    curses  ${.CURDIR}/../libcurses
+
+SRCS=  menu.c item.c userptr.c internals.c driver.c post.c attributes.c
+MAN=   menu_attributes.3 menu_item_name.3 menu_items.3 menu_userptr.3 \
+       menu_cursor.3 menu_item_new.3 menu_mark.3 menu_win.3 menu_driver.3 \
+       menu_item_opts.3 menu_new.3 menus.3 menu_format.3 menu_item_userptr.3 \
+       menu_opts.3 menu_hook.3 menu_item_value.3 menu_pattern.3 \
+       menu_item_current.3 menu_item_visible.3 menu_post.3
+MLINKS+=       menu_attributes.3 menu_back.3 \
+               menu_attributes.3 menu_fore.3 \
+               menu_attributes.3 menu_grey.3 \
+               menu_attributes.3 menu_pad.3 \
+               menu_attributes.3 set_menu_back.3 \
+               menu_attributes.3 set_menu_fore.3 \
+               menu_attributes.3 set_menu_grey.3 \
+               menu_attributes.3 set_menu_pad.3 \
+               menu_item_name.3 item_description.3 \
+               menu_item_name.3 item_name.3 \
+               menu_items.3 item_count.3 \
+               menu_items.3 set_menu_items.3 \
+               menu_userptr.3 set_menu_userptr.3 \
+               menu_cursor.3 pos_menu_cursor.3 \
+               menu_item_new.3 free_item.3 \
+               menu_item_new.3 new_item.3 \
+               menu_mark.3 menu_unmark.3 \
+               menu_mark.3 set_menu_mark.3 \
+               menu_mark.3 set_menu_unmark.3 \
+               menu_win.3 menu_sub.3 \
+               menu_win.3 scale_menu.3 \
+               menu_win.3 set_menu_sub.3 \
+               menu_win.3 set_menu_win.3 \
+               menu_item_opts.3 item_opts.3 \
+               menu_item_opts.3 item_opts_off.3 \
+               menu_item_opts.3 item_opts_on.3 \
+               menu_new.3 new_menu.3 \
+               menu_new.3 free_menu.3 \
+               menu_format.3 set_menu_format.3 \
+               menu_item_userptr.3 item_userptr.3 \
+               menu_item_userptr.3 set_item_userptr.3 \
+               menu_opts.3 menu_opts_off.3 \
+               menu_opts.3 menu_opts_on.3 \
+               menu_opts.3 set_menu_opts.3 \
+               menu_hook.3 item_init.3 \
+               menu_hook.3 item_term.3 \
+               menu_hook.3 menu_init.3 \
+               menu_hook.3 menu_term.3 \
+               menu_hook.3 set_item_init.3 \
+               menu_hook.3 set_item_term.3 \
+               menu_hook.3 set_menu_init.3 \
+               menu_hook.3 set_menu_term.3 \
+               menu_item_value.3 item_value.3 \
+               menu_item_value.3 set_item_value.3 \
+               menu_item_value.3 item_selected.3 \
+               menu_item_current.3 current_item.3 \
+               menu_item_current.3 item_index.3 \
+               menu_item_current.3 set_current_item.3 \
+               menu_item_current.3 set_top_row.3 \
+               menu_item_current.3 top_row.3 \
+               menu_item_visible.3 item_visible.3 \
+               menu_post.3 post_menu.3 \
+               menu_post.3 unpost_menu.3
+INCS=  menu.h eti.h
+INCSDIR=/usr/include
+
+.include <bsd.lib.mk>
+.include <bsd.subdir.mk>
diff --git a/lib/libmenu/attributes.c b/lib/libmenu/attributes.c
new file mode 100644 (file)
index 0000000..f352a64
--- /dev/null
@@ -0,0 +1,135 @@
+/*     $NetBSD: attributes.c,v 1.7 2003/03/09 01:08:47 lukem Exp $     */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: attributes.c,v 1.7 2003/03/09 01:08:47 lukem Exp $");
+
+#include <menu.h>
+
+/* defined in menu.c - the default menu struct */
+extern MENU _menui_default_menu;
+
+/*
+ * Set the menu foreground attribute
+ */
+int
+set_menu_fore(MENU *menu, attr_t attr)
+{
+       if (menu == NULL)
+               _menui_default_menu.fore = attr;
+       else
+               menu->fore = attr;
+        return E_OK;
+}
+
+/*
+ * Return the menu foreground attribute
+ */
+char
+menu_fore(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.fore;
+       else
+               return menu->fore;
+}
+
+/*
+ * Set the menu background attribute
+ */
+int
+set_menu_back(MENU *menu, attr_t attr)
+{
+       if (menu == NULL)
+               _menui_default_menu.back = attr;
+       else
+               menu->back = attr;
+        return E_OK;
+}
+
+/*
+ * Return the menu background attribute
+ */
+char
+menu_back(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.back;
+       else
+               return menu->back;
+}
+
+/*
+ * Set the menu greyed out attribute
+ */
+int
+set_menu_grey(MENU *menu, attr_t attr)
+{
+       if (menu == NULL)
+               _menui_default_menu.grey = attr;
+       else
+               menu->grey = attr;
+        return E_OK;
+}
+
+/*
+ * Return the menu greyed out attribute
+ */
+char
+menu_grey(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.grey;
+       else
+               return menu->grey;
+}
+
+/*
+ * Set the menu pad character - the filler char between name and description
+ */
+int
+set_menu_pad(MENU *menu, int pad)
+{
+       if (menu == NULL)
+               _menui_default_menu.pad = pad;
+       else
+               menu->pad = pad;
+        return E_OK;
+}
+
+/*
+ * Return the menu pad character
+ */
+int
+menu_pad(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.pad;
+       else
+               return menu->pad;
+}
diff --git a/lib/libmenu/driver.c b/lib/libmenu/driver.c
new file mode 100644 (file)
index 0000000..776135d
--- /dev/null
@@ -0,0 +1,288 @@
+/*     $NetBSD: driver.c,v 1.9 2003/03/09 01:08:48 lukem Exp $ */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: driver.c,v 1.9 2003/03/09 01:08:48 lukem Exp $");
+
+#include <menu.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include "internals.h"
+
+/*
+ * The guts of the menu library.  This function processes the character
+ * in c and performs actions based on the value of the character.  If the
+ * character is a normal one then the driver attempts to match the character
+ * against the items.  If the character is a recognised request then the
+ * request is processed by the driver, if the character is not a recognised
+ * request and is not printable then it assumed to be a user defined command.
+ */
+int
+menu_driver(MENU *menu, int c)
+{
+       int drv_top_row, drv_scroll, i, it, status = E_OK;
+       ITEM *drv_new_item;
+
+       i = 0;
+       
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+       if (menu->posted == 0)
+               return E_NOT_POSTED;
+       if (menu->items == NULL)
+               return E_NOT_CONNECTED;
+       if (*menu->items == NULL)
+               return E_NOT_CONNECTED;
+       if (menu->in_init == 1)
+               return E_BAD_STATE;
+
+         /* this one should never happen but just in case.... */
+       if (menu->items[menu->cur_item] == NULL)
+               return E_SYSTEM_ERROR;
+
+       drv_new_item = menu->items[menu->cur_item];
+       it = menu->cur_item;
+       drv_top_row = menu->top_row;
+       
+       if ((c > REQ_BASE_NUM) && (c <= MAX_COMMAND)) {
+                 /* is a known driver request  - first check if the pattern
+                  * buffer needs to be cleared, we do this on non-search
+                  * type requests.
+                  */
+               if (! ((c == REQ_BACK_PATTERN) || (c == REQ_NEXT_MATCH) ||
+                      (c == REQ_PREV_MATCH))) {
+                       if ((c == REQ_CLEAR_PATTERN)
+                           && (menu->pattern == NULL))
+                               return E_REQUEST_DENIED;
+                       free(menu->pattern);
+                       menu->pattern = NULL;
+                       menu->plen = 0;
+                       menu->match_len = 0;
+               }
+               
+               switch (c) {
+                 case REQ_LEFT_ITEM:
+                         drv_new_item = drv_new_item->left;
+                         break;
+                 case REQ_RIGHT_ITEM:
+                         drv_new_item = drv_new_item->right;
+                         break;
+                 case REQ_UP_ITEM:
+                         drv_new_item = drv_new_item->up;
+                         break;
+                 case REQ_DOWN_ITEM:
+                         drv_new_item = drv_new_item->down;
+                         break;
+                 case REQ_SCR_ULINE:
+                         if (drv_top_row == 0)
+                                 return E_REQUEST_DENIED;
+                         drv_top_row--;
+                         drv_new_item = drv_new_item->up;
+                         break;
+                 case REQ_SCR_DLINE:
+                         drv_top_row++;
+                         if ((drv_top_row + menu->rows - 1)> menu->item_rows)
+                                 return E_REQUEST_DENIED;
+                         drv_new_item = drv_new_item->down;
+                         break;
+                 case REQ_SCR_DPAGE:
+                         drv_scroll = menu->item_rows - menu->rows
+                                 - menu->top_row;
+                         if (drv_scroll > menu->rows) {
+                                 drv_scroll = menu->rows;
+                         }
+                         
+                         if (drv_scroll <= 0) {
+                                 return E_REQUEST_DENIED;
+                         } else {
+                                 drv_top_row += drv_scroll;
+                                 while (drv_scroll-- > 0)
+                                         drv_new_item = drv_new_item->down;
+                         }
+                         break;
+                 case REQ_SCR_UPAGE:
+                         if (menu->rows < menu->top_row) {
+                                 drv_scroll = menu->rows;
+                         } else {
+                                 drv_scroll = menu->top_row;
+                         }
+                         if (drv_scroll == 0)
+                                 return E_REQUEST_DENIED;
+
+                         drv_top_row -= drv_scroll;
+                         while (drv_scroll-- > 0)
+                                 drv_new_item = drv_new_item->up;
+                         break;
+                 case REQ_FIRST_ITEM:
+                         drv_new_item = menu->items[0];
+                         break;
+                 case REQ_LAST_ITEM:
+                         drv_new_item = menu->items[menu->item_count - 1];
+                         break;
+                 case REQ_NEXT_ITEM:
+                         if ((menu->cur_item + 1) >= menu->item_count) {
+                                 if ((menu->opts & O_NONCYCLIC)
+                                     == O_NONCYCLIC) {
+                                         return E_REQUEST_DENIED;
+                                 } else {
+                                         drv_new_item = menu->items[0];
+                                 }
+                         } else {
+                                 drv_new_item =
+                                         menu->items[menu->cur_item + 1];
+                         }
+                         break;
+                 case REQ_PREV_ITEM:
+                         if (menu->cur_item == 0) {
+                                 if ((menu->opts & O_NONCYCLIC)
+                                     == O_NONCYCLIC) {
+                                         return E_REQUEST_DENIED;
+                                 } else {
+                                         drv_new_item = menu->items[
+                                                 menu->item_count - 1];
+                                 }
+                         } else {
+                                 drv_new_item =
+                                         menu->items[menu->cur_item - 1];
+                         }
+                         break;
+                 case REQ_TOGGLE_ITEM:
+                         if ((menu->opts & (O_RADIO | O_ONEVALUE)) != 0) {
+                             if ((menu->opts & O_RADIO) == O_RADIO) {
+                                 if ((drv_new_item->opts & O_SELECTABLE)
+                                                       != O_SELECTABLE)
+                                         return E_NOT_SELECTABLE;
+
+                                   /* don't deselect selected item */
+                                 if (drv_new_item->selected == 1)
+                                         return E_REQUEST_DENIED;
+                                 
+                                 /* deselect all items */
+                                 for (i = 0; i < menu->item_count; i++) {
+                                     if ((menu->items[i]->selected) &&
+                                         (drv_new_item->index != i)) {
+                                         menu->items[i]->selected ^= 1;
+                                         _menui_draw_item(menu,
+                                               menu->items[i]->index);
+                                     }
+                                 }
+
+                                   /* turn on selected item */
+                                 drv_new_item->selected ^= 1;
+                                 _menui_draw_item(menu, drv_new_item->index);
+                             } else {
+                                 return E_REQUEST_DENIED;
+                             }
+                         } else {
+                                 if ((drv_new_item->opts
+                                      & O_SELECTABLE) == O_SELECTABLE) {
+                                           /* toggle select flag */
+                                         drv_new_item->selected ^= 1;
+                                           /* update item in menu */
+                                         _menui_draw_item(menu,
+                                               drv_new_item->index);
+                                 } else {
+                                         return E_NOT_SELECTABLE;
+                                 }
+                         }
+                         break;
+                 case REQ_CLEAR_PATTERN:
+                           /* this action is taken before the
+                              case statement */
+                         break;
+                 case REQ_BACK_PATTERN:
+                         if (menu->pattern == NULL)
+                                 return E_REQUEST_DENIED;
+                         
+                         if (menu->plen == 0)
+                                 return E_REQUEST_DENIED;
+                         menu->pattern[menu->plen--] = '\0';
+                         break;
+                 case REQ_NEXT_MATCH:
+                         if (menu->pattern == NULL)
+                                 return E_REQUEST_DENIED;
+
+                         status = _menui_match_pattern(menu, 0,
+                                                        MATCH_NEXT_FORWARD,
+                                                        &it);
+                         drv_new_item = menu->items[it];
+                         break;
+                 case REQ_PREV_MATCH:
+                         if (menu->pattern == NULL)
+                                 return E_REQUEST_DENIED;
+
+                         status = _menui_match_pattern(menu, 0,
+                                                        MATCH_NEXT_REVERSE,
+                                                        &it);
+                         drv_new_item = menu->items[it];
+                         break; 
+               }
+       } else if (c > MAX_COMMAND) {
+                 /* must be a user command */
+               return E_UNKNOWN_COMMAND;
+       } else if (isprint((unsigned char) c)) {
+                 /* otherwise search items for the character. */
+               status = _menui_match_pattern(menu, (unsigned char) c,
+                                              MATCH_FORWARD, &it);
+               drv_new_item = menu->items[it];
+
+                 /* update the position of the cursor if we are doing
+                  * show match and the current item has not changed.  If
+                  * we don't do this here it won't get done since the
+                  * display will not be updated due to the current item
+                  * not changing.
+                  */
+               if ((drv_new_item->index == menu->cur_item)
+                   && ((menu->opts & O_SHOWMATCH) == O_SHOWMATCH)) {
+                       pos_menu_cursor(menu);
+               }
+               
+                           
+       } else {
+                 /* bad character */
+               return E_BAD_ARGUMENT;
+       }
+
+       if (drv_new_item == NULL)
+               return E_REQUEST_DENIED;
+
+       if (drv_new_item->row < drv_top_row) drv_top_row = drv_new_item->row;
+       if (drv_new_item->row >= (drv_top_row + menu->rows))
+               drv_top_row = drv_new_item->row - menu->rows + 1;
+       
+       if ((drv_new_item->index != menu->cur_item)
+           || (drv_top_row != menu->top_row))
+               _menui_goto_item(menu, drv_new_item, drv_top_row);
+
+       return status;
+}
+
+               
+       
+               
+       
diff --git a/lib/libmenu/eti.h b/lib/libmenu/eti.h
new file mode 100644 (file)
index 0000000..84cff06
--- /dev/null
@@ -0,0 +1,50 @@
+/*     $NetBSD: eti.h,v 1.8 2001/06/13 10:45:59 wiz Exp $      */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#ifndef        _ETI_H_
+#define        _ETI_H_
+
+/* common return codes for libmenu and libpanel functions */
+
+#define E_OK              (0)
+#define E_SYSTEM_ERROR    (-1)
+#define E_BAD_ARGUMENT    (-2)
+#define E_POSTED          (-3)
+#define E_CONNECTED       (-4)
+#define E_BAD_STATE       (-5)
+#define E_NO_ROOM         (-6)
+#define E_NOT_POSTED      (-7)
+#define E_UNKNOWN_COMMAND (-8)
+#define E_NO_MATCH        (-9)
+#define E_NOT_SELECTABLE  (-10)
+#define E_NOT_CONNECTED   (-11)
+#define E_REQUEST_DENIED  (-12)
+#define E_INVALID_FIELD   (-13)
+#define E_CURRENT         (-14)
+
+#endif /* !_ETI_H_ */
diff --git a/lib/libmenu/internals.c b/lib/libmenu/internals.c
new file mode 100644 (file)
index 0000000..4b3cce0
--- /dev/null
@@ -0,0 +1,635 @@
+/*     $NetBSD: internals.c,v 1.15 2012/06/27 11:53:36 blymn Exp $     */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: internals.c,v 1.15 2012/06/27 11:53:36 blymn Exp $");
+
+#include <menu.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include "internals.h"
+
+/* internal function prototypes */
+static void
+_menui_calc_neighbours(MENU *menu, int item_no);
+static void _menui_redraw_menu(MENU *menu, int old_top_row, int old_cur_item);
+
+  /*
+   * Link all the menu items together to speed up navigation.  We need
+   * to calculate the widest item entry, then work out how many columns
+   * of items the window will accommodate and then how many rows there will
+   * be.  Once the layout is determined the neighbours of each item is
+   * calculated and the item structures updated.
+   */
+int
+_menui_stitch_items(MENU *menu)
+{
+       int i, row_major;
+
+       row_major = ((menu->opts & O_ROWMAJOR) == O_ROWMAJOR);
+
+       if (menu->posted == 1)
+               return E_POSTED;
+       if (menu->items == NULL)
+               return E_BAD_ARGUMENT;
+
+       menu->item_rows = menu->item_count / menu->cols;
+       menu->item_cols = menu->cols;
+       if (menu->item_count > (menu->item_rows * menu->item_cols))
+               menu->item_rows += 1;
+
+       _menui_max_item_size(menu);
+
+       for (i = 0; i < menu->item_count; i++) {
+                 /* fill in the row and column value of the item */
+               if (row_major) {
+                       menu->items[i]->row = i / menu->item_cols;
+                       menu->items[i]->col = i % menu->item_cols;
+               } else {
+                       menu->items[i]->row = i % menu->item_rows;
+                       menu->items[i]->col = i / menu->item_rows;
+               }
+
+               _menui_calc_neighbours(menu, i);
+       }
+
+       return E_OK;
+}
+
+  /*
+   * Calculate the neighbours for an item in menu.
+   */
+static void
+_menui_calc_neighbours(MENU *menu, int item_no)
+{
+       int neighbour, cycle, row_major, edge;
+       ITEM *item;
+
+       row_major = ((menu->opts & O_ROWMAJOR) == O_ROWMAJOR);
+       cycle = ((menu->opts & O_NONCYCLIC) != O_NONCYCLIC);
+       item = menu->items[item_no];
+
+       if (menu->item_rows < 2) {
+               if (cycle) {
+                       item->up = item;
+                       item->down = item;
+               } else {
+                       item->up = NULL;
+                       item->down = NULL;
+               }
+       } else {
+
+               /* up */
+               if (menu->item_cols < 2) {
+                       if (item_no == 0) {
+                               if (cycle)
+                                       item->up =
+                                           menu->items[menu->item_count - 1];
+                               else
+                                       item->up = NULL;
+                       } else
+                               item->up = menu->items[item_no - 1];
+               } else {
+                       edge = 0;
+                       if (row_major) {
+                               if (item->row == 0) {
+                                       neighbour =
+                                       (menu->item_rows - 1) * menu->item_cols
+                                               + item->col;
+                                       if (neighbour >= menu->item_count)
+                                               neighbour -= menu->item_cols;
+                                       edge = 1;
+                               } else
+                                       neighbour = item_no - menu->item_cols;
+                       } else {
+                               if (item->row == 0) {
+                                       neighbour = menu->item_rows * item->col
+                                               + menu->item_rows - 1;
+                                       if (neighbour >= menu->item_count)
+                                               neighbour = menu->item_count - 1;
+                                       edge = 1;
+                               } else
+                                       neighbour = item_no - 1;
+                       }
+
+
+                       item->up = menu->items[neighbour];
+                       if ((!cycle) && (edge == 1))
+                               item->up = NULL;
+               }
+
+               /* Down */
+               if (menu->item_cols < 2) {
+                       if (item_no == (menu->item_count - 1)) {
+                               if (cycle)
+                                       item->down = menu->items[0];
+                               else
+                                       item->down = NULL;
+                       } else
+                               item->down = menu->items[item_no + 1];
+               } else {
+                       edge = 0;
+                       if (row_major) {
+                               if (item->row == menu->item_rows - 1) {
+                                       neighbour = item->col;
+                                       edge = 1;
+                               } else {
+                                       neighbour = item_no + menu->item_cols;
+                                       if (neighbour >= menu->item_count) {
+                                               neighbour = item->col;
+                                               edge = 1;
+                                       }
+                               }
+                       } else {
+                               if (item->row == menu->item_rows - 1) {
+                                       neighbour = item->col * menu->item_rows;
+                                       edge = 1;
+                               } else {
+                                       neighbour = item_no + 1;
+                                       if (neighbour >= menu->item_count) {
+                                               neighbour = item->col
+                                                   * menu->item_rows;
+                                               edge = 1;
+                                       }
+                               }
+                       }
+
+                       item->down = menu->items[neighbour];
+                       if ((!cycle) && (edge == 1))
+                               item->down = NULL;
+               }
+       }
+
+       if (menu->item_cols < 2) {
+               if (cycle) {
+                       item->left = item;
+                       item->right = item;
+               } else {
+                       item->left = NULL;
+                       item->right = NULL;
+               }
+       } else {
+               /* left */
+               if (menu->item_rows < 2) {
+                       if (item_no == 0) {
+                               if (cycle)
+                                       item->left =
+                                           menu->items[menu->item_count - 1];
+                               else
+                                       item->left = NULL;
+                       } else
+                               item->left = menu->items[item_no - 1];
+               } else {
+                       edge = 0;
+                       if (row_major) {
+                               if (item->col == 0) {
+                                       neighbour = item_no + menu->cols - 1;
+                                       if (neighbour >= menu->item_count)
+                                               neighbour = menu->item_count - 1;
+                                       edge = 1;
+                               } else
+                                       neighbour = item_no - 1;
+                       } else {
+                               if (item->col == 0) {
+                                       neighbour = menu->item_rows
+                                           * (menu->item_cols - 1) + item->row;
+                                       if (neighbour >= menu->item_count)
+                                               neighbour -= menu->item_rows;
+                                       edge = 1;
+                               } else
+                                       neighbour = item_no - menu->item_rows;
+                       }
+
+                       item->left = menu->items[neighbour];
+                       if ((!cycle) && (edge == 1))
+                               item->left = NULL;
+               }
+
+               /* right */
+               if (menu->item_rows < 2) {
+                       if (item_no == menu->item_count - 1) {
+                               if (cycle)
+                                       item->right = menu->items[0];
+                               else
+                                       item->right = NULL;
+                       } else
+                               item->right = menu->items[item_no + 1];
+               } else {
+                       edge = 0;
+                       if (row_major) {
+                               if (item->col == menu->item_cols - 1) {
+                                       neighbour = item_no - menu->item_cols
+                                           + 1;
+                                       edge = 1;
+                               } else if (item_no == menu->item_count - 1) {
+                                       neighbour = item->row * menu->item_cols;
+                                       edge = 1;
+                               } else
+                                       neighbour = item_no + 1;
+                       } else {
+                               if (item->col == menu->item_cols - 1) {
+                                       neighbour = item->row;
+                                       edge = 1;
+                               } else {
+                                       neighbour = item_no + menu->item_rows;
+                                       if (neighbour >= menu->item_count) {
+                                               neighbour = item->row;
+                                               edge = 1;
+                                       }
+                               }
+                       }
+
+                       item->right = menu->items[neighbour];
+                       if ((!cycle) && (edge == 1))
+                               item->right = NULL;
+               }
+       }
+}
+
+/*
+ * Goto the item pointed to by item and adjust the menu structure
+ * accordingly.  Call the term and init functions if required.
+ */
+int
+_menui_goto_item(MENU *menu, ITEM *item, int new_top_row)
+{
+       int old_top_row = menu->top_row, old_cur_item = menu->cur_item;
+
+         /* If we get a null then the menu is not cyclic so deny request */
+       if (item == NULL)
+               return E_REQUEST_DENIED;
+
+       menu->in_init = 1;
+       if (menu->top_row != new_top_row) {
+               if ((menu->posted == 1) && (menu->menu_term != NULL))
+                       menu->menu_term(menu);
+               menu->top_row = new_top_row;
+
+               if ((menu->posted == 1) && (menu->menu_init != NULL))
+                       menu->menu_init(menu);
+       }
+
+         /* this looks like wasted effort but it can happen.... */
+       if (menu->cur_item != item->index) {
+
+               if ((menu->posted == 1) && (menu->item_term != NULL))
+                       menu->item_term(menu);
+
+               menu->cur_item = item->index;
+               menu->cur_row = item->row;
+               menu->cur_col = item->col;
+
+               if (menu->posted == 1)
+                       _menui_redraw_menu(menu, old_top_row, old_cur_item);
+
+               if ((menu->posted == 1) && (menu->item_init != NULL))
+                       menu->item_init(menu);
+
+       }
+
+       menu->in_init = 0;
+       return E_OK;
+}
+
+/*
+ * Attempt to match items with the pattern buffer in the direction given
+ * by iterating over the menu items.  If a match is found return E_OK
+ * otherwise return E_NO_MATCH
+ */
+int
+_menui_match_items(MENU *menu, int direction, int *item_matched)
+{
+       int i, caseless;
+
+       caseless = ((menu->opts & O_IGNORECASE) == O_IGNORECASE);
+
+       i = menu->cur_item;
+       if (direction == MATCH_NEXT_FORWARD) {
+               if (++i >= menu->item_count) i = 0;
+       } else if (direction == MATCH_NEXT_REVERSE) {
+               if (--i < 0) i = menu->item_count - 1;
+       }
+
+
+       do {
+               if (menu->items[i]->name.length >= menu->plen) {
+                         /* no chance if pattern is longer */
+                       if (caseless) {
+                               if (strncasecmp(menu->items[i]->name.string,
+                                               menu->pattern,
+                                               (size_t) menu->plen) == 0) {
+                                       *item_matched = i;
+                                       menu->match_len = menu->plen;
+                                       return E_OK;
+                               }
+                       } else {
+                               if (strncmp(menu->items[i]->name.string,
+                                           menu->pattern,
+                                           (size_t) menu->plen) == 0) {
+                                       *item_matched = i;
+                                       menu->match_len = menu->plen;
+                                       return E_OK;
+                               }
+                       }
+               }
+
+               if ((direction == MATCH_FORWARD) ||
+                   (direction == MATCH_NEXT_FORWARD)) {
+                       if (++i >= menu->item_count) i = 0;
+               } else {
+                       if (--i <= 0) i = menu->item_count - 1;
+               }
+       } while (i != menu->cur_item);
+
+       menu->match_len = 0; /* match did not succeed - kill the match len. */
+       return E_NO_MATCH;
+}
+
+/*
+ * Attempt to match the pattern buffer against the items.  If c is a
+ * printable character then add it to the pattern buffer prior to
+ * performing the match.  Direction determines the direction of matching.
+ * If the match is successful update the item_matched variable with the
+ * index of the item that matched the pattern.
+ */
+int
+_menui_match_pattern(MENU *menu, int c, int direction, int *item_matched)
+{
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+       if (menu->items == NULL)
+               return E_BAD_ARGUMENT;
+       if (*menu->items == NULL)
+               return E_BAD_ARGUMENT;
+
+       if (isprint(c)) {
+                 /* add char to buffer - first allocate room for it */
+               if ((menu->pattern = (char *)
+                    realloc(menu->pattern,
+                            menu->plen + sizeof(char) +
+                            ((menu->plen > 0)? 0 : 1)))
+                   == NULL)
+                       return E_SYSTEM_ERROR;
+               menu->pattern[menu->plen] = c;
+               menu->pattern[++menu->plen] = '\0';
+
+                 /* there is no chance of a match if pattern is longer
+                    than all the items */
+               if (menu->plen >= menu->max_item_width) {
+                       menu->pattern[--menu->plen] = '\0';
+                       return E_NO_MATCH;
+               }
+
+               if (_menui_match_items(menu, direction,
+                                       item_matched) == E_NO_MATCH) {
+                       menu->pattern[--menu->plen] = '\0';
+                       return E_NO_MATCH;
+               } else
+                       return E_OK;
+       } else {
+               if (_menui_match_items(menu, direction,
+                                       item_matched) == E_OK) {
+                       return E_OK;
+               } else {
+                       return E_NO_MATCH;
+               }
+       }
+}
+
+/*
+ * Draw an item in the subwindow complete with appropriate highlighting.
+ */
+void
+_menui_draw_item(MENU *menu, int item)
+{
+       int j, pad_len, mark_len;
+
+       mark_len = max(menu->mark.length, menu->unmark.length);
+
+       wmove(menu->scrwin,
+             menu->items[item]->row - menu->top_row,
+             menu->items[item]->col * (menu->col_width + 1));
+
+       if (menu->cur_item == item)
+               wattrset(menu->scrwin, menu->fore);
+       if ((menu->items[item]->opts & O_SELECTABLE) != O_SELECTABLE)
+               wattron(menu->scrwin, menu->grey);
+
+         /* deal with the menu mark, if  one is set.
+          * We mark the selected items and write blanks for
+          * all others unless the menu unmark string is set in which
+          * case the unmark string is written.
+          */
+       if (menu->items[item]->selected == 1) {
+               if (menu->mark.string != NULL) {
+                       for (j = 0; j < menu->mark.length; j++) {
+                               waddch(menu->scrwin,
+                                      menu->mark.string[j]);
+                       }
+               }
+                 /* blank any length difference between mark & unmark */
+               for (j = menu->mark.length; j < mark_len; j++)
+                       waddch(menu->scrwin, ' ');
+       } else {
+               if (menu->unmark.string != NULL) {
+                       for (j = 0; j < menu->unmark.length; j++) {
+                               waddch(menu->scrwin,
+                                      menu->unmark.string[j]);
+                       }
+               }
+                 /* blank any length difference between mark & unmark */
+               for (j = menu->unmark.length; j < mark_len; j++)
+                       waddch(menu->scrwin, ' ');
+       }
+
+         /* add the menu name */
+       for (j=0; j < menu->items[item]->name.length; j++)
+               waddch(menu->scrwin,
+                      menu->items[item]->name.string[j]);
+
+       pad_len = menu->col_width - menu->items[item]->name.length
+               - mark_len - 1;
+       if ((menu->opts & O_SHOWDESC) == O_SHOWDESC) {
+               pad_len -= menu->items[item]->description.length - 1;
+               for (j = 0; j < pad_len; j++)
+                       waddch(menu->scrwin, menu->pad);
+               for (j = 0; j < menu->items[item]->description.length; j++) {
+                       waddch(menu->scrwin,
+                              menu->items[item]->description.string[j]);
+               }
+       } else {
+               for (j = 0; j < pad_len; j++)
+                       waddch(menu->scrwin, ' ');
+       }
+       menu->items[item]->visible = 1;
+
+         /* kill any special attributes... */
+       wattrset(menu->scrwin, menu->back);
+
+         /*
+          * Fill in the spacing between items, annoying but it looks
+          * odd if the menu items are inverse because the spacings do not
+          * have the same attributes as the items.
+          */
+       if ((menu->items[item]->col > 0) &&
+           (menu->items[item]->col < (menu->item_cols - 1))) {
+               wmove(menu->scrwin,
+                     menu->items[item]->row - menu->top_row,
+                     menu->items[item]->col * (menu->col_width + 1) - 1);
+               waddch(menu->scrwin, ' ');
+       }
+
+         /* and position the cursor nicely */
+       pos_menu_cursor(menu);
+}
+
+/*
+ * Draw the menu in the subwindow provided.
+ */
+int
+_menui_draw_menu(MENU *menu)
+{
+       int rowmajor, i, j, k, row = -1, col = -1, stride;
+       int incr, cur_row, offset, row_count;
+
+       rowmajor = ((menu->opts & O_ROWMAJOR) == O_ROWMAJOR);
+
+       if (rowmajor) {
+               stride = 1;
+               incr = menu->item_cols;
+       } else {
+               stride = menu->item_rows;
+               incr = 1;
+       }
+       row_count = 0;
+
+       for (i = 0;  i < menu->item_count; i += incr) {
+               if (menu->items[i]->row == menu->top_row)
+                       break;
+               row_count++;
+               for (j = 0; j < menu->item_cols; j++) {
+                       offset = j * stride + i;
+                       if (offset >= menu->item_count)
+                               break; /* done */
+                       menu->items[offset]->visible = 0;
+               }
+       }
+
+       wmove(menu->scrwin, 0, 0);
+
+       menu->col_width = getmaxx(menu->scrwin) / menu->cols;
+
+       for (cur_row = 0; cur_row < menu->rows; cur_row++) {
+               for (j = 0; j < menu->cols; j++) {
+                       offset = j * stride + i;
+                       if (offset >= menu->item_count) {
+                          /* no more items to draw, write background blanks */
+                               wattrset(menu->scrwin, menu->back);
+                               if (row < 0) {
+                                       row = menu->items[menu->item_count - 1]->row;
+                                       col = menu->items[menu->item_count - 1]->col;
+                               }
+
+                               wmove(menu->scrwin, cur_row,
+                                     j * (menu->col_width + 1));
+                               for (k = 0; k < menu->col_width; k++)
+                                       waddch(menu->scrwin, ' ');
+                       } else {
+                               _menui_draw_item(menu, offset);
+                       }
+               }
+
+               i += incr;
+               row_count++;
+       }
+
+       if (row_count < menu->item_rows) {
+               for (cur_row = row_count;  cur_row < menu->item_rows; cur_row++) {
+                       for (j = 0; j < menu->item_cols; j++) {
+                               offset = j * stride + i;
+                               if (offset >= menu->item_count)
+                                       break; /* done */
+                               menu->items[offset]->visible = 0;
+                       }
+                       i += incr;
+               }
+       }
+
+       return E_OK;
+}
+
+
+/*
+ * Calculate the widest menu item and stash it in the menu struct.
+ *
+ */
+void
+_menui_max_item_size(MENU *menu)
+{
+       int i, with_desc, width;
+
+       with_desc = ((menu->opts & O_SHOWDESC) == O_SHOWDESC);
+
+       for (i = 0; i < menu->item_count; i++) {
+               width = menu->items[i]->name.length
+                       + max(menu->mark.length, menu->unmark.length);
+               if (with_desc)
+                       width += menu->items[i]->description.length + 1;
+
+               menu->max_item_width = max(menu->max_item_width, width);
+       }
+}
+
+
+/*
+ * Redraw the menu on the screen.  If the current item has changed then
+ * unhighlight the old item and highlight the new one.
+ */
+static void
+_menui_redraw_menu(MENU *menu, int old_top_row, int old_cur_item)
+{
+
+       if (menu->top_row != old_top_row) {
+                 /* top row changed - redo the whole menu
+                  * XXXX this could be improved if we had wscrl implemented.
+
+                  * XXXX we could scroll the window and just fill in the
+                  * XXXX changed lines.
+                  */
+               wclear(menu->scrwin);
+               _menui_draw_menu(menu);
+       } else {
+               if (menu->cur_item != old_cur_item) {
+                         /* redo the old item as a normal one. */
+                       _menui_draw_item(menu, old_cur_item);
+               }
+                 /* and then redraw the current item */
+               _menui_draw_item(menu, menu->cur_item);
+       }
+}
diff --git a/lib/libmenu/internals.h b/lib/libmenu/internals.h
new file mode 100644 (file)
index 0000000..11fbc14
--- /dev/null
@@ -0,0 +1,53 @@
+/*     $NetBSD: internals.h,v 1.8 2001/06/13 10:45:59 wiz Exp $        */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <menu.h>
+
+#ifndef INTERNALS_H
+#define INTERNALS_H
+
+#define MATCH_FORWARD 1
+#define MATCH_REVERSE 2
+#define MATCH_NEXT_FORWARD 3
+#define MATCH_NEXT_REVERSE 4
+
+/* stole this from curses.h */
+#define max(a,b)        ((a) > (b) ? a : b)
+
+/* function prototypes */
+
+void _menui_draw_item(MENU *menu, int item);
+int _menui_draw_menu(MENU *menu);
+int _menui_goto_item(MENU *menu, ITEM *item, int new_top_row);
+int _menui_match_pattern(MENU *menu, int c, int direction ,
+                        int *item_matched);
+int _menui_match_items(MENU *menu, int direction, int *item_matched);
+void _menui_max_item_size(MENU *menu);
+int _menui_stitch_items(MENU *menu);
+
+#endif
diff --git a/lib/libmenu/item.c b/lib/libmenu/item.c
new file mode 100644 (file)
index 0000000..0276c78
--- /dev/null
@@ -0,0 +1,404 @@
+/*     $NetBSD: item.c,v 1.12 2012/03/21 05:33:27 matt Exp $   */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: item.c,v 1.12 2012/03/21 05:33:27 matt Exp $");
+
+#include <menu.h>
+#include <stdlib.h>
+#include <string.h>
+#include "internals.h"
+
+/* the following is defined in menu.c - it is the default menu struct */
+extern MENU _menui_default_menu;
+
+/* keep default item options for setting in new_item */
+ITEM _menui_default_item = {
+       {NULL, 0}, /* item name struct */
+       {NULL, 0}, /* item description struct */
+       NULL, /* user pointer */
+       0, /* is item visible? */
+       0, /* is item selected? */
+       0, /* row item is on */
+       0, /* column item is on */
+       O_SELECTABLE, /* item options */
+       NULL, /* parent menu item is bound to */
+       -1, /* index number if item attached to a menu */
+       NULL, /* left neighbour */
+       NULL, /* right neighbour */
+       NULL, /* up neighbour */
+       NULL /* down neighbour */
+};
+
+/*
+ * Return the item visibility flag
+ */
+int
+item_visible(ITEM *item)
+{
+       if (item == NULL)
+               return E_BAD_ARGUMENT;
+       if (item->parent == NULL)
+               return E_NOT_CONNECTED;
+       
+        return item->visible;
+}
+
+/*
+ * Return the pointer to the item name
+ */
+char *
+item_name(ITEM *item)
+{
+       if (item == NULL)
+               return NULL;
+       
+        return item->name.string;
+}
+
+/*
+ * Return the pointer to the item description
+ */
+char *
+item_description(ITEM *item)
+{
+       if (item == NULL)
+               return NULL;
+       
+        return item->description.string;
+}
+
+/*
+ * Set the application defined function called when the menu is posted or
+ * just after the current item changes.
+ */
+int
+set_item_init(MENU *menu, Menu_Hook func)
+{
+       if (menu == NULL)
+               _menui_default_menu.item_init = func;
+       else
+               menu->item_init = func;
+        return E_OK;
+}
+
+
+/*
+ * Return a pointer to the item initialisation routine.
+ */
+Menu_Hook
+item_init(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.item_init;
+       else
+               return menu->item_init;
+}
+
+/*
+ * Set the user defined function to be called when menu is unposted or just
+ * before the current item changes.
+ */
+int
+set_item_term(MENU *menu, Menu_Hook func)
+{
+       if (menu == NULL)
+               _menui_default_menu.item_term = func;
+       else
+               menu->item_term = func;
+        return E_OK;
+}
+
+/*
+ * Return a pointer to the termination function
+ */
+Menu_Hook
+item_term(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.item_term;
+       else
+               return menu->item_term;
+}
+
+/*
+ * Returns the number of items that are selected.
+ * The index numbers of the items are placed in the dynamically allocated
+ * int array *sel.
+ */
+int
+item_selected(MENU *menu, int **sel)
+{
+       int i, j;
+
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+
+       /* count selected */
+       for (i = 0, j = 0; i < menu->item_count; i++)
+               if (menu->items[i]->selected)
+                       j++;
+
+       if (j == 0) {
+               *sel = NULL;
+               return 0;
+       }
+       
+       if ( (*sel = malloc(sizeof(int) * j)) == NULL)
+               return E_SYSTEM_ERROR;
+
+       for (i = 0, j = 0; i < menu->item_count; i++)
+               if (menu->items[i]->selected)
+                       (*sel)[j++] = i;
+
+       return j;
+}
+
+/*
+ * Set the item options.  We keep a global copy of the current item options
+ * as subsequent new_item calls will use the updated options as their
+ * defaults.
+ */
+int
+set_item_opts(ITEM *item, OPTIONS opts)
+{
+          /* selectable seems to be the only allowable item opt! */
+        if (opts != O_SELECTABLE)
+                return E_SYSTEM_ERROR;
+
+       if (item == NULL)
+               _menui_default_item.opts = opts;
+       else
+               item->opts = opts;
+        return E_OK;
+}
+
+/*
+ * Set item options on.
+ */
+int
+item_opts_on(ITEM *item, OPTIONS opts)
+{
+        if (opts != O_SELECTABLE)
+                return E_SYSTEM_ERROR;
+
+        if (item == NULL)
+               _menui_default_item.opts |= opts;
+       else
+               item->opts |= opts;
+        return E_OK;
+}
+
+/*
+ * Turn off the named options.
+ */
+int
+item_opts_off(ITEM *item, OPTIONS opts)
+{
+        if (opts != O_SELECTABLE)
+                return E_SYSTEM_ERROR;
+
+       if (item == NULL)
+               _menui_default_item.opts &= ~(opts);
+       else
+               item->opts &= ~(opts);
+        return E_OK;
+}
+
+/*
+ * Return the current options set in item.
+ */
+OPTIONS
+item_opts(ITEM *item)
+{
+       if (item == NULL)
+               return _menui_default_item.opts;
+       else
+               return item->opts;
+}
+
+/*
+ * Set the selected flag of the item iff the menu options allow it.
+ */
+int
+set_item_value(ITEM *param_item, int flag)
+{
+       ITEM *item = (param_item != NULL) ? param_item : &_menui_default_item;
+       
+          /* not bound to a menu */
+        if (item->parent == NULL)
+                return E_NOT_CONNECTED;
+
+          /* menu options do not allow multi-selection */
+        if ((item->parent->opts & O_ONEVALUE) == O_ONEVALUE)
+                return E_REQUEST_DENIED;
+
+        item->selected = flag;
+       _menui_draw_item(item->parent, item->index);
+        return E_OK;
+}
+
+/*
+ * Return the item value of the item.
+ */
+int
+item_value(ITEM *item)
+{
+       if (item == NULL)
+               return _menui_default_item.selected;
+       else
+               return item->selected;
+}
+
+/*
+ * Allocate a new item and return the pointer to the newly allocated
+ * structure.
+ */
+ITEM *
+new_item(char *name, char *description)
+{
+        ITEM *new_one;
+
+       if (name == NULL)
+               return NULL;
+
+         /* allocate a new item structure for ourselves */
+        if ((new_one = (ITEM *)malloc(sizeof(ITEM))) == NULL)
+                return NULL;
+
+         /* copy in the defaults for the item */
+       (void)memcpy(new_one, &_menui_default_item, sizeof(ITEM));
+       
+         /* fill in the name structure - first the length and then
+            allocate room for the string & copy that. */
+       new_one->name.length = strlen(name);
+        if ((new_one->name.string = (char *)
+             malloc(sizeof(char) * new_one->name.length + 1)) == NULL) {
+                 /* uh oh malloc failed - clean up & exit */
+               free(new_one);
+                return NULL;
+        }
+        
+        strcpy(new_one->name.string, name);
+
+       if (description == NULL)
+               new_one->description.length = 0;
+       else {
+         /* fill in the description structure, stash the length then
+            allocate room for description string and copy it in */
+               new_one->description.length = strlen(description);
+               if ((new_one->description.string =
+                   (char *) malloc(sizeof(char) *
+                   new_one->description.length + 1)) == NULL) {
+                       /*
+                        * malloc has failed
+                        * - free up allocated memory and return
+                        */
+                       free(new_one->name.string);
+                       free(new_one);
+                       return NULL;
+               }
+       
+               strcpy(new_one->description.string, description);
+       }
+
+       return new_one;
+}
+
+/*
+ * Free the allocated storage associated with item.
+ */
+int
+free_item(ITEM *item)
+{
+       if (item == NULL)
+               return E_BAD_ARGUMENT;
+       
+         /* check for connection to menu */
+       if (item->parent != NULL)
+               return E_CONNECTED;
+
+         /* no connections, so free storage starting with the strings */
+       free(item->name.string);
+       if (item->description.length)
+               free(item->description.string);
+       free(item);
+       return E_OK;
+}
+
+/*
+ * Set the menu's current item to the one given.
+ */
+int
+set_current_item(MENU *param_menu, ITEM *item)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       int i = 0;
+
+         /* check if we have been called from an init type function */
+       if (menu->in_init == 1)
+               return E_BAD_STATE;
+
+         /* check we have items in the menu */
+       if (menu->items == NULL)
+               return E_NOT_CONNECTED;
+
+       if ((i = item_index(item)) < 0)
+                 /* item must not be a part of this menu */
+               return E_BAD_ARGUMENT;
+       
+       menu->cur_item = i;
+       return E_OK;
+}
+
+/*
+ * Return a pointer to the current item for the menu
+ */
+ITEM *
+current_item(MENU *menu)
+{
+       if (menu == NULL)
+               return NULL;
+       
+       if (menu->items == NULL)
+               return NULL;
+       
+       return menu->items[menu->cur_item];
+}
+
+/*
+ * Return the index into the item array that matches item.
+ */
+int
+item_index(ITEM *item)
+{
+       if (item == NULL)
+               return _menui_default_item.index;
+       else
+               return item->index;
+}
diff --git a/lib/libmenu/menu.c b/lib/libmenu/menu.c
new file mode 100644 (file)
index 0000000..dd49875
--- /dev/null
@@ -0,0 +1,743 @@
+/*     $NetBSD: menu.c,v 1.17 2012/03/21 05:33:27 matt Exp $   */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: menu.c,v 1.17 2012/03/21 05:33:27 matt Exp $");
+
+#include <ctype.h>
+#include <menu.h>
+#include <string.h>
+#include <stdlib.h>
+#include "internals.h"
+
+MENU _menui_default_menu = {
+       16,         /* number of item rows that will fit in window */
+        1,          /* number of columns of items that will fit in window */
+       0,          /* number of rows of items we have */
+       0,          /* number of columns of items we have */
+        0,          /* current cursor row */
+        0,          /* current cursor column */
+        {NULL, 0},  /* mark string */
+        {NULL, 0},  /* unmark string */
+        O_ONEVALUE, /* menu options */
+        NULL,       /* the pattern buffer */
+       0,          /* length of pattern buffer */
+       0,          /* the length of matched buffer */
+        0,          /* is the menu posted? */
+        A_REVERSE, /* menu foreground */
+        A_NORMAL,   /* menu background */
+        A_UNDERLINE,      /* unselectable menu item */
+        ' ',        /* filler between name and description */
+        NULL,       /* user defined pointer */
+       0,          /* top row of menu */
+       0,          /* widest item in the menu */
+       0,          /* the width of a menu column */
+       0,          /* number of items attached to the menu */
+        NULL,       /* items in the menu */
+        0,          /* current menu item */
+       0,          /* currently in a hook function */
+        NULL,       /* function called when menu posted */
+        NULL,       /* function called when menu is unposted */
+        NULL,       /* function called when current item changes */
+        NULL,       /* function called when current item changes */
+        NULL,       /* the menu window */
+       NULL,       /* the menu subwindow */
+       NULL,       /* the window to write to */
+};
+
+
+       
+/*
+ * Set the menu mark character
+ */
+int
+set_menu_mark(MENU *m, char *mark)
+{
+       MENU *menu = m;
+       
+       if (m == NULL) menu = &_menui_default_menu;
+       
+          /* if there was an old mark string, free it first */
+        if (menu->mark.string != NULL) free(menu->mark.string);
+
+        if ((menu->mark.string = (char *) malloc(strlen(mark) + 1)) == NULL)
+                return E_SYSTEM_ERROR;
+
+        strcpy(menu->mark.string, mark);
+       menu->mark.length = strlen(mark);
+
+         /* max item size may have changed - recalculate. */
+       _menui_max_item_size(menu);
+        return E_OK;
+}
+
+/*
+ * Return the menu mark string for the menu.
+ */
+char *
+menu_mark(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.mark.string;
+       else
+               return menu->mark.string;
+}
+
+/*
+ * Set the menu unmark character
+ */
+int
+set_menu_unmark(MENU *m, char *mark)
+{
+       MENU *menu = m;
+
+       if (m == NULL) menu = &_menui_default_menu;
+       
+          /* if there was an old mark string, free it first */
+        if (menu->unmark.string != NULL) free(menu->unmark.string);
+
+        if ((menu->unmark.string = (char *) malloc(strlen(mark) + 1)) == NULL)
+                return E_SYSTEM_ERROR;
+
+        strcpy(menu->unmark.string, mark);
+       menu->unmark.length = strlen(mark);
+         /* max item size may have changed - recalculate. */
+       _menui_max_item_size(menu);
+        return E_OK;
+}
+
+/*
+ * Return the menu unmark string for the menu.
+ */
+char *
+menu_unmark(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.unmark.string;
+       else
+               return menu->unmark.string;
+}
+
+/*
+ * Set the menu window to the window passed.
+ */
+int
+set_menu_win(MENU *menu, WINDOW *win)
+{
+       if (menu == NULL) {
+               _menui_default_menu.menu_win = win;
+               _menui_default_menu.scrwin = win;
+       } else {
+               if (menu->posted == TRUE) {
+                       return E_POSTED;
+               } else {
+                       menu->menu_win = win;
+                       menu->scrwin = win;
+               }
+       }
+       
+        return E_OK;
+}
+
+/*
+ * Return the pointer to the menu window
+ */
+WINDOW *
+menu_win(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.menu_win;
+       else
+               return menu->menu_win;
+}
+
+/*
+ * Set the menu subwindow for the menu.
+ */
+int
+set_menu_sub(MENU *menu, WINDOW *sub)
+{
+       if (menu == NULL) {
+               _menui_default_menu.menu_subwin = sub;
+               _menui_default_menu.scrwin = sub;
+       } else {
+               if (menu->posted == TRUE)
+                       return E_POSTED;
+               
+               menu->menu_subwin = sub;
+               menu->scrwin = sub;
+       }
+       
+        return E_OK;
+}
+
+/*
+ * Return the subwindow pointer for the menu
+ */
+WINDOW *
+menu_sub(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.menu_subwin;
+       else
+               return menu->menu_subwin;
+}
+
+/*
+ * Set the maximum number of rows and columns of items that may be displayed.
+ */
+int
+set_menu_format(MENU *param_menu, int rows, int cols)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       
+        menu->rows = rows;
+        menu->cols = cols;
+
+       if (menu->items != NULL)
+                 /* recalculate the item neighbours */
+               return _menui_stitch_items(menu);
+
+       return E_OK;
+}
+
+/*
+ * Return the max number of rows and cols that may be displayed.
+ */
+void
+menu_format(MENU *param_menu, int *rows, int *cols)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+
+        *rows = menu->rows;
+        *cols = menu->cols;
+}
+
+/*
+ * Set the user defined function to call when a menu is posted.
+ */
+int
+set_menu_init(MENU *menu, Menu_Hook func)
+{
+       if (menu == NULL)
+               _menui_default_menu.menu_init = func;
+       else
+               menu->menu_init = func;
+        return E_OK;
+}
+
+/*
+ * Return the pointer to the menu init function.
+ */
+Menu_Hook
+menu_init(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.menu_init;
+       else
+               return menu->menu_init;
+}
+
+/*
+ * Set the user defined function called when a menu is unposted.
+ */
+int
+set_menu_term(MENU *menu, Menu_Hook func)
+{
+       if (menu == NULL)
+               _menui_default_menu.menu_term = func;
+       else
+               menu->menu_term = func;
+        return E_OK;
+}
+
+/*
+ * Return the user defined menu termination function pointer.
+ */
+Menu_Hook
+menu_term(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.menu_term;
+       else
+               return menu->menu_term;
+}
+
+/*
+ * Return the current menu options set.
+ */
+OPTIONS
+menu_opts(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.opts;
+       else
+               return menu->opts;
+}
+
+/*
+ * Set the menu options to the given options.
+ */
+int
+set_menu_opts(MENU *param_menu, OPTIONS opts)
+{
+       int i, seen;
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       OPTIONS old_opts = menu->opts;
+       
+        menu->opts = opts;
+
+         /*
+          * If the radio option is selected then make sure only one
+          * item is actually selected in the items.
+          */
+       if (((opts & O_RADIO) == O_RADIO) && (menu->items != NULL) &&
+           (menu->items[0] != NULL)) {
+               seen = 0;
+               for (i = 0; i < menu->item_count; i++) {
+                       if (menu->items[i]->selected == 1) {
+                               if (seen == 0) {
+                                       seen = 1;
+                               } else {
+                                       menu->items[i]->selected = 0;
+                               }
+                       }
+               }
+
+                 /* if none selected, select the first item */
+               if (seen == 0)
+                       menu->items[0]->selected = 1;
+       }
+
+       if ((menu->opts & O_ROWMAJOR) != (old_opts &  O_ROWMAJOR))
+                 /* changed menu layout - need to recalc neighbours */
+               _menui_stitch_items(menu);
+       
+        return E_OK;
+}
+
+/*
+ * Turn on the options in menu given by opts.
+ */
+int
+menu_opts_on(MENU *param_menu, OPTIONS opts)
+{
+       int i, seen;
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       OPTIONS old_opts = menu->opts;
+
+        menu->opts |= opts;
+
+         /*
+          * If the radio option is selected then make sure only one
+          * item is actually selected in the items.
+          */
+       if (((opts & O_RADIO) == O_RADIO) && (menu->items != NULL) &&
+           (menu->items[0] != NULL)) {
+               seen = 0;
+               for (i = 0; i < menu->item_count; i++) {
+                       if (menu->items[i]->selected == 1) {
+                               if (seen == 0) {
+                                       seen = 1;
+                               } else {
+                                       menu->items[i]->selected = 0;
+                               }
+                       }
+               }
+                 /* if none selected then select the top item */
+               if (seen == 0)
+                       menu->items[0]->selected = 1;
+       }
+
+       if ((menu->items != NULL) &&
+           (menu->opts & O_ROWMAJOR) != (old_opts &  O_ROWMAJOR))
+                 /* changed menu layout - need to recalc neighbours */
+               _menui_stitch_items(menu);
+       
+        return E_OK;
+}
+
+/*
+ * Turn off the menu options given in opts.
+ */
+int
+menu_opts_off(MENU *param_menu, OPTIONS opts)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       OPTIONS old_opts = menu->opts;
+
+        menu->opts &= ~(opts);
+       
+       if ((menu->items != NULL ) &&
+           (menu->opts & O_ROWMAJOR) != (old_opts &  O_ROWMAJOR))
+                 /* changed menu layout - need to recalc neighbours */
+               _menui_stitch_items(menu);
+       
+        return E_OK;
+}
+
+/*
+ * Return the menu pattern buffer.
+ */
+char *
+menu_pattern(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.pattern;
+       else
+               return menu->pattern;
+}
+
+/*
+ * Set the menu pattern buffer to pat and attempt to match the pattern in
+ * the item list.
+ */
+int
+set_menu_pattern(MENU *param_menu, char *pat)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       char *p = pat;
+       
+         /* check pattern is all printable characters */
+       while (*p)
+               if (!isprint((unsigned char) *p++)) return E_BAD_ARGUMENT;
+       
+        if ((menu->pattern = (char *) realloc(menu->pattern,
+                                     sizeof(char) * strlen(pat) + 1)) == NULL)
+                return E_SYSTEM_ERROR;
+
+        strcpy(menu->pattern, pat);
+       menu->plen = strlen(pat);
+       
+          /* search item list for pat here */
+       return _menui_match_items(menu, MATCH_FORWARD, &menu->cur_item);
+}
+
+/*
+ * Allocate a new menu structure and fill it in.
+ */
+MENU *
+new_menu(ITEM **items)
+{
+        MENU *the_menu;
+        
+        if ((the_menu = (MENU *)malloc(sizeof(MENU))) == NULL)
+                return NULL;
+
+          /* copy the defaults */
+       (void)memcpy(the_menu, &_menui_default_menu, sizeof(MENU));
+
+         /* set a default window if none already set. */
+       if (the_menu->menu_win == NULL)
+               the_menu->scrwin = stdscr;
+
+         /* make a private copy of the mark string */
+       if (_menui_default_menu.mark.string != NULL) {
+               if ((the_menu->mark.string =
+                    (char *) malloc((unsigned) _menui_default_menu.mark.length + 1))
+                   == NULL) {
+                       free(the_menu);
+                       return NULL;
+               }
+
+               strlcpy(the_menu->mark.string, _menui_default_menu.mark.string,
+                       (unsigned) _menui_default_menu.mark.length + 1);
+       }
+       
+         /* make a private copy of the unmark string too */
+       if (_menui_default_menu.unmark.string != NULL) {
+               if ((the_menu->unmark.string =
+                    (char *) malloc((unsigned) _menui_default_menu.unmark.length + 1))
+                   == NULL) {
+                       free(the_menu);
+                       return NULL;
+               }
+
+               strlcpy(the_menu->unmark.string,
+                       _menui_default_menu.unmark.string,
+                       (unsigned) _menui_default_menu.unmark.length+ 1 );
+       }
+
+          /* now attach the items, if any */
+        if (items != NULL) {
+               if(set_menu_items(the_menu, items) < 0) {
+                       if (the_menu->mark.string != NULL)
+                               free(the_menu->mark.string);
+                       if (the_menu->unmark.string != NULL)
+                               free(the_menu->unmark.string);
+                       free(the_menu);
+                       return NULL;
+               }
+       }
+       
+       return the_menu;
+}
+
+/*
+ * Free up storage allocated to the menu object and destroy it.
+ */
+int
+free_menu(MENU *menu)
+{
+       int i;
+
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+       
+       if (menu->posted != 0)
+               return E_POSTED;
+       
+       if (menu->pattern != NULL)
+               free(menu->pattern);
+
+       if (menu->mark.string != NULL)
+               free(menu->mark.string);
+
+       if (menu->items != NULL) {
+                 /* disconnect the items from this menu */
+               for (i = 0; i < menu->item_count; i++) {
+                       menu->items[i]->parent = NULL;
+               }
+       }
+       
+       free(menu);
+       return E_OK;
+}
+
+/*
+ * Calculate the minimum window size for the menu.
+ */
+int
+scale_menu(MENU *param_menu, int *rows, int *cols)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       
+       if (menu->items == NULL)
+               return E_BAD_ARGUMENT;
+
+         /* calculate the max item size */
+       _menui_max_item_size(menu);
+
+       *rows = menu->rows;
+       *cols = menu->cols * menu->max_item_width;
+
+         /*
+          * allow for spacing between columns...
+          */
+       *cols += (menu->cols - 1);
+       
+       return E_OK;
+}
+
+/*
+ * Set the menu item list to the one given.
+ */
+int
+set_menu_items(MENU *param_menu, ITEM **items)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       int i, new_count = 0, sel_count = 0;
+       
+         /* don't change if menu is posted */
+       if (menu->posted == 1)
+               return E_POSTED;
+
+         /* count the new items and validate none are connected already */
+       while (items[new_count] != NULL) {
+               if ((items[new_count]->parent != NULL) &&
+                   (items[new_count]->parent != menu))
+                       return E_CONNECTED;
+               if (items[new_count]->selected == 1)
+                       sel_count++;
+               new_count++;
+       }
+
+         /*
+          * don't allow multiple selected items if menu is radio
+          * button style.
+          */
+       if (((menu->opts & O_RADIO) == O_RADIO) &&
+           (sel_count > 1))
+               return E_BAD_ARGUMENT;
+       
+         /* if there were items connected then disconnect them. */
+       if (menu->items != NULL) {
+               for (i = 0; i < menu->item_count; i++) {
+                       menu->items[i]->parent = NULL;
+                       menu->items[i]->index = -1;
+               }
+       }
+
+       menu->item_count = new_count;
+
+         /* connect the new items to the menu */
+       for (i = 0; i < new_count; i++) {
+               items[i]->parent = menu;
+               items[i]->index = i;
+       }
+
+       menu->items = items;
+       menu->cur_item = 0; /* reset current item just in case */
+       menu->top_row = 0; /* and the top row too */
+       if (menu->pattern != NULL) { /* and the pattern buffer....sigh */
+               free(menu->pattern);
+               menu->plen = 0;
+               menu->match_len = 0;
+       }
+       
+         /*
+          * make sure at least one item is selected on a radio
+          * button style menu.
+          */
+       if (((menu->opts & O_RADIO) == O_RADIO) && (sel_count == 0))
+               menu->items[0]->selected = 1;
+       
+       
+       _menui_stitch_items(menu); /* recalculate the item neighbours */
+       
+       return E_OK;
+}
+
+/*
+ * Return the pointer to the menu items array.
+ */
+ITEM **
+menu_items(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.items;
+       else
+               return menu->items;
+}
+
+/*
+ * Return the count of items connected to the menu
+ */
+int
+item_count(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.item_count;
+       else
+               return menu->item_count;
+}
+
+/*
+ * Set the menu top row to be the given row.  The current item becomes the
+ * leftmost item on that row in the menu.
+ */
+int
+set_top_row(MENU *param_menu, int row)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+       int i, cur_item, state = E_SYSTEM_ERROR;
+       
+       if (row > menu->item_rows)
+               return E_BAD_ARGUMENT;
+
+       if (menu->items == NULL)
+               return E_NOT_CONNECTED;
+
+       if (menu->in_init == 1)
+               return E_BAD_STATE;
+
+       cur_item = 0;
+       
+       for (i = 0; i < menu->item_count; i++) {
+                 /* search for first item that matches row - this will be
+                    the current item. */
+               if (row == menu->items[i]->row) {
+                       cur_item = i;
+                       state = E_OK;
+                       break; /* found what we want - no need to go further */
+               }
+       }
+
+       menu->in_init = 1; /* just in case we call the init/term routines */
+       
+       if (menu->posted == 1) {
+               if (menu->menu_term != NULL)
+                       menu->menu_term(menu);
+               if (menu->item_term != NULL)
+                       menu->item_term(menu);
+       }
+
+       menu->cur_item = cur_item;
+       menu->top_row = row;
+
+       if (menu->posted == 1) {
+               if (menu->menu_init != NULL)
+                       menu->menu_init(menu);
+               if (menu->item_init != NULL)
+                       menu->item_init(menu);
+       }
+
+       menu->in_init = 0;
+               
+         /* this should always be E_OK unless we are really screwed up */
+       return state;
+}
+
+/*
+ * Return the current top row number.
+ */
+int
+top_row(MENU *param_menu)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+
+       if (menu->items == NULL)
+               return E_NOT_CONNECTED;
+       
+       return menu->top_row;
+}
+
+/*
+ * Position the cursor at the correct place in the menu.
+ *
+ */
+int
+pos_menu_cursor(MENU *menu)
+{
+       int movx, maxmark;
+       
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+
+       maxmark = max(menu->mark.length, menu->unmark.length);
+       movx = maxmark + (menu->items[menu->cur_item]->col
+               * (menu->col_width + 1));
+       
+       if (menu->match_len > 0)
+               movx += menu->match_len - 1;
+       
+       wmove(menu->scrwin,
+             menu->items[menu->cur_item]->row - menu->top_row, movx);
+
+       return E_OK;
+}
diff --git a/lib/libmenu/menu.h b/lib/libmenu/menu.h
new file mode 100644 (file)
index 0000000..77eceaa
--- /dev/null
@@ -0,0 +1,210 @@
+/*     $NetBSD: menu.h,v 1.13 2004/03/22 19:01:09 jdc Exp $    */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#ifndef        _MENU_H_
+#define        _MENU_H_
+
+#include <curses.h>
+#include <eti.h>
+
+/* requests for the menu_driver call */
+#define REQ_BASE_NUM      (KEY_MAX + 0x200)
+#define REQ_LEFT_ITEM     (KEY_MAX + 0x201)
+#define REQ_RIGHT_ITEM    (KEY_MAX + 0x202)
+#define REQ_UP_ITEM       (KEY_MAX + 0x203)
+#define REQ_DOWN_ITEM     (KEY_MAX + 0x204)
+#define REQ_SCR_ULINE     (KEY_MAX + 0x205)
+#define REQ_SCR_DLINE     (KEY_MAX + 0x206)
+#define REQ_SCR_DPAGE     (KEY_MAX + 0x207)
+#define REQ_SCR_UPAGE     (KEY_MAX + 0x208)
+#define REQ_FIRST_ITEM    (KEY_MAX + 0x209)
+#define REQ_LAST_ITEM     (KEY_MAX + 0x20a)
+#define REQ_NEXT_ITEM     (KEY_MAX + 0x20b)
+#define REQ_PREV_ITEM     (KEY_MAX + 0x20c)
+#define REQ_TOGGLE_ITEM   (KEY_MAX + 0x20d)
+#define REQ_CLEAR_PATTERN (KEY_MAX + 0x20e)
+#define REQ_BACK_PATTERN  (KEY_MAX + 0x20f)
+#define REQ_NEXT_MATCH    (KEY_MAX + 0x210)
+#define REQ_PREV_MATCH    (KEY_MAX + 0x211)
+
+#define MAX_COMMAND       (KEY_MAX + 0x211) /* last menu driver request
+                                              - for application defined
+                                              commands */
+
+/* Menu options */
+typedef unsigned int OPTIONS;
+
+/* and the values they can have */
+#define O_ONEVALUE   (0x1)
+#define O_SHOWDESC   (0x2)
+#define O_ROWMAJOR   (0x4)
+#define O_IGNORECASE (0x8)
+#define O_SHOWMATCH  (0x10)
+#define O_NONCYCLIC  (0x20)
+#define O_SELECTABLE (0x40)
+#define O_RADIO      (0x80)
+
+typedef struct __menu_str {
+        char *string;
+        int length;
+} MENU_STR;
+
+typedef struct __menu MENU;
+typedef struct __item ITEM;
+
+typedef void (*Menu_Hook) (MENU *);
+
+struct __item {
+        MENU_STR name;
+        MENU_STR description;
+        char *userptr;
+        int visible;  /* set if item is visible */
+        int selected; /* set if item has been selected */
+       int row; /* menu row this item is on */
+       int col; /* menu column this item is on */
+        OPTIONS opts;
+        MENU *parent; /* menu this item is bound to */
+       int index; /* index number for this item, if attached */
+         /* The following are the item's neighbours - makes menu
+            navigation easier */
+       ITEM *left;
+       ITEM *right;
+       ITEM *up;
+       ITEM *down;
+};
+
+struct __menu {
+        int rows; /* max number of rows to be displayed */
+        int cols; /* max number of columns to be displayed */
+       int item_rows; /* number of item rows we have */
+       int item_cols; /* number of item columns we have */
+        int cur_row; /* current cursor row */
+        int cur_col; /* current cursor column */
+        MENU_STR mark; /* menu mark string */
+        MENU_STR unmark; /* menu unmark string */
+        OPTIONS opts; /* options for the menu */
+        char *pattern; /* the pattern buffer */
+       int plen;  /* pattern buffer length */
+       int match_len; /* length of pattern matched */
+        int posted; /* set if menu is posted */
+        attr_t fore; /* menu foreground */
+        attr_t back; /* menu background */
+        attr_t grey; /* greyed out (nonselectable) menu item */
+        int pad;  /* filler char between name and description */
+        char *userptr;
+       int top_row; /* the row that is at the top of the menu */
+       int max_item_width; /* widest item */
+       int col_width; /* width of the menu columns - this is not always
+                         the same as the widest item */
+        int item_count; /* number of items attached */
+        ITEM **items; /* items associated with this menu */
+        int  cur_item; /* item cursor is currently positioned at */
+        int in_init; /* set when processing an init or term function call */
+        Menu_Hook menu_init; /* call this when menu is posted */
+        Menu_Hook menu_term; /* call this when menu is unposted */
+        Menu_Hook item_init; /* call this when menu posted & after
+                                      current item changes */
+        Menu_Hook item_term; /* call this when menu unposted & just
+                                      before current item changes */
+        WINDOW *menu_win; /* the menu window */
+        WINDOW *menu_subwin; /* the menu subwindow */
+       WINDOW *scrwin; /* the window to write to */
+};
+
+
+/* Public function prototypes. */
+__BEGIN_DECLS
+int  menu_driver(MENU *, int);
+int scale_menu(MENU *, int *, int *);
+int set_top_row(MENU *, int);
+int pos_menu_cursor(MENU *);
+int top_row(MENU *);
+
+int  free_menu(MENU *);
+char menu_back(MENU *);
+char menu_fore(MENU *);
+void menu_format(MENU *, int *, int *);
+char menu_grey(MENU *);
+Menu_Hook menu_init(MENU *);
+char *menu_mark(MENU *);
+OPTIONS menu_opts(MENU *);
+int menu_opts_off(MENU *, OPTIONS);
+int menu_opts_on(MENU *, OPTIONS);
+int menu_pad(MENU *);
+char *menu_pattern(MENU *);
+WINDOW *menu_sub(MENU *);
+Menu_Hook menu_term(MENU *);
+char *menu_unmark (MENU *);
+char *menu_userptr(MENU *);
+WINDOW *menu_win(MENU *);
+MENU *new_menu(ITEM **);
+int post_menu(MENU *);
+int set_menu_back(MENU *, attr_t);
+int set_menu_fore(MENU *, attr_t);
+int set_menu_format(MENU *, int, int);
+int set_menu_grey(MENU *, attr_t);
+int set_menu_init(MENU *, Menu_Hook);
+int set_menu_items(MENU *, ITEM **);
+int set_menu_mark(MENU *, char *);
+int set_menu_opts(MENU *, OPTIONS);
+int set_menu_pad(MENU *, int);
+int set_menu_pattern(MENU *, char *);
+int set_menu_sub(MENU *, WINDOW *);
+int set_menu_term(MENU *, Menu_Hook);
+int set_menu_unmark(MENU *, char *);
+int set_menu_userptr(MENU *, char *);
+int  set_menu_win(MENU *, WINDOW *);
+int unpost_menu(MENU *);
+
+ITEM *current_item(MENU *);
+int free_item(ITEM *);
+int item_count(MENU *);
+char *item_description(ITEM *);
+int item_index(ITEM *);
+Menu_Hook item_init(MENU *);
+char *item_name(ITEM *);
+OPTIONS item_opts(ITEM *);
+int item_opts_off(ITEM *, OPTIONS);
+int item_opts_on(ITEM *, OPTIONS);
+int item_selected(MENU *, int **); /* return the item index of selected */
+Menu_Hook item_term(MENU *);
+char *item_userptr(ITEM *);
+int item_value(ITEM *);
+int item_visible(ITEM *);
+ITEM **menu_items(MENU *);
+ITEM *new_item(char *, char *);
+int set_current_item(MENU *, ITEM *);
+int set_item_init(MENU *, Menu_Hook);
+int set_item_opts(ITEM *, OPTIONS);
+int set_item_term(MENU *, Menu_Hook);
+int set_item_userptr(ITEM *, char *);
+int set_item_value(ITEM *, int);
+
+__END_DECLS
+
+#endif /* !_MENU_H_ */
diff --git a/lib/libmenu/menu_attributes.3 b/lib/libmenu/menu_attributes.3
new file mode 100644 (file)
index 0000000..a2d4833
--- /dev/null
@@ -0,0 +1,135 @@
+.\"    $NetBSD: menu_attributes.3,v 1.10 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ATTRIBUTES 3
+.Os
+.Sh NAME
+.Nm menu_back ,
+.Nm menu_fore ,
+.Nm menu_grey ,
+.Nm menu_pad ,
+.Nm set_menu_back ,
+.Nm set_menu_fore ,
+.Nm set_menu_grey ,
+.Nm set_menu_pad
+.Nd get and set menu attributes
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft char
+.Fn menu_back "MENU *menu"
+.Ft char
+.Fn menu_fore "MENU *menu"
+.Ft char
+.Fn menu_grey "MENU *menu"
+.Ft int
+.Fn menu_pad "MENU *menu"
+.Ft int
+.Fn set_menu_back "MENU *menu" "char attr"
+.Ft int
+.Fn set_menu_fore "MENU *menu" "char attr"
+.Ft int
+.Fn set_menu_grey "MENU *menu" "char attr"
+.Ft int
+.Fn set_menu_pad "MENU *menu" "int pad"
+.Sh DESCRIPTION
+The
+.Fn menu_back
+function returns the value of the background attribute for the menu
+passed.
+This attribute is set by the
+.Fn set_menu_back
+call.
+The
+.Fn menu_fore
+function returns the value of the foreground character attribute for
+the menu passed.
+This attribute is set by the
+.Fn set_menu_fore
+function.
+The
+.Fn menu_grey
+function returns the value of the grey or unselectable character
+attribute for the menu passed.
+This attribute is set by the
+.Fn set_menu_grey
+function.
+The
+.Fn menu_pad
+function returns the padding character that will be used between the
+item name and its description.
+The value of the pad character is set by the
+.Fn set_menu_pad
+function.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_UNKNOWN_COMMAND -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_CONNECTED
+An item was already connected to a menu.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NO_ROOM
+The menu does not fit within the subwindow.
+.It Er E_NOT_POSTED
+The menu is not posted.
+.It Er E_UNKNOWN_COMMAND
+The menu driver does not recognize the request passed to it.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.It Er E_NOT_SELECTABLE
+The item could not be selected.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_cursor.3 b/lib/libmenu/menu_cursor.3
new file mode 100644 (file)
index 0000000..b32c307
--- /dev/null
@@ -0,0 +1,91 @@
+.\"    $NetBSD: menu_cursor.3,v 1.9 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_CURSOR 3
+.Os
+.Sh NAME
+.Nm pos_menu_cursor
+.Nd position cursor in menu window
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn pos_menu_cursor "MENU *menu"
+.Sh DESCRIPTION
+The
+.Fn pos_menu_cursor
+function positions the cursor in the menu window.
+This function can be called after other curses calls to restore the cursor
+to its correct position in the menu.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_UNKNOWN_COMMAND -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_CONNECTED
+An item was already connected to a menu.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NO_ROOM
+The menu does not fit within the subwindow.
+.It Er E_NOT_POSTED
+The menu is not posted.
+.It Er E_UNKNOWN_COMMAND
+The menu driver does not recognize the request passed to it.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.It Er E_NOT_SELECTABLE
+The item could not be selected.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_driver.3 b/lib/libmenu/menu_driver.3
new file mode 100644 (file)
index 0000000..9f706f8
--- /dev/null
@@ -0,0 +1,136 @@
+.\"    $NetBSD: menu_driver.3,v 1.8 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_DRIVER 3
+.Os
+.Sh NAME
+.Nm menu_driver
+.Nd main menu handling function
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn menu_driver "MENU *menu" "int c"
+.Sh DESCRIPTION
+The
+.Fn menu_driver
+function is the guts of the menu system.
+It takes the commands passed
+by c parameter and performs the requested action on the menu given.
+The following commands may be given to the menu driver:
+.Pp
+.Bl -tag -width REQ_CLEAR_PATTERN -compact
+.It Command
+Action
+.It REQ_LEFT_ITEM
+Sets the new current item to be the item to the left of the current
+item.
+.It REQ_RIGHT_ITEM
+Sets the new current item to be the item to the rights of the current
+item.
+.It REQ_UP_ITEM
+Sets the new current item to be the item above the current item.
+.It REQ_DOWN_ITEM
+Sets the new current item to be the item below the current item.
+.It REQ_SCR_ULINE
+Scroll the menu one line towards the bottom of the menu window.
+The new current item becomes the item immediately above the current item.
+.It REQ_SCR_DLINE
+Scroll the menu one line towards the top of the menu window.
+The new current item becomes the item immediately below the current item.
+.It REQ_SCR_DPAGE
+Scroll the menu one page towards the bottom of the menu window.
+.It REQ_SCR_UPAGE
+Scroll the menu one page towards the top of the menu window.
+.It REQ_FIRST_ITEM
+Set the current item to be the first item in the menu.
+.It REQ_LAST_ITEM
+Set the current item to be the last item in the menu.
+.It REQ_NEXT_ITEM
+Set the new current item to be the next item in the item array after
+the current item.
+.It REQ_PREV_ITEM
+Set the new current item to be the item before the current item in the
+items array.
+.It REQ_TOGGLE_ITEM
+If the item is selectable then toggle the item's value.
+.It REQ_CLEAR_PATTERN
+Clear all the characters currently in the menu's pattern buffer.
+.It REQ_BACK_PATTERN
+Remove the last character from the pattern buffer.
+.It REQ_NEXT_MATCH
+Attempt to find the next item that matches the pattern buffer.
+.It REQ_PREV_MATCH
+Attempt to find the previous item that matches the pattern buffer.
+.El
+If
+.Fn menu_driver
+is passed a command that is greater than MAX_COMMAND then the command
+passed is assumed to be a user defined command and
+.Fn menu_driver
+returns E_UNKNOWN_COMMAND.
+Otherwise if the command is a printable
+character then the character represented by the command is placed at
+the end of the pattern buffer and an attempt is made to match the
+pattern buffer against the items in the menu.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_UNKNOWN_COMMAND -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_NOT_POSTED
+The menu is not posted.
+.It Er E_UNKNOWN_COMMAND
+The menu driver does not recognize the request passed to it.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_format.3 b/lib/libmenu/menu_format.3
new file mode 100644 (file)
index 0000000..09356cb
--- /dev/null
@@ -0,0 +1,77 @@
+.\"    $NetBSD: menu_format.3,v 1.9 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_FORMAT 3
+.Os
+.Sh NAME
+.Nm menu_format ,
+.Nm set_menu_format
+.Nd get or set number of rows and columns of items
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft void
+.Fn menu_format "MENU *menu" "int *rows" "int *cols"
+.Ft int
+.Fn set_menu_format "MENU *menu" "int rows" "int cols"
+.Sh DESCRIPTION
+The
+.Fn menu_format
+returns the number of rows and columns of items that can be displayed
+by the menu.
+The format is set by the
+.Fn set_menu_format
+function call.
+Note that the rows and columns defined here are not the size of the
+window but rather the number of rows and columns of items.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_BAD_ARGUMENT -compact
+.It Er E_OK
+The function was successful.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_hook.3 b/lib/libmenu/menu_hook.3
new file mode 100644 (file)
index 0000000..10b3fa0
--- /dev/null
@@ -0,0 +1,103 @@
+.\"    $NetBSD: menu_hook.3,v 1.8 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_HOOK 3
+.Os
+.Sh NAME
+.Nm item_init ,
+.Nm item_term ,
+.Nm menu_init ,
+.Nm menu_term ,
+.Nm set_item_init ,
+.Nm set_item_term ,
+.Nm set_menu_init ,
+.Nm set_menu_term
+.Nd get or set handler functions for menu post/unpost or item change
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft void (*hook)()
+.Fn item_init "MENU *menu"
+.Ft void (*hook)()
+.Fn item_term "MENU *menu"
+.Ft void (*hook)()
+.Fn menu_init "MENU *menu"
+.Ft void (*hook)()
+.Fn menu_term "MENU *menu"
+.Ft int
+.Fn set_item_init "MENU *menu" "void (*hook)())"
+.Ft int
+.Fn set_item_term "MENU *menu" "void (*hook)())"
+.Ft int
+.Fn set_menu_init "MENU *menu" "void (*hook)())"
+.Ft int
+.Fn set_menu_term "MENU *menu" "void (*hook)())"
+.Sh DESCRIPTION
+The
+.Fn item_init
+function returns a pointer to the function that will be called
+whenever the menu is posted and also just after the current item
+changes.
+This is set by the
+.Fn set_item_init
+call.
+The
+.Fn item_term
+function returns a pointer to the function that will be called before
+the menu is unposted and just before the current item changes, this
+pointer is set by the
+.Fn set_item_term
+call.
+The
+.Fn menu_init
+functions returns a pointer to the function that will be called just
+before the menu is posted to the screen.
+This pointer is set by the
+.Fn set_menu_init
+function call.
+The
+.Fn menu_term
+function returns a pointer to the function that will be called just
+after the menu has been unposted, this pointer is set by the
+.Fn set_menu_term
+function.
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_item_current.3 b/lib/libmenu/menu_item_current.3
new file mode 100644 (file)
index 0000000..a09ed1a
--- /dev/null
@@ -0,0 +1,101 @@
+.\"    $NetBSD: menu_item_current.3,v 1.9 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_CURRENT 3
+.Os
+.Sh NAME
+.Nm current_item ,
+.Nm item_index ,
+.Nm set_current_item ,
+.Nm set_top_row
+.Nm top_row
+.Nd get or set item pointers or top row
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft ITEM *
+.Fn current_item "MENU *menu"
+.Ft int
+.Fn item_index "ITEM *item"
+.Ft int
+.Fn set_current_item "MENU *menu" "ITEM *item"
+.Ft int
+.Fn set_top_row "MENU *menu" "int row"
+.Ft int
+.Fn top_row "MENU *menu"
+.Sh DESCRIPTION
+The
+.Fn current_item
+returns a pointer to the current menu item.
+The
+.Fn set_current_item
+can be used to set this to the item give.
+The
+.Fn item_index
+function returns the index number in the array of items for the item
+pointed to by the
+.Fa item
+parameter.
+The
+.Fn set_top_row
+function sets the top row of the menu displayed to be the row given.
+The current item becomes the leftmost item of the top row.
+The
+.Fn top_row
+call returns the row number that is currently at the top of the
+displayed menu.
+.Sh RETURN VALUES
+.Fn current_item
+returns NULL if no items are attached to the menu.
+.Pp
+.Bl -tag -width E_NOT_CONNECTED -compact
+.It Er E_OK
+The function was successful.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_item_name.3 b/lib/libmenu/menu_item_name.3
new file mode 100644 (file)
index 0000000..72f02d7
--- /dev/null
@@ -0,0 +1,71 @@
+.\"    $NetBSD: menu_item_name.3,v 1.9 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_NAME 3
+.Os
+.Sh NAME
+.Nm item_description ,
+.Nm item_name
+.Nd get item name or description
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft char *
+.Fn item_description "ITEM *item"
+.Ft char *
+.Fn item_name "ITEM *item"
+.Sh DESCRIPTION
+The
+.Fn item_description
+.Fa menu
+function returns the description string associated with the passed
+item.
+The
+.Fn item_name
+function returns the name string associated with the passed item.
+.Sh RETURN VALUES
+The function
+.Fn item_description
+and
+.Fn item_name
+functions return NULL if the item pointer is not valid.
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_item_new.3 b/lib/libmenu/menu_item_new.3
new file mode 100644 (file)
index 0000000..e8be7e4
--- /dev/null
@@ -0,0 +1,79 @@
+.\"    $NetBSD: menu_item_new.3,v 1.8 2003/04/16 13:35:10 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_NEW 3
+.Os
+.Sh NAME
+.Nm free_item ,
+.Nm new_item
+.Nd create or delete menu item
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn free_item "ITEM *item"
+.Ft ITEM *
+.Fn new_item "char *name" "char *description"
+.Sh DESCRIPTION
+The
+.Fn free_item
+function destroys the item and frees all allocated storage for that
+item.
+The
+.Fn new_item
+allocates storage for a new item then copies in the item name and
+description for the new item.
+A pointer to the newly created item is returned to the caller.
+.Sh RETURN VALUES
+The
+.Fn new_item
+function returns NULL on failure, the
+.Fn free_item
+returns one of the following error values:
+.Pp
+.Bl -tag -width E_BAD_ARGUMENT -compact
+.It Er E_OK
+The function was successful.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_item_opts.3 b/lib/libmenu/menu_item_opts.3
new file mode 100644 (file)
index 0000000..0e80e79
--- /dev/null
@@ -0,0 +1,82 @@
+.\"    $NetBSD: menu_item_opts.3,v 1.8 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_OPTS 3
+.Os
+.Sh NAME
+.Nm item_opts ,
+.Nm item_opts_off ,
+.Nm item_opts_on
+.Nd get or modify options for an item
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft OPTIONS
+.Fn item_opts "ITEM *item"
+.Ft int
+.Fn item_opts_off "ITEM *item" "OPTIONS opts"
+.Ft int
+.Fn item_opts_on "ITEM *item" "OPTIONS opts"
+.Sh DESCRIPTION
+The
+.Fn item_opts
+function returns the options currently set for the given item.
+The
+.Fn item_opts_off
+function turns off the options passed in
+.Fa opts
+for the item passed.
+The
+.Fn item_opts_on
+function turns on the options passed in
+.Fa opts
+for the item given.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_SYSTEM_ERROR -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_item_userptr.3 b/lib/libmenu/menu_item_userptr.3
new file mode 100644 (file)
index 0000000..01c556d
--- /dev/null
@@ -0,0 +1,72 @@
+.\"    $NetBSD: menu_item_userptr.3,v 1.7 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_USERPTR 3
+.Os
+.Sh NAME
+.Nm item_userptr ,
+.Nm set_item_userptr
+.Nd get or set user pointer for an item
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft char *
+.Fn item_userptr "ITEM *item"
+.Ft int
+.Fn set_item_userptr "ITEM *item" "char *userptr"
+.Sh DESCRIPTION
+The
+.Fn item_userptr
+function returns the value of the user defined pointer for the given
+item, this pointer is defined by the
+.Fn set_item_userptr
+function.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_SYSTEM_ERROR -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_item_value.3 b/lib/libmenu/menu_item_value.3
new file mode 100644 (file)
index 0000000..bfd26ac
--- /dev/null
@@ -0,0 +1,106 @@
+.\"    $NetBSD: menu_item_value.3,v 1.11 2003/04/16 13:35:11 wiz Exp $ .\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_VALUE 3
+.Os
+.Sh NAME
+.Nm item_value ,
+.Nm set_item_value ,
+.Nm item_selected
+.Nd get or set value for an item
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn item_value "ITEM *item"
+.Ft int
+.Fn set_item_value "ITEM *item" "int flag"
+.Ft int
+.Fn item_selected "MENU *menu" "int **array"
+.Sh DESCRIPTION
+The
+.Fn item_value
+function returns value of the item.
+If the item has been selected then this value will be TRUE.
+The value can also be set by calling
+.Fn set_item_value
+to set the value to a defined state.
+Setting the value to a value
+other than TRUE or FALSE will have undefined results.
+The
+.Fn item_selected
+function returns the number of items that are selected in the menu, that
+is the number of items whose value is TRUE.
+The indexes of the selected
+items will be returned in
+.Fa array
+which will be dynamically allocated to hold the number of indexes.
+It is the responsibility of the caller to release this storage by calling
+.Xr free 3
+when the storage is no longer required.
+If there are no elements selected in the items array then
+.Fn item_selected
+will return 0 and
+.Fa array
+will be NULL.
+If an error occurs
+.Fn item_selected
+will return one of the below return values which are less than 0.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_REQUEST_DENIED -compact
+.It Er E_OK
+The function was successful.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.It Er E_SYSTEM_ERROR
+A system error occurred whilst processing the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
+.Pp
+The function
+.Fn item_selected
+is a
+.Nx
+extension and must not be used in portable code.
diff --git a/lib/libmenu/menu_item_visible.3 b/lib/libmenu/menu_item_visible.3
new file mode 100644 (file)
index 0000000..4b2edc2
--- /dev/null
@@ -0,0 +1,67 @@
+.\"    $NetBSD: menu_item_visible.3,v 1.7 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEM_VISIBLE 3
+.Os
+.Sh NAME
+.Nm item_visible
+.Nd get visibility status of an item
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn item_visible "ITEM *item"
+.Sh DESCRIPTION
+The
+.Fn item_visible
+function returns TRUE if the item passed is currently visible in a
+menu.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_NOT_CONNECTED -compact
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_items.3 b/lib/libmenu/menu_items.3
new file mode 100644 (file)
index 0000000..bc9ef38
--- /dev/null
@@ -0,0 +1,90 @@
+.\"    $NetBSD: menu_items.3,v 1.10 2012/06/30 09:25:55 jdf Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_ITEMS 3
+.Os
+.Sh NAME
+.Nm item_count ,
+.Nm menu_items ,
+.Nm set_menu_items
+.Nd attach items to menus or check correspondences
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn item_count "MENU *menu"
+.Ft ITEM **
+.Fn menu_items "MENU *menu"
+.Ft int
+.Fn set_menu_items "MENU *menu" "ITEM **items"
+.Sh DESCRIPTION
+The
+.Fn item_count
+.Fa menu
+function returns the number of items currently attached to the menu
+passed.
+The
+.Fn menu_items
+function returns a pointer to an array of item pointers that represent
+the menu items currently attached to the given menu.
+Apart from using
+.Fn new_menu
+(see
+.Xr menu_new 3 )
+menu items may be attached to a menu by calling
+.Fn set_menu_items
+any items currently attached to the menu will be detached and the NULL
+terminated array of new items will be attached to the menu.
+.Sh RETURN VALUES
+Any function returning a string pointer will return NULL if an error
+occurs.
+Functions returning an integer will return one of the following:
+.Pp
+.Bl -tag -width E_CONNECTED -compact
+.It Er E_OK
+The function was successful.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_CONNECTED
+An item was already connected to a menu.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_mark.3 b/lib/libmenu/menu_mark.3
new file mode 100644 (file)
index 0000000..730ac32
--- /dev/null
@@ -0,0 +1,112 @@
+.\"    $NetBSD: menu_mark.3,v 1.9 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_MARK 3
+.Os
+.Sh NAME
+.Nm menu_mark ,
+.Nm menu_unmark ,
+.Nm set_menu_mark ,
+.Nm set_menu_unmark
+.Nd get or set strings that show mark status for a menu
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft char *
+.Fn menu_mark "MENU *menu"
+.Ft char *
+.Fn menu_unmark "MENU *menu"
+.Ft int
+.Fn set_menu_mark "MENU *menu" "char *mark"
+.Ft int
+.Fn set_menu_unmark "MENU *menu" "char *mark"
+.Sh DESCRIPTION
+The
+.Fn menu_mark
+function returns a pointer to the character string that is used to
+mark selected items in the menu.
+The mark string is set by the
+.Fn set_menu_mark
+function.
+The
+.Fn menu_unmark
+function returns a pointer to the character string that is used to
+indicate a menu items is not selected, this string is set by the
+.Fn set_menu_unmark
+function.
+The mark and unmark strings may be of differing lengths, the room
+allocated to drawing the mark will be the maximum of the lengths of
+both the mark and unmark strings.
+The shorter of the two strings will be left justified and space padded.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_UNKNOWN_COMMAND -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_CONNECTED
+An item was already connected to a menu.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NO_ROOM
+The menu does not fit within the subwindow.
+.It Er E_NOT_POSTED
+The menu is not posted.
+.It Er E_UNKNOWN_COMMAND
+The menu driver does not recognize the request passed to it.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.It Er E_NOT_SELECTABLE
+The item could not be selected.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_new.3 b/lib/libmenu/menu_new.3
new file mode 100644 (file)
index 0000000..7aa791f
--- /dev/null
@@ -0,0 +1,85 @@
+.\"    $NetBSD: menu_new.3,v 1.10 2012/06/30 09:25:55 jdf Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_NEW 3
+.Os
+.Sh NAME
+.Nm free_menu ,
+.Nm new_menu
+.Nd create or delete a menu
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn free_menu "MENU *menu"
+.Ft MENU *
+.Fn new_menu "ITEM **items"
+.Sh DESCRIPTION
+The
+.Fn free_menu
+.Fa menu
+function destroys the given menu and frees all allocated storage
+associated with the menu.
+All items associated with the menu are
+detached from the menu before it is destroyed.
+The
+.Fn new_menu
+function allocates storage for a new menu and initializes all the
+values to the defined defaults.
+If the items pointer passed is not a NULL then the given NULL terminated
+array of items is attached to the new menu.
+.Sh RETURN VALUES
+The
+.Fn new_menu
+function returns NULL on error, while the
+.Fn free_menu
+function returns one of the following error values:
+.Pp
+.Bl -tag -width E_BAD_ARGUMENT -compact
+.It Er E_OK
+The function was successful.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_opts.3 b/lib/libmenu/menu_opts.3
new file mode 100644 (file)
index 0000000..a07f47e
--- /dev/null
@@ -0,0 +1,88 @@
+.\"    $NetBSD: menu_opts.3,v 1.8 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_OPTS 3
+.Os
+.Sh NAME
+.Nm menu_opts ,
+.Nm menu_opts_off ,
+.Nm menu_opts_on ,
+.Nm set_menu_opts
+.Nd get or modify options for a menu
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft OPTIONS
+.Fn menu_opts "MENU *menu"
+.Ft int
+.Fn menu_opts_off "MENU *menu" "OPTIONS opts"
+.Ft int
+.Fn menu_opts_on "MENU *menu" "OPTIONS opts"
+.Ft int
+.Fn set_menu_opts "MENU *menu" "OPTIONS opts"
+.Sh DESCRIPTION
+The
+.Fn menu_opts
+function returns the current options set for the menu given.
+The
+.Fn menu_opts_off
+function turns off the menu options given by the opts parameter for
+the menu.
+The
+.Fn menu_opts_on
+function turns on the menu options given by the opts parameter for the
+menu passed.
+The
+.Fn set_menu_opts
+sets the menu options to the value given in opts.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_BAD_ARGUMENT -compact
+.It Er E_OK
+The function was successful.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_pattern.3 b/lib/libmenu/menu_pattern.3
new file mode 100644 (file)
index 0000000..659fdf6
--- /dev/null
@@ -0,0 +1,77 @@
+.\"    $NetBSD: menu_pattern.3,v 1.8 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_PATTERN 3
+.Os
+.Sh NAME
+.Nm menu_pattern ,
+.Nm set_menu_pattern
+.Nd get or set menu pattern
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft char *
+.Fn menu_pattern "MENU *menu"
+.Sh DESCRIPTION
+The
+.Fn menu_pattern
+function returns a pointer to the string that is currently in the menu
+pattern buffer.
+The menu pattern buffer can be set by calling
+.Fn set_menu_pattern
+which will set the pattern buffer to the string passed and then
+attempt to match that string against the names of the items in the
+attached items.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_BAD_ARGUMENT -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_post.3 b/lib/libmenu/menu_post.3
new file mode 100644 (file)
index 0000000..be0c6dc
--- /dev/null
@@ -0,0 +1,98 @@
+.\"    $NetBSD: menu_post.3,v 1.10 2009/10/24 11:17:13 reed Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_POST 3
+.Os
+.Sh NAME
+.Nm post_menu ,
+.Nm unpost_menu
+.Nd post (draw) or unpost a menu
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft int
+.Fn post_menu "MENU *menu"
+.Ft int
+.Fn unpost_menu "MENU *menu"
+.Sh DESCRIPTION
+The
+.Fn post_menu
+function causes the menu to be drawn on the screen.
+Any functions defined by either
+.Fn set_menu_init
+or
+.Fn set_item_init
+(see
+.Xr menu_hook 3 )
+are called before the menu is placed on the screen.
+The
+.Fn unpost_menu
+does the opposite, it removes a menu from the screen.
+Any functions defined by both
+.Fn set_menu_term
+and
+.Fn set_item_term
+(see
+.Xr menu_hook 3 )
+are called prior to the menu's removal.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_NOT_CONNECTED -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NO_ROOM
+The menu does not fit within the subwindow.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menu_hook 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_userptr.3 b/lib/libmenu/menu_userptr.3
new file mode 100644 (file)
index 0000000..87c8e17
--- /dev/null
@@ -0,0 +1,73 @@
+.\"    $NetBSD: menu_userptr.3,v 1.8 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_USERPTR 3
+.Os
+.Sh NAME
+.Nm menu_userptr ,
+.Nm set_menu_userptr
+.Nd get or set user pointer for a menu
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft char *
+.Fn menu_userptr "MENU *menu"
+.Ft int
+.Fn set_menu_userptr "MENU *menu" "char *ptr"
+.Sh DESCRIPTION
+The
+.Fn menu_userptr
+function returns the pointer to the user defined pointer for the given
+menu.
+This pointer is set by the
+.Fn set_menu_userptr
+function.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_SYSTEM_ERROR -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menu_win.3 b/lib/libmenu/menu_win.3
new file mode 100644 (file)
index 0000000..984e8e1
--- /dev/null
@@ -0,0 +1,115 @@
+.\"    $NetBSD: menu_win.3,v 1.10 2003/04/16 13:35:11 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENU_WIN 3
+.Os
+.Sh NAME
+.Nm menu_sub ,
+.Nm menu_win ,
+.Nm scale_menu ,
+.Nm set_menu_sub ,
+.Nm set_menu_win
+.Nd sub-menu handling
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Ft WINDOW *
+.Fn menu_sub "MENU *menu"
+.Ft WINDOW *
+.Fn menu_win "MENU *menu"
+.Ft int
+.Fn scale_menu "MENU *menu" "int *rows" "int *cols"
+.Ft int
+.Fn set_menu_sub "MENU *menu" "WINDOW *sub"
+.Ft int
+.Fn set_menu_win "MENU *menu" "WINDOW *win"
+.Sh DESCRIPTION
+The
+.Fn menu_sub
+function returns a pointer to the window that will be used to post a
+menu into, this pointer is set by the
+.Fn set_menu_sub
+function.
+The
+.Fn menu_win
+function returns a pointer to the window in which the menu subwindow
+will be created when the menu is posted, this pointer is set by the
+.Fn set_menu_win
+function.
+The
+.Fn scale_menu
+function calculates the minimum size a window needs to be to hold the
+items for a given menu, the parameters rows and cols are set to the
+required number of rows and columns respectively.
+.Sh RETURN VALUES
+The functions return one of the following error values:
+.Pp
+.Bl -tag -width E_UNKNOWN_COMMAND -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_CONNECTED
+An item was already connected to a menu.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NO_ROOM
+The menu does not fit within the subwindow.
+.It Er E_NOT_POSTED
+The menu is not posted
+.It Er E_UNKNOWN_COMMAND
+The menu driver does not recognize the request passed to it.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.It Er E_NOT_SELECTABLE
+The item could not be selected.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menus 3
+.Sh NOTES
+The header
+.Pa \*[Lt]menu.h\*[Gt]
+automatically includes both
+.Pa \*[Lt]curses.h\*[Gt]
+and
+.Pa \*[Lt]eti.h\*[Gt] .
diff --git a/lib/libmenu/menus.3 b/lib/libmenu/menus.3
new file mode 100644 (file)
index 0000000..22b8783
--- /dev/null
@@ -0,0 +1,299 @@
+.\"    $NetBSD: menus.3,v 1.15 2003/04/16 13:35:12 wiz Exp $
+.\"
+.\" Copyright (c) 1999
+.\"    Brett Lymn - blymn@baea.com.au, brett_lymn@yahoo.com.au
+.\"
+.\" This code is donated to The NetBSD Foundation by the author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd September 10, 1999
+.Dt MENUS 3
+.Os
+.Sh NAME
+.Nm menus
+.Nd menu library
+.Sh LIBRARY
+.Lb libmenu
+.Sh SYNOPSIS
+.In menu.h
+.Sh DESCRIPTION
+The
+.Nm
+library provides a terminal independent menu system using the
+.Xr curses 3
+library.
+Before using the
+.Nm
+functions the terminal must be set up by
+.Xr curses 3
+using the
+.Fn initscr
+function or similar.
+Programs using
+.Nm
+functions must be linked with the
+.Xr curses 3
+library.
+.Pp
+The
+.Nm
+library provides facilities for defining menu items, placing a menu on the
+terminal screen, assign pre- and post-change operations and setting the
+attributes of both the menu and its items.
+.Ss Defining default attributes for menus and items
+The
+.Nm
+library allows any settable attribute or option of both the menu and item
+objects to be defined such that any new menu or item automatically inherits
+the value as default.
+Setting the default value will not affect any item or
+menu that has already been created but will be applied to subsequent objects.
+To set the default attribute or option the set routine is passed a NULL
+pointer in the item or menu parameter when calling the set routine.
+The current default value can be retrieved by calling the get routine with a
+NULL pointer for the item or menu parameter.
+.Pp
+.Bl -tag -width item_description -compact
+.It function name
+manual page name
+.It current_item
+.Xr menu_item_current 3
+.It free_item
+.Xr menu_item_new 3
+.It free_menu
+.Xr menu_new 3
+.It item_count
+.Xr menu_items 3
+.It item_description
+.Xr menu_item_name 3
+.It item_index
+.Xr menu_item_current 3
+.It item_init
+.Xr menu_hook 3
+.It item_name
+.Xr menu_item_name 3
+.It item_opts
+.Xr menu_item_opts 3
+.It item_opts_off
+.Xr menu_item_opts 3
+.It item_opts_on
+.Xr menu_item_opts 3
+.It item_selected
+.Xr menu_item_value 3
+.It item_term
+.Xr menu_hook 3
+.It item_userptr
+.Xr menu_item_userptr 3
+.It item_value
+.Xr menu_item_value 3
+.It item_visible
+.Xr menu_item_visible 3
+.It menu_back
+.Xr menu_attributes 3
+.It menu_driver
+.Xr menu_driver 3
+.It menu_fore
+.Xr menu_attributes 3
+.It menu_format
+.Xr menu_format 3
+.It menu_grey
+.Xr menu_attributes 3
+.It menu_init
+.Xr menu_hook 3
+.It menu_items
+.Xr menu_items 3
+.It menu_mark
+.Xr menu_mark 3
+.It menu_opts
+.Xr menu_opts 3
+.It menu_opts_off
+.Xr menu_opts 3
+.It menu_opts_on
+.Xr menu_opts 3
+.It menu_pad
+.Xr menu_attributes 3
+.It menu_pattern
+.Xr menu_pattern 3
+.It menu_sub
+.Xr menu_win 3
+.It menu_term
+.Xr menu_hook 3
+.It menu_unmark
+.Xr menu_mark 3
+.It menu_userptr
+.Xr menu_userptr 3
+.It men_win
+.Xr menu_win 3
+.It new_item
+.Xr menu_item_new 3
+.It new_menu
+.Xr menu_new 3
+.It pos_menu_cursor
+.Xr menu_cursor 3
+.It post_menu
+.Xr menu_post 3
+.It scale_menu
+.Xr menu_win 3
+.It set_current_item
+.Xr menu_item_current 3
+.It set_item_init
+.Xr menu_hook 3
+.It set_item_opts
+.Xr menu_item_opts 3
+.It set_item_term
+.Xr menu_hook 3
+.It set_item_userptr
+.Xr menu_item_userptr 3
+.It set_item_value
+.Xr menu_item_value 3
+.It set_menu_back
+.Xr menu_attributes 3
+.It set_menu_fore
+.Xr menu_attributes 3
+.It set_menu_format
+.Xr menu_format 3
+.It set_menu_grey
+.Xr menu_attributes 3
+.It set_menu_init
+.Xr menu_hook 3
+.It set_menu_items
+.Xr menu_items 3
+.It set_menu_mark
+.Xr menu_mark 3
+.It set_menu_opts
+.Xr menu_opts 3
+.It set_menu_pad
+.Xr menu_attributes 3
+.It set_menu_pattern
+.Xr menu_pattern 3
+.It set_menu_sub
+.Xr menu_win 3
+.It set_menu_term
+.Xr menu_hook 3
+.It set_menu_unmark
+.Xr menu_mark 3
+.It set_menu_userptr
+.Xr menu_userptr 3
+.It set_menu_win
+.Xr menu_win 3
+.It set_top_row
+.Xr menu_item_current 3
+.It top_row
+.Xr menu_item_current 3
+.It unpost_menu
+.Xr menu_post 3
+.El
+.Sh RETURN VALUES
+Any function returning a string pointer will return NULL if an error
+occurs.
+Functions returning an integer will return one of the following:
+.Pp
+.Bl -tag -width E_UNKNOWN_COMMAND -compact
+.It Er E_OK
+The function was successful.
+.It Er E_SYSTEM_ERROR
+There was a system error during the call.
+.It Er E_BAD_ARGUMENT
+One or more of the arguments passed to the function was incorrect.
+.It Er E_POSTED
+The menu is already posted.
+.It Er E_CONNECTED
+An item was already connected to a menu.
+.It Er E_BAD_STATE
+The function was called from within an initialization or termination
+routine.
+.It Er E_NO_ROOM
+The menu does not fit within the subwindow.
+.It Er E_NOT_POSTED
+The menu is not posted.
+.It Er E_UNKNOWN_COMMAND
+The menu driver does not recognize the request passed to it.
+.It Er E_NO_MATCH
+The character search failed to find a match.
+.It Er E_NOT_SELECTABLE
+The item could not be selected.
+.It Er E_NOT_CONNECTED
+The item is not connected to a menu.
+.It Er E_REQUEST_DENIED
+The menu driver could not process the request.
+.El
+.Sh SEE ALSO
+.Xr curses 3 ,
+.Xr menu_attributes 3 ,
+.Xr menu_cursor 3 ,
+.Xr menu_driver 3 ,
+.Xr menu_format 3 ,
+.Xr menu_hook 3 ,
+.Xr menu_item_current 3 ,
+.Xr menu_item_name 3 ,
+.Xr menu_item_new 3 ,
+.Xr menu_item_opts 3 ,
+.Xr menu_item_userptr 3 ,
+.Xr menu_item_value 3 ,
+.Xr menu_item_visible 3 ,
+.Xr menu_items 3 ,
+.Xr menu_mark 3 ,
+.Xr menu_new 3 ,
+.Xr menu_opts 3 ,
+.Xr menu_pattern 3 ,
+.Xr menu_post 3 ,
+.Xr menu_userptr 3 ,
+.Xr menu_win 3
+.Sh NOTES
+This implementation of the menus library does depart in behaviour
+subtly from the original AT \*[Am] T implementation.
+Some of the more notable departures are:
+.Pp
+.Bl -tag -width "item marking" -compact
+.It unmark
+The original implementation did not have a marker for an unmarked field
+the mark was only displayed next to a field when it had been marked using
+the REQ_TOGGLE_ITEM.
+In this implementation a separate marker can be used
+to indicate an unmarked item.
+This can be set using set_menu_unmark function.
+There is no requirement for the mark and unmark strings to be the same
+length.
+Room will be left for the longest of the two.
+The unmark string
+is optional, if it is not set then menus defaults to the old behaviour.
+.It item marking
+In the original implementation the current item was considered selected
+and hence had the mark string displayed next to it.
+This implementation does not do this because the Author considers the
+effect too confusing.
+Especially in the case of a multiple selection menu because there was no
+way to tell if the current item is selected or not without shifting off
+of it.
+Since the current item is displayed using the foreground attribute it was
+deemed unnecessary to also display the mark string against the current item.
+.El
+.Pp
+The option O_RADIO and the function
+.Fn item_selected
+are
+.Nx
+extensions and must not be used in portable code.
diff --git a/lib/libmenu/post.c b/lib/libmenu/post.c
new file mode 100644 (file)
index 0000000..2493b4a
--- /dev/null
@@ -0,0 +1,107 @@
+/*     $NetBSD: post.c,v 1.12 2003/04/19 12:52:39 blymn Exp $  */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: post.c,v 1.12 2003/04/19 12:52:39 blymn Exp $");
+
+#include <menu.h>
+#include <stdlib.h>
+#include "internals.h"
+
+/*
+ * Post the menu to the screen.  Call any defined init routines and then
+ * draw the menu on the screen.
+ */
+int
+post_menu(MENU *menu)
+{
+       int maxx, maxy, i;
+       
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+       if (menu->posted == 1)
+               return E_POSTED;
+       if (menu->in_init == 1)
+               return E_BAD_STATE;
+       if (menu->items == NULL)
+               return E_NOT_CONNECTED;
+       if (*menu->items == NULL)
+               return E_NOT_CONNECTED;
+
+       menu->in_init = 1;
+       
+       if (menu->menu_init != NULL)
+               menu->menu_init(menu);
+       if (menu->item_init != NULL)
+               menu->item_init(menu);
+
+       menu->in_init = 0;
+
+       getmaxyx(menu->scrwin, maxy, maxx);
+       if ((maxx == ERR) || (maxy == ERR)) return E_SYSTEM_ERROR;
+
+       if ((menu->cols * menu->max_item_width + menu->cols - 1) > maxx)
+               return E_NO_ROOM;
+
+       if ((menu->opts & O_RADIO) != O_RADIO) {
+               for (i = 0; i < menu->item_count; i++) {
+                       menu->items[i]->selected = 0;
+               }
+       }
+       
+       menu->posted = 1;
+       return _menui_draw_menu(menu);
+       
+}
+
+/*
+ * Unpost the menu.  Call any defined termination routines and remove the
+ * menu from the screen.
+ */
+int
+unpost_menu(MENU *menu)
+{
+       if (menu == NULL)
+               return E_BAD_ARGUMENT;
+       if (menu->posted != 1)
+               return E_NOT_POSTED;
+       if (menu->in_init == 1)
+               return E_BAD_STATE;
+       if (menu->item_term != NULL)
+               menu->item_term(menu);
+
+       if (menu->menu_term != NULL)
+               menu->menu_term(menu);
+
+       menu->posted = 0;
+       werase(menu->scrwin);
+       wrefresh(menu->scrwin);
+       return E_OK;
+}
+
+       
diff --git a/lib/libmenu/shlib_version b/lib/libmenu/shlib_version
new file mode 100644 (file)
index 0000000..dc8e452
--- /dev/null
@@ -0,0 +1,5 @@
+#      $NetBSD: shlib_version,v 1.11 2009/01/11 03:07:48 christos Exp $
+#      Remember to update distrib/sets/lists/base/shl.* when changing
+#
+major=6
+minor=0
diff --git a/lib/libmenu/userptr.c b/lib/libmenu/userptr.c
new file mode 100644 (file)
index 0000000..682b761
--- /dev/null
@@ -0,0 +1,91 @@
+/*     $NetBSD: userptr.c,v 1.9 2003/03/09 01:08:48 lukem Exp $        */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: userptr.c,v 1.9 2003/03/09 01:08:48 lukem Exp $");
+
+#include <menu.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* the following is defined in menu.c */
+extern MENU _menui_default_menu;
+
+/* the following is defined in item.c */
+extern ITEM _menui_default_item;
+
+/*
+ * Set the item user pointer data
+ */
+int
+set_item_userptr(ITEM *param_item, char *userptr)
+{
+       ITEM *item = (param_item != NULL) ? param_item : &_menui_default_item;
+       
+        item->userptr = userptr;
+        return E_OK;
+}
+
+
+/*
+ * Return the item user pointer
+ */
+char *
+item_userptr(ITEM *item)
+{
+       if (item == NULL)
+               return _menui_default_item.userptr;
+       else
+               return item->userptr;
+}
+
+/*
+ * Return the user pointer for the given menu
+ */
+char *
+menu_userptr(MENU *menu)
+{
+       if (menu == NULL)
+               return _menui_default_menu.userptr;
+       else
+               return menu->userptr;
+}
+
+/*
+ * Set the user pointer for the given menu
+ */
+int
+set_menu_userptr(MENU *param_menu, char *userptr)
+{
+       MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
+
+        menu->userptr = userptr;
+
+        return E_OK;
+}
+
index 16be44cb4ae71597ddede2d4f59e343be698ee99..8e7c078388bd616d0fa6d961c76248473a4e591a 100644 (file)
@@ -83,6 +83,7 @@
 2012/10/17 12:00:00,lib/libcurses
 2012/10/17 12:00:00,lib/libedit
 2012/10/17 12:00:00,lib/libm
+2012/10/17 12:00:00,lib/libmenu
 2011/09/30 22:08:19,lib/libprop
 2012/10/17 12:00:00,lib/libpuffs
 2012/10/17 12:00:00,lib/librmt