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;
#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,