iPXE
Defines | Functions
getkey.c File Reference

Special key interpretation. More...

#include <ctype.h>
#include <ipxe/console.h>
#include <ipxe/process.h>
#include <ipxe/keys.h>
#include <ipxe/timer.h>
#include <ipxe/nap.h>

Go to the source code of this file.

Defines

#define GETKEY_TIMEOUT   ( TICKS_PER_SEC / 4 )

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static int getchar_timeout (unsigned long timeout)
 Read character from console if available within timeout period.
int getkey (unsigned long timeout)
 Get single keypress.

Detailed Description

Special key interpretation.

Definition in file getkey.c.


Define Documentation

#define GETKEY_TIMEOUT   ( TICKS_PER_SEC / 4 )

Definition at line 39 of file getkey.c.

Referenced by getkey().


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
static int getchar_timeout ( unsigned long  timeout) [static]

Read character from console if available within timeout period.

Parameters:
timeoutTimeout period, in ticks (0=indefinite)
Return values:
characterCharacter read from console

Definition at line 47 of file getkey.c.

References cpu_nap(), currticks(), getchar(), iskey(), start, and step().

Referenced by getkey().

                                                     {
        unsigned long start = currticks();

        while ( ( timeout == 0 ) || ( ( currticks() - start ) < timeout ) ) {
                step();
                if ( iskey() )
                        return getchar();
                cpu_nap();
        }

        return -1;
}
int getkey ( unsigned long  timeout)

Get single keypress.

Parameters:
timeoutTimeout period, in ticks (0=indefinite)
Return values:
keyKey pressed

The returned key will be an ASCII value or a KEY_XXX special constant. This function differs from getchar() in that getchar() will return "special" keys (e.g. cursor keys) as a series of characters forming an ANSI escape sequence.

Definition at line 71 of file getkey.c.

References ESC, getchar_timeout(), GETKEY_TIMEOUT, isalpha(), isdigit(), KEY_ANSI, and toupper().

Referenced by bios_inject(), login_ui(), main_loop(), menu_loop(), prompt(), pxe_menu_prompt_and_select(), pxe_menu_select(), and readline_history().

                                     {
        int character;
        unsigned int n = 0;

        character = getchar_timeout ( timeout );
        if ( character != ESC )
                return character;

        character = getchar_timeout ( GETKEY_TIMEOUT );
        if ( character < 0 )
                return ESC;

        if ( isalpha ( character ) )
                return ( toupper ( character ) - 'A' + 1 );

        while ( ( character = getchar_timeout ( GETKEY_TIMEOUT ) ) >= 0 ) {
                if ( isdigit ( character ) ) {
                        n = ( ( n * 10 ) + ( character - '0' ) );
                        continue;
                }
                if ( character >= 0x40 )
                        return KEY_ANSI ( n, character );
        }

        return ESC;
}