Implement menu & command-list on dumb terminals.

This commit is contained in:
kr 2001-05-25 07:58:54 +00:00
parent 19477b0574
commit 2edd28f97b
2 changed files with 149 additions and 77 deletions

View file

@ -1,3 +1,19 @@
2001-05-25 Klaus Reichl <Klaus.Reichl@alcatel.at>
* stage2/stage2.c (print_entries_raw): New function.
(run_menu): Use it to implement menu & command-list if on dumb
terminals.
Changes are:
Adjust FIRST_ENTRY only on non-dumb terminals.
Setting of SHOW_MENU is honoured also on dumb
terminals.
Likely if SHOW_MENU is false, ESC brings her to the
menu - not to the command-line as before.
PRINT_BORDER, GOTOXY, SET_LINE_xxx are only called if
not on dumb terminals.
Show entry number when timeout is running if terminal is dumb.
Prompt with entry number when waiting for keys.
2001-05-14 Pavel Roskin <proski@gnu.org>
* stage2/shared.h (ENTRY): Remove unnecessary `##'.

View file

@ -138,6 +138,33 @@ print_entries (int y, int size, int first, char *menu_entries)
}
static void
print_entries_raw (int size, int first, char *menu_entries)
{
int i;
#define LINE_LENGTH 67
for (i = 0; i < LINE_LENGTH; i++)
grub_putchar ('-');
grub_putchar ('\n');
for (i = first; i < size; i++)
{
/* grub's printf can't %02d so ... */
if (i < 10)
grub_putchar (' ');
grub_printf ("%d: %s\n", i, get_entry (menu_entries, i, 0));
}
for (i = 0; i < LINE_LENGTH; i++)
grub_putchar ('-');
grub_putchar ('\n');
#undef LINE_LENGTH
}
static void
print_border (int y, int size)
{
@ -290,20 +317,21 @@ run_menu (char *menu_entries, char *config_entries, int num_entries,
*/
restart:
while (entryno > 11)
/* Dumb terminal always use all entries for display
invariant for TERMINAL_DUMB: first_entry == 0 */
if (! (terminal & TERMINAL_DUMB))
{
first_entry++;
entryno--;
while (entryno > 11)
{
first_entry++;
entryno--;
}
}
/* If the timeout was expired or wasn't set, force to show the menu
interface. If the terminal is dumb and the timeout is set, hide
the menu to boot the default entry automatically when the timeout
is expired. */
interface. */
if (grub_timeout < 0)
show_menu = 1;
else if (terminal & TERMINAL_DUMB)
show_menu = 0;
/* If SHOW_MENU is false, don't display the menu until ESC is pressed. */
if (! show_menu)
@ -337,38 +365,12 @@ restart:
grub_timeout--;
/* Print a message. */
if (terminal & TERMINAL_DUMB)
grub_printf ("\rPress `ESC' to enter the command-line... %d ",
grub_timeout);
else
grub_printf ("\rPress `ESC' to enter the menu... %d ",
grub_timeout);
grub_printf ("\rPress `ESC' to enter the menu... %d ",
grub_timeout);
}
}
}
/* If the terminal is dumb, enter the command-line interface instead. */
if (show_menu && (terminal & TERMINAL_DUMB))
{
if (! auth && password)
{
/* The user must enter a correct password. */
char entered[32];
/* Make sure that PASSWORD is NUL-terminated. */
nul_terminate (password);
do
{
grub_memset (entered, 0, sizeof (entered));
get_cmdline ("Password: ", entered, 31, '*', 0);
}
while (check_password (entered, password, password_type) != 0);
}
enter_cmdline (heap, 1);
}
/* Only display the menu if the user wants to see it. */
if (show_menu)
{
@ -383,7 +385,8 @@ restart:
nocursor ();
#endif /* ! GRUB_UTIL */
print_border (3, 12);
if (! (terminal & TERMINAL_DUMB))
print_border (3, 12);
#ifdef GRUB_UTIL
/* In the grub shell, always use ACS_*. */
@ -408,6 +411,9 @@ restart:
# endif /* SUPPORT_SERIAL */
#endif /* ! GRUB_UTIL */
if (terminal & TERMINAL_DUMB)
print_entries_raw (num_entries, first_entry, menu_entries);
grub_printf ("\n\
Use the %c and %c keys to select which entry is highlighted.\n",
disp_up, disp_down);
@ -432,10 +438,16 @@ restart:
selected line, or escape to go back to the main menu.");
}
print_entries (3, 12, first_entry, menu_entries);
/* highlight initial line */
set_line_highlight (4 + entryno, first_entry + entryno, menu_entries);
if (terminal & TERMINAL_DUMB)
grub_printf ("\n\nThe selected entry is %d ", entryno);
else
{
print_entries (3, 12, first_entry, menu_entries);
/* highlight initial line */
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
}
}
/* XX using RT clock now, need to initialize value */
@ -456,9 +468,17 @@ restart:
/* else not booting yet! */
time2 = time1;
gotoxy (3, 22);
printf ("The highlighted entry will be booted automatically in %d seconds. ", grub_timeout);
gotoxy (74, 4 + entryno);
if (terminal & TERMINAL_DUMB)
grub_printf ("\r Entry %d will be booted automatically in %d seconds. ",
entryno, grub_timeout);
else
{
gotoxy (3, 22);
printf ("The highlighted entry will be booted automatically in %d seconds. ", grub_timeout);
gotoxy (74, 4 + entryno);
}
grub_timeout--;
}
@ -469,52 +489,74 @@ restart:
in grub if interrupt driven I/O is done). */
if ((checkkey () != -1) || (grub_timeout == -1))
{
/* Key was pressed, show which entry is selected before GETKEY,
since we're comming in here also on GRUB_TIMEOUT == -1 and
hang in GETKEY */
if (terminal & TERMINAL_DUMB)
grub_printf ("\r Highlighted entry is %d: ", entryno);
c = translate_keycode (getkey ());
if (grub_timeout >= 0)
{
gotoxy (3, 22);
if (terminal & TERMINAL_DUMB)
grub_putchar ('\r');
else
gotoxy (3, 22);
printf (" ");
grub_timeout = -1;
fallback_entry = -1;
gotoxy (74, 4 + entryno);
if (! (terminal & TERMINAL_DUMB))
gotoxy (74, 4 + entryno);
}
/* We told them above (at least in SUPPORT_SERIAL) to use
'^' or 'v' so accept these keys. */
if (c == 16 || c == '^')
{
if (entryno > 0)
if (terminal & TERMINAL_DUMB)
{
set_line_normal (4 + entryno, first_entry + entryno,
menu_entries);
entryno--;
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
if (entryno > 0)
entryno--;
}
else if (first_entry > 0)
else
{
first_entry--;
print_entries (3, 12, first_entry, menu_entries);
set_line_highlight (4, first_entry + entryno, menu_entries);
if (entryno > 0)
{
set_line_normal (4 + entryno, first_entry + entryno,
menu_entries);
entryno--;
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
}
else if (first_entry > 0)
{
first_entry--;
print_entries (3, 12, first_entry, menu_entries);
set_line_highlight (4, first_entry + entryno,
menu_entries);
}
}
}
if ((c == 14 || c == 'v') && first_entry + entryno + 1 < num_entries)
{
if (entryno < 11)
{
set_line_normal (4 + entryno, first_entry + entryno,
menu_entries);
entryno++;
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
}
else if (num_entries > 12 + first_entry)
{
first_entry++;
print_entries (3, 12, first_entry, menu_entries);
set_line_highlight (15, first_entry + entryno, menu_entries);
}
if (terminal & TERMINAL_DUMB)
entryno++;
else
if (entryno < 11)
{
set_line_normal (4 + entryno, first_entry + entryno,
menu_entries);
entryno++;
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
}
else if (num_entries > 12 + first_entry)
{
first_entry++;
print_entries (3, 12, first_entry, menu_entries);
set_line_highlight (15, first_entry + entryno, menu_entries);
}
}
if (config_entries)
@ -526,15 +568,16 @@ restart:
{
if ((c == 'd') || (c == 'o') || (c == 'O'))
{
set_line_normal (4 + entryno, first_entry + entryno,
menu_entries);
if (! (terminal & TERMINAL_DUMB))
set_line_normal (4 + entryno, first_entry + entryno,
menu_entries);
/* insert after is almost exactly like insert before */
if (c == 'o')
{
/* But `o' differs from `O', since it may causes
the menu screen to scroll up. */
if (entryno < 11)
if (entryno < 11 || (terminal & TERMINAL_DUMB))
entryno++;
else
first_entry++;
@ -575,9 +618,19 @@ restart:
first_entry--;
}
print_entries (3, 12, first_entry, menu_entries);
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
if (terminal & TERMINAL_DUMB)
{
grub_printf ("\n\n");
print_entries_raw (num_entries, first_entry,
menu_entries);
grub_printf ("\n");
}
else
{
print_entries (3, 12, first_entry, menu_entries);
set_line_highlight (4 + entryno, first_entry + entryno,
menu_entries);
}
}
cur_entry = menu_entries;
@ -595,7 +648,10 @@ restart:
char entered[32];
char *pptr = password;
gotoxy (1, 21);
if (terminal & TERMINAL_DUMB)
grub_printf ("\r ");
else
gotoxy (1, 21);
/* Wipe out the previously entered password */
memset (entered, 0, sizeof (entered));