[console] Add a timeout parameter to getkey()

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/1/head
Michael Brown 2011-03-07 19:33:50 +00:00
parent 2969a8567f
commit 9d633bdc71
7 changed files with 13 additions and 16 deletions

View File

@ -35,13 +35,13 @@ FILE_LICENCE ( GPL2_OR_LATER );
/**
* Read character from console if available within timeout period
*
* @v timeout Timeout period, in ticks
* @v timeout Timeout period, in ticks (0=indefinite)
* @ret character Character read from console
*/
int getchar_timeout ( unsigned long timeout ) {
static int getchar_timeout ( unsigned long timeout ) {
unsigned long start = currticks();
while ( ( currticks() - start ) < timeout ) {
while ( ( timeout == 0 ) || ( ( currticks() - start ) < timeout ) ) {
step();
if ( iskey() )
return getchar();
@ -53,6 +53,7 @@ int getchar_timeout ( unsigned long timeout ) {
/**
* Get single keypress
*
* @v timeout Timeout period, in ticks (0=indefinite)
* @ret key Key pressed
*
* The returned key will be an ASCII value or a KEY_XXX special
@ -60,11 +61,11 @@ int getchar_timeout ( unsigned long timeout ) {
* will return "special" keys (e.g. cursor keys) as a series of
* characters forming an ANSI escape sequence.
*/
int getkey ( void ) {
int getkey ( unsigned long timeout ) {
int character;
unsigned int n = 0;
character = getchar();
character = getchar_timeout ( timeout );
if ( character != ESC )
return character;

View File

@ -98,7 +98,7 @@ char * readline ( const char *prompt ) {
buf[0] = '\0';
while ( 1 ) {
key = edit_string ( &string, getkey() );
key = edit_string ( &string, getkey ( 0 ) );
sync_console ( &string );
switch ( key ) {
case CR:

View File

@ -47,7 +47,7 @@ int shell_banner ( void ) {
printf ( "\nPress Ctrl-B for the iPXE command line..." );
/* Wait for key */
key = getchar_timeout ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 );
key = getkey ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 );
/* Clear the "Press Ctrl-B" line */
printf ( "\r \r" );

View File

@ -88,7 +88,7 @@ int login_ui ( void ) {
draw_editbox ( current_box );
key = getkey();
key = getkey ( 0 );
switch ( key ) {
case KEY_DOWN:
current_box = &password_box;

View File

@ -401,7 +401,7 @@ static int main_loop ( struct settings *settings ) {
draw_setting ( &widget );
color_set ( CPAIR_NORMAL, NULL );
key = getkey();
key = getkey ( 0 );
if ( widget.editing ) {
key = edit_setting ( &widget, key );
switch ( key ) {

View File

@ -102,8 +102,7 @@ struct console_driver {
extern void putchar ( int character );
extern int getchar ( void );
extern int getchar_timeout ( unsigned long timeout );
extern int iskey ( void );
extern int getkey ( void );
extern int getkey ( unsigned long timeout );
#endif /* CONSOLE_H */

View File

@ -30,7 +30,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/dhcp.h>
#include <ipxe/keys.h>
#include <ipxe/timer.h>
#include <ipxe/process.h>
#include <ipxe/uri.h>
#include <usr/dhcpmgmt.h>
#include <usr/autoboot.h>
@ -239,9 +238,7 @@ static int pxe_menu_select ( struct pxe_menu *menu ) {
pxe_menu_draw_item ( menu, menu->selection, 1 );
/* Wait for keyboard input */
while ( ! iskey() )
step();
key = getkey();
key = getkey ( 0 );
/* Unhighlight currently selected item */
pxe_menu_draw_item ( menu, menu->selection, 0 );
@ -304,7 +301,7 @@ static int pxe_menu_prompt_and_select ( struct pxe_menu *menu ) {
if ( ! len )
len = printf ( " (%d)", menu->timeout );
if ( iskey() ) {
key = getkey();
key = getkey ( 0 );
if ( key == KEY_F8 ) {
/* Display menu */
printf ( "\n" );