From 52ec9b9ec418dbb80e0ebaf8a418eab22e2dd21f Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 3 Jun 2009 23:30:40 +0000 Subject: [PATCH] Implement the DEC alignment test. With the last change this is enough for the first cursor test in vttest (in ports) to pass; it still shops a few more problems though. --- input.c | 27 ++++++++++++++++++++++----- screen-write.c | 25 +++++++++++++++++++++++++ tmux.h | 2 ++ tty.c | 20 ++++++++++++++++++++ 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/input.c b/input.c index 35ae4164..c635a842 100644 --- a/input.c +++ b/input.c @@ -630,6 +630,9 @@ input_handle_c1_control(u_char ch, struct input_ctx *ictx) log_debug2("-- c1 %zu: %hhu (%c)", ictx->off, ch, ch); switch (ch) { + case 'D': /* IND */ + screen_write_linefeed(&ictx->ctx); + break; case 'E': /* NEL */ screen_write_carriagereturn(&ictx->ctx); screen_write_linefeed(&ictx->ctx); @@ -652,7 +655,7 @@ input_handle_private_two(u_char ch, struct input_ctx *ictx) "-- p2 %zu: %hhu (%c) %hhu", ictx->off, ch, ch, ictx->intermediate); switch (ch) { - case '0': /* Dscs (graphics) */ + case '0': /* SCS */ /* * Not really supported, but fake it up enough for those that * use it to switch character sets (by redefining G0 to @@ -665,22 +668,36 @@ input_handle_private_two(u_char ch, struct input_ctx *ictx) } break; case '=': /* DECKPAM */ + if (ictx->intermediate != '\0') + break; screen_write_kkeypadmode(&ictx->ctx, 1); log_debug("kkeypad on (application mode)"); break; case '>': /* DECKPNM */ + if (ictx->intermediate != '\0') + break; screen_write_kkeypadmode(&ictx->ctx, 0); log_debug("kkeypad off (number mode)"); break; case '7': /* DECSC */ + if (ictx->intermediate != '\0') + break; memcpy(&ictx->saved_cell, &ictx->cell, sizeof ictx->saved_cell); ictx->saved_cx = s->cx; ictx->saved_cy = s->cy; break; - case '8': /* DECRC */ - memcpy(&ictx->cell, &ictx->saved_cell, sizeof ictx->cell); - screen_write_cursormove( - &ictx->ctx, ictx->saved_cx, ictx->saved_cy); + case '8': + switch (ictx->intermediate) { + case '\0': /* DECRC */ + memcpy( + &ictx->cell, &ictx->saved_cell, sizeof ictx->cell); + screen_write_cursormove( + &ictx->ctx, ictx->saved_cx, ictx->saved_cy); + break; + case '#': /* DECALN */ + screen_write_alignmenttest(&ictx->ctx); + break; + } break; default: log_debug("unknown p2: %hhu", ch); diff --git a/screen-write.c b/screen-write.c index 033a1a52..700e150c 100644 --- a/screen-write.c +++ b/screen-write.c @@ -291,6 +291,31 @@ screen_write_cursorleft(struct screen_write_ctx *ctx, u_int nx) s->cx -= nx; } +/* VT100 alignment test. */ +void +screen_write_alignmenttest(struct screen_write_ctx *ctx) +{ + struct screen *s = ctx->s; + struct grid_cell gc; + u_int xx, yy; + + memcpy(&gc, &grid_default_cell, sizeof gc); + gc.data = 'E'; + + for (yy = 0; yy < screen_size_y(s); yy++) { + for (xx = 0; xx < screen_size_x(s); xx++) + grid_view_set_cell(s->grid, xx, yy, &gc); + } + + s->cx = 0; + s->cy = 0; + + s->rupper = 0; + s->rlower = screen_size_y(s) - 1; + + tty_write_cmd(ctx->wp, TTY_ALIGNMENTTEST); +} + /* Insert nx characters. */ void screen_write_insertcharacter(struct screen_write_ctx *ctx, u_int nx) diff --git a/tmux.h b/tmux.h index 429a66a0..b2521ac2 100644 --- a/tmux.h +++ b/tmux.h @@ -279,6 +279,7 @@ struct tty_term_code_entry { /* Output commands. */ enum tty_cmd { + TTY_ALIGNMENTTEST, TTY_CELL, TTY_CLEARENDOFLINE, TTY_CLEARENDOFSCREEN, @@ -1363,6 +1364,7 @@ void screen_write_cursorup(struct screen_write_ctx *, u_int); void screen_write_cursordown(struct screen_write_ctx *, u_int); void screen_write_cursorright(struct screen_write_ctx *, u_int); void screen_write_cursorleft(struct screen_write_ctx *, u_int); +void screen_write_alignmenttest(struct screen_write_ctx *); void screen_write_insertcharacter(struct screen_write_ctx *, u_int); void screen_write_deletecharacter(struct screen_write_ctx *, u_int); void screen_write_insertline(struct screen_write_ctx *, u_int); diff --git a/tty.c b/tty.c index 16a865eb..3149c8fb 100644 --- a/tty.c +++ b/tty.c @@ -38,6 +38,7 @@ void tty_attributes(struct tty *, const struct grid_cell *); void tty_attributes_fg(struct tty *, const struct grid_cell *); void tty_attributes_bg(struct tty *, const struct grid_cell *); +void tty_cmd_alignmenttest(struct tty *, struct window_pane *, va_list); void tty_cmd_cell(struct tty *, struct window_pane *, va_list); void tty_cmd_clearendofline(struct tty *, struct window_pane *, va_list); void tty_cmd_clearendofscreen(struct tty *, struct window_pane *, va_list); @@ -54,6 +55,7 @@ void tty_cmd_raw(struct tty *, struct window_pane *, va_list); void tty_cmd_reverseindex(struct tty *, struct window_pane *, va_list); void (*tty_cmds[])(struct tty *, struct window_pane *, va_list) = { + tty_cmd_alignmenttest, tty_cmd_cell, tty_cmd_clearendofline, tty_cmd_clearendofscreen, @@ -830,6 +832,24 @@ tty_cmd_clearscreen( } } +void +tty_cmd_alignmenttest( + struct tty *tty, struct window_pane *wp, unused va_list ap) +{ + struct screen *s = wp->screen; + u_int i, j; + + tty_reset(tty); + + tty_region(tty, 0, screen_size_y(s) - 1, wp->yoff); + + for (j = 0; j < screen_size_y(s); j++) { + tty_cursor(tty, 0, j, wp->xoff, wp->yoff); + for (i = 0; i < screen_size_x(s); i++) + tty_putc(tty, 'E'); + } +} + void tty_cmd_cell(struct tty *tty, struct window_pane *wp, va_list ap) {