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