示例#1
0
/*
 * 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;
  }
}
示例#2
0
文件: keyboard.cpp 项目: mariuz/haiku
extern "C" void
clear_key_buffer(void)
{
	while (check_for_key() != 0)
		;
}