From b618a1ee0b63a120cb1d99249a82c6843ff3e4f4 Mon Sep 17 00:00:00 2001 From: Thomas Cort Date: Tue, 12 Nov 2013 07:39:59 -0500 Subject: [PATCH] Importing lib/libmenu No Minix-specific changes needed. Change-Id: Ifab9a44bd401aebf99ab019697937620d88d47de --- distrib/sets/lists/minix/mi | 81 ++++ lib/Makefile | 2 +- lib/libmenu/Makefile | 77 ++++ lib/libmenu/attributes.c | 135 ++++++ lib/libmenu/driver.c | 288 +++++++++++++ lib/libmenu/eti.h | 50 +++ lib/libmenu/internals.c | 635 +++++++++++++++++++++++++++ lib/libmenu/internals.h | 53 +++ lib/libmenu/item.c | 404 +++++++++++++++++ lib/libmenu/menu.c | 743 ++++++++++++++++++++++++++++++++ lib/libmenu/menu.h | 210 +++++++++ lib/libmenu/menu_attributes.3 | 135 ++++++ lib/libmenu/menu_cursor.3 | 91 ++++ lib/libmenu/menu_driver.3 | 136 ++++++ lib/libmenu/menu_format.3 | 77 ++++ lib/libmenu/menu_hook.3 | 103 +++++ lib/libmenu/menu_item_current.3 | 101 +++++ lib/libmenu/menu_item_name.3 | 71 +++ lib/libmenu/menu_item_new.3 | 79 ++++ lib/libmenu/menu_item_opts.3 | 82 ++++ lib/libmenu/menu_item_userptr.3 | 72 ++++ lib/libmenu/menu_item_value.3 | 106 +++++ lib/libmenu/menu_item_visible.3 | 67 +++ lib/libmenu/menu_items.3 | 90 ++++ lib/libmenu/menu_mark.3 | 112 +++++ lib/libmenu/menu_new.3 | 85 ++++ lib/libmenu/menu_opts.3 | 88 ++++ lib/libmenu/menu_pattern.3 | 77 ++++ lib/libmenu/menu_post.3 | 98 +++++ lib/libmenu/menu_userptr.3 | 73 ++++ lib/libmenu/menu_win.3 | 115 +++++ lib/libmenu/menus.3 | 299 +++++++++++++ lib/libmenu/post.c | 107 +++++ lib/libmenu/shlib_version | 5 + lib/libmenu/userptr.c | 91 ++++ releasetools/nbsd_ports | 1 + 36 files changed, 5038 insertions(+), 1 deletion(-) create mode 100644 lib/libmenu/Makefile create mode 100644 lib/libmenu/attributes.c create mode 100644 lib/libmenu/driver.c create mode 100644 lib/libmenu/eti.h create mode 100644 lib/libmenu/internals.c create mode 100644 lib/libmenu/internals.h create mode 100644 lib/libmenu/item.c create mode 100644 lib/libmenu/menu.c create mode 100644 lib/libmenu/menu.h create mode 100644 lib/libmenu/menu_attributes.3 create mode 100644 lib/libmenu/menu_cursor.3 create mode 100644 lib/libmenu/menu_driver.3 create mode 100644 lib/libmenu/menu_format.3 create mode 100644 lib/libmenu/menu_hook.3 create mode 100644 lib/libmenu/menu_item_current.3 create mode 100644 lib/libmenu/menu_item_name.3 create mode 100644 lib/libmenu/menu_item_new.3 create mode 100644 lib/libmenu/menu_item_opts.3 create mode 100644 lib/libmenu/menu_item_userptr.3 create mode 100644 lib/libmenu/menu_item_value.3 create mode 100644 lib/libmenu/menu_item_visible.3 create mode 100644 lib/libmenu/menu_items.3 create mode 100644 lib/libmenu/menu_mark.3 create mode 100644 lib/libmenu/menu_new.3 create mode 100644 lib/libmenu/menu_opts.3 create mode 100644 lib/libmenu/menu_pattern.3 create mode 100644 lib/libmenu/menu_post.3 create mode 100644 lib/libmenu/menu_userptr.3 create mode 100644 lib/libmenu/menu_win.3 create mode 100644 lib/libmenu/menus.3 create mode 100644 lib/libmenu/post.c create mode 100644 lib/libmenu/shlib_version create mode 100644 lib/libmenu/userptr.c diff --git a/distrib/sets/lists/minix/mi b/distrib/sets/lists/minix/mi index 3d8b83316..caa2f4353 100644 --- a/distrib/sets/lists/minix/mi +++ b/distrib/sets/lists/minix/mi @@ -670,6 +670,7 @@ ./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 @@ -1138,6 +1139,7 @@ ./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 @@ -1686,6 +1688,11 @@ ./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 @@ -2692,6 +2699,7 @@ ./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 @@ -2980,6 +2988,8 @@ ./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 @@ -3295,6 +3305,19 @@ ./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 @@ -3429,6 +3452,37 @@ ./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 @@ -3489,6 +3543,8 @@ ./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 @@ -3539,6 +3595,7 @@ ./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 @@ -3564,6 +3621,7 @@ ./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 @@ -3858,6 +3916,7 @@ ./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 @@ -3867,6 +3926,26 @@ ./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 @@ -4143,6 +4222,7 @@ ./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 @@ -4180,6 +4260,7 @@ ./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 diff --git a/lib/Makefile b/lib/Makefile index acf1819ce..f8bcb51b7 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -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 index 000000000..e219d6c66 --- /dev/null +++ b/lib/libmenu/Makefile @@ -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 +.include diff --git a/lib/libmenu/attributes.c b/lib/libmenu/attributes.c new file mode 100644 index 000000000..f352a6416 --- /dev/null +++ b/lib/libmenu/attributes.c @@ -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 +__RCSID("$NetBSD: attributes.c,v 1.7 2003/03/09 01:08:47 lukem Exp $"); + +#include + +/* 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 index 000000000..776135da1 --- /dev/null +++ b/lib/libmenu/driver.c @@ -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 +__RCSID("$NetBSD: driver.c,v 1.9 2003/03/09 01:08:48 lukem Exp $"); + +#include +#include +#include +#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 index 000000000..84cff069c --- /dev/null +++ b/lib/libmenu/eti.h @@ -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 index 000000000..4b3cce088 --- /dev/null +++ b/lib/libmenu/internals.c @@ -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 +__RCSID("$NetBSD: internals.c,v 1.15 2012/06/27 11:53:36 blymn Exp $"); + +#include +#include +#include +#include +#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 index 000000000..11fbc1413 --- /dev/null +++ b/lib/libmenu/internals.h @@ -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 + +#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 index 000000000..0276c7820 --- /dev/null +++ b/lib/libmenu/item.c @@ -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 +__RCSID("$NetBSD: item.c,v 1.12 2012/03/21 05:33:27 matt Exp $"); + +#include +#include +#include +#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 index 000000000..dd49875cd --- /dev/null +++ b/lib/libmenu/menu.c @@ -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 +__RCSID("$NetBSD: menu.c,v 1.17 2012/03/21 05:33:27 matt Exp $"); + +#include +#include +#include +#include +#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 index 000000000..77eceaa5b --- /dev/null +++ b/lib/libmenu/menu.h @@ -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 +#include + +/* 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 index 000000000..a2d483397 --- /dev/null +++ b/lib/libmenu/menu_attributes.3 @@ -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 index 000000000..b32c307f0 --- /dev/null +++ b/lib/libmenu/menu_cursor.3 @@ -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 index 000000000..9f706f867 --- /dev/null +++ b/lib/libmenu/menu_driver.3 @@ -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 index 000000000..09356cb7d --- /dev/null +++ b/lib/libmenu/menu_format.3 @@ -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 index 000000000..10b3fa00a --- /dev/null +++ b/lib/libmenu/menu_hook.3 @@ -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 index 000000000..a09ed1aae --- /dev/null +++ b/lib/libmenu/menu_item_current.3 @@ -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 index 000000000..72f02d70b --- /dev/null +++ b/lib/libmenu/menu_item_name.3 @@ -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 index 000000000..e8be7e4f4 --- /dev/null +++ b/lib/libmenu/menu_item_new.3 @@ -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 index 000000000..0e80e7934 --- /dev/null +++ b/lib/libmenu/menu_item_opts.3 @@ -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 index 000000000..01c556dda --- /dev/null +++ b/lib/libmenu/menu_item_userptr.3 @@ -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 index 000000000..bfd26ac2f --- /dev/null +++ b/lib/libmenu/menu_item_value.3 @@ -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 index 000000000..4b2edc24f --- /dev/null +++ b/lib/libmenu/menu_item_visible.3 @@ -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 index 000000000..bc9ef38c5 --- /dev/null +++ b/lib/libmenu/menu_items.3 @@ -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 index 000000000..730ac32df --- /dev/null +++ b/lib/libmenu/menu_mark.3 @@ -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 index 000000000..7aa791fde --- /dev/null +++ b/lib/libmenu/menu_new.3 @@ -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 index 000000000..a07f47e97 --- /dev/null +++ b/lib/libmenu/menu_opts.3 @@ -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 index 000000000..659fdf677 --- /dev/null +++ b/lib/libmenu/menu_pattern.3 @@ -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 index 000000000..be0c6dc3b --- /dev/null +++ b/lib/libmenu/menu_post.3 @@ -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 index 000000000..87c8e1762 --- /dev/null +++ b/lib/libmenu/menu_userptr.3 @@ -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 index 000000000..984e8e1c4 --- /dev/null +++ b/lib/libmenu/menu_win.3 @@ -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 index 000000000..22b8783d7 --- /dev/null +++ b/lib/libmenu/menus.3 @@ -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 index 000000000..2493b4a2e --- /dev/null +++ b/lib/libmenu/post.c @@ -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 +__RCSID("$NetBSD: post.c,v 1.12 2003/04/19 12:52:39 blymn Exp $"); + +#include +#include +#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 index 000000000..dc8e452ba --- /dev/null +++ b/lib/libmenu/shlib_version @@ -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 index 000000000..682b761b5 --- /dev/null +++ b/lib/libmenu/userptr.c @@ -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 +__RCSID("$NetBSD: userptr.c,v 1.9 2003/03/09 01:08:48 lukem Exp $"); + +#include +#include +#include + +/* 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; +} + diff --git a/releasetools/nbsd_ports b/releasetools/nbsd_ports index 16be44cb4..8e7c07838 100644 --- a/releasetools/nbsd_ports +++ b/releasetools/nbsd_ports @@ -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