less: fix pasting into search line ('/' cmd) -

it was mishandled because pasting "types" very fast
 and read_key eats many chars. +30 bytes.
This commit is contained in:
Denis Vlasenko 2008-11-02 00:55:41 +00:00
parent 3c385cd706
commit c51457ca5b

View File

@ -96,7 +96,9 @@ struct globals {
smallint pattern_valid; smallint pattern_valid;
#endif #endif
smallint terminated; smallint terminated;
smalluint kbd_input_size;
struct termios term_orig, term_less; struct termios term_orig, term_less;
char kbd_input[KEYCODE_BUFFER_SIZE];
}; };
#define G (*ptr_to_globals) #define G (*ptr_to_globals)
#define cur_fline (G.cur_fline ) #define cur_fline (G.cur_fline )
@ -133,6 +135,8 @@ struct globals {
#define terminated (G.terminated ) #define terminated (G.terminated )
#define term_orig (G.term_orig ) #define term_orig (G.term_orig )
#define term_less (G.term_less ) #define term_less (G.term_less )
#define kbd_input_size (G.kbd_input_size )
#define kbd_input (G.kbd_input )
#define INIT_G() do { \ #define INIT_G() do { \
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \ SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
less_gets_pos = -1; \ less_gets_pos = -1; \
@ -806,7 +810,6 @@ static void reinitialize(void)
static ssize_t getch_nowait(void) static ssize_t getch_nowait(void)
{ {
char input[KEYCODE_BUFFER_SIZE];
int rd; int rd;
struct pollfd pfd[2]; struct pollfd pfd[2];
@ -837,22 +840,25 @@ static ssize_t getch_nowait(void)
if (less_gets_pos >= 0) if (less_gets_pos >= 0)
move_cursor(max_displayed_line + 2, less_gets_pos + 1); move_cursor(max_displayed_line + 2, less_gets_pos + 1);
fflush(stdout); fflush(stdout);
if (kbd_input_size == 0) {
#if ENABLE_FEATURE_LESS_WINCH #if ENABLE_FEATURE_LESS_WINCH
while (1) { while (1) {
int r; int r;
/* NB: SIGWINCH interrupts poll() */ /* NB: SIGWINCH interrupts poll() */
r = poll(pfd + rd, 2 - rd, -1); r = poll(pfd + rd, 2 - rd, -1);
if (/*r < 0 && errno == EINTR &&*/ winch_counter) if (/*r < 0 && errno == EINTR &&*/ winch_counter)
return '\\'; /* anything which has no defined function */ return '\\'; /* anything which has no defined function */
if (r) break; if (r) break;
} }
#else #else
safe_poll(pfd + rd, 2 - rd, -1); safe_poll(pfd + rd, 2 - rd, -1);
#endif #endif
}
/* We have kbd_fd in O_NONBLOCK mode, read inside read_key() /* We have kbd_fd in O_NONBLOCK mode, read inside read_key()
* would not block even if there is no input available */ * 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 (rd == -1) {
if (errno == EAGAIN) { if (errno == EAGAIN) {
/* No keyboard input available. Since poll() did return, /* No keyboard input available. Since poll() did return,