From c51457ca5b0c1938c9b6813c7d72aa7d70fa88f8 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 2 Nov 2008 00:55:41 +0000 Subject: [PATCH] less: fix pasting into search line ('/' cmd) - it was mishandled because pasting "types" very fast and read_key eats many chars. +30 bytes. --- miscutils/less.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/miscutils/less.c b/miscutils/less.c index 6c793ad8b..36d451271 100644 --- a/miscutils/less.c +++ b/miscutils/less.c @@ -96,7 +96,9 @@ struct globals { smallint pattern_valid; #endif smallint terminated; + smalluint kbd_input_size; struct termios term_orig, term_less; + char kbd_input[KEYCODE_BUFFER_SIZE]; }; #define G (*ptr_to_globals) #define cur_fline (G.cur_fline ) @@ -133,6 +135,8 @@ struct globals { #define terminated (G.terminated ) #define term_orig (G.term_orig ) #define term_less (G.term_less ) +#define kbd_input_size (G.kbd_input_size ) +#define kbd_input (G.kbd_input ) #define INIT_G() do { \ SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ less_gets_pos = -1; \ @@ -806,7 +810,6 @@ static void reinitialize(void) static ssize_t getch_nowait(void) { - char input[KEYCODE_BUFFER_SIZE]; int rd; struct pollfd pfd[2]; @@ -837,22 +840,25 @@ static ssize_t getch_nowait(void) if (less_gets_pos >= 0) move_cursor(max_displayed_line + 2, less_gets_pos + 1); fflush(stdout); + + if (kbd_input_size == 0) { #if ENABLE_FEATURE_LESS_WINCH - while (1) { - int r; - /* NB: SIGWINCH interrupts poll() */ - r = poll(pfd + rd, 2 - rd, -1); - if (/*r < 0 && errno == EINTR &&*/ winch_counter) - return '\\'; /* anything which has no defined function */ - if (r) break; - } + while (1) { + int r; + /* NB: SIGWINCH interrupts poll() */ + r = poll(pfd + rd, 2 - rd, -1); + if (/*r < 0 && errno == EINTR &&*/ winch_counter) + return '\\'; /* anything which has no defined function */ + if (r) break; + } #else - safe_poll(pfd + rd, 2 - rd, -1); + safe_poll(pfd + rd, 2 - rd, -1); #endif + } /* We have kbd_fd in O_NONBLOCK mode, read inside read_key() * would not block even if there is no input available */ - rd = read_key(kbd_fd, NULL, input); + rd = read_key(kbd_fd, &kbd_input_size, kbd_input); if (rd == -1) { if (errno == EAGAIN) { /* No keyboard input available. Since poll() did return,