the JWAIT_WAITING flag, and clean up by calling unset_waitlist().
From a suggestion from Robert Elz <kre@munnari.oz.au> 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 <gentoo_eshoes@tutanota.com>
+
+ 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
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));
_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++)
{
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
ne = new + nmax;
nd = newbytes;
nfd = new + nd;
+ ofdf = old_face + oldbytes;
+ nfdf = new_face + newbytes;
+
goto dumb_update;
}
if (oldbytes != 0 && newbytes != 0)
/* 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);