/* * Read keyboard input until some key sequence has been recognized. */ int kbd_getch_raw(do_wait) { unsigned char key; int i, esc_delay, time_to_wait, esc_count, delay; esc_delay = config.escdelay ? config.escdelay * 1000 : 25000; time_to_wait = config.kbdtimeout * 1000000; check_for_key(1); if(kbd.key || !do_wait) return kbd.key; esc_count = 0; for(;;) { delay = esc_count ? esc_delay : KBD_TIMEOUT; if(esc_count) esc_count--; kbd_set_timeout(delay); key = 0; read(config.kbd_fd, &key, 1); kbd_del_timeout(); if(do_wait && config.kbdtimeout && (time_to_wait -= delay) <= 0) { /* fake 'Enter' */ kbd.pos = 0; kbd.key = KEY_ENTER; return kbd.key; } /* next 3 keys might be part of an esc sequence */ if(key == '\x1b') esc_count = 3; if((i = utf8_enc_len(key)) > 1) esc_count = i - 1; if(key) { if(kbd.pos < sizeof kbd.buffer) kbd.buffer[kbd.pos++] = key; check_for_key(0); } else { check_for_key(1); } if(kbd.key || !do_wait) return kbd.key; } }
extern "C" void clear_key_buffer(void) { while (check_for_key() != 0) ; }