From 75f043fedb97fb7ab7a50fad704f044f1ba8eb67 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sat, 13 Dec 2008 17:41:49 +0000 Subject: [PATCH] Work around lack of dch. --- CHANGES | 9 ++++++++- tmux.h | 3 ++- tty.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 6fb7c674..8c88b156 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,10 @@ +13 December 2008 + +* Work around lack of dch. On Linux, the rxvt termcap doesn't have it (it is + lying, but we can't really start disbelieving termcaps...). This is a bit + horrible - I can see no way to do it without pretty much redrawing the whole + line, but it works... + 10 December 2008 * glibc's getopt(3) is useless: it is not POSIX compliant without jumping @@ -772,7 +779,7 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.172 2008-12-10 20:26:41 nicm Exp $ +$Id: CHANGES,v 1.173 2008-12-13 17:41:49 nicm Exp $ LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB diff --git a/tmux.h b/tmux.h index a44d8804..0f386772 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.202 2008-12-10 20:25:41 nicm Exp $ */ +/* $Id: tmux.h,v 1.203 2008-12-13 17:41:49 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -953,6 +953,7 @@ void tty_set_title(struct tty *, const char *); int tty_open(struct tty *, char **); void tty_close(struct tty *); void tty_free(struct tty *); +void tty_write(struct tty *, struct screen *, int, ...); void tty_vwrite(struct tty *, struct screen *s, int, va_list); /* tty-keys.c */ diff --git a/tty.c b/tty.c index 995c1ddc..a82b86ea 100644 --- a/tty.c +++ b/tty.c @@ -1,4 +1,4 @@ -/* $Id: tty.c,v 1.53 2008-12-06 09:30:25 nicm Exp $ */ +/* $Id: tty.c,v 1.54 2008-12-13 17:41:49 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -34,6 +34,8 @@ void tty_free_term(struct tty_term *); void tty_fill_acs(struct tty *); u_char tty_get_acs(struct tty *, u_char); +void tty_put_line(struct tty *, struct screen *, u_int, u_int, u_int); + const char *tty_strip(const char *); void tty_raw(struct tty *, const char *); void tty_puts(struct tty *, const char *); @@ -484,6 +486,16 @@ tty_set_title(struct tty *tty, const char *title) tty_putc(tty, '\007'); } +void +tty_write(struct tty *tty, struct screen *s, int cmd, ...) +{ + va_list ap; + + va_start(ap, cmd); + tty_vwrite(tty, s, cmd, ap); + va_end(ap); +} + void tty_vwrite(struct tty *tty, struct screen *s, int cmd, va_list ap) { @@ -498,6 +510,24 @@ tty_vwrite(struct tty *tty, struct screen *s, int cmd, va_list ap) tty_cmds[cmd](tty, s, ap); } +void +tty_put_line(struct tty *tty, struct screen *s, u_int px, u_int py, u_int nx) +{ + const struct grid_cell *gc; + struct grid_cell tc; + u_int xx; + + for (xx = px; xx < px + nx; xx++) { + gc = grid_view_peek_cell(s->grid, xx, py); + if (screen_check_selection(s, xx, py)) { + memcpy(&tc, &s->sel.cell, sizeof tc); + tc.data = gc->data; + tty_write(tty, s, TTY_CELL, &tc); + } else + tty_write(tty, s, TTY_CELL, gc); + } +} + void tty_cmd_cursorup(struct tty *tty, unused struct screen *s, va_list ap) { @@ -596,8 +626,15 @@ tty_cmd_deletecharacter(struct tty *tty, unused struct screen *s, va_list ap) while (ua-- > 0) tty_puts(tty, delete_character); } else { - while (ua-- > 0) - tty_putc(tty, '\010'); + /* + * XXX assumes screen already updated! I hate this... stupid + * terms without dch... + */ + if (s->cx != screen_size_x(s) - 1) { + tty_put_line(tty, s, + s->cx, s->cy, screen_size_x(s) - s->cx); + } + tty_puts(tty, tparm(cursor_address, s->cy, s->cx)); } }