From: Crystal Kolipe Subject: Adding ECMA-48 REP to wscons to fix breakage To: tech@openbsd.org Date: Thu, 20 Jun 2024 06:35:06 -0300 The attached patch adds the CSI b control sequence to wscons. This is needed because the curses updates in the last development cycle broke the use of the xterm emulation which had worked fine in both 7.3 and 7.4. Unlike the quick kludge I posted last month to make things usable, this version is intended to fix the problem correctly and handles multiple line output. Notes: The repeat count is limited to 65535, which matches xterm behaviour. According to the spec, sending the repeat sequence after a non-printable character is undefined behaviour. For example, considering the following sequence: A^G^[[5bB Xterm displays a missing character glyph for the five repeats of the bell character. Since we don't necessarily have a missing character glyph available on wscons this version of the patch just repeats the last printed character. In this case we get: AAAAAAB diff -ur 1/sys/dev/wscons/wsemul_vt100.c 2/sys/dev/wscons/wsemul_vt100.c --- sys/dev/wscons/wsemul_vt100.c Wed Aug 2 20:20:19 2023 +++ sys/dev/wscons/wsemul_vt100.c Thu Jun 20 10:05:51 2024 @@ -394,6 +394,8 @@ } } +edp->last_printed_char=instate->inchar; + #ifdef HAVE_DOUBLE_WIDTH_HEIGHT WSEMULOP(rc, edp, &edp->abortstate, putchar, (edp->emulcookie, edp->crow, edp->ccol << edp->dw, dc, diff -ur 1/sys/dev/wscons/wsemul_vt100_subr.c 2/sys/dev/wscons/wsemul_vt100_subr.c --- sys/dev/wscons/wsemul_vt100_subr.c Sun Feb 26 15:09:53 2023 +++ sys/dev/wscons/wsemul_vt100_subr.c Thu Jun 20 09:48:08 2024 @@ -43,7 +43,8 @@ #define VTMODE_SET 33 #define VTMODE_RESET 44 #define VTMODE_REPORT 55 - +extern int wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *edp, + struct wsemul_inputstate *instate, int kernel); /* * scroll up within scrolling region */ @@ -548,6 +549,17 @@ break; } break; + case 'b': /* REP - repeat previously printed character */ + instate->inchar = edp->last_printed_char; + /* + * We arbitrarily limit the repeat count to 65535 to avoid + * un-interruptable flooding of the console. This matches + * current xterm behaviour. + */ + for (m=0; m < (DEF1_ARG(0) < 65535 ? DEF1_ARG(0) : 65535); m++) { + wsemul_vt100_output_normal(edp, instate, 0); + } + break; case 'c': /* DA primary */ if (ARG(0) == 0) wsdisplay_emulinput(edp->cbcookie, WSEMUL_VT_ID1, diff -ur 1/sys/dev/wscons/wsemul_vt100var.h 2/sys/dev/wscons/wsemul_vt100var.h --- sys/dev/wscons/wsemul_vt100var.h Mon Mar 6 17:14:44 2023 +++ sys/dev/wscons/wsemul_vt100var.h Mon May 27 16:45:26 2024 @@ -99,6 +99,7 @@ #else u_char translatebuf[1]; #endif + uint32_t last_printed_char; }; /* some useful utility macros */