mirror of
https://github.com/sheumann/hush.git
synced 2024-12-22 14:30:31 +00:00
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:
parent
3c385cd706
commit
c51457ca5b
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user