XFree86 3.2o - xterm patch #35 - 1997/1/7 - T.Dickey <dickey@clark.net>
 
This patch does the following:
 
        + combines the coding for foreground and background colors into a
          single byte, reducing the memory required to store saved-lines in
          color.  (I'll take back that byte in a following patch to use to
          ensure the character-set, so there's no long-term decrease in memory
          use).
 
        + modifies the PF1-PF4 coding in termcap/terminfo.  Because xterm is
          still by default emulating vt100, the function key codes are
          vt100-compatible (I overlooked this in patch #31).
 
          I also reformatted the whole terminfo file into a single-column,
          for consistency.
 
        + adds an interim xterm-vt220 description to accommodate the old and new
          styles of function-keys (though probably it'd be better to drop the
          old-style altogether).
 
--------------------------------------------------------------------------------
  charproc.c |  180 +++++++++++++++++++-----------------------------
 ptyx.h     |    7 -
 screen.c   |   46 ++++--------
 termcap    |    5 +
 terminfo   |  220 +++++++++++++++++++++++++++++++++++++++++++++--------------
 util.c     |   58 ++++++++++++++-
 xterm.h    |    7 +
 7 files changed, 325 insertions, 198 deletions
--------------------------------------------------------------------------------
 Index: charproc.c
--- xterm-34+/charproc.c        Sun Jan  5 17:05:03 1997
 +++ xterm-35/charproc.c Tue Jan  7 18:30:56 1997
 @@ -131,12 +131,12 @@
  static void VTNonMaskableEvent PROTO_XT_EV_HANDLER_ARGS;
 static void VTallocbuf PROTO((void));
 static void VTparse PROTO((void));
-static void WriteText PROTO(( TScreen *screen, char *str, int len, unsigned flags, unsigned fg, unsigned bg));
 +static void WriteText PROTO(( TScreen *screen, char *str, int len));
  static void ansi_modes PROTO((XtermWidget termw, void (*func)(unsigned *p, unsigned mask)));
 static void bitclr PROTO((unsigned *p, unsigned mask));
 static void bitcpy PROTO((unsigned *p, unsigned q, unsigned mask));
 static void bitset PROTO((unsigned *p, unsigned mask));
-static void dotext PROTO((TScreen *screen, unsigned flags, int charset, Char *buf, Char *ptr, unsigned fg, unsigned bg));
 +static void dotext PROTO((TScreen *screen, int charset, Char *buf, Char *ptr));
  static void dpmodes PROTO((XtermWidget termw, void (*func)(unsigned *p, unsigned mask)));
 static void report_win_label PROTO((TScreen *screen, int code, XTextProperty *text, Status ok));
 static void restoremodes PROTO((XtermWidget termw));
@@ -157,11 +157,9 @@
 #endif
 
 #if OPT_ISO_COLORS
-static void clrColorBD PROTO((void));
 -static void clrColorUL PROTO((void));
 -static void setColorBD PROTO((void));
 -static void setColorUL PROTO((void));
 -static void resetColor PROTO((void));
 +static void setExtendedFG PROTO((void));
 +static void reset_SGR_Colors PROTO((void));
 +static void reset_SGR_Foreground PROTO((void));
  #endif
 
 #define        DEFAULT         -1
@@ -305,8 +303,11 @@
 static ANSI reply;
 static int param[NPARAM];
 
+#ifdef UNUSED
 static unsigned long ctotal;
 static unsigned long ntotal;
+#endif
+
 static jmp_buf vtjmpbuf;
 
 /* event handlers */
@@ -815,63 +816,40 @@
        XSetForeground(screen->display, ReverseBoldGC(screen), bg);
 }
 
+/* Invoked after updating bold/underline flags, computes the extended color
 + * index to use for foreground.
 + */
 static void
-setColorBD()
+setExtendedFG()
 {
-       if (term->screen.colorBDMode) {
 -               if (!(term->flags & FG_COLOR)
 -                || (term->cur_foreground == COLOR_UL)) {
 -                       SGR_Foreground(COLOR_BD);
 -               } else if (term->cur_foreground < 8) { /* Set highlight bit */
 -                       SGR_Foreground(term->cur_foreground | 8);
 -               }
 -       }
-}
 +       int fg = term->sgr_foreground;
  
-static void
-clrColorBD()
-{
-       if (term->screen.colorBDMode
 -        && term->flags & BOLD
 -        && !(term->flags & FG_COLOR)) {
 -               if (term->cur_foreground == COLOR_BD)
 -                       SGR_Foreground(-1);
 -               else if ((term->cur_foreground >= 8)
 -                  &&    (term->cur_foreground <= 15))
 -                       SGR_Foreground(term->cur_foreground & 7);
 +       if (fg < 0) {
 +               if (term->screen.colorULMode && (term->flags & UNDERLINE))
 +                       fg = COLOR_UL;
 +
+               if (term->screen.colorBDMode && (term->flags & BOLD))
 +                       fg = COLOR_BD;
         }
-}
 
-static void
-setColorUL()
-{
-       if (term->screen.colorULMode
 -        && !(term->flags & FG_COLOR))
 -               SGR_Foreground(COLOR_UL);
 +       if ((fg >= 0) && (fg < 8) && (term->flags & BOLD))
 +               fg |= 8;
 +
+       SGR_Foreground(fg);
  }
 
 static void
-clrColorUL()
+reset_SGR_Foreground()
 {
-       if (term->screen.colorULMode
 -        && term->cur_foreground == COLOR_UL) {
 -               if (term->screen.colorBDMode
 -                && (term->flags & BOLD))
 -                       SGR_Foreground(COLOR_BD);
 -               else
 -                       SGR_Foreground(-1);
 -       }
+       term->sgr_foreground = -1;
 +       setExtendedFG();
  }
 
 static void
-resetColor()
+reset_SGR_Colors()
 {
-       clrColorBD(); /* first */
 -       clrColorUL(); /* second */
 -       if (term->flags & FG_COLOR)
 -               SGR_Foreground(-1);
 -       if (term->flags & BG_COLOR)
 -               SGR_Background(-1);
 +       reset_SGR_Foreground();
 +       SGR_Background(-1);
  }
 #endif /* OPT_ISO_COLORS */
 
@@ -976,20 +954,16 @@
                        }
                        if(screen->curss) {
                                thischar = *bptr;
-                               dotext(screen, term->flags,
 +                               dotext(screen,
                                  screen->gsets[(int)(screen->curss)],
-                                       bptr, bptr + 1,
 -                                       term->cur_foreground,
 -                                       term->cur_background );
 +                                       bptr, bptr + 1);
                                 screen->curss = 0;
                        }
                        if(bptr < cp) {
                                thischar = cp[-1];
-                               dotext(screen, term->flags,
 +                               dotext(screen,
                                  screen->gsets[(int)(screen->curgl)],
-                                       bptr, cp,
 -                                       term->cur_foreground,
 -                                       term->cur_background );
 +                                       bptr, cp);
                         }
                        bptr = cp;
                        break;
@@ -1412,17 +1386,17 @@
                                 case 0:
                                        term->flags &=
                                                ~(INVERSE|BOLD|UNDERLINE|INVISIBLE);
-                                       if_OPT_ISO_COLORS(screen,{resetColor();})
 +                                       if_OPT_ISO_COLORS(screen,{reset_SGR_Colors();})
                                         break;
                                 case 1:        /* Bold                         */
                                        /* FALLTHRU */
                                 case 5:        /* Blink, really.       */
                                        term->flags |= BOLD;
-                                       if_OPT_ISO_COLORS(screen,{setColorBD();})
 +                                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                         break;
                                 case 4:        /* Underscore           */
                                        term->flags |= UNDERLINE;
-                                       if_OPT_ISO_COLORS(screen,{setColorUL();})
 +                                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                         break;
                                 case 7:
                                        term->flags |= INVERSE;
@@ -1431,14 +1405,14 @@
                                        term->flags |= INVISIBLE;
                                        break;
                                 case 24:
-                                       if_OPT_ISO_COLORS(screen,{clrColorUL();})
                                         term->flags &= ~UNDERLINE;
+                                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                         break;
                                 case 22: /* reset 'bold' */
                                        /* FALLTHRU */
                                 case 25: /* reset 'blink' */
-                                       if_OPT_ISO_COLORS(screen,{clrColorBD();})
                                         term->flags &= ~BOLD;
+                                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                         break;
                                 case 27:
                                        term->flags &= ~INVERSE;
@@ -1455,16 +1429,13 @@
                                 case 36:
                                 case 37:
                                        if_OPT_ISO_COLORS(screen,{
-                                         SGR_Foreground(
 -                                               (param[row] - 30)
 -                                               /* Set highlight bit if bold */
 -                                               | ((term->flags & BOLD)
 -                                                 ? 8 : 0));
 +                                         term->sgr_foreground = (param[row] - 30);
 +                                         setExtendedFG();
                                         })
                                        break;
                                 case 39:
                                        if_OPT_ISO_COLORS(screen,{
-                                         SGR_Foreground(-1);
 +                                         reset_SGR_Foreground();
                                         })
                                        break;
                                 case 40:
@@ -1486,10 +1457,8 @@
                                        break;
                                 case 100:
                                        if_OPT_ISO_COLORS(screen,{
-                                         if (term->flags & FG_COLOR)
 -                                           SGR_Foreground(-1);
 -                                         if (term->flags & BG_COLOR)
 -                                           SGR_Background(-1);
 +                                         reset_SGR_Foreground();
 +                                         SGR_Background(-1);
                                         })
                                        break;
                                }
@@ -1654,12 +1623,7 @@
                 case CASE_DECRC:
                        /* DECRC */
                        CursorRestore(term, &screen->sc);
-                       if_OPT_ISO_COLORS(screen,{
 -                               if (term->flags & BOLD)
 -                                       setColorBD();
 -                               if (term->flags & UNDERLINE)
 -                                       setColorUL();
 -                       })
 +                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                         parsestate = groundtable;
                        break;
 
@@ -1921,11 +1885,9 @@
                            count = (param[0] < 1) ? 1 : param[0];
                            repeated[0] = lastchar;
                            while (count-- > 0) {
-                               dotext(screen, term->flags,
 +                               dotext(screen,
                                         screen->gsets[(int)(screen->curgl)],
-                                       repeated, repeated+1,
 -                                       term->cur_foreground,
 -                                       term->cur_background );
 +                                       repeated, repeated+1);
                             }
                        }
                        parsestate = groundtable;
@@ -2312,9 +2274,8 @@
  * by charset.  worry about end of line conditions (wraparound if selected).
  */
 static void
-dotext(screen, flags, charset, buf, ptr, fg, bg )
 +dotext(screen, charset, buf, ptr)
     register TScreen   *screen;
-    unsigned   flags, fg, bg;
      char       charset;
     Char       *buf;           /* start of characters to process */
     Char       *ptr;           /* end */
@@ -2351,7 +2312,7 @@
        while (len > 0) {
                n = screen->max_col - screen->cur_col +1;
                if (n <= 1) {
-                       if (screen->do_wrap && (flags&WRAPAROUND)) {
 +                       if (screen->do_wrap && (term->flags & WRAPAROUND)) {
                             /* mark that we had to wrap this line */
                            ScrnSetAttributes(screen, screen->cur_row, 0,
                                              LINEWRAPPED, LINEWRAPPED, 1);
@@ -2365,7 +2326,9 @@
                if (len < n)
                        n = len;
                next_col = screen->cur_col + n;
-               WriteText(screen, (char *)ptr, n, flags, fg, bg );
 +
+               WriteText(screen, (char *)ptr, n);
 +
                /*
                 * the call to WriteText updates screen->cur_col.
                 * If screen->cur_col != next_col, we must have
@@ -2382,20 +2345,21 @@
  * the current cursor position.  update cursor position.
  */
 static void
-WriteText(screen, str, len, flags, fg, bg )
 +WriteText(screen, str, len)
     register TScreen   *screen;
     register char      *str;
     register int       len;
-    unsigned           flags, fg, bg;
  {
-       register unsigned fgs = flags;
 +       unsigned flags  = term->flags;
 +       unsigned fg     = term->cur_foreground;
 +       unsigned bg     = term->cur_background;
         GC      currentGC;
  
        if(screen->cur_row - screen->topline <= screen->max_row) {
                if(screen->cursor_state)
                        HideCursor();
 
-               if (fgs & INSERT)
 +               if (flags & INSERT)
                         InsertChar(screen, len);
                if (!(AddToRefresh(screen))) {
                        /* make sure that the correct GC is current */
@@ -2404,24 +2368,26 @@
                        if(screen->scroll_amt)
                                FlushScroll(screen);
 
-                       if (fgs & INVISIBLE)
 +                       if (flags & INVISIBLE)
                                 memset(str, ' ', len);
 
-                       drawXtermText(screen, fgs, currentGC,
 +                       drawXtermText(screen, flags, currentGC,
                                 CursorX(screen, screen->cur_col),
-                               CursorY(screen, screen->cur_row)
 -                                       + screen->fnt_norm->ascent,
 +                               CursorY(screen, screen->cur_row),
                                 str, len);
 
+                       resetXtermGC(screen, flags, False);
 +
                        /*
                         * The following statements compile data to compute the
                         * average number of characters written on each call to
                         * XText.  The data may be examined via the use of a
                         * "hidden" escape sequence.
                         */
+#ifdef UNUSED
                        ctotal += len;
                        ++ntotal;
-                       resetXtermGC(screen, flags, False);
 +#endif
                }
        }
        ScreenWrite(screen, str, flags,  fg, bg, len);
@@ -3446,7 +3412,8 @@
    if (!color_ok)
        new->screen.colorMode = False;
 
-   new->num_ptrs = new->screen.colorMode ? 4 : 2;
 +   new->num_ptrs = new->screen.colorMode ? 3 : 2;
 +   new->sgr_foreground = -1;
  #endif /* OPT_ISO_COLORS */
    new->screen.underline = request->screen.underline;
 
@@ -4012,13 +3979,12 @@
 
        drawXtermText(screen, flags, currentGC,
                x = CursorX(screen, screen->cur_col),
-               y = CursorY(screen, screen->cur_row) + 
 -                       screen->fnt_norm->ascent,
 +               y = CursorY(screen, screen->cur_row),
                 (char *) &c, 1);
 
        if (!screen->select && !screen->always_highlight) {
                screen->box->x = x;
-               screen->box->y = y - screen->fnt_norm->ascent;
 +               screen->box->y = y;
                 XDrawLines (screen->display, TextWindow(screen), 
                            screen->cursoroutlineGC ? screen->cursoroutlineGC 
                                                    : currentGC,
@@ -4046,8 +4012,9 @@
        flags = SCRN_BUF_ATTRS(screen, screen->cursor_row)[screen->cursor_col];
 
        if_OPT_ISO_COLORS(screen,{
-           fg = SCRN_BUF_FORES(screen, screen->cursor_row)[screen->cursor_col];
 -           bg = SCRN_BUF_BACKS(screen, screen->cursor_row)[screen->cursor_col];
 +           unsigned fb = SCRN_BUF_COLOR(screen, screen->cursor_row)[screen->cursor_col];
 +           fg = extract_fg(fb, flags);
 +           bg = extract_bg(fb);
         })
 
 #ifndef NO_ACTIVE_ICON
@@ -4075,8 +4042,7 @@
 
        drawXtermText(screen, flags, currentGC,
                CursorX(screen, screen->cursor_col),
-               CursorY(screen, screen->cursor_row)
 -                       + screen->fnt_norm->ascent,
 +               CursorY(screen, screen->cursor_row),
                 &c, 1);
 
        screen->cursor_state = OFF;
@@ -4163,7 +4129,7 @@
 
        bitclr(&term->flags, ORIGIN);
 
-       if_OPT_ISO_COLORS(screen,{ resetColor(); })
 +       if_OPT_ISO_COLORS(screen,{reset_SGR_Colors();})
  
        /* Reset character-sets to initial state */
        resetCharsets(screen);
@@ -4219,7 +4185,7 @@
                term->keyboard.flags &= ~(MODE_DECCKM);
                bitcpy(&term->flags, term->initflags, WRAPAROUND|REVERSEWRAP);
                bitclr(&term->flags, INSERT|INVERSE|BOLD|UNDERLINE|INVISIBLE);
-               if_OPT_ISO_COLORS(screen,{resetColor();})
 +               if_OPT_ISO_COLORS(screen,{reset_SGR_Colors();})
                 update_appcursor();
                update_autowrap();
                update_reversewrap();
Index: ptyx.h
--- xterm-34+/ptyx.h    Sun Jan  5 16:06:15 1997
 +++ xterm-35/ptyx.h     Tue Jan  7 18:25:49 1997
 @@ -336,8 +336,7 @@
  #define BUF_ATTRS(buf, row) (buf[MAX_PTRS * (row) + 1])
 
 #if OPT_ISO_COLORS
-#define BUF_FORES(buf, row) (buf[MAX_PTRS * (row) + 2])
 -#define BUF_BACKS(buf, row) (buf[MAX_PTRS * (row) + 3])
 +#define BUF_COLOR(buf, row) (buf[MAX_PTRS * (row) + 2])
  #endif
 
        /* TScreen-level macros */
@@ -345,8 +344,7 @@
 #define SCRN_BUF_ATTRS(screen, row) BUF_ATTRS(screen->buf, row)
 
 #if OPT_ISO_COLORS
-#define SCRN_BUF_FORES(screen, row) BUF_FORES(screen->buf, row)
 -#define SCRN_BUF_BACKS(screen, row) BUF_BACKS(screen->buf, row)
 +#define SCRN_BUF_COLOR(screen, row) BUF_COLOR(screen->buf, row)
  #endif
 
 typedef struct {
@@ -636,6 +634,7 @@
     unsigned    cur_foreground;        /* current foreground color     */
     unsigned    cur_background;        /* current background color     */
 #if OPT_ISO_COLORS
+    unsigned    sgr_foreground;        /* current SGR foreground color */
      int         num_ptrs;      /* number of pointers per row in 'ScrnBuf' */
 #endif
     unsigned   initflags;      /* initial mode flags           */
Index: screen.c
--- xterm-34+/screen.c  Fri Dec 27 03:01:57 1996
 +++ xterm-35/screen.c   Tue Jan  7 18:26:47 1997
 @@ -207,7 +207,7 @@
  register int length;           /* length of string */
 {
 #if OPT_ISO_COLORS
-       register Char *fgs = 0, *bgs = 0;
 +       register Char *fb = 0;
  #endif
        register Char *attrs;
        register int avail  = screen->max_col - screen->cur_col + 1;
@@ -223,8 +223,7 @@
        attrs = SCRN_BUF_ATTRS(screen, screen->cur_row) + screen->cur_col;
 
        if_OPT_ISO_COLORS(screen,{
-           fgs = SCRN_BUF_FORES(screen, screen->cur_row) + screen->cur_col;
 -           bgs = SCRN_BUF_BACKS(screen, screen->cur_row) + screen->cur_col;
 +               fb = SCRN_BUF_COLOR(screen, screen->cur_row) + screen->cur_col;
         })
 
        wrappedbit = *attrs & LINEWRAPPED;
@@ -241,8 +240,7 @@
        memset( attrs, flags,  length);
 
        if_OPT_ISO_COLORS(screen,{
-               memset( fgs,   cur_fg, length);
 -               memset( bgs,   cur_bg, length);
 +               memset( fb,   makeColorPair(cur_fg, cur_bg), length);
         })
 
        if (wrappedbit)
@@ -272,8 +270,7 @@
                for (i = 0; i < last; i += MAX_PTRS) {
                        bzero(save[i+0], size);
                        memset(save[i+1], flags, size);
-                       memset(save[i+2], term->cur_foreground, size);
 -                       memset(save[i+3], term->cur_background, size);
 +                       memset(save[i+2], xtermColorPair(), size);
                 }
        } else {
                for (i = MAX_PTRS * n - 1 ; i >= 0 ; i--)
@@ -374,10 +371,7 @@
        for (i=col; i<col+n; i++)
            attrs[i] = flags;
        if_OPT_ISO_COLORS(screen,{
-           if (flags & FG_COLOR)
 -               memset(BUF_FORES(sb, row) + col, term->cur_foreground, n);
 -           if (flags & BG_COLOR)
 -               memset(BUF_BACKS(sb, row) + col, term->cur_background, n);
 +           memset(BUF_COLOR(sb, row) + col, xtermColorPair(), n);
         })
 
        if (wrappedbit)
@@ -407,10 +401,7 @@
        memset (attrs + size - n, TERM_COLOR_FLAGS, n);
 
        if_OPT_ISO_COLORS(screen,{
-           if (term->flags & FG_COLOR)
 -               memset(BUF_FORES(sb, row) + size - n, term->cur_foreground, n);
 -           if (term->flags & BG_COLOR)
 -               memset(BUF_BACKS(sb, row) + size - n, term->cur_background, n);
 +           memset(BUF_COLOR(sb, row) + size - n, xtermColorPair(), n);
         })
        if (wrappedbit)
            attrs[0] |= LINEWRAPPED;
@@ -428,8 +419,7 @@
 int toprow, leftcol, nrows, ncols;
 Boolean force;                 /* ... leading/trailing spaces */
 {
-       int y = toprow * FontHeight(screen) + screen->border +
 -               FontAscent(screen);
 +       int y = toprow * FontHeight(screen) + screen->border;
         register int row;
        register int topline = screen->topline;
        int maxrow = toprow + nrows - 1;
@@ -443,7 +433,7 @@
                screen->cursor_state = OFF;
        for (row = toprow; row <= maxrow; y += FontHeight(screen), row++) {
 #if OPT_ISO_COLORS
-          register Char *fgs = 0, *bgs = 0;
 +          register Char *fb = 0;
  #endif
           register Char *chars;
           register Char *attrs;
@@ -468,8 +458,7 @@
           attrs = SCRN_BUF_ATTRS(screen, lastind + topline);
 
           if_OPT_ISO_COLORS(screen,{
-                  fgs = SCRN_BUF_FORES(screen, lastind + topline);
 -                  bgs = SCRN_BUF_BACKS(screen, lastind + topline);
 +                  fb = SCRN_BUF_COLOR(screen, lastind + topline);
            })
 
           if (row < screen->startHRow || row > screen->endHRow ||
@@ -530,8 +519,8 @@
 
           flags = attrs[col];
           if_OPT_ISO_COLORS(screen,{
-               fg = fgs[col];
 -               bg = bgs[col];
 +               fg = extract_fg(fb[col], flags);
 +               bg = extract_bg(fb[col]);
            })
           gc = updatedXtermGC(screen, flags, fg, bg, hilite);
           gc_changes |= (flags & (FG_COLOR|BG_COLOR));
@@ -542,8 +531,8 @@
           for (; col <= maxcol; col++) {
                if ((attrs[col] != flags)
 #if OPT_ISO_COLORS
-                || ((flags & FG_COLOR) && (fgs[col] != fg))
 -                || ((flags & BG_COLOR) && (bgs[col] != bg))
 +                || ((flags & FG_COLOR) && (extract_fg(fb[col],attrs[col]) != fg))
 +                || ((flags & BG_COLOR) && (extract_bg(fb[col]) != bg))
  #endif
                 ) {
                   drawXtermText(screen, flags, gc, x, y,
@@ -555,8 +544,8 @@
 
                   flags = attrs[col];
                   if_OPT_ISO_COLORS(screen,{
-                       fg = fgs[col];
 -                       bg = bgs[col];
 +                       fg = extract_fg(fb[col], flags);
 +                       bg = extract_bg(fb[col]);
                    })
                   gc = updatedXtermGC(screen, flags, fg, bg, hilite);
                   gc_changes |= (flags & (FG_COLOR|BG_COLOR));
@@ -601,10 +590,7 @@
            bzero (BUF_CHARS(buf, row), len);
            memset(BUF_ATTRS(buf, row), flags, len);
            if_OPT_ISO_COLORS(screen,{
-               memset(BUF_FORES(buf, row), 
 -                       (flags & FG_COLOR) ? term->cur_foreground : 0, len);
 -               memset(BUF_BACKS(buf, row), 
 -                       (flags & BG_COLOR) ? term->cur_background : 0, len);
 +               memset(BUF_COLOR(buf, row), xtermColorPair(), len);
             })
        }
 }
Index: termcap
--- xterm-34+/termcap   Sat Dec 28 11:36:20 1996
 +++ xterm-35/termcap    Tue Jan  7 18:27:15 1997
 @@ -21,7 +21,7 @@
         :ho=\E[H:\
        :im=\E[4h:ei=\E[4l:mi:\
        :ks=\E[?1h\E=:ke=\E[?1l\E>:\
-       :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:\
 +       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
         :k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
        :k;=\E[21~:F1=\E[23~:F2=\E[24~:\
        :kn#12:\
@@ -51,6 +51,9 @@
        :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\
        :kn#20:\
        :st@:ut@:Co@:NC@:op@:AB@:AF@:pa@:Sf@:Sb@:tc=xterm:
+xterm-vt220|xterm emulating vt220:\
+       :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:\
 +       :tc=xterm:
  #
 # vi may work better with this entry, because vi
 # doesn't use insert mode much
Index: terminfo
--- xterm-34+/terminfo  Sun Nov 24 11:02:48 1996
 +++ xterm-35/terminfo   Tue Jan  7 18:25:49 1997
 @@ -11,7 +11,7 @@
         xenl,
        colors#8,
        cols#80,
-       it#8, 
 +       it#8,
        lines#24,
        pairs#64,
        acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
@@ -66,7 +66,7 @@
        kdch1=\177,
        kend=\EOF,
        kent=\EOM,
-       kf1=\E[11~,
 +       kf1=\EOP,
        kf10=\E[21~,
        kf11=\E[23~,
        kf12=\E[24~,
@@ -77,10 +77,10 @@
        kf17=\E[31~,
        kf18=\E[32~,
        kf19=\E[33~,
-       kf2=\E[12~,
 +       kf2=\EOQ,
        kf20=\E[34~,
-       kf3=\E[13~,
 -       kf4=\E[14~,
 +       kf3=\EOR,
+       kf4=\EOS,
         kf5=\E[15~,
        kf6=\E[17~,
        kf7=\E[18~,
@@ -157,64 +157,180 @@
        smir@,
        use=xterm,
 #
+xterm-vt220|xterm emulating vt220,
+       kf1=\E[11~,
 +       kf2=\E[12~,
 +       kf3=\E[13~,
 +       kf4=\E[14~,
 +       use=xterm,
 +#
 xterm-rep|xterm with repeat-character control,
        rep=%p1%c\E[%p2%{1}%-%db,
        use=xterm,
 #
 # Compatible with the R6 xterm
 xterm-r6|xterm-old|xterm X11R6 version,
-       is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
 -       rs2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
 -       am, bel=^G,
 -       cols#80, lines#24,
 -       clear=\E[H\E[2J, cup=\E[%i%p1%d;%p2%dH,
 -       csr=\E[%i%p1%d;%p2%dr,
 -       cud=\E[%p1%dB, cud1=\n, cuu=\E[%p1%dA, cuu1=\E[A,
 -       cub=\E[%p1%dD, cub1=\b, cuf=\E[%p1%dC, cuf1=\E[C,
 -       el=\E[K, ed=\E[J,
 -       home=\E[H, ht=^I, ind=^J, cr=^M,
 +       am,
        km,
-       smir=\E[4h, rmir=\E[4l, mir,
 -       smso=\E[7m, rmso=\E[m, smul=\E[4m, rmul=\E[m,
 -       bold=\E[1m, rev=\E[7m, blink@, sgr0=\E[m, msgr,
 -       enacs=\E)0, smacs=^N, rmacs=^O,
 -       smkx=\E[?1h\E=, rmkx=\E[?1l\E>,
 -       kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
 -       kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
 +       mir,
+       msgr,
 +       xenl,
+       cols#80,
 +       lines#24,
+       bel=^G,
 +       blink@,
+       bold=\E[1m,
 +       clear=\E[H\E[2J,
 +       cr=^M,
+       csr=\E[%i%p1%d;%p2%dr,
 +       cub=\E[%p1%dD,
 +       cub1=^H,
+       cud=\E[%p1%dB,
 +       cud1=^J,
+       cuf=\E[%p1%dC,
 +       cuf1=\E[C,
 +       cup=\E[%i%p1%d;%p2%dH,
 +       cuu=\E[%p1%dA,
 +       cuu1=\E[A,
 +       dch=\E[%p1%dP,
 +       dch1=\E[P,
 +       dl=\E[%p1%dM,
 +       dl1=\E[M,
+       ed=\E[J,
 +       el=\E[K,
+       enacs=\E)0,
 +       home=\E[H,
 +       ht=^I,
+       il=\E[%p1%dL,
 +       il1=\E[L,
+       ind=^J,
 +       is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
 +       kbs=^H,
+       kcub1=\EOD,
 +       kcud1=\EOB,
+       kcuf1=\EOC,
 +       kcuu1=\EOA,
 +       kdch1=\E[3~,
 +       kf1=\EOP,
        kf10=\E[21~,
-       kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
 -       kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~,
 -       kfnd=\E[1~, kich1=\E[2~, kdch1=\E[3~,
 -       kslt=\E[4~, kpp=\E[5~, knp=\E[6~,
 -       kbs=\b, kcuu1=\EOA, kcud1=\EOB, kcuf1=\EOC, kcub1=\EOD,
 -       meml=\El, memu=\Em,
 -       smcup=\E7\E[?47h, rmcup=\E[2J\E[?47l\E8,
 -       sc=\E7, rc=\E8,
 -       il=\E[%p1%dL, dl=\E[%p1%dM, il1=\E[L, dl1=\E[M,
 +       kf11=\E[23~,
 +       kf12=\E[24~,
 +       kf13=\E[25~,
 +       kf14=\E[26~,
 +       kf15=\E[28~,
 +       kf16=\E[29~,
 +       kf17=\E[31~,
 +       kf18=\E[32~,
 +       kf19=\E[33~,
 +       kf2=\EOQ,
+       kf20=\E[34~,
 +       kf3=\EOR,
+       kf4=\EOS,
 +       kf5=\E[15~,
 +       kf6=\E[17~,
 +       kf7=\E[18~,
 +       kf8=\E[19~,
 +       kf9=\E[20~,
 +       kfnd=\E[1~,
 +       kich1=\E[2~,
 +       knp=\E[6~,
 +       kpp=\E[5~,
 +       kslt=\E[4~,
 +       meml=\El,
+       memu=\Em,
 +       rc=\E8,
+       rev=\E[7m,
         ri=\EM,
-       dch=\E[%p1%dP, dch1=\E[P,
 +       rmacs=^O,
+       rmcup=\E[2J\E[?47l\E8,
 +       rmir=\E[4l,
 +       rmkx=\E[?1l\E>,
 +       rmso=\E[m,
 +       rmul=\E[m,
 +       rs2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
 +       sc=\E7,
+       sgr0=\E[m,
 +       smacs=^N,
+       smcup=\E7\E[?47h,
 +       smir=\E[4h,
 +       smkx=\E[?1h\E=,
 +       smso=\E[7m,
 +       smul=\E[4m,
         tbc=\E[3g,
-       xenl,
 #
 # Compatible with the R5 xterm
 xterm-r5|xterm R5 version,
-       am, xenl, km, msgr,
 -       cols#80, it#8, lines#24,
 -       bel=^G, cr=\r, csr=\E[%i%p1%d;%p2%dr, tbc=\E[3g,
 -       clear=\E[H\E[2J, el=\E[K, ed=\E[J, cup=\E[%i%p1%d;%p2%dH,
 -       cud1=\n, home=\E[H, cub1=\b, cuf1=\E[C,
 -       cuu1=\E[A, dch1=\E[P, dl1=\E[M, blink=@,
 -       bold=\E[1m, rev=\E[7m, smso=\E[7m, sgr0=\E[m,
 -       rmso=\E[m, ich1=\E[@, il1=\E[L, kbs=\b,
 -       kdch1=\E[3~, kdl1=\E[31~, kel=\E[8~, kcud1=\EOB, kf0=\EOq,
 -       kf1=\E[11~, kf10=\E[21~, kf2=\E[12~, kf3=\E[13~,
 -       kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~,
 -       kf8=\E[19~, kf9=\E[20~, khome=\E[7~, kich1=\E[2~,
 -       kil1=\E[30~, kcub1=\EOD, knp=\E[6~, kpp=\E[5~,
 -       kcuf1=\EOC, kcuu1=\EOA, rmkx=\E[?1l\E>, smkx=\E[?1h\E=,
 -       dch=\E[%p1%dP, dl=\E[%p1%dM, cud=\E[%p1%dB, ich=\E[%p1%d@,
 -       il=\E[%p1%dL, cub=\E[%p1%dD, cuf=\E[%p1%dC, cuu=\E[%p1%dA,
 -       rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rc=\E8, sc=\E7,
 -       ind=\n, ri=\EM,
 +       am,
+       km,
 +       msgr,
+       xenl,
 +       cols#80,
+       it#8,
 +       lines#24,
+       bel=^G,
 +       blink=@,
+       bold=\E[1m,
 +       clear=\E[H\E[2J,
 +       cr=^M,
+       csr=\E[%i%p1%d;%p2%dr,
 +       cub=\E[%p1%dD,
 +       cub1=^H,
+       cud=\E[%p1%dB,
 +       cud1=^J,
+       cuf=\E[%p1%dC,
 +       cuf1=\E[C,
+       cup=\E[%i%p1%d;%p2%dH,
 +       cuu=\E[%p1%dA,
 +       cuu1=\E[A,
 +       dch=\E[%p1%dP,
 +       dch1=\E[P,
 +       dl=\E[%p1%dM,
 +       dl1=\E[M,
+       ed=\E[J,
 +       el=\E[K,
+       home=\E[H,
 +       ht=^I,
+       hts=\EH,
 +       ich=\E[%p1%d@,
 +       ich1=\E[@,
 +       il=\E[%p1%dL,
 +       il1=\E[L,
+       ind=^J,
 +       kbs=^H,
+       kcub1=\EOD,
 +       kcud1=\EOB,
 +       kcuf1=\EOC,
 +       kcuu1=\EOA,
 +       kdch1=\E[3~,
 +       kdl1=\E[31~,
 +       kel=\E[8~,
 +       kf0=\EOq,
+       kf1=\EOP,
 +       kf10=\E[21~,
 +       kf11=\E[23~,
 +       kf12=\E[24~,
 +       kf2=\EOQ,
+       kf3=\EOR,
 +       kf4=\EOS,
+       kf5=\E[15~,
 +       kf6=\E[17~,
 +       kf7=\E[18~,
 +       kf8=\E[19~,
 +       kf9=\E[20~,
 +       khome=\E[7~,
 +       kich1=\E[2~,
 +       kil1=\E[30~,
 +       knp=\E[6~,
 +       kpp=\E[5~,
 +       rc=\E8,
+       rev=\E[7m,
 +       ri=\EM,
+       rmkx=\E[?1l\E>,
 +       rmso=\E[m,
 +       rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H,
 +       sc=\E7,
        sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m,
-       hts=\EH, ht=\t, kf11=\E[23~, kf12=\E[24~,
 +       sgr0=\E[m,
 +       smkx=\E[?1h\E=,
 +       smso=\E[7m,
 +       tbc=\E[3g,
 Index: util.c
--- xterm-34+/util.c    Fri Dec 27 03:01:57 1996
 +++ xterm-35/util.c     Tue Jan  7 19:14:55 1997
 @@ -697,10 +697,7 @@
         memset(SCRN_BUF_ATTRS(screen, row) + col, flags, len);
 
        if_OPT_ISO_COLORS(screen,{
-               memset(SCRN_BUF_FORES(screen, row) + col,
 -                       flags & FG_COLOR ? term->cur_foreground : 0, len);
 -               memset(SCRN_BUF_BACKS(screen, row) + col,
 -                       flags & BG_COLOR ? term->cur_background : 0, len);
 +               memset(SCRN_BUF_COLOR(screen, row) + col, xtermColorPair(), len);
         })
 
        return rc;
@@ -1294,6 +1291,7 @@
        char *text;
        int len;
 {
+       y += FontAscent(screen);
         XDrawImageString(screen->display, TextWindow(screen), gc, 
                x, y,  text, len);
        if ((flags & BOLD) && screen->enbolden)
@@ -1380,6 +1378,58 @@
 }
 
 #if OPT_ISO_COLORS
+/*
+ * Extract the foreground-color index from a one-byte color pair.  If we've got
 + * BOLD or UNDERLINE color-mode active, those will be used unless we've got
 + * an SGR foreground color active.
 + */
+unsigned
+extract_fg (color, flags)
+       unsigned color;
 +       unsigned flags;
 +{
+       unsigned fg = (color >> 4) & 0xf;
 +       if (fg == extract_bg(color))
 +       {
+               if (term->screen.colorULMode && (flags & UNDERLINE))
 +                       fg = COLOR_UL;
 +               if (term->screen.colorBDMode && (flags & BOLD))
 +                       fg = COLOR_BD;
 +       }
+       return fg;
 +}
+
+unsigned
+extract_bg (color)
+       unsigned color;
 +{
+       return color & 0xf;
 +}
+
+/*
+ * Combine the current foreground and background into a single 8-bit number.
 + * Note that we're storing the SGR foreground, since cur_foreground may be set
 + * to COLOR_UL or COLOR_BD, which would make the code larger than 8 bits.
 + *
+ * FIXME: I'm using the coincidence of fg/bg values to unmask COLOR_UL/COLOR_BD,
 + * which will require more work...
 + */
+unsigned
+makeColorPair (fg, bg)
+       int fg;
 +       int bg;
 +{
+       unsigned my_bg = (bg >= 0) && (bg < 16) ? bg : 0;
 +       unsigned my_fg = (fg >= 0) && (fg < 16) ? fg : my_bg;
 +       return (my_fg << 4) | my_bg;
 +}
+
+unsigned
+xtermColorPair ()
+{
+       return makeColorPair(term->sgr_foreground, term->cur_background);
 +}
+
 Pixel
 getXtermForeground(flags, color)
        int flags;
Index: xterm.h
--- xterm-34+/xterm.h   Fri Dec 27 03:01:57 1996
 +++ xterm-35/xterm.h    Tue Jan  7 18:25:49 1997
 @@ -204,6 +204,10 @@
  
 extern Pixel getXtermBackground PROTO((int flags, int color));
 extern Pixel getXtermForeground PROTO((int flags, int color));
+extern unsigned extract_bg PROTO((unsigned color));
 +extern unsigned extract_fg PROTO((unsigned color, unsigned flags));
 +extern unsigned makeColorPair PROTO((int fg, int bg));
 +extern unsigned xtermColorPair PROTO((void));
  extern void ClearCurBackground PROTO((TScreen *screen, int top, int left, unsigned height, unsigned width));
 extern void useCurBackground PROTO((Bool flag));
 
@@ -212,6 +216,9 @@
 #define ClearCurBackground(screen, top, left, height, width) \
        XClearArea (screen->display, TextWindow(screen), \
                left, top, width, height, FALSE)
+
+#define extract_fg(color, flags) term->cur_foreground
 +#define extract_bg(color) term->cur_background
  
                /* FIXME: Reverse-Video? */
 #define getXtermBackground(flags, color) term->core.background_pixel