xterm-60.patch.txt

XFree86 3.9Ab - xterm patch #60 - 1998/1/10 - T.Dickey <dickey@clark.net>
 
This fixes some minor bugs and adds new functionality:
 
        + add support for blinking text.  This does not actually cause the
          text to flash, but text with the blink attribute can be displayed
          in color, using new resources colorBL and colorBLMode.
 
          If colors are not used, the blinking text will be displayed as
          before (just like bold).  The main purpose of this is to make
          applications work properly when they assume the emulator supports
          blinking text.
 
          I did this by moving the per-cell LINEWRAPPED flag to a per-line
          flag, to make room for the new BLINK flag.  There were no per-line
          flags, so this changes a lot of logic.
 
        + corrected a missing save-cursor in the handling of SGR 1048 (the
          new control sequence I added in patch #54, 1997/10/17).  Reported
          by Darren Hiebert.
 
        + flush the output of the transparent printing after each line
          Reported by Tomas Vanhala <vanhala@ling.helsinki.fi>.
 
        + correct the modes that are affected by save/restore cursor by adding
          WRAPAROUND and PROTECTED.
 
        + corrected placement of one of the XSync calls that I added in patch
          #51, 1997/9/15, which had the side-effect of writing on the window
          border when the xterm was resizing from 132 to 80 columns.
 
        + work around an incompatibility of the XKB definition used in xterm
          versus that symbol from IRIX 6.2's imake definitions (by adjusting
          the standalone configure script).
 
--------------------------------------------------------------------------------
 button.c     |   14 ---
 charproc.c   |   61 ++++++++++------
 configure    |  110 ++++++++++++++++++++++-------
 configure.in |    4 +
 cursor.c     |    6 +
 data.h       |    4 +
 misc.c       |    2 
 print.c      |    9 +-
 ptyx.h       |   67 +++++++++++-------
 screen.c     |  212 +++++++++++++++++++++++++++++----------------------------
 scrollbar.c  |   31 ++++----
 util.c       |   33 ++++----
 xterm.h      |    5 -
 xterm.man    |   12 ++-
 xtermcfg.hin |    5 +
 15 files changed, 351 insertions, 224 deletions
--------------------------------------------------------------------------------
Index: button.c
--- xterm-59+/button.c  Mon Dec 29 12:22:34 1997
+++ xterm-60/button.c   Tue Jan  6 20:32:02 1998
@@ -1472,10 +1472,8 @@
 {
        register int i = 0;
        register Char *ch = SCRN_BUF_CHARS(screen, row + screen->topline);
-       Char attr;
        register int c;
 
-       *eol = 0;
        i = Length(screen, row, scol, ecol);
        ecol = scol + i;
 #if OPT_DEC_CHRSET
@@ -1484,17 +1482,7 @@
                ecol = (ecol + 1) / 2;
        }
 #endif
-       if (*eol == 0) {
-               if(ScrnGetAttributes(screen, row + screen->topline, 0, &attr, 1) == 1) {
-                       *eol = (attr & LINEWRAPPED) ? 0 : 1;
-               } else {
-                       /* If we can't get the attributes, assume no wrap */
-                       /* CANTHAPPEN */
-                       (void)fprintf(stderr, "%s: no attributes for %d, %d\n",
-                               xterm_name, row, ecol - 1);
-                       *eol = 1;
-               }
-       }
+       *eol = !ScrnTstWrapped(screen, row);
        for (i = scol; i < ecol; i++) {
                c = ch[i];
                if (c == 0)
Index: charproc.c
--- xterm-59+/charproc.c        Fri Jan  2 20:27:14 1998
+++ xterm-60/charproc.c Fri Jan  9 20:11:43 1998
@@ -252,10 +252,12 @@
 #define XtNcolor14 "color14"
 #define XtNcolor15 "color15"
 #define XtNcolorBD "colorBD"
+#define XtNcolorBL "colorBL"
 #define XtNcolorUL "colorUL"
 #define XtNcolorMode "colorMode"
 #define XtNcolorULMode "colorULMode"
 #define XtNcolorBDMode "colorBDMode"
+#define XtNcolorBLMode "colorBLMode"
 #define XtNcolorAttrMode "colorAttrMode"
 #define XtNboldColors "boldColors"
 #define XtNdynamicColors "dynamicColors"
@@ -746,6 +748,9 @@
 {XtNcolorBD, XtCForeground, XtRPixel, sizeof(Pixel),
        XtOffsetOf(XtermWidgetRec, screen.Acolors[COLOR_BD]),
        XtRString, "XtDefaultForeground"},
+{XtNcolorBL, XtCForeground, XtRPixel, sizeof(Pixel),
+       XtOffsetOf(XtermWidgetRec, screen.Acolors[COLOR_BL]),
+       XtRString, "XtDefaultForeground"},
 {XtNcolorUL, XtCForeground, XtRPixel, sizeof(Pixel),
        XtOffsetOf(XtermWidgetRec, screen.Acolors[COLOR_UL]),
        XtRString, "XtDefaultForeground"},
@@ -758,6 +763,9 @@
 {XtNcolorBDMode, XtCColorMode, XtRBoolean, sizeof(Boolean),
        XtOffsetOf(XtermWidgetRec, screen.colorBDMode),
        XtRBoolean, (XtPointer) &defaultFALSE},
+{XtNcolorBLMode, XtCColorMode, XtRBoolean, sizeof(Boolean),
+       XtOffsetOf(XtermWidgetRec, screen.colorBLMode),
+       XtRBoolean, (XtPointer) &defaultFALSE},
 {XtNcolorAttrMode, XtCColorMode, XtRBoolean, sizeof(Boolean),
        XtOffsetOf(XtermWidgetRec, screen.colorAttrMode),
        XtRBoolean, (XtPointer) &defaultFALSE},
@@ -911,6 +919,9 @@
 
                if (term->screen.colorBDMode && (term->flags & BOLD))
                        fg = COLOR_BD;
+
+               if (term->screen.colorBLMode && (term->flags & BLINK))
+                       fg = COLOR_BL;
        }
 
        /* This implements the IBM PC-style convention of 8-colors, with one
@@ -1515,15 +1526,17 @@
                                 case DEFAULT:
                                 case 0:
                                        term->flags &=
-                                               ~(INVERSE|BOLD|UNDERLINE|INVISIBLE);
+                                               ~(INVERSE|BOLD|BLINK|UNDERLINE|INVISIBLE);
                                        if_OPT_ISO_COLORS(screen,{reset_SGR_Colors();})
                                        break;
-                                case 1:        /* Bold                         */
-                                       /* FALLTHRU */
-                                case 5:        /* Blink, really.       */
+                                case 1:        /* Bold                 */
                                        term->flags |= BOLD;
                                        if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                        break;
+                                case 5:        /* Blink                */
+                                       term->flags |= BLINK;
+                                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
+                                       break;
                                 case 4:        /* Underscore           */
                                        term->flags |= UNDERLINE;
                                        if_OPT_ISO_COLORS(screen,{setExtendedFG();})
@@ -1539,11 +1552,13 @@
                                        if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                        break;
                                 case 22: /* reset 'bold' */
-                                       /* FALLTHRU */
-                                case 25: /* reset 'blink' */
                                        term->flags &= ~BOLD;
                                        if_OPT_ISO_COLORS(screen,{setExtendedFG();})
                                        break;
+                                case 25: /* reset 'blink' */
+                                       term->flags &= ~BLINK;
+                                       if_OPT_ISO_COLORS(screen,{setExtendedFG();})
+                                       break;
                                 case 27:
                                        term->flags &= ~INVERSE;
                                        break;
@@ -2487,8 +2502,7 @@
                if (n <= 1) {
                        if (screen->do_wrap && (term->flags & WRAPAROUND)) {
                            /* mark that we had to wrap this line */
-                           ScrnSetAttributes(screen, screen->cur_row, 0,
-                                             LINEWRAPPED, LINEWRAPPED, 1);
+                           ScrnSetWrapped(screen, screen->cur_row);
                            xtermAutoPrint('\n');
                            Index(screen, 1);
                            screen->cur_col = 0;
@@ -2790,7 +2804,10 @@
                        break;
                case 1048:
                        if (!termw->misc.titeInhibit) {
-                               CursorRestore(termw, &screen->sc);
+                               if(func == bitset)
+                                       CursorSave(termw, &screen->sc);
+                               else
+                                       CursorRestore(termw, &screen->sc);
                        }
                        break;
                }
@@ -3340,8 +3357,8 @@
 {
     Size_t len = ScrnPointers(screen, screen->max_row + 1);
 
-    memcpy ( (char *)screen->save_ptr, (char *)screen->buf,      len);
-    memcpy ( (char *)screen->buf,      (char *)screen->altbuf,   len);
+    memcpy ( (char *)screen->save_ptr, (char *)screen->visbuf,   len);
+    memcpy ( (char *)screen->visbuf,   (char *)screen->altbuf,   len);
     memcpy ( (char *)screen->altbuf,   (char *)screen->save_ptr, len);
 }
 
@@ -3505,16 +3522,15 @@
             askedWidth,  askedHeight,
            &replyWidth, &replyHeight);
 
-       XSync(screen->display, FALSE);  /* synchronize */
-       if(XtAppPending(app_con))
-               xevents();
-
        if (status == XtGeometryYes ||
            status == XtGeometryDone) {
            ScreenResize (&termw->screen,
                          replyWidth,
                          replyHeight,
                          &termw->flags);
+           XSync(screen->display, FALSE);      /* synchronize */
+           if(XtAppPending(app_con))
+               xevents();
        }
 }
                                
@@ -3549,9 +3565,9 @@
     screen->allbuf = Allocate (nrows, screen->max_col + 1,
      &screen->sbuf_address);
     if (screen->scrollWidget)
-      screen->buf = &screen->allbuf[MAX_PTRS * screen->savelines];
+      screen->visbuf = &screen->allbuf[MAX_PTRS * screen->savelines];
     else
-      screen->buf = screen->allbuf;
+      screen->visbuf = screen->allbuf;
     return;
 }
 
@@ -3656,6 +3672,7 @@
    new->screen.boldColors    = request->screen.boldColors;
    new->screen.colorAttrMode = request->screen.colorAttrMode;
    new->screen.colorBDMode   = request->screen.colorBDMode;
+   new->screen.colorBLMode   = request->screen.colorBLMode;
    new->screen.colorMode     = request->screen.colorMode;
    new->screen.colorULMode   = request->screen.colorULMode;
 
@@ -3679,7 +3696,7 @@
 #endif /* OPT_ISO_COLORS */
 
 #if OPT_DEC_CHRSET
-   new->num_ptrs = 4;
+   new->num_ptrs = 5;
 #endif
 
    new->screen.underline = request->screen.underline;
@@ -3977,7 +3994,7 @@
 #if OPT_TEK4014
        if (!tekWidget)                 /* if not called after fork */
 #endif
-         screen->buf = screen->allbuf = NULL;
+         screen->visbuf = screen->allbuf = NULL;
 
        screen->do_wrap = 0;
        screen->scrolls = screen->incopy = 0;
@@ -4224,7 +4241,7 @@
                    if (screen->cursorGC) {
                        currentGC = screen->cursorGC;
                    } else {
-                       if (flags & BOLD) {
+                       if (flags & (BOLD|BLINK)) {
                                currentGC = NormalBoldGC(screen);
                        } else {
                                currentGC = NormalGC(screen);
@@ -4234,7 +4251,7 @@
                    if (screen->reversecursorGC) {
                        currentGC = screen->reversecursorGC;
                    } else {
-                       if (flags & BOLD) {
+                       if (flags & (BOLD|BLINK)) {
                                currentGC = ReverseBoldGC(screen);
                        } else {
                                currentGC = ReverseGC(screen);
@@ -4467,7 +4484,7 @@
                 */
                term->keyboard.flags &= ~(MODE_DECCKM|MODE_KAM);
                bitcpy(&term->flags, term->initflags, WRAPAROUND|REVERSEWRAP);
-               bitclr(&term->flags, INSERT|INVERSE|BOLD|UNDERLINE|INVISIBLE);
+               bitclr(&term->flags, INSERT|INVERSE|BOLD|BLINK|UNDERLINE|INVISIBLE);
                if_OPT_ISO_COLORS(screen,{reset_SGR_Colors();})
                update_appcursor();
                update_autowrap();
Index: configure
--- xterm-59+/configure Sat Jan  3 10:19:54 1998
+++ xterm-60/configure  Fri Jan  9 18:11:16 1998
@@ -3259,8 +3259,66 @@
 
 LIBS="$LIBS $X_EXTRA_LIBS"
 
+for ac_func in \
+       XkbStdBell \
+       
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3268: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3273 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3296: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
 echo $ac_n "checking if we should use imake to help""... $ac_c" 1>&6
-echo "configure:3264: checking if we should use imake to help" >&5
+echo "configure:3322: checking if we should use imake to help" >&5
 
 # Check whether --enable-imake or --disable-imake was given.
 if test "${enable_imake+set}" = set; then
@@ -3285,7 +3343,7 @@
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3289: checking for $ac_word" >&5
+echo "configure:3347: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_IMAKE'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3417,7 +3475,7 @@
 
 
 echo $ac_n "checking for default terminal-id""... $ac_c" 1>&6
-echo "configure:3421: checking for default terminal-id" >&5
+echo "configure:3479: checking for default terminal-id" >&5
 
 # Check whether --with-terminal-id or --without-terminal-id was given.
 if test "${with_terminal_id+set}" = set; then
@@ -3438,7 +3496,7 @@
 
 
 echo $ac_n "checking for default terminal-type""... $ac_c" 1>&6
-echo "configure:3442: checking for default terminal-type" >&5
+echo "configure:3500: checking for default terminal-type" >&5
 
 # Check whether --with-terminal-type or --without-terminal-type was given.
 if test "${with_terminal_type+set}" = set; then
@@ -3456,7 +3514,7 @@
 
 ###    checks for optional features
 echo $ac_n "checking if you want active-icons""... $ac_c" 1>&6
-echo "configure:3460: checking if you want active-icons" >&5
+echo "configure:3518: checking if you want active-icons" >&5
 
 # Check whether --enable-active-icon or --disable-active-icon was given.
 if test "${enable_active_icon+set}" = set; then
@@ -3482,7 +3540,7 @@
 fi
 
 echo $ac_n "checking if you want ANSI color""... $ac_c" 1>&6
-echo "configure:3486: checking if you want ANSI color" >&5
+echo "configure:3544: checking if you want ANSI color" >&5
 
 # Check whether --enable-ansi-color or --disable-ansi-color was given.
 if test "${enable_ansi_color+set}" = set; then
@@ -3506,7 +3564,7 @@
 
 
 echo $ac_n "checking if you want 16 colors like aixterm""... $ac_c" 1>&6
-echo "configure:3510: checking if you want 16 colors like aixterm" >&5
+echo "configure:3568: checking if you want 16 colors like aixterm" >&5
 
 # Check whether --enable-16-color or --disable-16-color was given.
 if test "${enable_16_color+set}" = set; then
@@ -3530,7 +3588,7 @@
 
 
 echo $ac_n "checking if you want bold colors mapped like IBM PC""... $ac_c" 1>&6
-echo "configure:3534: checking if you want bold colors mapped like IBM PC" >&5
+echo "configure:3592: checking if you want bold colors mapped like IBM PC" >&5
 
 # Check whether --enable-bold-color or --disable-bold-color was given.
 if test "${enable_bold_color+set}" = set; then
@@ -3554,7 +3612,7 @@
 
 
 echo $ac_n "checking if you want color-mode enabled by default""... $ac_c" 1>&6
-echo "configure:3558: checking if you want color-mode enabled by default" >&5
+echo "configure:3616: checking if you want color-mode enabled by default" >&5
 
 # Check whether --enable-color-mode or --disable-color-mode was given.
 if test "${enable_color_mode+set}" = set; then
@@ -3578,7 +3636,7 @@
 
 
 echo $ac_n "checking for doublesize characters""... $ac_c" 1>&6
-echo "configure:3582: checking for doublesize characters" >&5
+echo "configure:3640: checking for doublesize characters" >&5
 
 # Check whether --enable-doublechars or --disable-doublechars was given.
 if test "${enable_doublechars+set}" = set; then
@@ -3602,7 +3660,7 @@
 
 
 echo $ac_n "checking if you want support for input-method""... $ac_c" 1>&6
-echo "configure:3606: checking if you want support for input-method" >&5
+echo "configure:3664: checking if you want support for input-method" >&5
 
 # Check whether --enable-input-method or --disable-input-method was given.
 if test "${enable_input_method+set}" = set; then
@@ -3628,7 +3686,7 @@
 fi
 
 echo $ac_n "checking if you want support for internationalization""... $ac_c" 1>&6
-echo "configure:3632: checking if you want support for internationalization" >&5
+echo "configure:3690: checking if you want support for internationalization" >&5
 
 # Check whether --enable-i18n or --disable-i18n was given.
 if test "${enable_i18n+set}" = set; then
@@ -3654,7 +3712,7 @@
 fi
 
 echo $ac_n "checking if you want support for logging""... $ac_c" 1>&6
-echo "configure:3658: checking if you want support for logging" >&5
+echo "configure:3716: checking if you want support for logging" >&5
 
 # Check whether --enable-logging or --disable-logging was given.
 if test "${enable_logging+set}" = set; then
@@ -3680,7 +3738,7 @@
 fi
 
 echo $ac_n "checking if you want support for right-scrollbar""... $ac_c" 1>&6
-echo "configure:3684: checking if you want support for right-scrollbar" >&5
+echo "configure:3742: checking if you want support for right-scrollbar" >&5
 
 # Check whether --enable-rightbar or --disable-rightbar was given.
 if test "${enable_rightbar+set}" = set; then
@@ -3706,7 +3764,7 @@
 fi
 
 echo $ac_n "checking if you want support for tek4014""... $ac_c" 1>&6
-echo "configure:3710: checking if you want support for tek4014" >&5
+echo "configure:3768: checking if you want support for tek4014" >&5
 
 # Check whether --enable-tek4014 or --disable-tek4014 was given.
 if test "${enable_tek4014+set}" = set; then
@@ -3736,7 +3794,7 @@
 fi
 
 echo $ac_n "checking if you want VT52 emulation""... $ac_c" 1>&6
-echo "configure:3740: checking if you want VT52 emulation" >&5
+echo "configure:3798: checking if you want VT52 emulation" >&5
 
 # Check whether --enable-vt52 or --disable-vt52 was given.
 if test "${enable_vt52+set}" = set; then
@@ -3761,7 +3819,7 @@
 
 # development/testing aids
 echo $ac_n "checking if you want debugging traces""... $ac_c" 1>&6
-echo "configure:3765: checking if you want debugging traces" >&5
+echo "configure:3823: checking if you want debugging traces" >&5
 
 # Check whether --enable-trace or --disable-trace was given.
 if test "${enable_trace+set}" = set; then
@@ -3790,7 +3848,7 @@
 
 
 echo $ac_n "checking if you want to see long compiling messages""... $ac_c" 1>&6
-echo "configure:3794: checking if you want to see long compiling messages" >&5
+echo "configure:3852: checking if you want to see long compiling messages" >&5
 
 # Check whether --enable-echo or --disable-echo was given.
 if test "${enable_echo+set}" = set; then
@@ -3830,7 +3888,7 @@
 
 
 echo $ac_n "checking if you want magic cookie emulation""... $ac_c" 1>&6
-echo "configure:3834: checking if you want magic cookie emulation" >&5
+echo "configure:3892: checking if you want magic cookie emulation" >&5
 
 # Check whether --enable-xmc-glitch or --disable-xmc-glitch was given.
 if test "${enable_xmc_glitch+set}" = set; then
@@ -3859,7 +3917,7 @@
 
 if test -n "$GCC" ; then
 echo $ac_n "checking if you want to turn on gcc warnings""... $ac_c" 1>&6
-echo "configure:3863: checking if you want to turn on gcc warnings" >&5
+echo "configure:3921: checking if you want to turn on gcc warnings" >&5
 
 # Check whether --enable-warnings or --disable-warnings was given.
 if test "${enable_warnings+set}" = set; then
@@ -3899,9 +3957,9 @@
 if test -n "$GCC"
 then
        echo "checking for gcc __attribute__ directives" 1>&6
-echo "configure:3903: checking for gcc __attribute__ directives" >&5
+echo "configure:3961: checking for gcc __attribute__ directives" >&5
        cat > conftest.$ac_ext <<EOF
-#line 3905 "configure"
+#line 3963 "configure"
 #include "confdefs.h"
 #include "conftest.h"
 #include "conftest.i"
@@ -3939,7 +3997,7 @@
 EOF
                        ;;
                esac
-               if { (eval echo configure:3943: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+               if { (eval echo configure:4001: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
                        test -n "$verbose" && echo "$ac_t""... $cf_attribute" 1>&6
                        cat conftest.h >>confdefs.h
 #              else
@@ -3956,11 +4014,11 @@
 if test -n "$GCC"
 then
                cat > conftest.$ac_ext <<EOF
-#line 3960 "configure"
+#line 4018 "configure"
 int main(int argc, char *argv[]) { return argv[argc-1] == 0; }
 EOF
                echo "checking for gcc warning options" 1>&6
-echo "configure:3964: checking for gcc warning options" >&5
+echo "configure:4022: checking for gcc warning options" >&5
        cf_save_CFLAGS="$CFLAGS"
        EXTRA_CFLAGS="-W -Wall"
        cf_warn_CONST=""
@@ -3978,7 +4036,7 @@
                Wstrict-prototypes $cf_warn_CONST
        do
                CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
-               if { (eval echo configure:3982: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+               if { (eval echo configure:4040: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
                        test -n "$verbose" && echo "$ac_t""... -$cf_opt" 1>&6
                        EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
                        test "$cf_opt" = Wcast-qual && EXTRA_CFLAGS="$EXTRA_CFLAGS -DXTSTRINGDEFINES"
Index: configure.in
--- xterm-59+/configure.in      Fri Jan  2 20:27:14 1998
+++ xterm-60/configure.in       Fri Jan  9 18:11:16 1998
@@ -79,6 +79,10 @@
 
 LIBS="$LIBS $X_EXTRA_LIBS"
 
+AC_CHECK_FUNCS( \
+       XkbStdBell \
+       )
+
 AC_MSG_CHECKING(if we should use imake to help)
 CF_ARG_DISABLE(imake,
        [  --disable-imake         disable use of imake for definitions],
Index: cursor.c
--- xterm-59+/cursor.c  Tue Jun  3 16:05:50 1997
+++ xterm-60/cursor.c   Fri Jan  9 06:05:08 1998
@@ -244,6 +244,8 @@
        memmove( sc->gsets, screen->gsets, sizeof(screen->gsets));
 }
 
+#define DECSC_FLAGS (BOLD|BLINK|INVERSE|UNDERLINE|ORIGIN|WRAPAROUND|PROTECTED)
+
 /*
  * Restore Cursor and Attributes
  */
@@ -257,8 +259,8 @@
        memmove( screen->gsets, sc->gsets, sizeof(screen->gsets));
        screen->curgl = sc->curgl;
        screen->curgr = sc->curgr;
-       tw->flags &= ~(BOLD|INVERSE|UNDERLINE|ORIGIN);
-       tw->flags |= sc->flags & (BOLD|INVERSE|UNDERLINE|ORIGIN);
+       tw->flags &= ~DECSC_FLAGS;
+       tw->flags |= sc->flags & DECSC_FLAGS;
        CursorSet (screen, (tw->flags & ORIGIN) ? sc->row - screen->top_marg
                           : sc->row, sc->col, tw->flags);
 }
Index: data.h
--- xterm-59+/data.h    Mon Dec 29 12:22:34 1997
+++ xterm-60/data.h     Fri Jan  9 18:11:16 1998
@@ -94,6 +94,10 @@
 
 extern XtermWidget term;
 
+#ifdef NO_XKBSTDBELL
+#undef XKB
+#endif
+
 #ifdef XKB
 #include <X11/extensions/XKBbells.h>
 #else
Index: misc.c
--- xterm-59+/misc.c    Mon Dec 29 12:22:34 1997
+++ xterm-60/misc.c     Fri Jan  9 06:29:05 1998
@@ -904,6 +904,8 @@
                                        strcat(reply, ";1");
                                if (term->flags & UNDERLINE)
                                        strcat(reply, ";4");
+                               if (term->flags & BLINK)
+                                       strcat(reply, ";5");
                                if (term->flags & INVERSE)
                                        strcat(reply, ";7");
                                if (term->flags & INVISIBLE)
Index: print.c
--- xterm-59+/print.c   Fri Sep 19 13:58:52 1997
+++ xterm-60/print.c    Fri Jan  9 06:30:31 1998
@@ -48,7 +48,7 @@
 #define Strcmp(a,b) strcmp((char *)a,(char *)b)
 #define Strncmp(a,b,c) strncmp((char *)a,(char *)b,c)
 
-#define SGR_MASK (BOLD|UNDERLINE|INVERSE)
+#define SGR_MASK (BOLD|BLINK|UNDERLINE|INVERSE)
 
 static void charToPrinter PROTO((int chr));
 static void printCursorLine PROTO((void));
@@ -156,6 +156,8 @@
                strcat(msg, ";1");
        if (attr & UNDERLINE)
                strcat(msg, ";2");
+       if (attr & BLINK)
+               strcat(msg, ";5");
        if (attr & INVERSE)     /* typo? DEC documents this as invisible */
                strcat(msg, ";7");
        strcat(msg, "m");
@@ -174,8 +176,11 @@
                Printer = popen(screen->printer_command, "w");
                initialized++;
        }
-       if (Printer != 0)
+       if (Printer != 0) {
                fputc(chr, Printer);
+               if (chr == '\r' || chr == '\n' || chr == '\f')
+                       fflush(Printer);
+       }
 }
 
 static void stringToPrinter(str)
Index: ptyx.h
--- xterm-59+/ptyx.h    Fri Jan  2 20:27:14 1998
+++ xterm-60/ptyx.h     Fri Jan  9 07:01:38 1998
@@ -356,7 +356,7 @@
 #if OPT_ISO_COLORS
 #define if_OPT_ISO_COLORS(screen, code) if(screen->colorMode) code
 #define TERM_COLOR_FLAGS (term->flags & (FG_COLOR|BG_COLOR))
-#define MAXCOLORS 18
+#define MAXCOLORS 19
 #define COLOR_0                0
 #define COLOR_1                1
 #define COLOR_2                2
@@ -373,8 +373,9 @@
 #define COLOR_13       13
 #define COLOR_14       14
 #define COLOR_15       15
-#define COLOR_BD       16
-#define COLOR_UL       17
+#define COLOR_BD       16      /* BOLD */
+#define COLOR_UL       17      /* UNDERLINE */
+#define COLOR_BL       18      /* BLINK */
 #ifndef DFT_COLORMODE
 #define DFT_COLORMODE TRUE     /* default colorMode resource */
 #endif
@@ -425,9 +426,13 @@
 #if OPT_ISO_COLORS || OPT_DEC_CHRSET
 #define MAX_PTRS term->num_ptrs
 #else
-#define MAX_PTRS 2
+#define MAX_PTRS 3
 #endif
 
+#define BUF_HEAD 1
+       /* the number that point to Char data */
+#define BUF_PTRS (MAX_PTRS - BUF_HEAD)
+
 /***====================================================================***/
 
 #if OPT_TEK4014
@@ -468,28 +473,35 @@
 
 /***====================================================================***/
 
+#define OFF_CHARS (BUF_HEAD + 0)
+#define OFF_ATTRS (BUF_HEAD + 1)
+#define OFF_COLOR (BUF_HEAD + 2)
+#define OFF_CSETS (BUF_HEAD + 3)
+
        /* ScrnBuf-level macros */
-#define BUF_CHARS(buf, row) (buf[MAX_PTRS * (row) + 0])
-#define BUF_ATTRS(buf, row) (buf[MAX_PTRS * (row) + 1])
+#define BUF_FLAGS(buf, row) (buf[MAX_PTRS * (row) + 0])
+#define BUF_CHARS(buf, row) (buf[MAX_PTRS * (row) + OFF_CHARS])
+#define BUF_ATTRS(buf, row) (buf[MAX_PTRS * (row) + OFF_ATTRS])
 
 #if OPT_ISO_COLORS
-#define BUF_COLOR(buf, row) (buf[MAX_PTRS * (row) + 2])
+#define BUF_COLOR(buf, row) (buf[MAX_PTRS * (row) + OFF_COLOR])
 #endif
 
 #if OPT_DEC_CHRSET
-#define BUF_CSETS(buf, row) (buf[MAX_PTRS * (row) + 3])
+#define BUF_CSETS(buf, row) (buf[MAX_PTRS * (row) + OFF_CSETS])
 #endif
 
        /* TScreen-level macros */
-#define SCRN_BUF_CHARS(screen, row) BUF_CHARS(screen->buf, row)
-#define SCRN_BUF_ATTRS(screen, row) BUF_ATTRS(screen->buf, row)
+#define SCRN_BUF_FLAGS(screen, row) BUF_FLAGS(screen->visbuf, row)
+#define SCRN_BUF_CHARS(screen, row) BUF_CHARS(screen->visbuf, row)
+#define SCRN_BUF_ATTRS(screen, row) BUF_ATTRS(screen->visbuf, row)
 
 #if OPT_ISO_COLORS
-#define SCRN_BUF_COLOR(screen, row) BUF_COLOR(screen->buf, row)
+#define SCRN_BUF_COLOR(screen, row) BUF_COLOR(screen->visbuf, row)
 #endif
 
 #if OPT_DEC_CHRSET
-#define SCRN_BUF_CSETS(screen, row) BUF_CSETS(screen->buf, row)
+#define SCRN_BUF_CSETS(screen, row) BUF_CSETS(screen->visbuf, row)
 #endif
 
        /* indices into save_modes[] */
@@ -548,6 +560,7 @@
        Boolean         colorMode;      /* are we using color mode?     */
        Boolean         colorULMode;    /* use color for underline?     */
        Boolean         colorBDMode;    /* use color for bold?          */
+       Boolean         colorBLMode;    /* use color for blink?         */
        Boolean         colorAttrMode;  /* prefer colorUL/BD to SGR     */
 #endif
 #if OPT_DEC_CHRSET
@@ -629,7 +642,7 @@
        Boolean         scrollttyoutput; /* scroll to bottom on tty output */
        Boolean         scrollkey;      /* scroll to bottom on key      */
 
-       ScrnBuf         buf;            /* ptr to visible screen buf (main) */
+       ScrnBuf         visbuf;         /* ptr to visible screen buf (main) */
        ScrnBuf         allbuf;         /* screen buffer (may include
                                           lines scrolled off top)      */
        Char            *sbuf_address;  /* main screen memory address   */
@@ -868,7 +881,7 @@
 /*
  * terminal flags
  * There are actually two namespaces mixed together here.
- * One is the set of flags that can go in screen->buf attributes
+ * One is the set of flags that can go in screen->visbuf attributes
  * and which must fit in a char.
  * The other is the global setting stored in
  * term->flags and screen->save_modes.  This need only fit in an unsigned.
@@ -878,26 +891,19 @@
 #define INVERSE                0x01    /* invert the characters to be output */
 #define UNDERLINE      0x02    /* true if underlining */
 #define BOLD           0x04
+#define BLINK          0x08
 /* global flags (also character attributes) */
-#define BG_COLOR       0x08  /* true if background set */
-#define FG_COLOR       0x10  /* true if foreground set */
+#define BG_COLOR       0x10  /* true if background set */
+#define FG_COLOR       0x20  /* true if foreground set */
 
 /* character flags (internal attributes) */
-#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
-                                * wrapped around and lines that have
-                                * ended naturally with a CR at column
-                                * max_col.
-                                */
+#define PROTECTED      0x40    /* a character is drawn that cannot be erased */
 #define CHARDRAWN      0x80    /* a character has been drawn here on the
                                   screen.  Used to distinguish blanks from
                                   empty parts of the screen when selecting */
 
                        /* mask: user-visible attributes */
-#define        ATTRIBUTES      (INVERSE|UNDERLINE|BOLD|BG_COLOR|FG_COLOR|INVISIBLE|PROTECTED)
+#define        ATTRIBUTES      (INVERSE|UNDERLINE|BOLD|BLINK|BG_COLOR|FG_COLOR|INVISIBLE|PROTECTED)
 
 #define WRAPAROUND     0x400   /* true if auto wraparound mode */
 #define        REVERSEWRAP     0x800   /* true if reverse wraparound mode */
@@ -909,6 +915,15 @@
 #define IN132COLUMNS   0x20000 /* true if in 132 column mode */
 #define INVISIBLE      0x40000 /* true if writing invisible text */
 
+/*
+ * Per-line flags
+ */
+#define LINEWRAPPED    0x01    /* used once per line to indicate that it wraps
+                                * onto the next line so we can tell the
+                                * difference between lines that have wrapped
+                                * around and lines that have ended naturally
+                                * with a CR at column max_col.
+                                */
 /*
  * If we've set protected attributes with the DEC-style DECSCA, then we'll have
  * to use DECSED or DECSEL to erase preserving protected text.  (The normal ED,
Index: screen.c
--- xterm-59+/screen.c  Fri Jan  2 20:27:14 1998
+++ xterm-60/screen.c   Fri Jan  9 20:11:58 1998
@@ -105,30 +105,44 @@
 
 ScrnBuf Allocate (nrow, ncol, addr)
 /*
-   allocates memory for a 2-dimensional array of chars and returns a pointer
-   thereto
-   each line is formed from a pair of char arrays.  The first (even) one is
-   the actual character array and the second (odd) one is the attributes.
-   each line is formed from four char arrays.  The first one is the actual
-   character array, the second one is the attributes, the third is the
-   foreground and background colors, and the fourth denotes the character set.
+ * Allocates memory for a 2-dimensional array of chars and returns a pointer
+ * thereto.  Each line is formed from a set of char arrays, with an index
+ * (i.e., the ScrnBuf type).  The first pointer in the index is reserved for
+ * per-line flags, and does not point to data.
+ *
+ * After the per-line flags, we have a series of pointers to char arrays:  The
+ * first one is the actual character array, the second one is the attributes,
+ * the third is the foreground and background colors, and the fourth denotes
+ * the character set.
+ *
+ * We store it all as pointers, because of alignment considerations, together
+ * with the intention of being able to change the total number of pointers per
+ * row according to whether the user wants color or not.
  */
 register int nrow, ncol;
 Char **addr;
 {
        register ScrnBuf base;
        register Char *tmp;
-       register int i;
+       register int i, j, k;
+       size_t entries = MAX_PTRS * nrow;
+       size_t length  = BUF_PTRS * nrow * ncol;
 
-       if ((base = (ScrnBuf) calloc ((unsigned)(nrow *= MAX_PTRS), sizeof (char *))) == 0)
+       if ((base = (ScrnBuf) calloc (entries, sizeof (char *))) == 0)
                SysError (ERROR_SCALLOC);
 
-       if ((tmp = (Char *)calloc ((unsigned) (nrow * ncol), sizeof(Char))) == 0)
+       if ((tmp = (Char *)calloc (length, sizeof(Char))) == 0)
                SysError (ERROR_SCALLOC2);
 
        *addr = tmp;
-       for (i = 0; i < nrow; i++, tmp += ncol)
-               base[i] = tmp;
+       for (i = k = 0; i < nrow; i++) {
+               base[k] = 0;    /* per-line flags */
+               k += BUF_HEAD;
+               for (j = BUF_HEAD; j < MAX_PTRS; j++) {
+                       base[k++] = tmp;
+                       tmp += ncol;
+               }
+       }
 
        return (base);
 }
@@ -146,42 +160,44 @@
 {
        register ScrnBuf base;
        register Char *tmp;
-       register int i, minrows;
+       register int i, j, k, minrows;
        register Size_t mincols;
        Char *oldbuf;
        int move_down = 0, move_up = 0;
+       size_t entries = MAX_PTRS * nrow;
+       size_t length  = BUF_PTRS * nrow * ncol;
 
-       if (sbuf == NULL || *sbuf == NULL)
+       if (sbuf == NULL || *sbuf == NULL) {
                return 0;
+       }
 
-       oldrow *= MAX_PTRS;
        oldbuf = *sbufaddr;
 
        /*
         * Special case if oldcol == ncol - straight forward realloc and
         * update of the additional lines in sbuf
+        *
+        * FIXME: this is a good idea, but doesn't seem to be implemented.
+        * -gildea
         */
 
-       /* this is a good idea, but doesn't seem to be implemented.  -gildea */
-
        /* 
         * realloc sbuf, the pointers to all the lines.
         * If the screen shrinks, remove lines off the top of the buffer
         * if resizeGravity resource says to do so.
         */
-       nrow *= MAX_PTRS;
-       if (nrow < oldrow  &&  term->misc.resizeGravity == SouthWestGravity) {
+       if (nrow < oldrow
+        && term->misc.resizeGravity == SouthWestGravity) {
            /* Remove lines off the top of the buffer if necessary. */
-           move_up = oldrow-nrow 
-                       - MAX_PTRS*(term->screen.max_row - term->screen.cur_row);
+           move_up = (oldrow - nrow)
+                       - (term->screen.max_row - term->screen.cur_row);
            if (move_up < 0)
                move_up = 0;
            /* Overlapping memmove here! */
-           memmove( *sbuf, *sbuf+move_up, 
-                 (oldrow-move_up)*sizeof((*sbuf)[0]) );
+           memmove( *sbuf, *sbuf + (move_up * MAX_PTRS),
+                 MAX_PTRS * (oldrow - move_up) * sizeof((*sbuf)[0]) );
        }
-       *sbuf = (ScrnBuf) realloc((char *) (*sbuf),
-                                 (unsigned) (nrow * sizeof(char *)));
+       *sbuf = (ScrnBuf) realloc((char *) (*sbuf), entries * sizeof(char *));
        if (*sbuf == 0)
            SysError(ERROR_RESIZE);
        base = *sbuf;
@@ -190,29 +206,42 @@
         *  create the new buffer space and copy old buffer contents there
         *  line by line.
         */
-       if ((tmp = (Char *)calloc((unsigned) (nrow * ncol), sizeof(Char))) == 0)
+       if ((tmp = (Char *)calloc(length, sizeof(Char))) == 0)
                SysError(ERROR_SREALLOC);
        *sbufaddr = tmp;
        minrows = (oldrow < nrow) ? oldrow : nrow;
        mincols = (oldcol < ncol) ? oldcol : ncol;
-       if (nrow > oldrow  &&  term->misc.resizeGravity == SouthWestGravity) {
+       if (nrow > oldrow
+        && term->misc.resizeGravity == SouthWestGravity) {
            /* move data down to bottom of expanded screen */
-           move_down = Min(nrow-oldrow, MAX_PTRS*term->screen.savedlines);
-           tmp += ncol*move_down;
+           move_down = Min(nrow - oldrow, term->screen.savedlines);
+           tmp += (ncol * move_down * BUF_PTRS);
        }
-       for (i = 0; i < minrows; i++, tmp += ncol) {
-               memcpy( tmp, base[i], mincols);
+
+       for (i = k = 0; i < minrows; i++) {
+               k += BUF_HEAD;
+               for (j = BUF_HEAD; j < MAX_PTRS; j++) {
+                       memcpy(tmp, base[k++], mincols);
+                       tmp += ncol;
+               }
        }
+
        /*
         * update the pointers in sbuf
         */
-       for (i = 0, tmp = *sbufaddr; i < nrow; i++, tmp += ncol)
-           base[i] = tmp;
+       for (i = k = 0, tmp = *sbufaddr; i < nrow; i++) {
+               for (j = 0; j < BUF_HEAD; j++)
+                       base[k++] = 0;
+               for (j = BUF_HEAD; j < MAX_PTRS; j++) {
+                       base[k++] = tmp;
+                       tmp += ncol;
+               }
+       }
 
         /* Now free the old buffer */
        free(oldbuf);
 
-       return move_down ? move_down/MAX_PTRS : -move_up/MAX_PTRS; /* convert to rows */
+       return move_down ? move_down : -move_up; /* convert to rows */
 }
 
 void
@@ -253,7 +282,7 @@
                cb = SCRN_BUF_CSETS(screen, screen->cur_row) + screen->cur_col;
        })
 
-       wrappedbit = *attrs & LINEWRAPPED;
+       wrappedbit = ScrnTstWrapped(screen, screen->cur_row);
 
        /* write blanks if we're writing invisible text */
        if (flags & INVISIBLE) {
@@ -274,7 +303,9 @@
        })
 
        if (wrappedbit)
-           *attrs |= LINEWRAPPED;
+           ScrnSetWrapped(screen, screen->cur_row);
+       else
+           ScrnClrWrapped(screen, screen->cur_row);
 
        if_OPT_XMC_GLITCH(screen,{
                Resolve_XMC(screen);
@@ -290,8 +321,9 @@
 ScrnBuf sb;
 int where, n, size;
 {
-       register int i;
+       register int i, j;
        size_t len = ScrnPointers(screen, n);
+       int last = (n * MAX_PTRS);
 
        /* save n lines at where */
        memcpy ( (char *) screen->save_ptr,
@@ -300,16 +332,20 @@
 
        /* clear contents of old rows */
        if (TERM_COLOR_FLAGS) {
-               int last = (n * MAX_PTRS);
                int flags = TERM_COLOR_FLAGS;
                for (i = 0; i < last; i += MAX_PTRS) {
-                       bzero(screen->save_ptr[i+0], size);
-                       memset(screen->save_ptr[i+1], flags, size);
-                       memset(screen->save_ptr[i+2], xtermColorPair(), size);
+                       screen->save_ptr[i] = 0;
+                       bzero( screen->save_ptr[i+ OFF_CHARS], size);
+                       memset(screen->save_ptr[i+ OFF_ATTRS], flags, size);
+                       memset(screen->save_ptr[i+ OFF_COLOR], xtermColorPair(), size);
                }
        } else {
-               for (i = MAX_PTRS * n - 1 ; i >= 0 ; i--)
-                       bzero (screen->save_ptr[i], size);
+               for (i = 0; i < last; i += MAX_PTRS) {
+                       for (j = 0; j < BUF_HEAD; j++)
+                               screen->save_ptr[i+j] = 0;
+                       for (j = BUF_HEAD; j < MAX_PTRS; j++)
+                               bzero (screen->save_ptr[i+j], size);
+               }
        }
 }
 
@@ -403,16 +439,16 @@
     register int n;
     int size;
 {
-       ScrnBuf sb = screen->buf;
+       ScrnBuf sb = screen->visbuf;
        int row = screen->cur_row;
        int col = screen->cur_col;
        register int i, j;
        register Char *ptr = BUF_CHARS(sb, row);
        register Char *attrs = BUF_ATTRS(sb, row);
-       int wrappedbit = attrs[0]&LINEWRAPPED;
+       int wrappedbit = ScrnTstWrapped(screen, row);
        int flags = CHARDRAWN | TERM_COLOR_FLAGS;
 
-       attrs[0] &= ~LINEWRAPPED; /* make sure the bit isn't moved */
+       ScrnClrWrapped(screen, row); /* make sure the bit isn't moved */
        for (i = size - 1; i >= col + n; i--) {
                ptr[i] = ptr[j = i - n];
                attrs[i] = attrs[j];
@@ -430,7 +466,9 @@
        })
 
        if (wrappedbit)
-           attrs[0] |= LINEWRAPPED;
+           ScrnSetWrapped(screen, row);
+       else
+           ScrnClrWrapped(screen, row);
 }
 
 void
@@ -442,13 +480,13 @@
     register int size;
     register int n;
 {
-       ScrnBuf sb = screen->buf;
+       ScrnBuf sb = screen->visbuf;
        int row = screen->cur_row;
        int col = screen->cur_col;
        register Char *ptr = BUF_CHARS(sb, row);
        register Char *attrs = BUF_ATTRS(sb, row);
        register Size_t nbytes = (size - n - col);
-       int wrappedbit = attrs[0]&LINEWRAPPED;
+       int wrappedbit = ScrnTstWrapped(screen, row);
 
        memcpy (ptr   + col, ptr   + col + n, nbytes);
        memcpy (attrs + col, attrs + col + n, nbytes);
@@ -462,7 +500,9 @@
            memset(BUF_CSETS(sb, row) + size - n, curXtermChrSet(row), n);
        })
        if (wrappedbit)
-           attrs[0] |= LINEWRAPPED;
+           ScrnSetWrapped(screen, row);
+       else
+           ScrnClrWrapped(screen, row);
 }
 
 void
@@ -697,7 +737,7 @@
 register TScreen *screen;
 register int first, last;
 {
-       ScrnBuf buf = screen->buf;
+       ScrnBuf buf = screen->visbuf;
        int     len = screen->max_col + 1;
        register int row;
        register int flags = TERM_COLOR_FLAGS;
@@ -795,7 +835,7 @@
                                          rows + savelines, cols,
                                          screen->max_row + 1 + savelines,
                                          screen->max_col + 1);
-               screen->buf = &screen->allbuf[MAX_PTRS * savelines];
+               screen->visbuf = &screen->allbuf[MAX_PTRS * savelines];
 
                screen->max_row += delta_rows;
                screen->max_col = cols - 1;
@@ -894,62 +934,30 @@
        return (0);
 }
 
-/*
- * Sets the attributes from the row, col, to row, col + length according to
- * mask and value. The bits in the attribute byte specified by the mask are
- * set to the corresponding bits in the value byte. If length would carry us
- * over the end of the line, it stops at the end of the line.
- */
 void
-ScrnSetAttributes(screen, row, col, mask, value, length)
-TScreen *screen;
-int row, col;
-unsigned mask, value;
-register int length;           /* length of string */
+ScrnClrWrapped(screen, row)
+       TScreen *screen;
+       int row;
 {
-       register Char *attrs;
-       register int avail  = screen->max_col - col + 1;
-
-       if (length > avail)
-           length = avail;
-       if (length <= 0)
-               return;
-       attrs = SCRN_BUF_ATTRS(screen, row) + col;
-       value &= mask;  /* make sure we only change the bits allowed by mask*/
-       while(length-- > 0) {
-               *attrs &= ~mask;        /* clear the bits */
-               *attrs |= value;        /* copy in the new values */
-               attrs++;
-       }
+       long value = (long)SCRN_BUF_FLAGS(screen, row + screen->topline) & ~ LINEWRAPPED;
+       SCRN_BUF_FLAGS(screen, row + screen->topline) = (Char *)value;
 }
 
-/*
- * Gets the attributes from the row, col, to row, col + length into the
- * supplied array, which is assumed to be big enough.  If length would carry us
- * over the end of the line, it stops at the end of the line. Returns
- * the number of bytes of attributes (<= length)
- */
-int
-ScrnGetAttributes(screen, row, col, str, length)
-TScreen *screen;
-int row, col;
-Char *str;
-register int length;           /* length of string */
+void
+ScrnSetWrapped(screen, row)
+       TScreen *screen;
+       int row;
 {
-       register Char *attrs;
-       register int avail  = screen->max_col - col + 1;
-       int ret;
+       long value = (long)SCRN_BUF_FLAGS(screen, row + screen->topline) | LINEWRAPPED;
+       SCRN_BUF_FLAGS(screen, row + screen->topline) = (Char *)value;
+}
 
-       if (length > avail)
-           length = avail;
-       if (length <= 0)
-               return 0;
-       ret = length;
-       attrs = SCRN_BUF_ATTRS(screen, row) + col;
-       while(length-- > 0) {
-               *str++ = *attrs++;
-       }
-       return ret;
+Bool
+ScrnTstWrapped(screen, row)
+       TScreen *screen;
+       int row;
+{
+       return (long)SCRN_BUF_FLAGS(screen, row + screen->topline) & LINEWRAPPED;
 }
 
 Bool
Index: scrollbar.c
--- xterm-59+/scrollbar.c       Sat Dec  6 10:24:45 1997
+++ xterm-60/scrollbar.c        Fri Jan  9 20:12:19 1998
@@ -344,7 +344,7 @@
     int init, doalloc;
 {
        register TScreen *screen = &xw->screen;
-       register int i;
+       register int i, j, k;
 
        if(screen->fullVwin.scrollbar)
                return;
@@ -370,21 +370,26 @@
        }
 
        if (doalloc && screen->allbuf) {
+           /* FIXME: this is not integrated well with Allocate */
            if((screen->allbuf =
-               (ScrnBuf) realloc((char *) screen->buf,
+               (ScrnBuf) realloc((char *) screen->visbuf,
                                  (unsigned) MAX_PTRS*(screen->max_row + 2 +
                                                screen->savelines) *
                                  sizeof(char *)))
-              == NULL)
-             Error (ERROR_SBRALLOC);
-           screen->buf = &screen->allbuf[MAX_PTRS * screen->savelines];
-           memmove( (char *)screen->buf, (char *)screen->allbuf,
+                       == NULL)
+               Error (ERROR_SBRALLOC);
+           screen->visbuf = &screen->allbuf[MAX_PTRS * screen->savelines];
+           memmove( (char *)screen->visbuf, (char *)screen->allbuf,
                   MAX_PTRS * (screen->max_row + 2) * sizeof (char *));
-           for(i = MAX_PTRS * screen->savelines - 1 ; i >= 0 ; i--)
-             if((screen->allbuf[i] =
-                 (Char *)calloc((unsigned) screen->max_col + 1, sizeof(Char))) ==
-                NULL)
-               Error (ERROR_SBRALLOC2);
+           for (i = k = 0; i < screen->savelines; i++) {
+               k += BUF_HEAD;
+               for (j = BUF_HEAD; j < MAX_PTRS; j++) {
+                   if((screen->allbuf[k++] =
+                       (Char *)calloc((unsigned) screen->max_col + 1, sizeof(Char))) ==
+                       NULL)
+                       Error (ERROR_SBRALLOC2);
+               }
+           }
        }
 
        ResizeScrollBar (screen);
@@ -411,7 +416,7 @@
 
        XtMapWidget(screen->scrollWidget);
        update_scrollbar ();
-       if (screen->buf) {
+       if (screen->visbuf) {
            XClearWindow (screen->display, XtWindow (term));
            Redraw ();
        }
@@ -427,7 +432,7 @@
        screen->fullVwin.scrollbar = 0;
        DoResizeScreen (term);
        update_scrollbar ();
-       if (screen->buf) {
+       if (screen->visbuf) {
            XClearWindow (screen->display, XtWindow (term));
            Redraw ();
        }
Index: util.c
--- xterm-59+/util.c    Fri Jan  2 20:27:14 1998
+++ xterm-60/util.c     Fri Jan  9 06:32:34 1998
@@ -265,7 +265,7 @@
                        screen->bot_marg + screen->savelines, 0,
                        amount, screen->max_col + 1);
        else
-               ScrnDeleteLine(screen, screen->buf,
+               ScrnDeleteLine(screen, screen->visbuf,
                        screen->bot_marg, screen->top_marg,
                        amount, screen->max_col + 1);
        if(refreshheight > 0)
@@ -338,7 +338,7 @@
                    (unsigned) Width(screen));
        }
     }
-    ScrnInsertLine(screen, screen->buf, screen->bot_marg, screen->top_marg,
+    ScrnInsertLine(screen, screen->visbuf, screen->bot_marg, screen->top_marg,
                   amount, screen->max_col + 1);
 }
 
@@ -398,7 +398,7 @@
                    (unsigned) Width(screen));
        }
     }
-    ScrnInsertLine(screen, screen->buf, screen->bot_marg, screen->cur_row, n,
+    ScrnInsertLine(screen, screen->visbuf, screen->bot_marg, screen->cur_row, n,
                   screen->max_col + 1);
 }
 
@@ -479,7 +479,7 @@
                        screen->bot_marg + screen->savelines, 0,
                        n, screen->max_col + 1);
        else
-               ScrnDeleteLine(screen, screen->buf,
+               ScrnDeleteLine(screen, screen->visbuf,
                        screen->bot_marg, screen->cur_row,
                        n, screen->max_col + 1);
 }
@@ -510,7 +510,7 @@
                 * prevent InsertChar from shifting the end of a line over
                 * if it is being appended to
                 */
-               if (non_blank_line (screen->buf, screen->cur_row, 
+               if (non_blank_line (screen->visbuf, screen->cur_row, 
                                    screen->cur_col, screen->max_col + 1))
                    horizontal_copy_area(screen, screen->cur_col,
                                         col - screen->cur_col,
@@ -753,7 +753,7 @@
        (void) ClearInLine(screen, screen->cur_row, screen->cur_col, len);
 
        /* with the right part cleared, we can't be wrapping */
-       BUF_ATTRS(screen->buf, screen->cur_row)[0] &= ~LINEWRAPPED;
+       ScrnClrWrapped(screen, screen->cur_row);
 }
 
 /*
@@ -1364,7 +1364,7 @@
        if (screen->fnt_prop) {
                int     adj, width;
                GC      fillGC = gc;    /* might be cursorGC */
-               XFontStruct *fs = (flags & BOLD)
+               XFontStruct *fs = (flags & (BOLD|BLINK))
                                ? screen->fnt_bold
                                : screen->fnt_norm;
                screen->fnt_prop = False;
@@ -1405,7 +1405,7 @@
        y += FontAscent(screen);
        XDrawImageString(screen->display, TextWindow(screen), gc, 
                x, y,  (char *)text, len);
-       if ((flags & BOLD) && screen->enbolden)
+       if ((flags & (BOLD|BLINK)) && screen->enbolden)
                XDrawString(screen->display, TextWindow(screen), gc,
                        x+1, y,  (char *)text, len);
        if ((flags & UNDERLINE) && screen->underline) {
@@ -1436,7 +1436,7 @@
 
        if ( (!hilite && (flags & INVERSE) != 0)
          ||  (hilite && (flags & INVERSE) == 0) ) {
-               if (flags & BOLD)
+               if (flags & (BOLD|BLINK))
                        gc = ReverseBoldGC(screen);
                else
                        gc = ReverseGC(screen);
@@ -1445,7 +1445,7 @@
                XSetBackground(screen->display, gc, fg_pix);
 
        } else {
-               if (flags & BOLD)
+               if (flags & (BOLD|BLINK))
                        gc = NormalBoldGC(screen);
                else
                        gc = NormalGC(screen);
@@ -1473,7 +1473,7 @@
 
        if ( (!hilite && (flags & INVERSE) != 0)
          ||  (hilite && (flags & INVERSE) == 0) ) {
-               if (flags & BOLD)
+               if (flags & (BOLD|BLINK))
                        gc = ReverseBoldGC(screen);
                else
                        gc = ReverseGC(screen);
@@ -1482,7 +1482,7 @@
                XSetBackground(screen->display, gc, fg_pix);
 
        } else {
-               if (flags & BOLD)
+               if (flags & (BOLD|BLINK))
                        gc = NormalBoldGC(screen);
                else
                        gc = NormalGC(screen);
@@ -1510,6 +1510,8 @@
                        fg = COLOR_UL;
                if (term->screen.colorBDMode && (flags & BOLD))
                        fg = COLOR_BD;
+               if (term->screen.colorBLMode && (flags & BLINK))
+                       fg = COLOR_BL;
        }
        return fg;
 }
@@ -1524,10 +1526,11 @@
 /*
  * 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.
+ * to COLOR_UL, COLOR_BD or COLOR_BL, 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...
+ * This assumes that fg/bg are equal when we override with one of the special
+ * attribute colors.
  */
 unsigned
 makeColorPair (fg, bg)
Index: xterm.h
--- xterm-59+/xterm.h   Fri Jan  2 20:27:14 1998
+++ xterm-60/xterm.h    Tue Jan  6 20:22:58 1998
@@ -175,16 +175,17 @@
 extern Bool non_blank_line PROTO((ScrnBuf sb, int row, int col, int len));
 extern ScrnBuf Allocate PROTO((int nrow, int ncol, Char **addr));
 extern int ScreenResize PROTO((TScreen *screen, int width, int height, unsigned *flags));
-extern int ScrnGetAttributes PROTO((TScreen *screen, int row, int col, Char *str, int length));
+extern int ScrnTstWrapped PROTO((TScreen *screen, int row));
 extern size_t ScrnPointers PROTO((TScreen *screen, size_t len));
 extern void ClearBufRows PROTO((TScreen *screen, int first, int last));
 extern void ScreenWrite PROTO((TScreen *screen, Char *str, unsigned flags, unsigned cur_fg_bg, int length));
+extern void ScrnClrWrapped PROTO((TScreen *screen, int row));
 extern void ScrnDeleteChar PROTO((TScreen *screen, int n, int size));
 extern void ScrnDeleteLine PROTO((TScreen *screen, ScrnBuf sb, int n, int last, int size, int where));
 extern void ScrnInsertChar PROTO((TScreen *screen, int n, int size));
 extern void ScrnInsertLine PROTO((TScreen *screen, ScrnBuf sb, int last, int where, int n, int size));
 extern void ScrnRefresh PROTO((TScreen *screen, int toprow, int leftcol, int nrows, int ncols, int force));
-extern void ScrnSetAttributes PROTO((TScreen *screen, int row, int col, unsigned mask, unsigned value, int length));
+extern void ScrnSetWrapped PROTO((TScreen *screen, int row));
 
 /* scrollbar.c */
 extern void DoResizeScreen PROTO((XtermWidget xw));
Index: xterm.man
--- xterm-59+/xterm.man Sat Jan  3 09:41:23 1998
+++ xterm-60/xterm.man  Fri Jan  9 06:16:06 1998
@@ -713,7 +713,8 @@
 The default is ``false.''
 .TP 8
 .B "colorAttrMode (\fPclass\fB ColorMode)"
-Specifies whether ``colorBD'' and ``colorUL'' should override ANSI colors.
+Specifies whether ``colorBD'', ``colorBL'' and ``colorUL''
+should override ANSI colors.
 If not, these are displayed only when no ANSI colors
 have been set for the corresponding position.
 The default is ``false.''
@@ -728,6 +729,11 @@
 color or as bold characters.  Note that setting ``colorMode'' off disables
 all colors, including bold.
 .TP 8
+.B "colorBLMode (\fPclass\fB ColorMode)"
+Specifies whether characters with the blink attribute should be displayed in
+color.
+Note that setting ``colorMode'' off disables all colors, including this.
+.TP 8
 .B "colorULMode (\fPclass\fB ColorMode)"
 Specifies whether characters with the underline attribute should be displayed
 in color or as underlined characters.  Note that setting ``colorMode'' off
@@ -773,6 +779,10 @@
 .B "colorBD (\fPclass\fB Foreground)"
 This specifies the color to use to display bold characters if
 the ``colorBDMode'' resource is enabled.
+.TP 8
+.B "colorBL (\fPclass\fB Foreground)"
+This specifies the color to use to display blink characters if
+the ``colorBLMode'' resource is enabled.
 .TP 8
 .B "colorUL (\fPclass\fB Foreground)"
 This specifies the color to use to display underlined characters if
Index: xtermcfg.hin
--- xterm-59+/xtermcfg.hin      Mon Dec 29 12:22:34 1997
+++ xterm-60/xtermcfg.hin       Fri Jan  9 18:11:16 1998
@@ -37,6 +37,7 @@
 #undef HAVE_STRERROR   /* AC_CHECK_FUNCS(strerror) */
 #undef HAVE_TERMCAP_H  /* AC_CHECK_HEADERS(termcap.h) */
 #undef HAVE_UNISTD_H   /* AC_CHECK_HEADERS(unistd.h) */
+#undef HAVE_XKBSTDBELL /* AC_CHECK_FUNCS(XkbStdBell) */
 #undef HAVE_X11_DECKEYSYM_H /* AC_CHECK_HEADERS(X11/DECkeysym.h) */
 #undef HAVE_X11_XPOLL_H        /* AC_CHECK_HEADERS(X11/Xpoll.h) */
 #undef NO_ACTIVE_ICON  /* CF_ARG_DISABLE(active-icon) */
@@ -80,4 +81,8 @@
 
 #if !HAVE_X11_XPOLL_H
 #define NO_XPOLL_H     /* X11R6.1 & up use Xpoll.h for select() definitions */
+#endif
+
+#if !HAVE_XKBSTDBELL
+#define NO_XKBSTDBELL  /* IRIX 6.2 incorrectly defines XKB in imake */
 #endif