xref: /netbsd-src/lib/libmenu/menu.h (revision c73d2721d15d261917544c9f48406b9126f4f54c)
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