From 7eb3bc0cf8cb9830cf348cb4f4da1af5175718fb Mon Sep 17 00:00:00 2001 From: uau Date: Sat, 25 Aug 2007 04:28:09 +0000 Subject: Clean up getch2() code somewhat git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@24150 b3059339-0415-0410-9bf9-f77b7e298cf2 --- osdep/getch2.c | 171 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 69 deletions(-) (limited to 'osdep') diff --git a/osdep/getch2.c b/osdep/getch2.c index e204fa4c03..b5b65370cf 100644 --- a/osdep/getch2.c +++ b/osdep/getch2.c @@ -136,81 +136,114 @@ void get_screen_size(void){ void getch2(void) { - int len=0; - int code=0; - int i=0; - - int retval; - retval=read(0,&getch2_buf[getch2_len],BUF_LEN-getch2_len); + int retval = read(0, &getch2_buf[getch2_len], BUF_LEN-getch2_len); if (retval < 1) - return; - getch2_len+=retval; + return; + getch2_len += retval; while (getch2_len > 0 && (getch2_len > 1 || getch2_buf[0] != 27)) { - /* First find in the TERMCAP database: */ - for(i=0;i1){ - int c=getch2_buf[1]; - if(c==10 || c==13) if(c!=code) len=2; + /* We always match some keypress here, with length 1 if nothing else. + * Since some of the cases explicitly test remaining buffer length + * having a keycode only partially read in the buffer could incorrectly + * use the first byte as an independent character. + * However the buffer is big enough that this shouldn't happen too + * easily, and it's been this way for years without many complaints. + * I see no simple fix as there's no easy test which would tell + * whether a string must be part of a longer keycode. */ + len = 1; + code = getch2_buf[0]; + /* Check the well-known codes... */ + if (code != 27) { + if (code == 'A'-64) code = KEY_HOME; + else if (code == 'E'-64) code = KEY_END; + else if (code == 'D'-64) code = KEY_DEL; + else if (code == 'H'-64) code = KEY_BS; + else if (code == 'U'-64) code = KEY_PGUP; + else if (code == 'V'-64) code = KEY_PGDWN; + else if (code == 8 || code==127) code = KEY_BS; + else if (code == 10 || code==13) { + if (getch2_len > 1) { + int c = getch2_buf[1]; + if ((c == 10 || c == 13) && (c != code)) + len = 2; + } + code = KEY_ENTER; + } } - code=KEY_ENTER; - goto found; - } - } else if(getch2_len>1){ - int c=getch2_buf[1]; - if(c==27){ code=KEY_ESC; len=2; goto found;} - if(c>='0' && c<='9'){ code=c-'0'+KEY_F; len=2; goto found;} - if(getch2_len>=4 && c=='[' && getch2_buf[2]=='['){ - int c=getch2_buf[3]; - if(c>='A' && c<'A'+12){ code=KEY_F+1+c-'A';len=4;goto found;} - } - if(c=='[' || c=='O') if(getch2_len>=3){ - int c=getch2_buf[2]; - static short int ctable[]={ KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT,0, - KEY_END,KEY_PGDWN,KEY_HOME,KEY_PGUP,0,0,KEY_INS,0,0,0, - KEY_F+1,KEY_F+2,KEY_F+3,KEY_F+4}; - if(c>='A' && c<='S') - if(ctable[c-'A']){ code=ctable[c-'A']; len=3; goto found;} - } - if(getch2_len>=4 && c=='[' && getch2_buf[3]=='~'){ - int c=getch2_buf[2]; - int ctable[8]={KEY_HOME,KEY_INS,KEY_DEL,KEY_END,KEY_PGUP,KEY_PGDWN,KEY_HOME,KEY_END}; - if(c>='1' && c<='8'){ code=ctable[c-'1']; len=4; goto found;} - } - if(getch2_len>=5 && c=='[' && getch2_buf[4]=='~'){ - int i=getch2_buf[2]-'0'; - int j=getch2_buf[3]-'0'; - if(i>=0 && i<=9 && j>=0 && j<=9){ - static short int ftable[20]={ - 11,12,13,14,15, 17,18,19,20,21, - 23,24,25,26,28, 29,31,32,33,34 }; - int a=i*10+j; - for(i=0;i<20;i++) if(ftable[i]==a){ code=KEY_F+1+i;len=5;goto found;} + else if (getch2_len > 1) { + int c = getch2_buf[1]; + if (c == 27) { + code = KEY_ESC; + len = 2; + goto found; + } + if (c >= '0' && c <= '9') { + code = c-'0'+KEY_F; + len = 2; + goto found; + } + if (getch2_len >= 4 && c == '[' && getch2_buf[2] == '[') { + int c = getch2_buf[3]; + if (c >= 'A' && c < 'A'+12) { + code = KEY_F+1 + c-'A'; + len = 4; + goto found; + } + } + if (c == '[' || c == 'O' && getch2_len >= 3) { + int c = getch2_buf[2]; + const short ctable[] = { + KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_LEFT, 0, + KEY_END, KEY_PGDWN, KEY_HOME, KEY_PGUP, 0, 0, KEY_INS, 0, 0, 0, + KEY_F+1, KEY_F+2, KEY_F+3, KEY_F+4}; + if (c >= 'A' && c <= 'S') + if (ctable[c - 'A']) { + code = ctable[c - 'A']; + len = 3; + goto found; + } + } + if (getch2_len >= 4 && c == '[' && getch2_buf[3] == '~') { + int c = getch2_buf[2]; + const int ctable[8] = {KEY_HOME, KEY_INS, KEY_DEL, KEY_END, KEY_PGUP, KEY_PGDWN, KEY_HOME, KEY_END}; + if (c >= '1' && c <= '8') { + code = ctable[c - '1']; + len = 4; + goto found; + } + } + if (getch2_len >= 5 && c == '[' && getch2_buf[4] == '~') { + int i = getch2_buf[2] - '0'; + int j = getch2_buf[3] - '0'; + if (i >= 0 && i <= 9 && j >= 0 && j <= 9) { + const short ftable[20] = { + 11,12,13,14,15, 17,18,19,20,21, + 23,24,25,26,28, 29,31,32,33,34 }; + int a = i*10 + j; + for (i = 0; i < 20; i++) + if (ftable[i] == a) { + code = KEY_F+1 + i; + len = 5; + goto found; + } + } + } } - } - } -found: - if((getch2_len-=len)>0){ - int i; - for(i=0;i