From 3ad2ca330538d38f36e9a3000190517b3f4bfa1b Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 3 Sep 2018 10:09:22 +0100 Subject: Don't handle ZLE functions for single key. For read -k and read -q where we use ZLE, we just want a single key and not full ZLE processing. So don't handle timed ZLE functions when preforming the read. --- ChangeLog | 6 ++++++ Src/Zle/zle_keymap.c | 4 ++-- Src/Zle/zle_main.c | 22 +++++++++++----------- Src/Zle/zle_misc.c | 4 ++-- Src/Zle/zle_vi.c | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 495399462..0acf22565 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2018-09-03 Peter Stephenson + + * 43365: Src/Zle/zle_keymap.c, Src/Zle/zle_main.c, + Src/Zle/zle_misc.c, Src/Zle/zle_vi.c: Don't handle ZLE timed + functions if just reading a single key. + 2018-08-31 Oliver Kiddle * 43358: Src/zsh.mdd: enforce consistent patchlevel form diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c index 2e96ac780..a5cf1011b 100644 --- a/Src/Zle/zle_keymap.c +++ b/Src/Zle/zle_keymap.c @@ -1518,7 +1518,7 @@ getrestchar_keybuf(void) * arrive together. If we don't do this the input can * get stuck if an invalid byte sequence arrives. */ - inchar = getbyte(1L, &timeout); + inchar = getbyte(1L, &timeout, 1); /* getbyte deliberately resets lastchar_wide_valid */ lastchar_wide_valid = 1; if (inchar == EOF) { @@ -1673,7 +1673,7 @@ addkeybuf(int c) static int getkeybuf(int w) { - int c = getbyte((long)w, NULL); + int c = getbyte((long)w, NULL, 1); if(c < 0) return EOF; diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index db70e7d7e..3487b5d9f 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -452,7 +452,7 @@ struct ztmout { */ static void -calc_timeout(struct ztmout *tmoutp, long do_keytmout) +calc_timeout(struct ztmout *tmoutp, long do_keytmout, int full) { if (do_keytmout && (keytimeout > 0 || do_keytmout < 0)) { if (do_keytmout < 0) @@ -465,7 +465,7 @@ calc_timeout(struct ztmout *tmoutp, long do_keytmout) } else tmoutp->tp = ZTM_NONE; - if (timedfns) { + if (full && timedfns) { for (;;) { LinkNode tfnode = firstnode(timedfns); Timedfn tfdat; @@ -504,7 +504,7 @@ calc_timeout(struct ztmout *tmoutp, long do_keytmout) /* see calc_timeout for use of do_keytmout */ static int -raw_getbyte(long do_keytmout, char *cptr) +raw_getbyte(long do_keytmout, char *cptr, int full) { int ret; struct ztmout tmout; @@ -519,7 +519,7 @@ raw_getbyte(long do_keytmout, char *cptr) # endif #endif - calc_timeout(&tmout, do_keytmout); + calc_timeout(&tmout, do_keytmout, full); /* * Handle timeouts and watched fd's. If a watched fd or a function @@ -684,7 +684,7 @@ raw_getbyte(long do_keytmout, char *cptr) * reconsider the key timeout from scratch. * The effect of this is microscopic. */ - calc_timeout(&tmout, do_keytmout); + calc_timeout(&tmout, do_keytmout, full); break; } /* @@ -810,7 +810,7 @@ raw_getbyte(long do_keytmout, char *cptr) # endif } /* If looping, need to recalculate timeout */ - calc_timeout(&tmout, do_keytmout); + calc_timeout(&tmout, do_keytmout, full); } # ifdef HAVE_POLL zfree(fds, sizeof(struct pollfd) * nfds); @@ -852,7 +852,7 @@ raw_getbyte(long do_keytmout, char *cptr) /**/ mod_export int -getbyte(long do_keytmout, int *timeout) +getbyte(long do_keytmout, int *timeout, int full) { char cc; unsigned int ret; @@ -877,7 +877,7 @@ getbyte(long do_keytmout, int *timeout) for (;;) { int q = queue_signal_level(); dont_queue_signals(); - r = raw_getbyte(do_keytmout, &cc); + r = raw_getbyte(do_keytmout, &cc, full); restore_queue_signals(q); if (r == -2) { /* timeout */ @@ -956,7 +956,7 @@ getbyte(long do_keytmout, int *timeout) mod_export ZLE_INT_T getfullchar(int do_keytmout) { - int inchar = getbyte((long)do_keytmout, NULL); + int inchar = getbyte((long)do_keytmout, NULL, 1); #ifdef MULTIBYTE_SUPPORT return getrestchar(inchar, NULL, NULL); @@ -1021,7 +1021,7 @@ getrestchar(int inchar, char *outstr, int *outcount) * arrive together. If we don't do this the input can * get stuck if an invalid byte sequence arrives. */ - inchar = getbyte(1L, &timeout); + inchar = getbyte(1L, &timeout, 1); /* getbyte deliberately resets lastchar_wide_valid */ lastchar_wide_valid = 1; if (inchar == EOF) { @@ -2139,7 +2139,7 @@ zle_main_entry(int cmd, va_list ap) do_keytmout = va_arg(ap, long); timeout = va_arg(ap, int *); chrp = va_arg(ap, int *); - *chrp = getbyte(do_keytmout, timeout); + *chrp = getbyte(do_keytmout, timeout, 0); break; } diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c index 898b552de..612ac2138 100644 --- a/Src/Zle/zle_misc.c +++ b/Src/Zle/zle_misc.c @@ -756,7 +756,7 @@ bracketedstring(void) while (endesc[endpos]) { if (current + 1 >= psize) pbuf = zrealloc(pbuf, psize *= 2); - if ((next = getbyte(1L, &timeout)) == EOF) + if ((next = getbyte(1L, &timeout, 1)) == EOF) break; if (!endpos || next != endesc[endpos++]) endpos = (next == *endesc); @@ -970,7 +970,7 @@ universalargument(char **args) * * Hence for now this remains byte-by-byte. */ - while ((gotk = getbyte(0L, NULL)) != EOF) { + while ((gotk = getbyte(0L, NULL, 1)) != EOF) { if (gotk == '-' && !digcnt) { minus = -1; digcnt++; diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c index e0923db3e..a5ff9200c 100644 --- a/Src/Zle/zle_vi.c +++ b/Src/Zle/zle_vi.c @@ -131,7 +131,7 @@ vigetkey(void) char m[3], *str; Thingy cmd; - if (getbyte(0L, NULL) == EOF) + if (getbyte(0L, NULL, 1) == EOF) return ZLEEOF; m[0] = lastchar; -- cgit 1.4.1