| /* -*- c -*- ------------------------------------------------------------- * |
| * |
| * Copyright 2004-2005 Murali Krishnan Ganapathy - All Rights Reserved |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
| * Boston MA 02111-1307, USA; either version 2 of the License, or |
| * (at your option) any later version; incorporated herein by reference. |
| * |
| * ----------------------------------------------------------------------- */ |
| |
| /* This program can be compiled for DOS with the OpenWatcom compiler |
| * (http://www.openwatcom.org/): |
| * |
| * wcl -3 -osx -mt <filename>.c |
| */ |
| |
| #ifndef __MENU_H__ |
| #define __MENU_H__ |
| |
| #include "com32io.h" |
| #include "tui.h" |
| #include "syslnx.h" |
| #include <string.h> |
| #include <unistd.h> |
| |
| // TIMEOUT PARAMETERS |
| /* If no key is pressed within TIMEOUTNUMSTEPS * TIMEOUTSTEPSIZE milliseconds |
| and if a timeout handler is registered, then that will be called. |
| The handler should either either take control from there on, or return without |
| producing any change in the current video settings. |
| |
| For e.g. the handler could |
| * Could just quit the menu program |
| * beep and return. |
| |
| TIMEOUTSTEPSIZE is the interval for which the program sleeps without checking for |
| any keystroke. So increasing this will make the response of the system slow. |
| Decreasing this will make a lot of interrupt calls using up your CPU. Default |
| value of TIMEOUTSTEPSIZE of 0.1 seconds should be right in most cases. |
| |
| TIMEOUTNUMSTEPS of 3000 corresponds to a wait time of 300 seconds or 5 minutes |
| */ |
| |
| #define TIMEOUTSTEPSIZE 10 |
| #define TIMEOUTNUMSTEPS 30000L |
| |
| // Attributes |
| #define NORMALATTR 0x17 |
| #define NORMALHLITE 0x1F // Normal Highlight attribute |
| #define REVERSEATTR 0x70 |
| #define REVERSEHLITE 0x78 // Reverse Hightlight attribute |
| #define INACTATTR 0x18 |
| #define INACTHLITE 0x10 // Inactive Highlight attribute |
| #define REVINACTATTR 0x78 |
| #define REVINACTHLITE 0x70 // Reverse Inactive Highlight attr |
| |
| #define STATUSATTR 0x74 |
| #define STATUSHLITE 0x7B // Status highlight |
| |
| #define FILLCHAR ' ' |
| #define FILLATTR NORMALATTR |
| #define SHADOWATTR 0x00 |
| #define SPACECHAR ' ' |
| |
| #define TFILLCHAR ' ' |
| #define TITLEATTR 0x70 |
| |
| #define ENABLEHLITE '<' // Char which turns on highlight |
| #define DISABLEHLITE '>' // Char which turns off highlight |
| #define NOHLITE 0 // The offset into attrib array for non-hilite |
| #define HLITE 1 // The offset for Hlite attrib |
| |
| #define MOREABOVE '^' // char to print when more menu items available above |
| #define MOREBELOW 'v' // more items available below |
| |
| // Attributes of the menu system |
| #define MAXMENUS 250 // Maximum number of menu's allowed |
| #define MAXMENUSIZE 100 // Default value for max num of entries in each menu |
| #define MAXMENUHEIGHT 20 // Maximum number of entries displayed |
| #define MENUBOXTYPE BOX_SINSIN // Default box type Look at tui.h for other values |
| |
| // Upper bounds on lengths |
| // We copy the given string, so user can reuse the space used to store incoming arguments. |
| #define MENULEN 78 // Each menu entry is atmost MENULEN chars |
| #define STATLEN 78 // Maximum length of status string |
| #define TITLELEN 78 // Maximum length of title string |
| #define ACTIONLEN 255 // Maximum length of an action string |
| |
| // Layout of menu |
| #define MENUROW 3 // Row where menu is displayed (relative to window) |
| #define MENUCOL 4 // Col where menu is displayed (relative to window) |
| #define MENUPAGE 1 // show in display page 1 |
| #define STATLINE 24 // Line number where status line starts (relative to window) |
| |
| // Used for printing debugging messages |
| #define DEBUGLINE 23 // debugging info goes here |
| |
| // Other Chars |
| #define RADIOMENUCHAR '>' // > symbol for radio menu? |
| #define CHECKED '\140' // Check mark |
| #define UNCHECKED '\146' // Light bullet |
| #define RADIOSEL '.' // Current Radio Selection |
| #define RADIOUNSEL ' ' // Radio option not selected |
| |
| typedef unsigned char uchar; |
| |
| // Types of menu's |
| #define NORMALMENU 1 |
| #define RADIOMENU 2 |
| |
| typedef enum { OPT_INACTIVE, OPT_SUBMENU, OPT_RUN, OPT_EXITMENU, OPT_CHECKBOX, |
| OPT_RADIOMENU, OPT_SEP, OPT_INVISIBLE, |
| OPT_RADIOITEM |
| } t_action; |
| |
| typedef union { |
| uchar submenunum; // For submenu's |
| uchar checked; // For check boxes |
| uchar radiomenunum; // Item mapping to a radio menu |
| } t_itemdata; |
| |
| struct s_menuitem; |
| struct s_menu; |
| struct s_menusystem; |
| |
| typedef struct { |
| unsigned int valid:1; // Is action valid? |
| unsigned int refresh:1; // Should we recompute menu stuff? |
| unsigned int reserved:6; // For future expansion |
| } t_handler_return; |
| |
| t_handler_return ACTION_VALID, ACTION_INVALID; // Specific values |
| |
| typedef t_handler_return(*t_item_handler) (struct s_menusystem *, |
| struct s_menuitem *); |
| typedef void (*t_menusystem_handler) (struct s_menusystem *, |
| struct s_menuitem *); |
| typedef void (*t_keys_handler) (struct s_menusystem *, struct s_menuitem *, |
| unsigned int scancode); |
| // Last parameter = HIGH BYTE = scan code , LOW BYTE = ASCII CODE |
| |
| typedef enum { HDLR_SCREEN, HDLR_KEYS } t_handler; |
| // Types of handlers for menu system |
| |
| // TIMEOUT is the list of possible values which can be returned by the handler |
| // instructing the menusystem what to do. The default is CODE_WAIT |
| typedef enum { CODE_WAIT, CODE_ENTER, CODE_ESCAPE } TIMEOUTCODE; |
| typedef TIMEOUTCODE(*t_timeout_handler) (void); |
| |
| typedef struct s_menuitem { |
| char *item; |
| char *status; |
| char *data; // string containing kernel to run.. but... |
| // for radio menu's this is a pointer to the item selected or NULL (initially) |
| // for submenu's this string could be name of menu |
| void *extra_data; // Any other data user can point to |
| unsigned int helpid; // Used for Context sensitive help |
| t_item_handler handler; // Pointer to function of type menufn |
| t_action action; |
| t_itemdata itemdata; // Data depends on action value |
| uchar shortcut; // one of [A-Za-z0-9] shortcut for this menu item |
| uchar index; // Index within the menu array |
| uchar parindex; // Index of the menu in which this item appears. |
| |
| } t_menuitem; |
| |
| typedef t_menuitem *pt_menuitem; // Pointer to type menuitem |
| |
| typedef struct s_menu { |
| pt_menuitem *items; // pointer to array of pointer to menuitems |
| char *title; // Title string for menu |
| char *name; // menu can be referred to by this string |
| int maxmenusize; // the size of array allocated |
| uchar numitems; // how many items do we actually have |
| uchar menuwidth; |
| uchar row, col; // Position where this menu should be displayed |
| uchar menuheight; // Maximum number of items to be displayed |
| } t_menu; |
| |
| typedef t_menu *pt_menu; // Pointer to type menu |
| |
| typedef struct s_menusystem { |
| pt_menu menus[MAXMENUS]; |
| char *title; |
| t_menusystem_handler handler; // Menu system handler |
| t_keys_handler keys_handler; // Handler for unknown keys |
| t_timeout_handler ontimeout; // Timeout handler |
| unsigned long tm_numsteps; |
| // Time to wait for key press=numsteps * stepsize milliseconds |
| unsigned int tm_stepsize; // Timeout step size (in milliseconds) |
| // Total timeout max time spent idle before we call handler |
| unsigned long tm_total_timeout; // (in milli seconds) |
| unsigned long tm_sofar_timeout; // All accumulated timeout |
| // total timeout handler |
| t_timeout_handler ontotaltimeout; // Total timeout handler |
| |
| int maxmenuheight; |
| uchar nummenus; |
| uchar normalattr[2]; // [0] is non-hlite attr, [1] is hlite attr |
| uchar reverseattr[2]; |
| uchar inactattr[2]; |
| uchar revinactattr[2]; |
| uchar statusattr[2]; |
| uchar fillchar; |
| uchar fillattr; |
| uchar spacechar; |
| uchar tfillchar; |
| uchar titleattr; |
| uchar shadowattr; |
| uchar statline; |
| uchar menupage; |
| int maxrow, minrow, numrows; // Number of rows in the window |
| int maxcol, mincol, numcols; // Number of columns in the window |
| |
| // Menu box look |
| char box_horiz, box_ltrt, box_rtlt; // Some chars of the box, for redrawing portions of the box |
| |
| } t_menusystem; |
| |
| typedef t_menusystem *pt_menusystem; // Pointer to type menusystem |
| |
| pt_menuitem showmenus(uchar startmenu); |
| |
| pt_menusystem init_menusystem(const char *title); |
| |
| void close_menusystem(void); // Deallocate memory used |
| |
| void set_normal_attr(uchar normal, uchar selected, uchar inactivenormal, |
| uchar inactiveselected); |
| |
| void set_normal_hlite(uchar normal, uchar selected, uchar inactivenormal, |
| uchar inactiveselected); |
| |
| void set_status_info(uchar statusattr, uchar statushlite, uchar statline); |
| |
| void set_title_info(uchar tfillchar, uchar titleattr); |
| |
| void set_misc_info(uchar fillchar, uchar fillattr, uchar spacechar, |
| uchar shadowattr); |
| |
| void set_window_size(uchar top, uchar left, uchar bot, uchar right); // Set the window which menusystem should use |
| |
| void set_menu_options(uchar maxmenuheight); |
| // maximum height of a menu |
| |
| void reg_handler(t_handler htype, void *handler); // Register handler |
| |
| void unreg_handler(t_handler htype); |
| |
| void reg_ontimeout(t_timeout_handler, unsigned int numsteps, |
| unsigned int stepsize); |
| // Set timeout handler, set 0 for default values. |
| // So stepsize=0 means numsteps is measured in centiseconds. |
| void unreg_ontimeout(void); |
| |
| void reg_ontotaltimeout(t_timeout_handler, unsigned long numcentiseconds); |
| void unreg_ontotaltimeout(void); |
| |
| // Find the number of the menu given the name |
| // Returns -1 if not found |
| uchar find_menu_num(const char *name); |
| |
| // Create a new menu and return its position |
| uchar add_menu(const char *title, int maxmenusize); |
| |
| // Create a named menu and return its position |
| uchar add_named_menu(const char *name, const char *title, int maxmenusize); |
| |
| void set_menu_pos(uchar row, uchar col); // Set the position of this menu. |
| |
| // Add item to the "current" menu |
| pt_menuitem add_item(const char *item, const char *status, t_action action, |
| const char *data, uchar itemdata); |
| |
| // Set shortcut key and help id |
| void set_item_options(uchar shortcut, int helpid); |
| |
| // Set the shortcut key for the current item |
| static inline void set_shortcut(uchar shortcut) |
| { |
| set_item_options(shortcut, 0xFFFF); |
| } |
| |
| // Add a separator to the "current" menu |
| pt_menuitem add_sep(void); |
| |
| // Generate string based on state of checkboxes and radioitem in given menu |
| // and append string to existing contents of "line" |
| // line must have enough space allocated |
| void gen_append_line(const char *menu_name, char *line); |
| |
| #endif |