279 lines
8 KiB
C
279 lines
8 KiB
C
#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
|