diff --git a/src/conio/ansi_cio.c b/src/conio/ansi_cio.c index 64f23651a8ca131fc7bebf4df4300fafc02defc6..126c613271065fdebbdbaa626d8219d94979585b 100644 --- a/src/conio/ansi_cio.c +++ b/src/conio/ansi_cio.c @@ -351,36 +351,37 @@ static void ansi_keyparse(void *par) int timeout=0; int timedout=0; int sval; + int unknown=0; seq[0]=0; for(;;) { sem_wait(&goahead); + if(timedout || unknown) { + for(p=seq;*p;p++) { + ansi_inch=*p; + sem_post(&got_input); + sem_wait(&used_input); + sem_wait(&goahead); + } + gotesc=0; + timeout=0; + seq[0]=0; + } if(!timedout) sem_post(&need_key); timedout=0; + unknown=0; if(timeout) { if(sem_trywait_block(&got_key,timeout)) { - gotesc=0; - timeout=0; timedout=1; + sem_post(&goahead); + continue; } } else sem_wait(&got_key); - if(timedout) { - for(p=seq;*p;p++) { - ansi_inch=*p; - sem_post(&got_input); - sem_wait(&used_input); - sem_wait(&goahead); - } - /* We ended up eating one too many... add one back */ - sem_post(&goahead); - seq[0]=0; - continue; - } - else - ch=ansi_raw_inch; + + ch=ansi_raw_inch; switch(gotesc) { case 1: /* Escape Sequence */ @@ -396,6 +397,9 @@ static void ansi_keyparse(void *par) && ch!='?' && (strlen(seq)==2?ch != '[':1) && (strlen(seq)==2?ch != 'O':1)) { + unknown=1; + gotesc=0; + timeout=0; for(i=0;aKeySequences[i].pszSequence[0];i++) { if(!strcmp(seq,aKeySequences[i].pszSequence)) { ansi_inch=aKeySequences[i].chExtendedKey; @@ -406,12 +410,15 @@ static void ansi_keyparse(void *par) sem_wait(&goahead); sem_post(&got_input); sem_wait(&used_input); + unknown=0; + seq[0]=0; break; } } - seq[0]=0; - gotesc=0; - timeout=0; + if(unknown) { + sem_post(&goahead); + continue; + } } else { /* Need more keys... keep looping */