Module Name: src Committed By: uwe Date: Wed Aug 2 22:37:02 UTC 2023
Modified Files: src/sys/dev/wscons: wsemul_vt100.c Log Message: wsemul_vt100: fix RI to not scroll outside of scroll region This is the inverse (scroll down) of the problem reported and fixed for IND (scroll up) in PR kern/11827 back in 2000. We only have one call site for this, but still move this bit of code into a separate wsemul_vt100_prevline function to make it symmetric with wsemul_vt100_nextline. While here, make both take vt100base_data. To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/dev/wscons/wsemul_vt100.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/wscons/wsemul_vt100.c diff -u src/sys/dev/wscons/wsemul_vt100.c:1.51 src/sys/dev/wscons/wsemul_vt100.c:1.52 --- src/sys/dev/wscons/wsemul_vt100.c:1.51 Sun Jul 16 17:43:50 2023 +++ src/sys/dev/wscons/wsemul_vt100.c Wed Aug 2 22:37:02 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: wsemul_vt100.c,v 1.51 2023/07/16 17:43:50 christos Exp $ */ +/* $NetBSD: wsemul_vt100.c,v 1.52 2023/08/02 22:37:02 uwe Exp $ */ /* * Copyright (c) 1998 @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100.c,v 1.51 2023/07/16 17:43:50 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsemul_vt100.c,v 1.52 2023/08/02 22:37:02 uwe Exp $"); #ifdef _KERNEL_OPT #include "opt_wsmsgattrs.h" @@ -88,7 +88,10 @@ static void wsemul_vt100_output_normal(s u_char, int); static void wsemul_vt100_output_c0c1(struct wsemul_vt100_emuldata *, u_char, int); -static void wsemul_vt100_nextline(struct wsemul_vt100_emuldata *); + +static void wsemul_vt100_nextline(struct vt100base_data *); /* IND */ +static void wsemul_vt100_prevline(struct vt100base_data *); /* RI */ + typedef u_int vt100_handler(struct wsemul_vt100_emuldata *, u_char); static vt100_handler @@ -364,14 +367,15 @@ wsemul_vt100_reset(struct wsemul_vt100_e */ /* - * Move the cursor to the next line if possible. If the cursor is at - * the bottom of the scroll area, then scroll it up. If the cursor is + * New line (including autowrap), index (IND). + * + * Move the cursor to the next line if possible. If the cursor is at + * the bottom of the scroll area, then scroll it up. If the cursor is * at the bottom of the screen then don't move it down. */ static void -wsemul_vt100_nextline(struct wsemul_vt100_emuldata *edp) +wsemul_vt100_nextline(struct vt100base_data *vd) { - struct vt100base_data *vd = &edp->bd; if (ROWS_BELOW(vd) == 0) { /* Bottom of the scroll region. */ @@ -384,6 +388,26 @@ wsemul_vt100_nextline(struct wsemul_vt10 } } +/* + * Reverse index (RI). + * + * Inverse of wsemul_vt100_nextline. Move up, scroll down. + */ +static void +wsemul_vt100_prevline(struct vt100base_data *vd) +{ + + if (ROWS_ABOVE(vd) == 0) { + /* Top of the scroll region. */ + wsemul_vt100_scrolldown(vd, 1); + } else { + if (vd->crow > 0) + /* Cursor not at the top of the screen. */ + vd->crow--; + CHECK_DW(vd); + } +} + static void wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *edp, u_char c, int kernel) @@ -393,7 +417,7 @@ wsemul_vt100_output_normal(struct wsemul if ((vd->flags & (VTFL_LASTCHAR | VTFL_DECAWM)) == (VTFL_LASTCHAR | VTFL_DECAWM)) { - wsemul_vt100_nextline(edp); + wsemul_vt100_nextline(vd); vd->ccol = 0; vd->flags &= ~VTFL_LASTCHAR; } @@ -509,7 +533,7 @@ wsemul_vt100_output_c0c1(struct wsemul_v case ASCII_LF: case ASCII_VT: case ASCII_FF: - wsemul_vt100_nextline(edp); + wsemul_vt100_nextline(vd); break; } } @@ -565,7 +589,7 @@ wsemul_vt100_output_esc(struct wsemul_vt vd->ccol = 0; /* FALLTHRU */ case 'D': /* IND */ - wsemul_vt100_nextline(edp); + wsemul_vt100_nextline(vd); break; case 'H': /* HTS */ KASSERT(vd->tabs != 0); @@ -593,12 +617,7 @@ wsemul_vt100_output_esc(struct wsemul_vt edp->sschartab = 3; break; case 'M': /* RI */ - if (ROWS_ABOVE(vd) > 0) { - vd->crow--; - CHECK_DW(vd); - break; - } - wsemul_vt100_scrolldown(vd, 1); + wsemul_vt100_prevline(vd); break; case 'P': /* DCS */ vd->nargs = 0;