diff --git a/bind.c b/bind.c index cd31305..3406fe8 100644 --- a/bind.c +++ b/bind.c @@ -448,22 +448,19 @@ static const char *getfname( unsigned keycode, const char *failmsg) { * String key name TO Command Key * * char *keyname; name of key to translate to Command key form - * fmt: [M-][^X][^][FN]X + * fmt: [M-|^X][^][FN]X * returns ~0 on invalid sequence */ static unsigned int stock( char *keyname) { /* parse it up */ unsigned c = 0 ; -/* first, the META prefix */ +/* first, the prefix META or ^X */ if( *keyname == 'M' && keyname[ 1] == '-') { c = META ; keyname += 2 ; - } - -/* control-x prefix */ - if( *keyname == '^' && keyname[ 1] == 'X') { - c |= CTLX ; + } else if( *keyname == '^' && keyname[ 1] == 'X') { + c = CTLX ; keyname += 2 ; } @@ -487,10 +484,9 @@ static unsigned int stock( char *keyname) { if( *keyname < 32 || *keyname == 0x7F) { c |= CTRL ; *keyname ^= 0x40 ; - } - -/* make sure we are not lower case (not with function keys) */ - if( *keyname >= 'a' && *keyname <= 'z' && !(c & SPEC)) + } else if( c && !(c & SPEC) + && *keyname >= 'a' && *keyname <= 'z') + /* make sure we are not lower case (not with function keys) */ *keyname -= 32 ; /* the final sequence... */ diff --git a/input.c b/input.c index ae0b958..5ce7d44 100644 --- a/input.c +++ b/input.c @@ -371,11 +371,10 @@ int get1key( void) { } /* GETCMD: Get a command from the keyboard. Process all applicable prefix - keys. Handle alted and controlled FNx, not shifted. Allow double - prefix M-^X. + keys. Handle alted and controlled FNx, not shifted. */ int getcmd( void) { - int cmask = 0 ; /* prefixes M- & ^X */ + int prefix = 0 ; /* prefixes M- or ^X */ int keyread[ STACKSIZE] ; /* room to process sequences like ^[[24;2~ */ int *kptr = keyread ; int c ; @@ -390,7 +389,7 @@ int getcmd( void) { if( c == 'O') { /* F1 .. F4 */ c = *(kptr++) = get1key() ; if( c >= 'P' && c <= 'S') - return c | SPEC | cmask ; + return c | SPEC | prefix ; } else if( c == '[') { int v1, v ; /* ^[[v1;v~ or ^[[v~ */ @@ -398,14 +397,17 @@ int getcmd( void) { v1 = v = 0 ; while( kptr < &keyread[ STACKSIZE]) { c = *(kptr++) = get1key() ; - if( (c == '~') || (c >= 'A' && c <= 'Z')) { + if( (c == '~') + || (c >= 'A' && c <= 'Z') + || (c >= 'a' && c <= 'z')) { /* Found end of sequence */ + int mask = prefix ; if( v1) { /* Handle ALT/CTL, not SHFT */ - if( (v - 1) & 4) - cmask |= CTRL ; - if( (v - 1) & 2) - cmask |= META ; + mask = META ; + + if( (v - 1) & 4) + mask |= CTRL ; v = v1 ; } @@ -417,7 +419,7 @@ int getcmd( void) { break ; } - return c | SPEC | cmask ; + return c | SPEC | mask ; } else if( c == ';') { /* Start of SHFT/ALT/CTL state */ v1 = v ; v = 0 ; @@ -433,20 +435,24 @@ int getcmd( void) { KPUSH( *(--kptr)) ; c = get1key() ; - } + } else + kptr-- ; if( c == metac) { - cmask |= META ; + prefix = META ; } else if( c == ctlxc) { - cmask |= CTLX ; + if( prefix) + break ; /* ^X^X or M-^X */ + else + prefix = CTLX ; } else break ; } - if( cmask && islower( c)) + if( prefix && islower( c)) c = flipcase( c) ; - return c | cmask ; + return c | prefix ; } /* A more generalized prompt/reply function allowing the caller