diff --git a/src/fe-text/gui-readline.c b/src/fe-text/gui-readline.c index 8008d6d6..61523d9d 100644 --- a/src/fe-text/gui-readline.c +++ b/src/fe-text/gui-readline.c @@ -327,15 +327,12 @@ static void key_delete_to_next_space(void) void readline(void) { - int key; + unsigned char buffer[128]; + int ret, i; - for (;;) { - key = term_getch(); - if (key == -1) - break; - - handle_key(key); - } + ret = term_gets(buffer, sizeof(buffer)); + for (i = 0; i < ret; i++) + handle_key(buffer[i]); } time_t get_idle_time(void) diff --git a/src/fe-text/term-curses.c b/src/fe-text/term-curses.c index dad1fedc..6f71ac29 100644 --- a/src/fe-text/term-curses.c +++ b/src/fe-text/term-curses.c @@ -363,18 +363,23 @@ void term_stop(void) irssi_redraw(); } -int term_getch(void) +int term_gets(unsigned char *buffer, int size) { - int key; - - key = getch(); - if (key == ERR) - return -1; + int key, count; + for (count = 0; count < size; ) { + key = getch(); #ifdef KEY_RESIZE - if (key == KEY_RESIZE) - return -1; + if (key == KEY_RESIZE) + continue; #endif - return key; + if (key == ERR) + break; + + buffer[count] = key; + count++; + } + + return count; } diff --git a/src/fe-text/term-terminfo.c b/src/fe-text/term-terminfo.c index 9beccbf0..f17e354f 100644 --- a/src/fe-text/term-terminfo.c +++ b/src/fe-text/term-terminfo.c @@ -312,7 +312,8 @@ void term_stop(void) irssi_redraw(); } -int term_getch(void) +int term_gets(unsigned char *buffer, int size) { - return fgetc(current_term->in); + /* fread() doesn't work */ + return read(fileno(current_term->in), buffer, size); } diff --git a/src/fe-text/term.h b/src/fe-text/term.h index bda89462..74e51f31 100644 --- a/src/fe-text/term.h +++ b/src/fe-text/term.h @@ -73,7 +73,7 @@ void term_refresh_thaw(void); void term_refresh(TERM_WINDOW *window); void term_stop(void); -int term_getch(void); +int term_gets(unsigned char *buffer, int size); /* internal */ void term_common_init(void); diff --git a/src/fe-text/terminfo-core.c b/src/fe-text/terminfo-core.c index d60001e7..9cbd4e20 100644 --- a/src/fe-text/terminfo-core.c +++ b/src/fe-text/terminfo-core.c @@ -429,7 +429,7 @@ static void terminfo_input_init(TERM_REC *term) memcpy(&term->tio, &term->old_tio, sizeof(term->tio)); term->tio.c_lflag &= ~(ICANON | ECHO); /* CBREAK, no ECHO */ - term->tio.c_cc[VMIN] = 0; /* non-blocking read */ + term->tio.c_cc[VMIN] = 1; /* read() is satisfied after 1 char */ term->tio.c_cc[VTIME] = 0; /* No timer */ /* Disable INTR, QUIT, VDSUSP and SUSP keys */