| #ifndef MENU_H |
| #define MENU_H |
| |
| #ifdef SIM |
| #include <stdlib.h> |
| #else |
| #include <common.h> |
| #endif |
| |
| #include "list.h" |
| |
| #ifdef SIM |
| #define GETENV(x) getenv(x) |
| #define SETENV(x,y) setenv(x,y,1) |
| #else |
| #define GETENV(x) getenv(x) |
| #define SETENV(x,y) setenv(x,y) |
| #endif |
| |
| #ifndef NULL |
| #define NULL ((void *)0L) |
| #endif |
| |
| /* Menu attributes */ |
| #define MENUATTR_NORMAL 0 /* Attribute used by standard menus */ |
| #define MENUATTR_ITEM 1 /* Attribute for menu items (normal) */ |
| #define MENUATTR_HILITE 2 /* Attribute for highlighted menu items */ |
| #define MENUATTR_DISABLED 3 /* Attribute for disabled menu items */ |
| |
| #ifndef bool_defined |
| #define bool_defined |
| typedef int bool; |
| #endif |
| |
| #ifndef true |
| #define true 1 |
| #endif |
| |
| #ifndef false |
| #define false 0 |
| #endif |
| |
| #define MAX_MENUS 30 |
| |
| #define KEY_NONE 0 /* No or false key pressed */ |
| #define KEY_NEXT_OPTION 1 /* Page Down, Arrow right */ |
| #define KEY_PREV_OPTION 2 /* Page Up, Arrow left */ |
| #define KEY_NEXT_ITEM 3 /* Arrow down */ |
| #define KEY_PREV_ITEM 4 /* Arrow up */ |
| #define KEY_ABORT 5 /* ESC */ |
| #define KEY_ACTIVATE 6 /* Return */ |
| #define KEY_DELETE 7 /* Backspace */ |
| #define KEY_F1 8 |
| |
| #define EXIT_AND_SAVE 0 |
| #define EXIT_AND_NO_SAVE 1 |
| #define EXIT_NOT 2 |
| #define EXIT_SAVE_PERMANENT 3 |
| #define EXIT_TO_SHELL 4 |
| |
| |
| #define SINGLE_BOX 0 |
| #define DOUBLE_BOX 1 |
| |
| #ifdef SIM |
| #include "sim.h" |
| #endif |
| |
| struct item_s; |
| struct menu_s; |
| |
| typedef void (*load_func)(struct menu_s *menu, struct item_s *item); |
| typedef void (*save_func)(struct menu_s *menu, struct item_s *item); |
| typedef void (*render_func)(struct menu_s *menu, struct item_s *item, int state); |
| typedef void (*invoke_func)(struct menu_s *menu, struct item_s *item, int key); |
| |
| typedef struct item_s |
| { |
| node_t link; /* Link for chaining */ |
| int x,y; /* Position */ |
| int w,h; /* Size */ |
| char *help_text; /* Help text do display */ |
| int front_width; /* Width of front display matter */ |
| int back_width; /* Width of option data or 0 */ |
| bool disabled; /* Wether this item is active or disabled */ |
| bool break_after; /* After this item break to next column */ |
| load_func f_load; /* Functio to load the setting */ |
| render_func f_render; /* Function to render contents */ |
| save_func f_save; /* Function to save the setting */ |
| invoke_func f_invoke; /* Function to handle key event */ |
| } item_t; |
| |
| |
| #define MENUTYPE_FORM 1 /* Form-integrated menu */ |
| #define MENUTYPE_POPUP 2 /* Popup menu (drawing differs) */ |
| |
| typedef struct menu_s |
| { |
| node_t link; |
| char *menu_title; /* Title of the menu */ |
| int type; /* Type of menu */ |
| bool two_colums; /* True for two-column menus */ |
| int x,y,w,h; /* Coordinates and extends */ |
| void *user_data; /* User data of menu */ |
| bool needs_layout; |
| int item_spacing; |
| item_t *current_item; /* current item */ |
| mylist_t item_list; |
| |
| char *parent_menu; /* Where to return when ESC is pressed */ |
| struct form_s *parent_form; /* Form where this is currently being displayed */ |
| } menu_t; |
| |
| typedef struct form_s |
| { |
| char *form_title; /* Title of the form */ |
| menu_t *current_menu; /* Menu that is active */ |
| menu_t *popup_save; /* Backup when popup is active */ |
| item_t *popup_item_save; /* Backup which item was active */ |
| |
| int menu_stack_ptr; /* Stack pointer */ |
| menu_t *menu_stack[MAX_MENUS];/* Previous menus */ |
| |
| mylist_t menu_list; |
| } form_t; |
| |
| void menu_draw_current_form(void); |
| void menu_init(void); |
| void menu_set_active_item(menu_t *menu, int nr); |
| void menu_draw_form(form_t *form); |
| void menu_form_switch_menu(form_t *form, char *name); |
| void menu_form_popup(form_t *form, menu_t* menu); |
| |
| /* Utility functions */ |
| |
| |
| void leave_func(item_t *item, void *dummy, int arg); |
| void menu_draw_help(item_t *item); |
| void menu_set_form(form_t *form); |
| void menu_do(bool do_leave_menu); |
| |
| |
| /* Item types */ |
| |
| /* |
| * Item: Boolean from a console var |
| * Creation args: |
| * (char *) display name |
| * (char *) variable name |
| * (char *) positive text ("yes", "true", "enabled", "on") |
| * (char *) negative text ("no", "false", "disabled", "off") |
| * int default if unset (0=negative, !0=positive) |
| */ |
| //#define ITEMTYPE_BOOL_CVAR 0 |
| |
| /* |
| * Item: Invoke-a-function item |
| * Creation args: |
| * (char *) display name |
| * (void *)(item_t *, void *, int) |
| * Function to invoke |
| * (void *) First parameter to be passed |
| * int Second parameter to be passed |
| */ |
| #define ITEMTYPE_FUNC 1 |
| |
| /* |
| * Item: Submenu |
| * Creation args: |
| * (char *) display name |
| * (char *) menu to change to |
| */ |
| #define ITEMTYPE_SUBMENU 2 |
| |
| /* |
| * Item: Popup Choice |
| * Creation args: |
| * (char *) display name |
| * int default choice |
| * (void *) hook user data. |
| * (void *) Save hook. See below |
| * (void *) Load hook. See below |
| * (popup_entry_t *) pointer to an array of popup_entry structures. |
| * Terminate with all entries set to NULL. |
| * |
| * Save/Load hook: |
| * Thes functions are called whenever the item needs to be loaded or saved. |
| * The prototypes are: |
| * |
| * int load(void *user_data, popup_entry_t *entries); |
| * void save(void *user_data, popup_entry_t *selected); |
| * |
| * Load: The function is invoked with the third creation argument (user data) and |
| * a pointer to the popup_entry** specified as the sixth argument. It should |
| * return the index of the entry that would become the selected/active entry. |
| * |
| * Save: The function is invoked with the user data and a pointer to the selected |
| * entry in the popup. It should save the value to an appropriate place, e.g. |
| * an environment variable. |
| * |
| */ |
| #define ITEMTYPE_POPUP 3 |
| |
| typedef struct _popup_entry |
| { |
| char *display_text; /* What the entry should display */ |
| char *value_text; /* What the entry should represent. For the hooks only */ |
| void *user_data; /* Additional hook user data. Use as you wish */ |
| } popup_entry_t; |
| |
| |
| /* |
| * Item: String from a console variable |
| * Creation args: |
| * (char *) display name |
| * (char *) variable name |
| * (char *) default if unset |
| */ |
| #define ITEMTYPE_STRING_CVAR 4 |
| |
| /* |
| * Item: Unselectable label |
| * Creatation args: |
| * (char *) display name |
| */ |
| #define ITEMTYPE_LABEL 5 |
| |
| /* |
| * Item: Numerical value editor |
| * Creation args: |
| * (char *) display name |
| * (int) default value |
| * (int) stepping rate |
| * (int) lower bound |
| * (int) upper bound |
| * (int) 0=decimal, 1=hex |
| * (void *) load hook (see below) |
| * (void *) save hook (see below) |
| * (void *) param 1 for hooks |
| * int param 2 for hooks |
| * |
| * Hooks work similar to popup types. The prototype for the hooks is |
| * int load(void *param1, int param2, int default); |
| * void save(void *param1, int param2, int value); |
| * If load is unable to load, it should return default. |
| */ |
| //#define ITEMTYPE_NUMERIC 6 |
| |
| /* |
| * Item: Configuration register editor |
| * Creation args: |
| * (char *) Display name |
| * (void *) register descriptor pointer (see below) |
| */ |
| //#define ITEMTYPE_REGISTER 7 |
| /* |
| typedef struct |
| { |
| char *register_name; |
| int config_offset; |
| int config_type; |
| int value_type; |
| int bus; |
| int devfn; |
| void *menu_page; |
| } articia_register_t; |
| |
| typedef struct |
| { |
| char *title; |
| articia_register_t *registers; |
| } articia_menu_page_t; |
| |
| enum |
| { |
| CONFIG_DWORD = 0, CONFIG_WORD = 1, CONFIG_BYTE = 2, TYPE_HEX = 0, TYPE_DEC = 1 |
| }; |
| */ |
| #endif |