[e16e8f2] | 1 | /* -*- c -*- ------------------------------------------------------------- * |
---|
| 2 | * |
---|
| 3 | * Copyright 2004-2005 Murali Krishnan Ganapathy - All Rights Reserved |
---|
| 4 | * |
---|
| 5 | * This program is free software; you can redistribute it and/or modify |
---|
| 6 | * it under the terms of the GNU General Public License as published by |
---|
| 7 | * the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
---|
| 8 | * Boston MA 02111-1307, USA; either version 2 of the License, or |
---|
| 9 | * (at your option) any later version; incorporated herein by reference. |
---|
| 10 | * |
---|
| 11 | * ----------------------------------------------------------------------- */ |
---|
| 12 | |
---|
| 13 | /* This program can be compiled for DOS with the OpenWatcom compiler |
---|
| 14 | * (http://www.openwatcom.org/): |
---|
| 15 | * |
---|
| 16 | * wcl -3 -osx -mt <filename>.c |
---|
| 17 | */ |
---|
| 18 | |
---|
| 19 | #ifndef __MENU_H__ |
---|
| 20 | #define __MENU_H__ |
---|
| 21 | |
---|
| 22 | #include "com32io.h" |
---|
| 23 | #include "tui.h" |
---|
| 24 | #include "syslnx.h" |
---|
| 25 | #include <string.h> |
---|
| 26 | #include <unistd.h> |
---|
| 27 | |
---|
| 28 | // TIMEOUT PARAMETERS |
---|
| 29 | /* If no key is pressed within TIMEOUTNUMSTEPS * TIMEOUTSTEPSIZE milliseconds |
---|
| 30 | and if a timeout handler is registered, then that will be called. |
---|
| 31 | The handler should either either take control from there on, or return without |
---|
| 32 | producing any change in the current video settings. |
---|
| 33 | |
---|
| 34 | For e.g. the handler could |
---|
| 35 | * Could just quit the menu program |
---|
| 36 | * beep and return. |
---|
| 37 | |
---|
| 38 | TIMEOUTSTEPSIZE is the interval for which the program sleeps without checking for |
---|
| 39 | any keystroke. So increasing this will make the response of the system slow. |
---|
| 40 | Decreasing this will make a lot of interrupt calls using up your CPU. Default |
---|
| 41 | value of TIMEOUTSTEPSIZE of 0.1 seconds should be right in most cases. |
---|
| 42 | |
---|
| 43 | TIMEOUTNUMSTEPS of 3000 corresponds to a wait time of 300 seconds or 5 minutes |
---|
| 44 | */ |
---|
| 45 | |
---|
| 46 | #define TIMEOUTSTEPSIZE 10 |
---|
| 47 | #define TIMEOUTNUMSTEPS 30000L |
---|
| 48 | |
---|
| 49 | // Attributes |
---|
| 50 | #define NORMALATTR 0x17 |
---|
| 51 | #define NORMALHLITE 0x1F // Normal Highlight attribute |
---|
| 52 | #define REVERSEATTR 0x70 |
---|
| 53 | #define REVERSEHLITE 0x78 // Reverse Hightlight attribute |
---|
| 54 | #define INACTATTR 0x18 |
---|
| 55 | #define INACTHLITE 0x10 // Inactive Highlight attribute |
---|
| 56 | #define REVINACTATTR 0x78 |
---|
| 57 | #define REVINACTHLITE 0x70 // Reverse Inactive Highlight attr |
---|
| 58 | |
---|
| 59 | #define STATUSATTR 0x74 |
---|
| 60 | #define STATUSHLITE 0x7B // Status highlight |
---|
| 61 | |
---|
| 62 | #define FILLCHAR ' ' |
---|
| 63 | #define FILLATTR NORMALATTR |
---|
| 64 | #define SHADOWATTR 0x00 |
---|
| 65 | #define SPACECHAR ' ' |
---|
| 66 | |
---|
| 67 | #define TFILLCHAR ' ' |
---|
| 68 | #define TITLEATTR 0x70 |
---|
| 69 | |
---|
| 70 | #define ENABLEHLITE '<' // Char which turns on highlight |
---|
| 71 | #define DISABLEHLITE '>' // Char which turns off highlight |
---|
| 72 | #define NOHLITE 0 // The offset into attrib array for non-hilite |
---|
| 73 | #define HLITE 1 // The offset for Hlite attrib |
---|
| 74 | |
---|
| 75 | #define MOREABOVE '^' // char to print when more menu items available above |
---|
| 76 | #define MOREBELOW 'v' // more items available below |
---|
| 77 | |
---|
| 78 | // Attributes of the menu system |
---|
| 79 | #define MAXMENUS 250 // Maximum number of menu's allowed |
---|
| 80 | #define MAXMENUSIZE 100 // Default value for max num of entries in each menu |
---|
| 81 | #define MAXMENUHEIGHT 20 // Maximum number of entries displayed |
---|
| 82 | #define MENUBOXTYPE BOX_SINSIN // Default box type Look at tui.h for other values |
---|
| 83 | |
---|
| 84 | // Upper bounds on lengths |
---|
| 85 | // We copy the given string, so user can reuse the space used to store incoming arguments. |
---|
| 86 | #define MENULEN 78 // Each menu entry is atmost MENULEN chars |
---|
| 87 | #define STATLEN 78 // Maximum length of status string |
---|
| 88 | #define TITLELEN 78 // Maximum length of title string |
---|
| 89 | #define ACTIONLEN 255 // Maximum length of an action string |
---|
| 90 | |
---|
| 91 | // Layout of menu |
---|
| 92 | #define MENUROW 3 // Row where menu is displayed (relative to window) |
---|
| 93 | #define MENUCOL 4 // Col where menu is displayed (relative to window) |
---|
| 94 | #define MENUPAGE 1 // show in display page 1 |
---|
| 95 | #define STATLINE 24 // Line number where status line starts (relative to window) |
---|
| 96 | |
---|
| 97 | // Used for printing debugging messages |
---|
| 98 | #define DEBUGLINE 23 // debugging info goes here |
---|
| 99 | |
---|
| 100 | // Other Chars |
---|
| 101 | #define RADIOMENUCHAR '>' // > symbol for radio menu? |
---|
| 102 | #define CHECKED '\140' // Check mark |
---|
| 103 | #define UNCHECKED '\146' // Light bullet |
---|
| 104 | #define RADIOSEL '.' // Current Radio Selection |
---|
| 105 | #define RADIOUNSEL ' ' // Radio option not selected |
---|
| 106 | |
---|
| 107 | typedef unsigned char uchar; |
---|
| 108 | |
---|
| 109 | // Types of menu's |
---|
| 110 | #define NORMALMENU 1 |
---|
| 111 | #define RADIOMENU 2 |
---|
| 112 | |
---|
| 113 | typedef enum { OPT_INACTIVE, OPT_SUBMENU, OPT_RUN, OPT_EXITMENU, OPT_CHECKBOX, |
---|
| 114 | OPT_RADIOMENU, OPT_SEP, OPT_INVISIBLE, |
---|
| 115 | OPT_RADIOITEM |
---|
| 116 | } t_action; |
---|
| 117 | |
---|
| 118 | typedef union { |
---|
| 119 | uchar submenunum; // For submenu's |
---|
| 120 | uchar checked; // For check boxes |
---|
| 121 | uchar radiomenunum; // Item mapping to a radio menu |
---|
| 122 | } t_itemdata; |
---|
| 123 | |
---|
| 124 | struct s_menuitem; |
---|
| 125 | struct s_menu; |
---|
| 126 | struct s_menusystem; |
---|
| 127 | |
---|
| 128 | typedef struct { |
---|
| 129 | unsigned int valid:1; // Is action valid? |
---|
| 130 | unsigned int refresh:1; // Should we recompute menu stuff? |
---|
| 131 | unsigned int reserved:6; // For future expansion |
---|
| 132 | } t_handler_return; |
---|
| 133 | |
---|
| 134 | t_handler_return ACTION_VALID, ACTION_INVALID; // Specific values |
---|
| 135 | |
---|
| 136 | typedef t_handler_return(*t_item_handler) (struct s_menusystem *, |
---|
| 137 | struct s_menuitem *); |
---|
| 138 | typedef void (*t_menusystem_handler) (struct s_menusystem *, |
---|
| 139 | struct s_menuitem *); |
---|
| 140 | typedef void (*t_keys_handler) (struct s_menusystem *, struct s_menuitem *, |
---|
| 141 | unsigned int scancode); |
---|
| 142 | // Last parameter = HIGH BYTE = scan code , LOW BYTE = ASCII CODE |
---|
| 143 | |
---|
| 144 | typedef enum { HDLR_SCREEN, HDLR_KEYS } t_handler; |
---|
| 145 | // Types of handlers for menu system |
---|
| 146 | |
---|
| 147 | // TIMEOUT is the list of possible values which can be returned by the handler |
---|
| 148 | // instructing the menusystem what to do. The default is CODE_WAIT |
---|
| 149 | typedef enum { CODE_WAIT, CODE_ENTER, CODE_ESCAPE } TIMEOUTCODE; |
---|
| 150 | typedef TIMEOUTCODE(*t_timeout_handler) (void); |
---|
| 151 | |
---|
| 152 | typedef struct s_menuitem { |
---|
| 153 | char *item; |
---|
| 154 | char *status; |
---|
| 155 | char *data; // string containing kernel to run.. but... |
---|
| 156 | // for radio menu's this is a pointer to the item selected or NULL (initially) |
---|
| 157 | // for submenu's this string could be name of menu |
---|
| 158 | void *extra_data; // Any other data user can point to |
---|
| 159 | unsigned int helpid; // Used for Context sensitive help |
---|
| 160 | t_item_handler handler; // Pointer to function of type menufn |
---|
| 161 | t_action action; |
---|
| 162 | t_itemdata itemdata; // Data depends on action value |
---|
| 163 | uchar shortcut; // one of [A-Za-z0-9] shortcut for this menu item |
---|
| 164 | uchar index; // Index within the menu array |
---|
| 165 | uchar parindex; // Index of the menu in which this item appears. |
---|
| 166 | |
---|
| 167 | } t_menuitem; |
---|
| 168 | |
---|
| 169 | typedef t_menuitem *pt_menuitem; // Pointer to type menuitem |
---|
| 170 | |
---|
| 171 | typedef struct s_menu { |
---|
| 172 | pt_menuitem *items; // pointer to array of pointer to menuitems |
---|
| 173 | char *title; // Title string for menu |
---|
| 174 | char *name; // menu can be referred to by this string |
---|
| 175 | int maxmenusize; // the size of array allocated |
---|
| 176 | uchar numitems; // how many items do we actually have |
---|
| 177 | uchar menuwidth; |
---|
| 178 | uchar row, col; // Position where this menu should be displayed |
---|
| 179 | uchar menuheight; // Maximum number of items to be displayed |
---|
| 180 | } t_menu; |
---|
| 181 | |
---|
| 182 | typedef t_menu *pt_menu; // Pointer to type menu |
---|
| 183 | |
---|
| 184 | typedef struct s_menusystem { |
---|
| 185 | pt_menu menus[MAXMENUS]; |
---|
| 186 | char *title; |
---|
| 187 | t_menusystem_handler handler; // Menu system handler |
---|
| 188 | t_keys_handler keys_handler; // Handler for unknown keys |
---|
| 189 | t_timeout_handler ontimeout; // Timeout handler |
---|
| 190 | unsigned long tm_numsteps; |
---|
| 191 | // Time to wait for key press=numsteps * stepsize milliseconds |
---|
| 192 | unsigned int tm_stepsize; // Timeout step size (in milliseconds) |
---|
| 193 | // Total timeout max time spent idle before we call handler |
---|
| 194 | unsigned long tm_total_timeout; // (in milli seconds) |
---|
| 195 | unsigned long tm_sofar_timeout; // All accumulated timeout |
---|
| 196 | // total timeout handler |
---|
| 197 | t_timeout_handler ontotaltimeout; // Total timeout handler |
---|
| 198 | |
---|
| 199 | int maxmenuheight; |
---|
| 200 | uchar nummenus; |
---|
| 201 | uchar normalattr[2]; // [0] is non-hlite attr, [1] is hlite attr |
---|
| 202 | uchar reverseattr[2]; |
---|
| 203 | uchar inactattr[2]; |
---|
| 204 | uchar revinactattr[2]; |
---|
| 205 | uchar statusattr[2]; |
---|
| 206 | uchar fillchar; |
---|
| 207 | uchar fillattr; |
---|
| 208 | uchar spacechar; |
---|
| 209 | uchar tfillchar; |
---|
| 210 | uchar titleattr; |
---|
| 211 | uchar shadowattr; |
---|
| 212 | uchar statline; |
---|
| 213 | uchar menupage; |
---|
| 214 | int maxrow, minrow, numrows; // Number of rows in the window |
---|
| 215 | int maxcol, mincol, numcols; // Number of columns in the window |
---|
| 216 | |
---|
| 217 | // Menu box look |
---|
| 218 | char box_horiz, box_ltrt, box_rtlt; // Some chars of the box, for redrawing portions of the box |
---|
| 219 | |
---|
| 220 | } t_menusystem; |
---|
| 221 | |
---|
| 222 | typedef t_menusystem *pt_menusystem; // Pointer to type menusystem |
---|
| 223 | |
---|
| 224 | pt_menuitem showmenus(uchar startmenu); |
---|
| 225 | |
---|
| 226 | pt_menusystem init_menusystem(const char *title); |
---|
| 227 | |
---|
| 228 | void close_menusystem(void); // Deallocate memory used |
---|
| 229 | |
---|
| 230 | void set_normal_attr(uchar normal, uchar selected, uchar inactivenormal, |
---|
| 231 | uchar inactiveselected); |
---|
| 232 | |
---|
| 233 | void set_normal_hlite(uchar normal, uchar selected, uchar inactivenormal, |
---|
| 234 | uchar inactiveselected); |
---|
| 235 | |
---|
| 236 | void set_status_info(uchar statusattr, uchar statushlite, uchar statline); |
---|
| 237 | |
---|
| 238 | void set_title_info(uchar tfillchar, uchar titleattr); |
---|
| 239 | |
---|
| 240 | void set_misc_info(uchar fillchar, uchar fillattr, uchar spacechar, |
---|
| 241 | uchar shadowattr); |
---|
| 242 | |
---|
| 243 | void set_window_size(uchar top, uchar left, uchar bot, uchar right); // Set the window which menusystem should use |
---|
| 244 | |
---|
| 245 | void set_menu_options(uchar maxmenuheight); |
---|
| 246 | // maximum height of a menu |
---|
| 247 | |
---|
| 248 | void reg_handler(t_handler htype, void *handler); // Register handler |
---|
| 249 | |
---|
| 250 | void unreg_handler(t_handler htype); |
---|
| 251 | |
---|
| 252 | void reg_ontimeout(t_timeout_handler, unsigned int numsteps, |
---|
| 253 | unsigned int stepsize); |
---|
| 254 | // Set timeout handler, set 0 for default values. |
---|
| 255 | // So stepsize=0 means numsteps is measured in centiseconds. |
---|
| 256 | void unreg_ontimeout(void); |
---|
| 257 | |
---|
| 258 | void reg_ontotaltimeout(t_timeout_handler, unsigned long numcentiseconds); |
---|
| 259 | void unreg_ontotaltimeout(void); |
---|
| 260 | |
---|
| 261 | // Find the number of the menu given the name |
---|
| 262 | // Returns -1 if not found |
---|
| 263 | uchar find_menu_num(const char *name); |
---|
| 264 | |
---|
| 265 | // Create a new menu and return its position |
---|
| 266 | uchar add_menu(const char *title, int maxmenusize); |
---|
| 267 | |
---|
| 268 | // Create a named menu and return its position |
---|
| 269 | uchar add_named_menu(const char *name, const char *title, int maxmenusize); |
---|
| 270 | |
---|
| 271 | void set_menu_pos(uchar row, uchar col); // Set the position of this menu. |
---|
| 272 | |
---|
| 273 | // Add item to the "current" menu |
---|
| 274 | pt_menuitem add_item(const char *item, const char *status, t_action action, |
---|
| 275 | const char *data, uchar itemdata); |
---|
| 276 | |
---|
| 277 | // Set shortcut key and help id |
---|
| 278 | void set_item_options(uchar shortcut, int helpid); |
---|
| 279 | |
---|
| 280 | // Set the shortcut key for the current item |
---|
| 281 | static inline void set_shortcut(uchar shortcut) |
---|
| 282 | { |
---|
| 283 | set_item_options(shortcut, 0xFFFF); |
---|
| 284 | } |
---|
| 285 | |
---|
| 286 | // Add a separator to the "current" menu |
---|
| 287 | pt_menuitem add_sep(void); |
---|
| 288 | |
---|
| 289 | // Generate string based on state of checkboxes and radioitem in given menu |
---|
| 290 | // and append string to existing contents of "line" |
---|
| 291 | // line must have enough space allocated |
---|
| 292 | void gen_append_line(const char *menu_name, char *line); |
---|
| 293 | |
---|
| 294 | #endif |
---|