From 0db5ff012950bd5c0a8607b0c78602ce8ac55dc8 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Mon, 13 Apr 2020 10:31:06 -0400 Subject: [PATCH] commit bash-20200410 snapshot --- CWRU/CWRU.chlog | 28 ++++++++++++++++++++++++++++ lib/readline/display.c | 25 +++++++++++++++++++++++++ lib/readline/text.c | 2 -- sig.c | 6 +++++- tests/RUN-ONE-TEST | 2 +- 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 025eeb2b7..ba2fdbe1d 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -7948,3 +7948,31 @@ builtins/wait.def the JWAIT_WAITING flag, and clean up by calling unset_waitlist(). From a suggestion from Robert Elz back in 3/2019 (originally in 10/2017) + + 4/11 + ---- +lib/readline/display.c + - update_line: in step 5b of the line wrapping prompt code, make sure + OFDF and NFDF are set before performing a dumb update + + 4/12 + ---- +sig.c + - termsig_handler: make sure to restore TOP_LEVEL_SIGMASK before + resending a terminating signal to ourselves, in the event that this + is called in a signal handler context with the terminating signal + blocked. Inspired by a report from + + 4/13 + ---- + +lib/readline/text.c + - rl_newline: if the region is active, call rl_redisplay to clear + standout mode before returning + +lib/readline/display.c + - norm_face: new function to mark a portion of the invisible face + buffer as normal text (no standout) + - rl_redisplay: if the line consumes more than a screen's worth of + lines, mark the lines that are off the top of the display as having + a `normal' face diff --git a/lib/readline/display.c b/lib/readline/display.c index 14af1e921..491b7d417 100644 --- a/lib/readline/display.c +++ b/lib/readline/display.c @@ -65,6 +65,7 @@ extern char *strchr (), *strrchr (); static void putc_face PARAMS((int, int, char *)); static void puts_face PARAMS((const char *, const char *, int)); +static void norm_face PARAMS((char *, int)); static void update_line PARAMS((char *, char *, char *, char *, int, int, int, int)); static void space_to_eol PARAMS((int)); @@ -1246,6 +1247,21 @@ rl_redisplay (void) _rl_last_c_pos > wrap_offset && \ o_cpos < prompt_last_invisible) + + /* We don't want to highlight anything that's going to be off the top + of the display; if the current line takes up more than an entire + screen, just mark the lines that won't be displayed as having a + `normal' face. + It's imperfect, but better than display corruption. */ + if (rl_mark_active_p () && inv_botlin > _rl_screenheight) + { + int extra; + + extra = inv_botlin - _rl_screenheight; + for (linenum = 0; linenum <= extra; linenum++) + norm_face (INV_LINE_FACE(linenum), INV_LLEN (linenum)); + } + /* For each line in the buffer, do the updating display. */ for (linenum = 0; linenum <= inv_botlin; linenum++) { @@ -1586,6 +1602,12 @@ puts_face (const char *str, const char *face, int n) putc_face (EOF, FACE_NORMAL, &cur_face); } +static void +norm_face (char *face, int n) +{ + memset (face, FACE_NORMAL, n); +} + #define ADJUST_CPOS(x) do { _rl_last_c_pos -= (x) ; cpos_adjusted = 1; } while (0) /* PWP: update_line() is based on finding the middle difference of each @@ -1758,6 +1780,9 @@ update_line (char *old, char *old_face, char *new, char *new_face, int current_l ne = new + nmax; nd = newbytes; nfd = new + nd; + ofdf = old_face + oldbytes; + nfdf = new_face + newbytes; + goto dumb_update; } if (oldbytes != 0 && newbytes != 0) diff --git a/lib/readline/text.c b/lib/readline/text.c index 15f5ebbee..2567dea26 100644 --- a/lib/readline/text.c +++ b/lib/readline/text.c @@ -1095,10 +1095,8 @@ rl_newline (int count, int key) if (rl_mark_active_p ()) { rl_deactivate_mark (); -#if 0 /* Not yet */ (*rl_redisplay_function) (); _rl_want_redisplay = 0; -#endif } rl_done = 1; diff --git a/sig.c b/sig.c index 54bf7d76d..85f791b85 100644 --- a/sig.c +++ b/sig.c @@ -608,7 +608,11 @@ termsig_handler (sig) /* We don't change the set of blocked signals. If a user starts the shell with a terminating signal blocked, we won't get here (and if by some - magic chance we do, we'll exit below). */ + magic chance we do, we'll exit below). What we do is to restore the + top-level signal mask, in case this is called from a terminating signal + handler context, in which case the signal is blocked. */ + restore_sigmask (); + set_signal_handler (sig, SIG_DFL); kill (getpid (), sig); diff --git a/tests/RUN-ONE-TEST b/tests/RUN-ONE-TEST index c8bef8dd1..0b0638107 100755 --- a/tests/RUN-ONE-TEST +++ b/tests/RUN-ONE-TEST @@ -1,4 +1,4 @@ -BUILD_DIR=/usr/local/build/bash/bash-current +BUILD_DIR=/usr/local/build/chet/bash/bash-current THIS_SH=$BUILD_DIR/bash PATH=$PATH:$BUILD_DIR -- 2.47.2