menu.h revision 1.1 1 1.1 blymn /* $Id: menu.h,v 1.1 1999/11/23 11:12:34 blymn Exp $ */
2 1.1 blymn
3 1.1 blymn /*-
4 1.1 blymn * Copyright (c) 1998-1999 Brett Lymn (blymn (at) baea.com.au, brett_lymn (at) yahoo.com)
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.1 blymn * derived from this software withough 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.1 blymn #include <curses.h>
30 1.1 blymn #include <eti.h>
31 1.1 blymn
32 1.1 blymn #ifndef MENU_H
33 1.1 blymn #define MENU_H 1
34 1.1 blymn
35 1.1 blymn /* the following is a hack to define attr_t until the curses lib
36 1.1 blymn does it officially */
37 1.1 blymn #ifndef CURSES_V3
38 1.1 blymn typedef char attr_t;
39 1.1 blymn #endif
40 1.1 blymn
41 1.1 blymn /* requests for the menu_driver call */
42 1.1 blymn #define REQ_BASE_NUM (0x100)
43 1.1 blymn #define REQ_LEFT_ITEM (0x101)
44 1.1 blymn #define REQ_RIGHT_ITEM (0x102)
45 1.1 blymn #define REQ_UP_ITEM (0x103)
46 1.1 blymn #define REQ_DOWN_ITEM (0x104)
47 1.1 blymn #define REQ_SCR_ULINE (0x105)
48 1.1 blymn #define REQ_SCR_DLINE (0x106)
49 1.1 blymn #define REQ_SCR_DPAGE (0x107)
50 1.1 blymn #define REQ_SCR_UPAGE (0x108)
51 1.1 blymn #define REQ_FIRST_ITEM (0x109)
52 1.1 blymn #define REQ_LAST_ITEM (0x10a)
53 1.1 blymn #define REQ_NEXT_ITEM (0x10b)
54 1.1 blymn #define REQ_PREV_ITEM (0x10c)
55 1.1 blymn #define REQ_TOGGLE_ITEM (0x10d)
56 1.1 blymn #define REQ_CLEAR_PATTERN (0x10e)
57 1.1 blymn #define REQ_BACK_PATTERN (0x10f)
58 1.1 blymn #define REQ_NEXT_MATCH (0x110)
59 1.1 blymn #define REQ_PREV_MATCH (0x111)
60 1.1 blymn
61 1.1 blymn #define MAX_COMMAND (0x111) /* last menu driver request - for application
62 1.1 blymn defined commands */
63 1.1 blymn
64 1.1 blymn /* Menu options */
65 1.1 blymn typedef unsigned int OPTIONS;
66 1.1 blymn
67 1.1 blymn /* and the values they can have */
68 1.1 blymn #define O_ONEVALUE (0x1)
69 1.1 blymn #define O_SHOWDESC (0x2)
70 1.1 blymn #define O_ROWMAJOR (0x4)
71 1.1 blymn #define O_IGNORECASE (0x8)
72 1.1 blymn #define O_SHOWMATCH (0x10)
73 1.1 blymn #define O_NONCYCLIC (0x20)
74 1.1 blymn #define O_SELECTABLE (0x40)
75 1.1 blymn
76 1.1 blymn typedef struct __menu_str {
77 1.1 blymn char *string;
78 1.1 blymn int length;
79 1.1 blymn } MENU_STR;
80 1.1 blymn
81 1.1 blymn typedef struct __menu MENU;
82 1.1 blymn typedef struct __item ITEM;
83 1.1 blymn
84 1.1 blymn typedef void (*_menui_menu_hook) (MENU *);
85 1.1 blymn
86 1.1 blymn struct __item {
87 1.1 blymn MENU_STR name;
88 1.1 blymn MENU_STR description;
89 1.1 blymn char *userptr;
90 1.1 blymn int visible; /* set if item is visible */
91 1.1 blymn int selected; /* set if item has been selected */
92 1.1 blymn int row; /* menu row this item is on */
93 1.1 blymn int col; /* menu column this item is on */
94 1.1 blymn OPTIONS opts;
95 1.1 blymn MENU *parent; /* menu this item is bound to */
96 1.1 blymn int index; /* index number for this item, if attached */
97 1.1 blymn /* The following are the item's neighbours - makes menu
98 1.1 blymn navigation easier */
99 1.1 blymn ITEM *left;
100 1.1 blymn ITEM *right;
101 1.1 blymn ITEM *up;
102 1.1 blymn ITEM *down;
103 1.1 blymn };
104 1.1 blymn
105 1.1 blymn struct __menu {
106 1.1 blymn int rows; /* max number of rows to be displayed */
107 1.1 blymn int cols; /* max number of columns to be displayed */
108 1.1 blymn int item_rows; /* number of item rows we have */
109 1.1 blymn int item_cols; /* number of item columns we have */
110 1.1 blymn int cur_row; /* current cursor row */
111 1.1 blymn int cur_col; /* current cursor column */
112 1.1 blymn MENU_STR mark; /* menu mark string */
113 1.1 blymn MENU_STR unmark; /* menu unmark string */
114 1.1 blymn OPTIONS opts; /* options for the menu */
115 1.1 blymn char *pattern; /* the pattern buffer */
116 1.1 blymn int plen; /* pattern buffer length */
117 1.1 blymn int match_len; /* length of pattern matched */
118 1.1 blymn int posted; /* set if menu is posted */
119 1.1 blymn attr_t fore; /* menu foreground */
120 1.1 blymn attr_t back; /* menu background */
121 1.1 blymn attr_t grey; /* greyed out (nonselectable) menu item */
122 1.1 blymn int pad; /* filler char between name and description */
123 1.1 blymn char *userptr;
124 1.1 blymn int top_row; /* the row that is at the top of the menu */
125 1.1 blymn int max_item_width; /* widest item */
126 1.1 blymn int col_width; /* width of the menu columns - this is not always
127 1.1 blymn the same as the widest item */
128 1.1 blymn int item_count; /* number of items attached */
129 1.1 blymn ITEM **items; /* items associated with this menu */
130 1.1 blymn int cur_item; /* item cursor is currently positioned at */
131 1.1 blymn int in_init; /* set when processing an init or term function call */
132 1.1 blymn _menui_menu_hook menu_init; /* call this when menu is posted */
133 1.1 blymn _menui_menu_hook menu_term; /* call this when menu is unposted */
134 1.1 blymn _menui_menu_hook item_init; /* call this when menu posted & after
135 1.1 blymn current item changes */
136 1.1 blymn _menui_menu_hook item_term; /* call this when menu unposted & just
137 1.1 blymn before current item changes */
138 1.1 blymn WINDOW *menu_win; /* the menu window */
139 1.1 blymn WINDOW *menu_subwin; /* the menu subwindow */
140 1.1 blymn int we_created;
141 1.1 blymn };
142 1.1 blymn
143 1.1 blymn
144 1.1 blymn /* Public function prototypes. */
145 1.1 blymn __BEGIN_DECLS
146 1.1 blymn int menu_driver __P((MENU *, int));
147 1.1 blymn int scale_menu __P((MENU *, int *, int *));
148 1.1 blymn int set_top_row __P((MENU *, int));
149 1.1 blymn int pos_menu_cursor __P((MENU *));
150 1.1 blymn int top_row __P((MENU *));
151 1.1 blymn
152 1.1 blymn int free_menu __P((MENU *));
153 1.1 blymn char menu_back __P((MENU *));
154 1.1 blymn char menu_fore __P((MENU *));
155 1.1 blymn void menu_format __P((MENU *, int *, int *));
156 1.1 blymn char menu_grey __P((MENU *));
157 1.1 blymn _menui_menu_hook menu_init __P((MENU *));
158 1.1 blymn char *menu_mark __P((MENU *));
159 1.1 blymn OPTIONS menu_opts __P((MENU *));
160 1.1 blymn int menu_opts_off __P((MENU *, OPTIONS));
161 1.1 blymn int menu_opts_on __P((MENU *, OPTIONS));
162 1.1 blymn int menu_pad __P((MENU *));
163 1.1 blymn char *menu_pattern __P((MENU *));
164 1.1 blymn WINDOW *menu_sub __P((MENU *));
165 1.1 blymn _menui_menu_hook menu_term __P((MENU *));
166 1.1 blymn char *menu_unmark __P((MENU *));
167 1.1 blymn char *menu_userptr __P((MENU *));
168 1.1 blymn WINDOW *menu_win __P((MENU *));
169 1.1 blymn MENU *new_menu __P((ITEM **));
170 1.1 blymn int post_menu __P((MENU *));
171 1.1 blymn int set_menu_back __P((MENU *, attr_t));
172 1.1 blymn int set_menu_fore __P((MENU *, attr_t));
173 1.1 blymn int set_menu_format __P((MENU *, int, int));
174 1.1 blymn int set_menu_grey __P((MENU *, attr_t));
175 1.1 blymn int set_menu_init __P((MENU *, _menui_menu_hook));
176 1.1 blymn int set_menu_items __P((MENU *, ITEM **));
177 1.1 blymn int set_menu_mark __P((MENU *, char *));
178 1.1 blymn int set_menu_opts __P((MENU *, OPTIONS));
179 1.1 blymn int set_menu_pad __P((MENU *, int));
180 1.1 blymn int set_menu_pattern __P((MENU *, char *));
181 1.1 blymn int set_menu_sub __P((MENU *, WINDOW *));
182 1.1 blymn int set_menu_term __P((MENU *, _menui_menu_hook));
183 1.1 blymn int set_menu_unmark __P((MENU *, char *));
184 1.1 blymn int set_menu_userptr __P((MENU *, char *));
185 1.1 blymn int set_menu_win __P((MENU *, WINDOW *));
186 1.1 blymn int unpost_menu __P((MENU *));
187 1.1 blymn
188 1.1 blymn ITEM *current_item __P((MENU *));
189 1.1 blymn int free_item __P((ITEM *));
190 1.1 blymn int item_count __P((MENU *));
191 1.1 blymn char *item_description __P((ITEM *));
192 1.1 blymn int item_index __P((ITEM *));
193 1.1 blymn _menui_menu_hook item_init __P((MENU *));
194 1.1 blymn char *item_name __P((ITEM *));
195 1.1 blymn OPTIONS item_opts __P((ITEM *));
196 1.1 blymn int item_opts_off __P((ITEM *, OPTIONS));
197 1.1 blymn int item_opts_on __P((ITEM *, OPTIONS));
198 1.1 blymn _menui_menu_hook item_term __P((MENU *));
199 1.1 blymn char *item_userptr __P((ITEM *));
200 1.1 blymn int item_value __P((ITEM *));
201 1.1 blymn int item_visible __P((ITEM *));
202 1.1 blymn ITEM **menu_items __P((MENU *));
203 1.1 blymn ITEM *new_item __P((char *, char *));
204 1.1 blymn int set_current_item __P((MENU *, ITEM *));
205 1.1 blymn int set_item_init __P((MENU *, _menui_menu_hook));
206 1.1 blymn int set_item_opts __P((ITEM *, OPTIONS));
207 1.1 blymn int set_item_term __P((MENU *, _menui_menu_hook));
208 1.1 blymn int set_item_userptr __P((ITEM *, char *));
209 1.1 blymn int set_item_value __P((ITEM *, int));
210 1.1 blymn
211 1.1 blymn #ifdef EXPOSE_PRIVATES
212 1.1 blymn void __menui_draw_item __P((MENU *, int));
213 1.1 blymn
214 1.1 blymn /* stole this from curses.h */
215 1.1 blymn #define max(a,b) ((a) > (b) ? a : b)
216 1.1 blymn #endif
217 1.1 blymn __END_DECLS
218 1.1 blymn
219 1.1 blymn #endif
220