XFree86 3.1.2Ec - xterm patch #18 - 1996/7/18 - T.Dickey
 
This implements the following:
 
        + escape sequences that act like the CDE dtterm's window operations
          (though I have implemented the default width and height -- I've seen
          a rather buggy dtterm running that seems to treat width=0 or height=0
          literally -- maybe that's a feature, not a bug?)
 
        + minor tweak to the screen-repainting when resizing (I still cannot
          entirely get rid of flicker).
 
        + still more fixes to terminfo & termcap (I corrected my error for
          the hpa code and added some other stuff by comparing to ncurses'
          description and rxvt's).
 
        + a tweak to the patch by Michael Rohleder for the color translation
 
        + re-order attribute codes to allow later implementation of protected
          fields (dtterm supposedly does this; it's probably more useful than
          blinking or invisible text -- that uses up all of the available bits
          without changing the attribute scheme radically).
 
My to-do list:
 
        + debug this on IRIX 5.2 (I've got lousy debugging aids there, and
          simply haven't had time til this week to spend the off-hours time
          I'll need to troubleshoot the problem).
 
        + try to reduce the memory usage of the savedLines (I think that it's
          feasible to suppress the memory allocated for fore/back color codes
          if the user hasn't enabled color).
 
        + time permitting, implement the protected fields (that's mainly
          by modifying the logic for the clear-line and clear-screen functions).
 
(I have a number of items beyond these that I won't have time to do before 3.2
is frozen).
 
--------------------------------------------------------------------------------
  VTPrsTbl.c  |   11 +-
 VTparse.def |    1 
 VTparse.h   |    1 
 charproc.c  |  268 ++++++++++++++++++++++++++++++++++++++++++++++++----------
 ptyx.h      |   16 ++-
 screen.c    |   20 ++--
 termcap     |    4 
 terminfo    |   38 +++++---
 util.c      |    4 
 9 files changed, 284 insertions, 79 deletions
--------------------------------------------------------------------------------
 Index: VTPrsTbl.c
--- xterm+/VTPrsTbl.c   Mon Jul  8 12:42:24 1996
 +++ xterm_a/VTPrsTbl.c  Wed Jul 17 19:57:24 1996
 @@ -36,7 +36,7 @@
  
 /*
  * Stupid Apollo C preprocessor can't handle long lines.  So... To keep
- * it happy, we put each onto a seperate line....  Sigh...
 + * it happy, we put each onto a separate line....  Sigh...
   */
 
 Const int groundtable[] =
@@ -486,7 +486,7 @@
 CASE_GROUND_STATE,
 CASE_GROUND_STATE,
 /*     `               a               b               c       */
-CASE_GROUND_STATE,
+CASE_HPA,
 CASE_GROUND_STATE,
 CASE_GROUND_STATE,
 CASE_DA1,
@@ -498,7 +498,7 @@
 /*     h               i               j               k       */
 CASE_SET,
 CASE_GROUND_STATE,
-CASE_HPA,
+CASE_GROUND_STATE,
 CASE_GROUND_STATE,
 /*     l               m               n               o       */
 CASE_RST,
@@ -511,7 +511,7 @@
 CASE_DECSTBM,
 CASE_DECSC,
 /*     t               u               v               w       */
-CASE_GROUND_STATE,
+CASE_XTERM_WINOPS,
 CASE_DECRC,
 CASE_GROUND_STATE,
 CASE_GROUND_STATE,
@@ -1068,8 +1068,7 @@
 CASE_IGNORE,
 CASE_IGNORE,
 CASE_IGNORE,
-/*     ,
-       -               .               /       */
 +/*     ,               -               .               /       */
  CASE_IGNORE,
 CASE_IGNORE,
 CASE_IGNORE,
Index: VTparse.def
--- xterm+/VTparse.def  Mon Jul  8 12:42:24 1996
 +++ xterm_a/VTparse.def Wed Jul 17 19:57:24 1996
 @@ -79,3 +79,4 @@
  CASE_HP_BUGGY_LL
 CASE_HPA
 CASE_VPA
+CASE_XTERM_WINOPS
Index: VTparse.h
--- xterm+/VTparse.h    Mon Jul  8 12:42:24 1996
 +++ xterm_a/VTparse.h   Wed Jul 17 19:57:24 1996
 @@ -109,3 +109,4 @@
  #define CASE_HP_BUGGY_LL 70
 #define CASE_HPA 71
 #define CASE_VPA 72
+#define CASE_XTERM_WINOPS 73
Index: charproc.c
 --- xterm+/charproc.c   Mon Jul  8 12:42:24 1996
 +++ xterm_a/charproc.c  Thu Jul 18 21:39:16 1996
 @@ -123,6 +123,7 @@
  static int set_character_class PROTO((char *s));
 static void DoSetSelectedFont PROTO_XT_SEL_CB_ARGS;
 static void FromAlternate PROTO((TScreen *screen));
+static void RequestResize PROTO((XtermWidget termw, int rows, int cols, int text));
  static void SwitchBufs PROTO((TScreen *screen));
 static void ToAlternate PROTO((TScreen *screen));
 static void VTGraphicsOrNoExpose PROTO((XEvent *event));
@@ -136,10 +137,12 @@
 static void dotext PROTO((TScreen *screen, unsigned flags, int charset, Char *buf, Char *ptr, unsigned fg, unsigned bg));
 static void dpmodes PROTO((XtermWidget termw, void (*func)(unsigned *p, int mask)));
 static void restoremodes PROTO((XtermWidget termw));
+static void report_win_label PROTO((TScreen *screen, int code, XTextProperty *text, Status ok));
  static void savemodes PROTO((XtermWidget termw));
 static void set_vt_box PROTO((TScreen *screen));
 static void unparseputn PROTO((unsigned int n, int fd));
 static void update_font_info PROTO((TScreen *screen, Bool doresize));
+static void window_ops PROTO((XtermWidget termw));
  
 #define        DEFAULT         -1
 #define        TEXT_BUF_SIZE   256
@@ -1435,6 +1438,11 @@
                        restoremodes(term);
                        parsestate = groundtable;
                        break;
+
+               case CASE_XTERM_WINOPS:
 +                       window_ops(term);
 +                       parsestate = groundtable;
 +                       break;
                 }
        }
 }
@@ -1953,28 +1961,8 @@
                                CursorSet(screen, 0, 0, termw->flags);
                                if((j = func == bitset ? 132 : 80) !=
                                 ((termw->flags & IN132COLUMNS) ? 132 : 80) ||
-                                j != screen->max_col + 1) {
 -                                       Dimension replyWidth, replyHeight;
 -                                       XtGeometryResult status;
 -
-                                       status = XtMakeResizeRequest (
 -                                           (Widget) termw, 
 -                                           (Dimension) FontWidth(screen) * j
 -                                               + 2*screen->border
 -                                               + screen->scrollbar,
 -                                           (Dimension) FontHeight(screen)
 -                                               * (screen->max_row + 1)
 -                                               + 2 * screen->border,
 -                                           &replyWidth, &replyHeight);
 -
-                                       if (status == XtGeometryYes ||
 -                                           status == XtGeometryDone) {
 -                                           ScreenResize (&termw->screen,
 -                                                         replyWidth,
 -                                                         replyHeight,
 -                                                         &termw->flags);
 -                                       }
 -                               }
 +                                j != screen->max_col + 1)
 +                                       RequestResize(termw, 0, j, TRUE);
                                 (*func)(&termw->flags, IN132COLUMNS);
                        }
                        break;
@@ -2181,27 +2169,8 @@
                                CursorSet(screen, 0, 0, termw->flags);
                                if((j = (screen->save_modes[1] & IN132COLUMNS)
                                 ? 132 : 80) != ((termw->flags & IN132COLUMNS)
-                                ? 132 : 80) || j != screen->max_col + 1) {
 -                                       Dimension replyWidth, replyHeight;
 -                                       XtGeometryResult status;
 -                                       status = XtMakeResizeRequest (
 -                                           (Widget) termw,
 -                                           (Dimension) FontWidth(screen) * j 
 -                                               + 2*screen->border
 -                                               + screen->scrollbar,
 -                                           (Dimension) FontHeight(screen)
 -                                               * (screen->max_row + 1)
 -                                               + 2*screen->border,
 -                                           &replyWidth, &replyHeight);
 -
-                                       if (status == XtGeometryYes ||
 -                                           status == XtGeometryDone) {
 -                                           ScreenResize (&termw->screen,
 -                                                         replyWidth,
 -                                                         replyHeight,
 -                                                         &termw->flags);
 -                                       }
 -                               }
 +                                ? 132 : 80) || j != screen->max_col + 1)
 +                                       RequestResize(termw, 0, j, TRUE);
                                 termw->flags &= ~IN132COLUMNS;
                                termw->flags |= screen->save_modes[1] &
                                 IN132COLUMNS;
@@ -2290,6 +2259,173 @@
 }
 
 /*
+ * Report window label (icon or title) in dtterm protocol
 + * ESC ] code label ESC backslash
 + */
+static void
+report_win_label(screen, code, text, ok)
 +       TScreen *screen;
 +       int code;
 +       XTextProperty *text;
 +       Status ok;
 +{
+       char **list;
 +       int length = 0;
 +
+       reply.a_type = ESC;
 +       unparseputc(ESC, screen->respond);
 +       unparseputc(']', screen->respond);
 +       unparseputc(code, screen->respond);
 +
+       if (ok
 +        && XTextPropertyToStringList(text, &list, &length)) {
 +               int n, c;
 +               for (n = 0; n < length; n++) {
 +                       char *s = list[n];
 +                       while ((c = *s++) != '\0')
 +                               unparseputc(c, screen->respond);
 +               }
 +               XFreeStringList(list);
 +       }
+
 +       unparseputc(ESC, screen->respond);
 +       unparseputc('\\', screen->respond);
 +}
+
+/*
+ * Window operations (from CDE dtterm description)
 + */
+static void
+window_ops(termw)
+    XtermWidget termw;
+{
 +       register TScreen        *screen = &termw->screen;
 +       XWindowChanges values;
 +       XWindowAttributes win_attrs;
 +       XTextProperty text;
 +       unsigned int value_mask;
 +       Position x, y;
 +
+       switch (param[0]) {
 +       case 1:         /* Restore (de-iconify) window */
 +               XMapWindow(screen->display,
 +                       VShellWindow);
 +               break;
 +
+       case 2:         /* Minimize (iconify) window */
 +               XIconifyWindow(screen->display,
 +                       VShellWindow,
 +                       DefaultScreen(screen->display));
 +               break;
 +
+       case 3:         /* Move the window to the given position */
 +               values.x   = param[1];
 +               values.y   = param[2];
 +               value_mask = (CWX | CWY);
 +               XReconfigureWMWindow(
 +                       screen->display,
 +                       VShellWindow,
 +                       DefaultScreen(screen->display),
 +                       value_mask,
 +                       &values);
 +               break;
 +
+       case 4:         /* Resize the window to given size in pixels */
 +               RequestResize(termw, param[1], param[2], FALSE);
 +               break;
 +
+       case 5:         /* Raise the window to the front of the stack */
 +               XRaiseWindow(screen->display, VShellWindow);
 +               break;
 +
+       case 6:         /* Lower the window to the bottom of the stack */
 +               XLowerWindow(screen->display, VShellWindow);
 +               break;
 +
+       case 7:         /* Refresh the window */
 +               Redraw();
 +               break;
 +
+       case 8:         /* Resize the text-area, in characters */
 +               RequestResize(termw, param[1], param[2], TRUE);
 +               break;
 +
+       case 11:        /* Report the window's state */
 +               XGetWindowAttributes(screen->display,
 +                       VWindow(screen),
 +                       &win_attrs);
 +               reply.a_type = CSI;
 +               reply.a_pintro = 0;
 +               reply.a_nparam = 1;
 +               reply.a_param[0] = (win_attrs.map_state == IsViewable) ? 1 : 2;
 +               reply.a_inters = 0;
 +               reply.a_final  = 't';
 +               unparseseq(&reply, screen->respond);
 +               break;
 +
+       case 13:        /* Report the window's position */
 +               XtTranslateCoords(toplevel, 0, 0, &x, &y);
 +               reply.a_type = CSI;
 +               reply.a_pintro = 0;
 +               reply.a_nparam = 3;
 +               reply.a_param[0] = 3;
 +               reply.a_param[1] = x;
 +               reply.a_param[2] = y;
 +               reply.a_inters = 0;
 +               reply.a_final  = 't';
 +               unparseseq(&reply, screen->respond);
 +               break;
 +
+       case 14:        /* Report the window's size in pixels */
 +               XGetWindowAttributes(screen->display,
 +                       VWindow(screen),
 +                       &win_attrs);
 +               reply.a_type = CSI;
 +               reply.a_pintro = 0;
 +               reply.a_nparam = 3;
 +               reply.a_param[0] = 4;
 +               /*FIXME: find if dtterm uses
 +                *      win_attrs.height or Height
 +                *      win_attrs.width  or Width
 +                */
 +               reply.a_param[1] = Height(screen);
 +               reply.a_param[2] = Width(screen);
 +               reply.a_inters = 0;
 +               reply.a_final  = 't';
 +               unparseseq(&reply, screen->respond);
 +               break;
 +
+       case 18:        /* Report the text's size in characters */
 +               reply.a_type = CSI;
 +               reply.a_pintro = 0;
 +               reply.a_nparam = 3;
 +               reply.a_param[0] = 8;
 +               reply.a_param[1] = screen->max_row + 1;
 +               reply.a_param[2] = screen->max_col + 1;
 +               reply.a_inters = 0;
 +               reply.a_final  = 't';
 +               unparseseq(&reply, screen->respond);
 +               break;
 +
+       case 20:        /* Report the icon's label */
 +               report_win_label(screen, 'L', &text,
 +                       XGetWMIconName(
 +                               screen->display,
 +                               VShellWindow,
 +                               &text));
 +               break;
 +
+       case 21:        /* Report the window's title */
 +               report_win_label(screen, 'l', &text,
 +                       XGetWMName(
 +                               screen->display,
 +                               VShellWindow,
 +                               &text));
 +               break;
 +       }
+}
 +
+/*
  * set a bit in a word given a pointer to the word and a mask.
  */
 static void bitset(p, mask)
@@ -2542,6 +2678,52 @@
                    &term->flags);
 }
 
+
+static void RequestResize(termw, rows, cols, text)
 +       XtermWidget termw;
 +       int rows;
 +       int cols;
 +       int text;
 +{
+       register TScreen        *screen = &termw->screen;
 +       Dimension replyWidth, replyHeight;
 +       Dimension askedWidth, askedHeight;
 +       XtGeometryResult status;
 +
+       askedWidth  = cols;
 +       askedHeight = rows;
 +       if (text) {
 +               if (askedHeight <= 0)
 +                       askedHeight = screen->max_row + 1;
 +               if (askedWidth <= 0)
 +                       askedWidth = screen->max_col + 1;
 +
+               askedWidth  *= FontWidth(screen);
 +               askedHeight *= FontHeight(screen);
 +
+               askedWidth  += (2 * screen->border) + screen->scrollbar;
 +               askedHeight += (2 * screen->border);
 +
+       } else {
 +               if (askedHeight <= 0)
 +                       askedHeight = FullHeight(screen);
 +               if (askedWidth <= 0)
 +                       askedWidth = FullWidth(screen);
 +       }
+
 +       status = XtMakeResizeRequest (
 +           (Widget) termw, 
 +            askedWidth,  askedHeight,
 +           &replyWidth, &replyHeight);
 +
+       if (status == XtGeometryYes ||
 +           status == XtGeometryDone) {
 +           ScreenResize (&termw->screen,
 +                         replyWidth,
 +                         replyHeight,
 +                         &termw->flags);
 +       }
+}
                                 
 extern Atom wm_delete_window;  /* for ICCCM delete window */
 
Index: ptyx.h
--- xterm+/ptyx.h       Mon Jun 10 13:03:46 1996
 +++ xterm_a/ptyx.h      Thu Jul 18 21:22:57 1996
 @@ -591,13 +591,17 @@
   * term->flags and screen->save_modes.  This need only fit in an unsigned.
  */
 
-#define        ATTRIBUTES      0x67    /* mask: user-visible attributes */
  /* global flags and character flags (visible character attributes) */
 #define INVERSE                0x01    /* invert the characters to be output */
 #define UNDERLINE      0x02    /* true if underlining */
 #define BOLD           0x04
+/* global flags (also character attributes) */
 +#define BG_COLOR       0x08  /* true if background set */
 +#define FG_COLOR       0x10  /* true if foreground set */
 +
 /* character flags (internal attributes) */
-#define LINEWRAPPED    0x08    /* used on the first character in a
 +#define PROTECTED      0x20    /* a character is drawn that cannot be erased */
 +#define LINEWRAPPED    0x40    /* used on the first character in a
                                  * line to indicate that it wraps onto
                                 * the next line so we can tell the
                                 * difference between lines that have
@@ -605,12 +609,12 @@
                                 * ended naturally with a CR at column
                                 * max_col.
                                 */
-#define CHARDRAWN      0x10    /* a character has been drawn here on the
 +#define CHARDRAWN      0x80    /* a character has been drawn here on the
                                    screen.  Used to distinguish blanks from
                                   empty parts of the screen when selecting */
-/* global flags */
-#define BG_COLOR       0x20  /* true if background set */
 -#define FG_COLOR       0x40  /* true if foreground set */
 +
+                       /* mask: user-visible attributes */
 +#define        ATTRIBUTES      (INVERSE|UNDERLINE|BOLD|BG_COLOR|FG_COLOR|PROTECTED)
  
 #define WRAPAROUND     0x400   /* true if auto wraparound mode */
 #define        REVERSEWRAP     0x800   /* true if reverse wraparound mode */
Index: screen.c
--- xterm+/screen.c     Sun Feb 18 12:46:26 1996
 +++ xterm_a/screen.c    Thu Jul 18 21:41:51 1996
 @@ -597,14 +597,18 @@
  
        /* clear the right and bottom internal border because of NorthWest
           gravity might have left junk on the right and bottom edges */
-       XClearArea (screen->display, tw,
 -                   width - screen->border, 0,                /* right edge */
 -                   screen->border, height,           /* from top to bottom */
 -                   False);
 -       XClearArea (screen->display, tw, 
 -                   0, height - screen->border,                   /* bottom */
 -                   width, screen->border,         /* all across the bottom */
 -                   False);
 +       if (width >= FullWidth(screen)) {
 +               XClearArea (screen->display, tw,
 +                           FullWidth(screen), 0,             /* right edge */
 +                           0, height,                /* from top to bottom */
 +                           False);
 +       }
+       if (height >= FullHeight(screen)) {
 +               XClearArea (screen->display, tw, 
 +                       0, FullHeight(screen),                    /* bottom */
 +                       width, 0,                  /* all across the bottom */
 +                       False);
 +       }
 
        /* round so that it is unlikely the screen will change size on  */
        /* small mouse movements.                                       */
Index: termcap
--- xterm+/termcap      Mon Jul  8 12:42:24 1996
 +++ xterm_a/termcap     Wed Jul 17 19:57:24 1996
 @@ -21,7 +21,7 @@
         :ho=\E[H:\
        :im=\E[4h:ei=\E[4l:mi:\
        :ks=\E[?1h\E=:ke=\E[?1l\E>:\
-       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
 +       :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:\
         :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:\
@@ -38,7 +38,7 @@
        :ti=\E7\E[?47h:te=\E[2J\E[?47l\E8:\
        :vi=\E[?25l:ve=\E[?25h:\
        :up=\E[A:us=\E[4m:ue=\E[24m:xn:\
-       :ut:Co#8:NC#7:op=\E100m:AB=\E[4%dm:AF=\E[3%dm:
 +       :ut:Co#8:op=\E100m:AB=\E[4%dm:AF=\E[3%dm:
  v2|xterm-65|xterm with tall window 65x80 (X Window System):\
        :li#65:tc=xterm:
 vb|xterm-bold|xterm with bold instead of underline (X Window System):\
Index: terminfo
--- xterm+/terminfo     Mon Jul  8 12:42:24 1996
 +++ xterm_a/terminfo    Wed Jul 17 19:57:24 1996
 @@ -11,8 +11,8 @@
         xenl,
        colors#8,
        cols#80,
+       it#8, 
         lines#24,
-       ncv#7,
        pairs#64,
        acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G,
@@ -31,31 +31,41 @@
        cup=\E[%i%p1%d;%p2%dH,
        cuu=\E[%p1%dA,
        cuu1=\E[A,
+       cvvis=\E[?25h,
         dch=\E[%p1%dP,
        dch1=\E[P,
        dl=\E[%p1%dM,
        dl1=\E[M,
        ed=\E[J,
        el=\E[K,
-       el1=\E[1K$<3>,
 +       el1=\E[1K,
         enacs=\E(B\E)0,
+       flash=\E[?5h\E[?5l,
         home=\E[H,
-       hpa=\E[%i%p1%dj,
 +       hpa=\E[%i%p1%dG,
         ht=^I,
        hts=\EH,
+       ich=\E[%p1%d@,
 +       ich1=\E[@,
         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>,
-       kbeg=\E[E,
 +       ka1=\EOw,
+       ka3=\EOu,
 +       kb2=\EOy,
+       kbeg=\EOE,
         kbs=^H,
+       kc1=\EOq,
+       kc3=\EOs,
         kcub1=\EOD,
        kcud1=\EOB,
        kcuf1=\EOC,
        kcuu1=\EOA,
-       kdch1=\E[3~,
 +       kdch1=\177,
         kend=\EOF,
-       kf1=\EOP,
+       kent=\EOM,
 +       kf1=\E[11~,
         kf10=\E[21~,
        kf11=\E[23~,
        kf12=\E[24~,
@@ -66,10 +76,10 @@
        kf17=\E[31~,
        kf18=\E[32~,
        kf19=\E[33~,
-       kf2=\EOQ,
+       kf2=\E[12~,
         kf20=\E[34~,
-       kf3=\EOR,
-       kf4=\EOS,
 +       kf3=\E[13~,
 +       kf4=\E[14~,
         kf5=\E[15~,
        kf6=\E[17~,
        kf7=\E[18~,
@@ -78,21 +88,24 @@
        kfnd=\E[1~,
        khome=\EOH,
        kich1=\E[2~,
+       kmous=\E[M,
         knp=\E[6~,
        kpp=\E[5~,
        kslt=\E[4~,
        meml=\El,
        memu=\Em,
-       op=\E[100m,
 +       op=\E[39;49m,
         rc=\E8,
        rev=\E[7m,
        ri=\EM,
        rmacs=^O,
+       rmam=\E[?7l,
         rmcup=\E[2J\E[?47l\E8,
        rmir=\E[4l,
        rmkx=\E[?1l\E>,
        rmso=\E[27m,
        rmul=\E[24m,
+       rs1=^O,
        rs2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
        sc=\E7,
        setab=\E[4%p1%dm,
@@ -102,6 +115,7 @@
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;,
        sgr0=\E[m\017,
        smacs=^N,
+       smam=\E[?7h,
         smcup=\E7\E[?47h,
        smir=\E[4h,
        smkx=\E[?1h\E=,
@@ -113,8 +127,8 @@
        lines#65,
        use=xterm,
 xterm-bold|xterm with bold instead of underline (X Window System),
-       smul=\E[1m,
         rmul=\E[22m,
+       smul=\E[1m,
         use=xterm,
 xtermm|monochrome xterm (X Window System),
        colors@,
@@ -128,8 +142,8 @@
        sgr@,
        use=xterm,
 xterm-boldso|xterm with bold for standout (X Window System),
-       smso=\E[1m,
         rmso=\E[22m,
+       smso=\E[1m,
         use=xterm,
 #
 # vi may work better with this entry, because vi
Index: util.c
--- xterm+/util.c       Sun Jun 30 12:03:00 1996
 +++ xterm_a/util.c      Thu Jul 18 21:27:03 1996
 @@ -1207,7 +1207,7 @@
         int flags;
        int color;
 {
-       Pixel fg = (flags & FG_COLOR)
 +       Pixel fg = (flags & FG_COLOR) && (color >= 0)
                         ? term->screen.Acolors[color]
                        : term->screen.foreground;
 
@@ -1223,7 +1223,7 @@
        int flags;
        int color;
 {
-       Pixel bg = (flags & BG_COLOR)
 +       Pixel bg = (flags & BG_COLOR) && (color >= 0)
                         ? term->screen.Acolors[color]
                        : term->core.background_pixel;