$Id$

There are two menu systems included with SYSLINUX, the advanced menu
system, and the simple menu system.


+++ THE ADVANCED MENU SYSTEM +++

The advanced menu system, written by Murali Krishnan Ganapathy, is
located in the menu/ subdirectly.  It allows the user to create
hierarchial submenus, dynamic options, checkboxes, and just about
anything you want.  It requires that the menu is compiled from a
simple C file, see menu/simple.c and menu/complex.c for examples.

The advanced menu system doesn't support serial console at this time.

See menu/README for more information.


+++ THE SIMPLE MENU SYSTEM +++

The simple menu system is a single module located at
com32/modules/menu.c32.  It uses the same configuration file as the
regular SYSLINUX command line, and displays all the LABEL statements.

To use the menu system, simply make sure menu.c32 is in the
appropriate location for your boot medium (the same directory as the
configuration file for SYSLINUX, EXTLINUX and ISOLINUX, and the same
directory as pxelinux.0 for PXELINUX), and put the following options
in your configuration file:

DEFAULT menu.c32
PROMPT 0


There are a few menu additions to the command line, all starting with
the keyword MENU; like the rest of the SYSLINUX config file
language, it is case insensitive:

MENU TITLE title

	Give the menu a title.  The title is presented at the top of
	the menu.

MENU LABEL label

	(Only valid after a LABEL statement.)
	Changes the label displayed for a specific entry.  This allows
	you to have a label that isn't suitable for the command line,
	for example:

	# Soft Cap Linux
	LABEL softcap
		MENU LABEL Soft Cap ^Linux 9.6.36
		KERNEL softcap-9.6.36.bzi
		APPEND whatever

	# A very dense operating system
	LABEL brick
		MENU LABEL ^Windows CE/ME/NT
		KERNEL chain.c32
		APPEND hd0 2

	The ^ symbol in a MENU LABEL statement defines a hotkey.
	The hotkey will be highlighted in the menu and will move the
	menu cursor immediately to that entry.

	Reusing hotkeys is disallowed, subsequent entries will not be
	highlighted, and will not work.

	Keep in mind that the LABELs, not MENU LABELs, must be unique,
	or odd things will happen to the command-line.

MENU HIDE

	(Only valid after a LABEL statement.)
	Suppresses a particular LABEL entry from the menu.


MENU DEFAULT

	(Only valid after a LABEL statement.)
	Indicates that this entry should be the default.  If no
	default is specified, use the first one.


MENU PASSWD passwd

	(Only valid after a LABEL statement.)
	Sets a password on this menu entry.  "passwd" can be either a
	cleartext password or a SHA-1 encrypted password; use the
	included Perl script "sha1pass" to encrypt passwords.
	(Obviously, if you don't encrypt your passwords they will not
	be very secure at all.)

	If you are using passwords, you want to make sure you also use
	the settings "NOESCAPE 1", "PROMPT 0", and either set
	"ALLOWOPTIONS 0" or use a master password (see below.)

	If passwd is an empty string, this menu entry can only be
	unlocked with the master password.


MENU MASTER PASSWD passwd

	Sets a master password.  This password can be used to boot any
	menu entry, and is required for the [Tab] and [Esc] keys to
	work.


MENU WIDTH 80
MENU MARGIN 10
MENU PASSWORDMARGIN 3
MENU ROWS 12
MENU TABMSGROW 18
MENU CMDLINEROW 18
MENU ENDROW 24
MENU PASSWORDROW 11
MENU TIMEOUTROW 20

	These options control the layout of the menu on the screen.
	The values above are the defaults.


The menu system honours the TIMEOUT command; if TIMEOUT is specified
it will execute the ONTIMEOUT command if one exists, otherwise it will
pick the default menu option.

Normally, the user can press [Tab] to edit the menu entry, and [Esc]
to return to the SYSLINUX command line.  However, if the configuration
file specifies ALLOWOPTIONS 0, these keys will be disabled, and if
MENU MASTER PASSWD is set, they require the master password.

The simple menu system supports serial console, using the normal
SERIAL directive.  However, it can be quite slow over a slow serial
link; you probably want to set your baudrate to 38400 or higher if
possible.  It requires a Linux/VT220/ANSI-compatible terminal on the
other end.

It is also possible to load a secondary configuration file, to get to
another menu.  To do that, invoke menu.c32 with the name of the
secondary configuration file.

LABEL othermenu
	MENU LABEL Another Menu
	KERNEL menu.c32
	APPEND othermenu.conf
