diff options
-rw-r--r-- | sys/dev/wscons/wsemul_sun.c | 82 | ||||
-rw-r--r-- | sys/dev/wscons/wsemul_vt100.c | 78 | ||||
-rw-r--r-- | sys/sys/tty.h | 4 |
3 files changed, 149 insertions, 15 deletions
diff --git a/sys/dev/wscons/wsemul_sun.c b/sys/dev/wscons/wsemul_sun.c index 6e56fbf7087..944e934dae6 100644 --- a/sys/dev/wscons/wsemul_sun.c +++ b/sys/dev/wscons/wsemul_sun.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsemul_sun.c,v 1.16 2006/07/01 16:16:53 miod Exp $ */ +/* $OpenBSD: wsemul_sun.c,v 1.17 2006/08/17 06:27:04 miod Exp $ */ /* $NetBSD: wsemul_sun.c,v 1.11 2000/01/05 11:19:36 drochner Exp $ */ /* @@ -38,7 +38,9 @@ * Color support from NetBSD's rcons color code, and wsemul_vt100. */ -#include <sys/cdefs.h> +#ifndef SMALL_KERNEL +#define JUMP_SCROLL +#endif #include <sys/param.h> #include <sys/systm.h> @@ -109,7 +111,7 @@ u_int wsemul_sun_output_control(struct wsemul_sun_emuldata *, u_char); void wsemul_sun_control(struct wsemul_sun_emuldata *, u_char); int wsemul_sun_selectattribute(struct wsemul_sun_emuldata *, int, int, int, long *, long *); -void wsemul_sun_scrollup(struct wsemul_sun_emuldata *); +void wsemul_sun_scrollup(struct wsemul_sun_emuldata *, u_int); struct wsemul_sun_emuldata wsemul_sun_console_emuldata; @@ -291,7 +293,7 @@ wsemul_sun_output_lowchars(edp, c, kernel) if (ROWS_LEFT > 0) edp->crow++; else - wsemul_sun_scrollup(edp); + wsemul_sun_scrollup(edp, edp->scrolldist); break; } } @@ -311,7 +313,7 @@ wsemul_sun_output_normal(edp, c, kernel) if (ROWS_LEFT > 0) edp->crow++; else - wsemul_sun_scrollup(edp); + wsemul_sun_scrollup(edp, edp->scrolldist); edp->ccol = 0; } } @@ -577,6 +579,11 @@ wsemul_sun_output(cookie, data, count, kernel) { struct wsemul_sun_emuldata *edp = cookie; u_int newstate; +#ifdef JUMP_SCROLL + const u_char *eot; + u_char curchar; + u_int cnt, pos, lines; +#endif #ifdef DIAGNOSTIC if (kernel && !edp->console) @@ -585,7 +592,57 @@ wsemul_sun_output(cookie, data, count, kernel) /* XXX */ (*edp->emulops->cursor)(edp->emulcookie, 0, edp->crow, edp->ccol); + for (; count > 0; data++, count--) { +#ifdef JUMP_SCROLL + /* + * If scrolling is not disabled and we are the bottom of + * the screen, count newlines until an escape sequence + * appears. + */ + if ((edp->state == SUN_EMUL_STATE_NORMAL || kernel) && + ROWS_LEFT == 0 && edp->scrolldist != 0) { + lines = 0; + pos = edp->ccol; + for (eot = data, cnt = count; cnt != 0; eot++, cnt--) { + curchar = *eot; + if (curchar == ASCII_FF || + curchar == ASCII_VT || curchar == ASCII_ESC) + break; + + switch (curchar) { + case ASCII_BS: + if (pos > 0) + pos--; + break; + case ASCII_CR: + pos = 0; + break; + case ASCII_HT: + pos = (pos + 7) & ~7; + if (pos >= edp->ncols) + pos = edp->ncols - 1; + break; + default: + if (++pos >= edp->ncols) { + pos = 0; + curchar = ASCII_LF; + } + break; + } + if (curchar == ASCII_LF) { + if (++lines >= edp->nrows - 1) + break; + } + } + + if (lines > 1) { + wsemul_sun_scrollup(edp, lines); + edp->crow--; + } + } +#endif + if (*data < ' ') { wsemul_sun_output_lowchars(edp, *data, kernel); continue; @@ -833,14 +890,15 @@ wsemul_sun_resetop(cookie, op) } void -wsemul_sun_scrollup(edp) +wsemul_sun_scrollup(edp, lines) struct wsemul_sun_emuldata *edp; + u_int lines; { /* * if we're in wrap-around mode, go to the first * line and clear it. */ - if (edp->scrolldist == 0) { + if (lines == 0) { edp->crow = 0; (*edp->emulops->eraserows)(edp->emulcookie, 0, 1, edp->bkgdattr); @@ -852,10 +910,10 @@ wsemul_sun_scrollup(edp) * (usually 34), clear the screen; otherwise, scroll by the * scrolling distance. */ - if (edp->scrolldist < edp->nrows) - (*edp->emulops->copyrows)(edp->emulcookie, edp->scrolldist, 0, - edp->nrows - edp->scrolldist); + if (lines < edp->nrows) + (*edp->emulops->copyrows)(edp->emulcookie, lines, 0, + edp->nrows - lines); (*edp->emulops->eraserows)(edp->emulcookie, - edp->nrows - edp->scrolldist, edp->scrolldist, edp->bkgdattr); - edp->crow -= edp->scrolldist - 1; + edp->nrows - lines, lines, edp->bkgdattr); + edp->crow -= lines - 1; } diff --git a/sys/dev/wscons/wsemul_vt100.c b/sys/dev/wscons/wsemul_vt100.c index 35746a18d52..09d72b5f1ee 100644 --- a/sys/dev/wscons/wsemul_vt100.c +++ b/sys/dev/wscons/wsemul_vt100.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsemul_vt100.c,v 1.12 2004/12/25 20:40:33 deraadt Exp $ */ +/* $OpenBSD: wsemul_vt100.c,v 1.13 2006/08/17 06:27:04 miod Exp $ */ /* $NetBSD: wsemul_vt100.c,v 1.13 2000/04/28 21:56:16 mycroft Exp $ */ /* @@ -27,6 +27,10 @@ * */ +#ifndef SMALL_KERNEL +#define JUMP_SCROLL +#endif + #include <sys/param.h> #include <sys/systm.h> #include <sys/time.h> @@ -953,6 +957,11 @@ wsemul_vt100_output(cookie, data, count, kernel) int kernel; { struct wsemul_vt100_emuldata *edp = cookie; +#ifdef JUMP_SCROLL + const u_char *eot; + u_char curchar; + u_int cnt, pos, lines; +#endif #ifdef DIAGNOSTIC if (kernel && !edp->console) @@ -962,11 +971,77 @@ wsemul_vt100_output(cookie, data, count, kernel) if (edp->flags & VTFL_CURSORON) (*edp->emulops->cursor)(edp->emulcookie, 0, edp->crow, edp->ccol << edp->dw); + for (; count > 0; data++, count--) { +#ifdef JUMP_SCROLL + /* + * If we are at the bottom of the scrolling area, count + * newlines until an escape sequence appears. + */ + if ((edp->state == VT100_EMUL_STATE_NORMAL || kernel) && + ROWS_BELOW == 0) { + lines = 0; + pos = edp->ccol; + for (eot = data, cnt = count; cnt != 0; eot++, cnt--) { + curchar = *eot; + /* + * Only char for which + * wsemul_vt100_output_c0c1() will switch + * to escape mode, for now. + * Revisit this when this changes... + */ + if (curchar == ASCII_ESC) + break; + + if (ISSET(edp->flags, VTFL_DECAWM)) + switch (curchar) { + case ASCII_BS: + if (pos > 0) + pos--; + break; + case ASCII_CR: + pos = 0; + break; + case ASCII_HT: + if (edp->tabs) { + pos++; + while (pos < NCOLS - 1 && + edp->tabs[pos] == 0) + pos++; + } else { + pos = (pos + 7) & ~7; + if (pos >= NCOLS) + pos = NCOLS - 1; + } + break; + default: + if (++pos >= NCOLS) { + pos = 0; + curchar = ASCII_LF; + } + break; + } + + if (curchar == ASCII_LF || + curchar == ASCII_VT || + curchar == ASCII_FF) { + if (++lines >= edp->scrreg_nrows - 1) + break; + } + } + + if (lines > 1) { + wsemul_vt100_scrollup(edp, lines); + edp->crow -= lines; + } + } +#endif + if ((*data & 0x7f) < 0x20) { wsemul_vt100_output_c0c1(edp, *data, kernel); continue; } + if (edp->state == VT100_EMUL_STATE_NORMAL || kernel) { wsemul_vt100_output_normal(edp, *data, kernel); continue; @@ -977,6 +1052,7 @@ wsemul_vt100_output(cookie, data, count, kernel) #endif edp->state = vt100_output[edp->state - 1](edp, *data); } + if (edp->flags & VTFL_CURSORON) (*edp->emulops->cursor)(edp->emulcookie, 1, edp->crow, edp->ccol << edp->dw); diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 5f884ef0bdd..806586a1868 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.h,v 1.21 2006/04/27 19:30:28 deraadt Exp $ */ +/* $OpenBSD: tty.h,v 1.22 2006/08/17 06:27:05 miod Exp $ */ /* $NetBSD: tty.h,v 1.30.4.1 1996/06/02 09:08:13 mrg Exp $ */ /*- @@ -164,7 +164,7 @@ struct itty { #define TTOPRI 26 /* Sleep priority for tty writes. */ #define TTMASK 15 -#define OBUFSIZ 100 +#define OBUFSIZ 512 #define TTYHOG 1024 #ifdef _KERNEL |