1*c73d2721Sjdc /* $NetBSD: menu.h,v 1.13 2004/03/22 19:01:09 jdc Exp $ */ 2b68c50bcSblymn 3b68c50bcSblymn /*- 4b7466e4fSblymn * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com.au) 5b68c50bcSblymn * All rights reserved. 6b68c50bcSblymn * 7b68c50bcSblymn * Redistribution and use in source and binary forms, with or without 8b68c50bcSblymn * modification, are permitted provided that the following conditions 9b68c50bcSblymn * are met: 10b68c50bcSblymn * 1. Redistributions of source code must retain the above copyright 11b68c50bcSblymn * notice, this list of conditions and the following disclaimer. 12b68c50bcSblymn * 2. The name of the author may not be used to endorse or promote products 13c03a48d6Swiz * derived from this software without specific prior written permission 14b68c50bcSblymn * 15b68c50bcSblymn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16b68c50bcSblymn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17b68c50bcSblymn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18b68c50bcSblymn * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19b68c50bcSblymn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20b68c50bcSblymn * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21b68c50bcSblymn * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22b68c50bcSblymn * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23b68c50bcSblymn * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24b68c50bcSblymn * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25b68c50bcSblymn * 26b68c50bcSblymn * 27b68c50bcSblymn */ 28b68c50bcSblymn 29beac10a2Skleink #ifndef _MENU_H_ 30beac10a2Skleink #define _MENU_H_ 31beac10a2Skleink 32b68c50bcSblymn #include <curses.h> 33b68c50bcSblymn #include <eti.h> 34b68c50bcSblymn 35b68c50bcSblymn /* requests for the menu_driver call */ 36*c73d2721Sjdc #define REQ_BASE_NUM (KEY_MAX + 0x200) 37*c73d2721Sjdc #define REQ_LEFT_ITEM (KEY_MAX + 0x201) 38*c73d2721Sjdc #define REQ_RIGHT_ITEM (KEY_MAX + 0x202) 39*c73d2721Sjdc #define REQ_UP_ITEM (KEY_MAX + 0x203) 40*c73d2721Sjdc #define REQ_DOWN_ITEM (KEY_MAX + 0x204) 41*c73d2721Sjdc #define REQ_SCR_ULINE (KEY_MAX + 0x205) 42*c73d2721Sjdc #define REQ_SCR_DLINE (KEY_MAX + 0x206) 43*c73d2721Sjdc #define REQ_SCR_DPAGE (KEY_MAX + 0x207) 44*c73d2721Sjdc #define REQ_SCR_UPAGE (KEY_MAX + 0x208) 45*c73d2721Sjdc #define REQ_FIRST_ITEM (KEY_MAX + 0x209) 46*c73d2721Sjdc #define REQ_LAST_ITEM (KEY_MAX + 0x20a) 47*c73d2721Sjdc #define REQ_NEXT_ITEM (KEY_MAX + 0x20b) 48*c73d2721Sjdc #define REQ_PREV_ITEM (KEY_MAX + 0x20c) 49*c73d2721Sjdc #define REQ_TOGGLE_ITEM (KEY_MAX + 0x20d) 50*c73d2721Sjdc #define REQ_CLEAR_PATTERN (KEY_MAX + 0x20e) 51*c73d2721Sjdc #define REQ_BACK_PATTERN (KEY_MAX + 0x20f) 52*c73d2721Sjdc #define REQ_NEXT_MATCH (KEY_MAX + 0x210) 53*c73d2721Sjdc #define REQ_PREV_MATCH (KEY_MAX + 0x211) 54b68c50bcSblymn 55*c73d2721Sjdc #define MAX_COMMAND (KEY_MAX + 0x211) /* last menu driver request 56ca4de2a4Sblymn - for application defined 57ca4de2a4Sblymn commands */ 58b68c50bcSblymn 59b68c50bcSblymn /* Menu options */ 60b68c50bcSblymn typedef unsigned int OPTIONS; 61b68c50bcSblymn 62b68c50bcSblymn /* and the values they can have */ 63b68c50bcSblymn #define O_ONEVALUE (0x1) 64b68c50bcSblymn #define O_SHOWDESC (0x2) 65b68c50bcSblymn #define O_ROWMAJOR (0x4) 66b68c50bcSblymn #define O_IGNORECASE (0x8) 67b68c50bcSblymn #define O_SHOWMATCH (0x10) 68b68c50bcSblymn #define O_NONCYCLIC (0x20) 69b68c50bcSblymn #define O_SELECTABLE (0x40) 7009440e90Sblymn #define O_RADIO (0x80) 71b68c50bcSblymn 72b68c50bcSblymn typedef struct __menu_str { 73b68c50bcSblymn char *string; 74b68c50bcSblymn int length; 75b68c50bcSblymn } MENU_STR; 76b68c50bcSblymn 77b68c50bcSblymn typedef struct __menu MENU; 78b68c50bcSblymn typedef struct __item ITEM; 79b68c50bcSblymn 80b7466e4fSblymn typedef void (*Menu_Hook) (MENU *); 81b68c50bcSblymn 82b68c50bcSblymn struct __item { 83b68c50bcSblymn MENU_STR name; 84b68c50bcSblymn MENU_STR description; 85b68c50bcSblymn char *userptr; 86b68c50bcSblymn int visible; /* set if item is visible */ 87b68c50bcSblymn int selected; /* set if item has been selected */ 88b68c50bcSblymn int row; /* menu row this item is on */ 89b68c50bcSblymn int col; /* menu column this item is on */ 90b68c50bcSblymn OPTIONS opts; 91b68c50bcSblymn MENU *parent; /* menu this item is bound to */ 92b68c50bcSblymn int index; /* index number for this item, if attached */ 93b68c50bcSblymn /* The following are the item's neighbours - makes menu 94b68c50bcSblymn navigation easier */ 95b68c50bcSblymn ITEM *left; 96b68c50bcSblymn ITEM *right; 97b68c50bcSblymn ITEM *up; 98b68c50bcSblymn ITEM *down; 99b68c50bcSblymn }; 100b68c50bcSblymn 101b68c50bcSblymn struct __menu { 102b68c50bcSblymn int rows; /* max number of rows to be displayed */ 103b68c50bcSblymn int cols; /* max number of columns to be displayed */ 104b68c50bcSblymn int item_rows; /* number of item rows we have */ 105b68c50bcSblymn int item_cols; /* number of item columns we have */ 106b68c50bcSblymn int cur_row; /* current cursor row */ 107b68c50bcSblymn int cur_col; /* current cursor column */ 108b68c50bcSblymn MENU_STR mark; /* menu mark string */ 109b68c50bcSblymn MENU_STR unmark; /* menu unmark string */ 110b68c50bcSblymn OPTIONS opts; /* options for the menu */ 111b68c50bcSblymn char *pattern; /* the pattern buffer */ 112b68c50bcSblymn int plen; /* pattern buffer length */ 113b68c50bcSblymn int match_len; /* length of pattern matched */ 114b68c50bcSblymn int posted; /* set if menu is posted */ 115b68c50bcSblymn attr_t fore; /* menu foreground */ 116b68c50bcSblymn attr_t back; /* menu background */ 117b68c50bcSblymn attr_t grey; /* greyed out (nonselectable) menu item */ 118b68c50bcSblymn int pad; /* filler char between name and description */ 119b68c50bcSblymn char *userptr; 120b68c50bcSblymn int top_row; /* the row that is at the top of the menu */ 121b68c50bcSblymn int max_item_width; /* widest item */ 122b68c50bcSblymn int col_width; /* width of the menu columns - this is not always 123b68c50bcSblymn the same as the widest item */ 124b68c50bcSblymn int item_count; /* number of items attached */ 125b68c50bcSblymn ITEM **items; /* items associated with this menu */ 126b68c50bcSblymn int cur_item; /* item cursor is currently positioned at */ 127b68c50bcSblymn int in_init; /* set when processing an init or term function call */ 128b7466e4fSblymn Menu_Hook menu_init; /* call this when menu is posted */ 129b7466e4fSblymn Menu_Hook menu_term; /* call this when menu is unposted */ 130b7466e4fSblymn Menu_Hook item_init; /* call this when menu posted & after 131b68c50bcSblymn current item changes */ 132b7466e4fSblymn Menu_Hook item_term; /* call this when menu unposted & just 133b68c50bcSblymn before current item changes */ 134b68c50bcSblymn WINDOW *menu_win; /* the menu window */ 135b68c50bcSblymn WINDOW *menu_subwin; /* the menu subwindow */ 136ca4de2a4Sblymn WINDOW *scrwin; /* the window to write to */ 137b68c50bcSblymn }; 138b68c50bcSblymn 139b68c50bcSblymn 140b68c50bcSblymn /* Public function prototypes. */ 141b68c50bcSblymn __BEGIN_DECLS 142d013bbe3Sblymn int menu_driver(MENU *, int); 143d013bbe3Sblymn int scale_menu(MENU *, int *, int *); 144d013bbe3Sblymn int set_top_row(MENU *, int); 145d013bbe3Sblymn int pos_menu_cursor(MENU *); 146d013bbe3Sblymn int top_row(MENU *); 147b68c50bcSblymn 148d013bbe3Sblymn int free_menu(MENU *); 149d013bbe3Sblymn char menu_back(MENU *); 150d013bbe3Sblymn char menu_fore(MENU *); 151d013bbe3Sblymn void menu_format(MENU *, int *, int *); 152d013bbe3Sblymn char menu_grey(MENU *); 153d013bbe3Sblymn Menu_Hook menu_init(MENU *); 154d013bbe3Sblymn char *menu_mark(MENU *); 155d013bbe3Sblymn OPTIONS menu_opts(MENU *); 156d013bbe3Sblymn int menu_opts_off(MENU *, OPTIONS); 157d013bbe3Sblymn int menu_opts_on(MENU *, OPTIONS); 158d013bbe3Sblymn int menu_pad(MENU *); 159d013bbe3Sblymn char *menu_pattern(MENU *); 160d013bbe3Sblymn WINDOW *menu_sub(MENU *); 161d013bbe3Sblymn Menu_Hook menu_term(MENU *); 162d013bbe3Sblymn char *menu_unmark (MENU *); 163d013bbe3Sblymn char *menu_userptr(MENU *); 164d013bbe3Sblymn WINDOW *menu_win(MENU *); 165d013bbe3Sblymn MENU *new_menu(ITEM **); 166d013bbe3Sblymn int post_menu(MENU *); 167d013bbe3Sblymn int set_menu_back(MENU *, attr_t); 168d013bbe3Sblymn int set_menu_fore(MENU *, attr_t); 169d013bbe3Sblymn int set_menu_format(MENU *, int, int); 170d013bbe3Sblymn int set_menu_grey(MENU *, attr_t); 171d013bbe3Sblymn int set_menu_init(MENU *, Menu_Hook); 172d013bbe3Sblymn int set_menu_items(MENU *, ITEM **); 173d013bbe3Sblymn int set_menu_mark(MENU *, char *); 174d013bbe3Sblymn int set_menu_opts(MENU *, OPTIONS); 175d013bbe3Sblymn int set_menu_pad(MENU *, int); 176d013bbe3Sblymn int set_menu_pattern(MENU *, char *); 177d013bbe3Sblymn int set_menu_sub(MENU *, WINDOW *); 178d013bbe3Sblymn int set_menu_term(MENU *, Menu_Hook); 179d013bbe3Sblymn int set_menu_unmark(MENU *, char *); 180d013bbe3Sblymn int set_menu_userptr(MENU *, char *); 181d013bbe3Sblymn int set_menu_win(MENU *, WINDOW *); 182d013bbe3Sblymn int unpost_menu(MENU *); 183b68c50bcSblymn 184d013bbe3Sblymn ITEM *current_item(MENU *); 185d013bbe3Sblymn int free_item(ITEM *); 186d013bbe3Sblymn int item_count(MENU *); 187d013bbe3Sblymn char *item_description(ITEM *); 188d013bbe3Sblymn int item_index(ITEM *); 189d013bbe3Sblymn Menu_Hook item_init(MENU *); 190d013bbe3Sblymn char *item_name(ITEM *); 191d013bbe3Sblymn OPTIONS item_opts(ITEM *); 192d013bbe3Sblymn int item_opts_off(ITEM *, OPTIONS); 193d013bbe3Sblymn int item_opts_on(ITEM *, OPTIONS); 19409440e90Sblymn int item_selected(MENU *, int **); /* return the item index of selected */ 195d013bbe3Sblymn Menu_Hook item_term(MENU *); 196d013bbe3Sblymn char *item_userptr(ITEM *); 197d013bbe3Sblymn int item_value(ITEM *); 198d013bbe3Sblymn int item_visible(ITEM *); 199d013bbe3Sblymn ITEM **menu_items(MENU *); 200d013bbe3Sblymn ITEM *new_item(char *, char *); 201d013bbe3Sblymn int set_current_item(MENU *, ITEM *); 202d013bbe3Sblymn int set_item_init(MENU *, Menu_Hook); 203d013bbe3Sblymn int set_item_opts(ITEM *, OPTIONS); 204d013bbe3Sblymn int set_item_term(MENU *, Menu_Hook); 205d013bbe3Sblymn int set_item_userptr(ITEM *, char *); 206d013bbe3Sblymn int set_item_value(ITEM *, int); 207b68c50bcSblymn 208b68c50bcSblymn __END_DECLS 209b68c50bcSblymn 210beac10a2Skleink #endif /* !_MENU_H_ */ 211