Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[console] Allow KEY_xxx constants to cover F8 function key
F8 is represented by the ANSI escape sequence "^[[19~", which is not
representable as a KEY_xxx constant using the current encoding scheme.
Adapt the encoding scheme to allow F8 to be represented, since PXE
requires that we may need to prompt the user to press F8.
  • Loading branch information
Michael Brown committed Jan 25, 2009
1 parent 3f814f0 commit ce9690c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 22 deletions.
14 changes: 8 additions & 6 deletions src/core/getkey.c
Expand Up @@ -16,6 +16,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <ctype.h>
#include <console.h>
#include <gpxe/process.h>
#include <gpxe/keys.h>
Expand Down Expand Up @@ -59,21 +60,22 @@ static int getchar_timeout ( unsigned long timeout ) {
*/
int getkey ( void ) {
int character;
int key;
unsigned int n = 0;

character = getchar();
if ( character != ESC )
return character;

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

return ( key ? key : ESC );
return ESC;
}
29 changes: 13 additions & 16 deletions src/include/gpxe/keys.h
Expand Up @@ -52,26 +52,23 @@
*
* The names are chosen to match those used by curses. The values are
* chosen to facilitate easy conversion from a received ANSI escape
* sequence to a KEY_XXX constant. The KEY_XXX constant is simply
* 0x100 plus the first byte following CSI in the ANSI escape
* sequence. For example, KEY_LEFT is 0x144, since a left cursor key
* is transmitted as the ANSI sequence "^[[D".
* sequence to a KEY_XXX constant.
*/

#define KEY_ANSI( character ) ( 0x100 + (character) )
#define KEY_ANSI( n, terminator ) ( 0x100 * ( (n) + 1 ) + (terminator) )

#define KEY_MIN 0x101
#define KEY_UP KEY_ANSI ( 'A' ) /**< Up arrow */
#define KEY_DOWN KEY_ANSI ( 'B' ) /**< Down arrow */
#define KEY_RIGHT KEY_ANSI ( 'C' ) /**< Right arrow */
#define KEY_LEFT KEY_ANSI ( 'D' ) /**< Left arrow */
#define KEY_END KEY_ANSI ( 'F' ) /**< End */
#define KEY_HOME KEY_ANSI ( 'H' ) /**< Home */
#define KEY_IC KEY_ANSI ( '2' ) /**< Insert */
#define KEY_DC KEY_ANSI ( '3' ) /**< Delete */
#define KEY_PPAGE KEY_ANSI ( '5' ) /**< Page up */
#define KEY_NPAGE KEY_ANSI ( '6' ) /**< Page down */
#define KEY_MAX 0x1ff
#define KEY_UP KEY_ANSI ( 0, 'A' ) /**< Up arrow */
#define KEY_DOWN KEY_ANSI ( 0, 'B' ) /**< Down arrow */
#define KEY_RIGHT KEY_ANSI ( 0, 'C' ) /**< Right arrow */
#define KEY_LEFT KEY_ANSI ( 0, 'D' ) /**< Left arrow */
#define KEY_END KEY_ANSI ( 0, 'F' ) /**< End */
#define KEY_HOME KEY_ANSI ( 0, 'H' ) /**< Home */
#define KEY_IC KEY_ANSI ( 2, '~' ) /**< Insert */
#define KEY_DC KEY_ANSI ( 3, '~' ) /**< Delete */
#define KEY_PPAGE KEY_ANSI ( 5, '~' ) /**< Page up */
#define KEY_NPAGE KEY_ANSI ( 6, '~' ) /**< Page down */
#define KEY_F8 KEY_ANSI ( 19, '~' ) /**< F8 (for PXE) */

/* Not in the [KEY_MIN,KEY_MAX] range; terminals seem to send these as
* normal ASCII values.
Expand Down

0 comments on commit ce9690c

Please sign in to comment.