| /* ----------------------------------------------------------------------- * |
| * |
| * Copyright 2004-2008 H. Peter Anvin - 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., 51 Franklin St, Fifth Floor, |
| * Boston MA 02110-1301, USA; either version 2 of the License, or |
| * (at your option) any later version; incorporated herein by reference. |
| * |
| * ----------------------------------------------------------------------- */ |
| |
| /* |
| * menu.h |
| * |
| * Header file for the simple menu system |
| */ |
| |
| #ifndef MENU_H |
| #define MENU_H |
| |
| #include <time.h> |
| #include <sys/time.h> |
| #include <sys/times.h> |
| #include <inttypes.h> |
| #include <unistd.h> |
| #include <colortbl.h> |
| #include <stdbool.h> |
| #include <getkey.h> |
| #include "refstr.h" |
| |
| /* #define DEBUG 1 */ |
| #include <dprintf.h> |
| |
| #ifndef CLK_TCK |
| # define CLK_TCK sysconf(_SC_CLK_TCK) |
| #endif |
| |
| struct menu; |
| |
| /* Note: the _UNRES variants must always be immediately after their |
| "normal" versions. */ |
| enum menu_action { |
| MA_NONE, /* Undefined value */ |
| MA_CMD, /* Execute a command */ |
| MA_DISABLED, /* Disabled menu entry */ |
| MA_SUBMENU, /* This is a submenu entry */ |
| MA_GOTO, /* Go to another menu */ |
| MA_GOTO_UNRES, /* Unresolved go to */ |
| MA_QUIT, /* Quit to CLI */ |
| MA_EXIT, /* Exit to higher-level menu */ |
| MA_EXIT_UNRES, /* Unresolved exit */ |
| MA_HELP, /* Show help text */ |
| }; |
| |
| struct menu_entry { |
| struct menu *menu; /* Parent menu */ |
| const char *displayname; |
| const char *label; |
| const char *passwd; |
| char *helptext; |
| const char *cmdline; |
| const char *background; |
| struct menu *submenu; |
| struct menu_entry *next; /* Linked list of all labels across menus */ |
| int entry; /* Entry number inside menu */ |
| enum menu_action action; |
| unsigned char hotkey; |
| bool immediate; /* Hotkey action does not require Enter */ |
| bool save; /* Save this entry if selected */ |
| }; |
| |
| static inline bool is_disabled(struct menu_entry *me) |
| { |
| return me->action == MA_DISABLED; |
| } |
| |
| enum kernel_type { |
| /* Meta-types for internal use */ |
| KT_NONE, |
| KT_LOCALBOOT, |
| |
| /* The ones we can pass off to SYSLINUX, in order */ |
| KT_KERNEL, /* Undefined type */ |
| KT_LINUX, /* Linux kernel */ |
| KT_BOOT, /* Bootstrap program */ |
| KT_BSS, /* Boot sector with patch */ |
| KT_PXE, /* PXE NBP */ |
| KT_FDIMAGE, /* Floppy disk image */ |
| KT_COM32, /* COM32 image */ |
| KT_CONFIG, /* Configuration file */ |
| }; |
| |
| /* Configurable integer parameters */ |
| enum parameter_number { |
| P_WIDTH, |
| P_MARGIN, |
| P_PASSWD_MARGIN, |
| P_MENU_ROWS, |
| P_TABMSG_ROW, |
| P_CMDLINE_ROW, |
| P_END_ROW, |
| P_PASSWD_ROW, |
| P_TIMEOUT_ROW, |
| P_HELPMSG_ROW, |
| P_HELPMSGEND_ROW, |
| P_HSHIFT, |
| P_VSHIFT, |
| P_HIDDEN_ROW, |
| |
| NPARAMS |
| }; |
| |
| /* Configurable messages */ |
| enum message_number { |
| MSG_TITLE, |
| MSG_AUTOBOOT, |
| MSG_TAB, |
| MSG_NOTAB, |
| MSG_PASSPROMPT, |
| |
| MSG_COUNT |
| }; |
| |
| struct messages { |
| const char *name; /* Message configuration name */ |
| const char *defmsg; /* Default message text */ |
| }; |
| |
| struct menu_parameter { |
| const char *name; |
| int value; |
| }; |
| |
| extern const struct menu_parameter mparm[NPARAMS]; |
| |
| struct fkey_help { |
| const char *textname; |
| const char *background; |
| }; |
| |
| struct menu { |
| struct menu *next; /* Linked list of all menus */ |
| const char *label; /* Goto label for this menu */ |
| struct menu *parent; |
| struct menu_entry *parent_entry; /* Entry for self in parent */ |
| |
| struct menu_entry **menu_entries; |
| struct menu_entry *menu_hotkeys[256]; |
| |
| const char *messages[MSG_COUNT]; |
| int mparm[NPARAMS]; |
| |
| int nentries; |
| int nentries_space; |
| int defentry; |
| int timeout; |
| |
| bool allowedit; |
| bool immediate; /* MENU IMMEDIATE default for this menu */ |
| bool save; /* MENU SAVE default for this menu */ |
| |
| int curentry; |
| int curtop; |
| |
| const char *title; |
| const char *ontimeout; |
| const char *onerror; |
| const char *menu_master_passwd; |
| const char *menu_background; |
| |
| struct color_table *color_table; |
| |
| struct fkey_help fkeyhelp[12]; |
| }; |
| |
| extern struct menu *root_menu, *start_menu, *hide_menu, *menu_list; |
| |
| /* 2048 is the current definition inside syslinux */ |
| #define MAX_CMDLINE_LEN 2048 |
| |
| /* These are global parameters regardless of which menu we're displaying */ |
| extern int shiftkey; |
| extern int hiddenmenu; |
| extern int clearmenu; |
| extern long long totaltimeout; |
| extern clock_t kbdtimeout; |
| extern const char *hide_key[KEY_MAX]; |
| |
| void parse_configs(char **argv); |
| int draw_background(const char *filename); |
| void set_resolution(int x, int y); |
| void start_console(void); |
| void local_cursor_enable(bool); |
| |
| static inline int my_isspace(char c) |
| { |
| return (unsigned char)c <= ' '; |
| } |
| |
| int my_isxdigit(char c); |
| unsigned int hexval(char c); |
| unsigned int hexval2(const char *p); |
| uint32_t parse_argb(char **p); |
| |
| extern const int message_base_color, menu_color_table_size; |
| int mygetkey(clock_t timeout); |
| int show_message_file(const char *filename, const char *background); |
| |
| /* passwd.c */ |
| int passwd_compare(const char *passwd, const char *entry); |
| |
| /* colors.c */ |
| #define MSG_COLORS_DEF_FG 0x90ffffff |
| #define MSG_COLORS_DEF_BG 0x80ffffff |
| #define MSG_COLORS_DEF_SHADOW SHADOW_NORMAL |
| void set_msg_colors_global(struct color_table *tbl, |
| unsigned int fg, unsigned int bg, |
| enum color_table_shadow shadow); |
| struct color_table *default_color_table(void); |
| struct color_table *copy_color_table(const struct color_table *master); |
| extern const int message_base_color; |
| |
| /* background.c */ |
| extern const char *current_background; |
| void set_background(const char *new_background); |
| |
| /* drain.c */ |
| void drain_keyboard(void); |
| |
| /* chainboot.c */ |
| void chainboot_file(const char *file, enum kernel_type type); |
| |
| #endif /* MENU_H */ |