~ob/st

94b8ec002101a5e8f52a342e53431eea71aa0631 — Hiltjo Posthuma 3 years ago dec6b53
Partially add back in "support REP (repeat) escape sequence"

Add the functionality back in for xterm compatibility, but do not expose the
capability in st.info (yet).

Some notes:

It was reverted because it caused some issues with ncurses in some
configurations, namely when using BSD padding (--enable-bsdpad, BSD_TPUTS) in
ncurses it caused issues with repeating digits.

A fix has been upstreamed in ncurses since snapshot 20200523. The fix is also
backported to OpenBSD -current.
2 files changed, 12 insertions(+), 0 deletions(-)

M st.c
M st.info
M st.c => st.c +10 -0
@@ 129,6 129,7 @@ typedef struct {
	int charset;  /* current charset */
	int icharset; /* selected charset for sequence */
	int *tabs;
	Rune lastc;   /* last printed char outside of sequence, 0 if control */
} Term;

/* CSI Escape sequence structs */


@@ 1648,6 1649,12 @@ csihandle(void)
		if (csiescseq.arg[0] == 0)
			ttywrite(vtiden, strlen(vtiden), 0);
		break;
	case 'b': /* REP -- if last char is printable print it <n> more times */
		DEFAULT(csiescseq.arg[0], 1);
		if (term.lastc)
			while (csiescseq.arg[0]-- > 0)
				tputc(term.lastc);
		break;
	case 'C': /* CUF -- Cursor <n> Forward */
	case 'a': /* HPR -- Cursor <n> Forward */
		DEFAULT(csiescseq.arg[0], 1);


@@ 2373,6 2380,8 @@ check_control_code:
		/*
		 * control codes are not shown ever
		 */
		if (!term.esc)
			term.lastc = 0;
		return;
	} else if (term.esc & ESC_START) {
		if (term.esc & ESC_CSI) {


@@ 2422,6 2431,7 @@ check_control_code:
	}

	tsetchar(u, &term.c.attr, term.c.x, term.c.y);
	term.lastc = u;

	if (width == 2) {
		gp->mode |= ATTR_WIDE;

M st.info => st.info +2 -0
@@ 184,6 184,8 @@ st-mono| simpleterm monocolor,
# XTerm extensions
	rmxx=\E[29m,
	smxx=\E[9m,
# disabled rep for now: causes some issues with older ncurses versions.
#	rep=%p1%c\E[%p2%{1}%-%db,
# tmux extensions, see TERMINFO EXTENSIONS in tmux(1)
	Tc,
	Ms=\E]52;%p1%s;%p2%s\007,