# ------------------------------------------------------------------------------
 #  Makefile.in                  |    5 
 #  Tekproc.c                    |   96 +++++
 #  button.c                     |   43 +-
 #  charproc.c                   |  296 ++++++++++++----
 #  charsets.c                   |    4 
 #  ctlseqs.ms                   |    4 
 #  cursor.c                     |    4 
 #  data.c                       |   15 
 #  data.h                       |   40 +-
 #  doublechr.c                  |   18 -
 #  fontutils.c                  |   42 +-
 #  input.c                      |   99 ++---
 #  main.c                       |  147 ++++----
 #  menu.c                       |   72 +---
 #  menu.h                       |   16 
 #  misc.c                       |   84 +++-
 #  os2main.c                    |   27 -
 #  print.c                      |   61 ++-
 #  ptydata.c                    |   10 
 #  ptyx.h                       |   14 
 #  screen.c                     |   20 -
 #  scrollbar.c                  |   35 +
 #  tabs.c                       |   30 +
 #  termcap                      |    2 
 #  terminfo                     |    1 
 #  testxmc.c                    |    6 
 #  trace.h                      |    2 
 #  util.c                       |   60 +++
 #  version.h                    |    4 
 #  xterm-125/AAA_README_VMS.txt |   45 ++
 #  xterm-125/MANIFEST           |  102 +++++
 #  xterm-125/link_axp.com       |  106 +++++
 #  xterm-125/make.com           |   88 ++++
 #  xterm-125/vms.c              |  725 +++++++++++++++++++++++++++++++++++++++++
 #  xterm-125/vms.h              |   39 ++
 #  xterm-125/xterm.dat          |  153 ++++++++
 #  xterm-125/xterm_axp.opt      |   28 +
 #  xterm.h                      |   34 +
 #  xterm.log.html               |   36 ++
 #  xterm.man                    |    3 
 #  xtermcfg.hin                 |    1 
 #  41 files changed, 2204 insertions, 413 deletions
 # ------------------------------------------------------------------------------
 Index: AAA_README_VMS.txt
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/AAA_README_VMS.txt        Sat Jan 29 15:47:10 2000
 @@ -0,0 +1,45 @@
 +http://www.clark.net/pub/dickey/xterm/xterm.html
+
 +Downloaded 1.22 variant (current Linux version) on 18-JAN-2000.
 +
+Port stalled for a few days because OpenVMS X11 lacks XtGravity.
 +
+X11KIT shared libraries almost work, but missing _XA_ symbols
 +for some reason.  
+
 +Copied X11KIT [.xaw3d] and [.xmu] into [.lib], put together simplified
 +build procedures.  Made a few mods.  Merged in some changes from
 +Patrick Young.  Now these build mostly ok except for tons of bcopy
 +related warnings and problems with LAYOUT.C. 
 +
+Merged changes from Xterm021 into here.
 +
+Made changes here and there to get it all to work.
 +
+25-JAN-2000, more or less done.  Logging doesn't work but PRINT
 +does, as does regular VT emulation, TEK emulation, 80 and 132 wide
 +modes.  The resource file needs work.  Cleaned up a really nasty problem 
 +with infinite loops on copy/paste in button.c (see tt_pasting).
 +
+To build this, if you have DECC, DW 1.2-5 and VMS 7.2-1 (the latter
 +probably doesn't matter) do:
+
 +$ @make
+
+in the top directory.  Expect a bunch of I and W warnings, but nothing 
 +worse.  Then define a foreign symbol for xterm for the resulting .exe.
 +
+26-JAN-2000.  Enabled logging.  When this is turned on from the menu
 +it creates a new file SYS$SCRATCH:XTERM_LOG.TXT and writes everything that
 +goes to the screen into it.  This may slow down output a bit as each block
 +of data read must be copied to disk.  The log file has RMS format stream-lf
 +and typically has a <CR> at the end of each line. 
 +
+27-JAN-2000.  Discovered a bug when doing an X11 paste into an EDT session,
 +had to add a tt_start_read() in button.c after the paste to reenable the
 +read AST.  Rearranged code in VMS.C to make the compiler happy and 
 +eliminate warnings.
+
+David Mathog
+mathog@seqaxp.bio.caltech.edu
+Manager, sequence analysis facility, biology division, Caltech 
 Index: MANIFEST
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/MANIFEST  Mon Jan 31 20:35:21 2000
 @@ -0,0 +1,102 @@
 +MANIFEST for xterm-125, version xterm-125
 +--------------------------------------------------------------------------------
 +MANIFEST                        this file
 +256colres.h                     resource-definitions for 256-color mode
 +256colres.pl                    script to generate 256colres.h
 +88colres.h                      resource definitions for 88-color mode
 +88colres.pl                     script to generate 88colres.h
 +AAA_README_VMS.txt              note for VMS port of 'xterm'
 +INSTALL                         configure script: options and related install instructions
 +Imakefile                       imake template for Makefile
 +Makefile.in                     configure script template for Makefile
 +README                          overview & caveats for 'xterm'
 +README.os390                    overview for os390 (EBCDIC) port of 'xterm'
 +TekPrsTbl.c                     Tek4014 parser state tables
 +Tekparse.def                    template for generating Tekparse.h
 +Tekparse.h                      Tek4014 parser-state definitions
 +Tekproc.c                       Tek4014 parser-state functions
 +Tests                           Useful tests for xterm-developers
 +VTPrsTbl.c                      VT100 parser state tables
 +VTparse.def                     template for generating VTparse.h
 +VTparse.h                       VT100 parser-state definitions
 +XTerm-col.ad                    color resource definitions for XTerm class
 +XTerm.ad                        resource definitions for XTerm class
 +aclocal.m4                      configure script: custom macros
 +button.c                        mouse button and selection processing
 +charproc.c                      VT100 parser functions
 +charsets.c                      module to translate character-sets
 +config.guess                    configure script: guess the system type
 +config.sub                      configure script: validate system type
 +configure.in                    template for generating configure script
 +configure                       Configuration script for UNIX
 +ctlseqs.ms                      documentation: Xterm Control Sequences
 +cursor.c                        VT100 low-level cursor movement
 +data.c                          global data declarations
 +data.h                          global data external-definitions
 +doublechr.c                     VT100 double-size character support
 +error.h                         error-code definitions for 'xterm'
 +fontutils.c                     xterm functions for (re)loading fonts
 +fontutils.h                     interface of fontutils.c
 +input.c                         VT100 key-symbol and function-key translation
 +install.sh                      configure script: fallback install script
 +keysym2ucs.c                    lookup-table for UTF-8 to keysyms
 +keysym2ucs.h                    interface of keysym2ucs.c
 +link_axp.com                    build-script for VMS port of xterm
 +main.c                          main program of 'xterm'
 +main.h                          default definitions for 'xterm'
 +make.com                        build-script for VMS port of 'xterm'
 +menu.c                          popup/pulldown menus for 'xterm'
 +menu.h                          interface of menu.c
 +misc.c                          miscellaneous utility functions for 'xterm'
 +mkdirs.sh                       configure script: make directories for install process
 +os2main.c                       main program for OS/2 EMX port of 'xterm'
 +print.c                         VT100+ print support functions
 +proto.h                         macros to simplify function prototypes
 +ptydata.c                       functions to manipulate data read from pty
 +ptyx.h                          structure-definitions for 'xterm'
 +resize.c                        program to compute/modify xterm's window size
 +resize.man                      manual page for 'resize'
 +screen.c                        VT100 screen update functions
 +scrollbar.c                     VT100 scrollbar support functions
 +sinstall.sh                     install setuid if existing program was
 +tabs.c                          VT100 tabstop support-functions
 +termcap                         termcap entries for 'xterm'
 +terminfo                        terminfo entries for 'xterm'
 +testxmc.c                       testing: xmc/magic-cookies
 +trace.c                         debugging trace functions for 'xterm'
 +trace.h                         interface of trace.c
 +ttysvr.c                        simple tty server for AMOEBA port of 'xterm'
 +util.c                          miscellaneous utility functions for 'xterm'
 +version.h                       version of xterm
 +vms.c                           VMS version of xterm's spawn(), etc.
 +vms.h                           system headers and definitions for vms.c
 +xcharmouse.h                    Jason Bacon's mouse-defs, cleaned up a little
 +xterm.dat                       application defaults for VMS port of 'xterm'
 +xterm.h                         common includes, definitions and prototypes for 'xterm'
 +xterm.man                       manual page for 'xterm'
 +xterm_axp.opt                   linker options file for VMS port of 'xterm'
 +xtermcfg.hin                    configure script: template for xtermcfg.h
 +tektests                        subdirectory
 +tektests/aitest.tek             tek4014 demo: draw a globe
 +tektests/dmerc.tek              tek4014 demo: draws a Mercator projection with orbit
 +tektests/fotest.tek             tek4014 demo: draw a scatterplot on log scale
 +tektests/imtest.tek             tek4014 demo: draw a test pattern
 +tektests/imtesth.tek            tek4014 demo: draw a test pattern
 +tektests/ocpred.tek             tek4014 demo: an occultation prediction
 +tektests/usmap.tek              tek4014 demo: a US map
 +unicode                         subdirectory
 +unicode/README                  description of files in ./unicode
 +unicode/convmap.pl              perl script for generating the lookup table for UTF-8 to keysym
 +unicode/keysym.map              keysym mapping from UTF-8
 +vttests                         subdirectory
 +vttests/16colors.sh             test-script to show 16-colors
 +vttests/256colors.pl            script to illustrate 256-colors
 +vttests/256colors2.pl           fancy test-script for 256-colors
 +vttests/88colors.pl             sample script showing 88-colors
 +vttests/88colors2.pl            sample script showing 88-colors
 +vttests/8colors.sh              test-script to illustrate 8-colors
 +vttests/doublechars.sh          test script to demonstrate doublesize chars
 +vttests/dynamic.sh              script to illustrate the dynamic colors control sequence
 +vttests/fonts.sh                script to demonstrate font-switching sequences
 +vttests/resize.sh               script to demonstrate resizing
 +vttests/title.sh                test-script to show title of xterm in action
 Index: Makefile.in
--- xterm-124+/Makefile.in      Thu Oct 14 05:57:38 1999
 +++ xterm-125/Makefile.in       Sun Jan 30 12:15:18 2000
 @@ -169,3 +169,8 @@
         $(SHELL) ${srcdir}/mkdirs.sh $@
 
 ALWAYS:
+
+depend : $(TABLES)
+       makedepend -- $(CPPFLAGS) -- $(SRCS)
 +
+# DO NOT DELETE THIS LINE -- make depend depends on it.
 Index: Tekproc.c
--- xterm-124+/Tekproc.c        Sun Aug 22 14:20:13 1999
 +++ xterm-125/Tekproc.c Sun Jan 30 14:42:37 2000
 @@ -180,7 +180,7 @@
      { "insert-seven-bit",      HandleKeyPressed },
     { "insert-eight-bit",      HandleEightBitKeyPressed },
     { "gin-press",             HandleGINInput },
-    { "secure",                HandleSecure },
 +    { "secure",                        HandleSecure },
      { "create-menu",           HandleCreateMenu },
     { "popup-menu",            HandlePopupMenu },
     /* menu actions */
@@ -226,7 +226,21 @@
 #define GIN_TERM_CR    1
 #define GIN_TERM_EOT   2
 
+#ifdef VMS
+#define DFT_FONT_SMALL "FIXED"
+#else
 +#define DFT_FONT_SMALL "6x10"
+#endif
 +
 static XtResource resources[] = {
+#ifdef VMS
+    {XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel),
 +       XtOffset(TekWidget, core.background_pixel),
 +       XtRString, "White"},
 +    {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
 +       XtOffset(TekWidget, Tforeground),
 +       XtRString, "Black"},
 +#endif
     {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension),
         XtOffsetOf(CoreRec, core.width), XtRDimension, (caddr_t)&defOne},
     {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension),
@@ -242,7 +256,7 @@
        XtRString, "8x13"},
     {"fontSmall", XtCFont, XtRFontStruct, sizeof(XFontStruct *),
        XtOffsetOf(TekWidgetRec, tek.Tfont[TEK_FONT_SMALL]),
-       XtRString, "6x10"},
 +       XtRString, DFT_FONT_SMALL},
      {"initialFont", "InitialFont", XtRString, sizeof(char *),
        XtOffsetOf(TekWidgetRec, tek.initial_font),
        XtRString, "large"},
@@ -387,7 +401,7 @@
            } else
 #endif
              nextstate = Tparsestate[c];
-           TRACE(("parse %d -> %d\n", c, nextstate))
 +           TRACE(("parse %d -> %d\n", c, nextstate));
  
            switch(nextstate) {
                 case CASE_REPORT:
@@ -716,7 +730,11 @@
 
 static int rcnt;
 static char *rptr;
+#ifdef VMS
+static int Tselect_mask;
+#else  /* VMS */
  static fd_set Tselect_mask;
+#endif /* VMS */
 
 static int Tinput(void)
 {
@@ -743,7 +761,11 @@
        if(Tbuffer->cnt-- <= 0) {
                if(nplot > 0)   /* flush line Tbuffer */
                        TekFlush();
+#ifdef VMS
+               Tselect_mask = pty_mask;        /* force a read */
 +#else /* VMS */
                XFD_COPYSET (&pty_mask, &Tselect_mask);
+#endif /* VMS */
                for( ; ; ) {
 #ifdef CRAY
                        struct timeval crocktimeout;
@@ -753,18 +775,43 @@
                                       &Tselect_mask, NULL, NULL,
                                       &crocktimeout);
 #endif
+#ifdef VMS
+                       if(Tselect_mask & pty_mask) {
 +#ifdef ALLOWLOGGING
+                          if(screen->logging)
 +                                  FlushLog(screen);
 +#endif
+                          if (read_queue.flink != 0) {
 +                                  Tbuffer->cnt = tt_read(Tbuffer->ptr = Tbuffer->buf);
 +                                  if(Tbuffer->cnt == 0) {
 +                                          Panic("input: read returned zero\n", 0);
 +                                  }
 +                                  else { break; }
 +                          }
 +                          else { sys$hiber(); }
 +                       }
 +#else  /* VMS */
                        if (getPtyData(screen, &Tselect_mask, Tbuffer)) {
                            break;
                        }
+#endif /* VMS */
                        if (Ttoggled && curstate == Talptable) {
                                TCursorToggle(TOGGLE);
                                Ttoggled = FALSE;
                        }
 #ifndef AMOEBA
                        if(XtAppPending(app_con) & XtIMXEvent) {
+#ifdef VMS
+                               Tselect_mask = X_mask;
 +#else /* VMS */
                                XFD_COPYSET (&X_mask, &Tselect_mask);
+#endif /* VMS */
                        } else {
                                XFlush(screen->display);
+#ifdef VMS
+                               Tselect_mask = Select_mask;
 +
+#else /* VMS */
                                XFD_COPYSET (&Select_mask, &Tselect_mask);
                                if((i = Select(max_plus1,
                                               &Tselect_mask, NULL, NULL,
@@ -773,8 +820,9 @@
                                                SysError(ERROR_TSELECT);
                                        continue;
                                }
+#endif /* VMS */
                        }
-#else
+#else /* AMOEBA */
                        XFlush(screen->display);
                        i = _X11TransAmSelect(ConnectionNumber(screen->display),
                                              1);
@@ -793,11 +841,19 @@
                        if (cb_full(screen->tty_outq) <= 0)
                                SleepMainThread();
 #endif /* AMOEBA */
+#ifdef VMS
+                       if(Tselect_mask & X_mask) {
 +                               xevents();
 +                               if(Tbuffer->cnt > 0)
 +                                       goto again;
 +                       }
 +#else /* VMS */
                        if(FD_ISSET (ConnectionNumber (screen->display), &Tselect_mask)) {
                                xevents();
                                if(Tbuffer->cnt > 0)
                                        goto again;
                        }
+#endif /* VMS */
                }
                Tbuffer->cnt--;
                if (!Ttoggled && curstate == Talptable) {
@@ -1170,8 +1226,11 @@
        cplot[len++] = '\r';
     if (screen->gin_terminator == GIN_TERM_EOT)
        cplot[len++] = '\004';
-
+#ifdef VMS
+    tt_write(cplot+adj, len-adj);
 +#else /* VMS */
     v_write(screen->respond, cplot+adj, len-adj);
+#endif /* VMS */
 }
 
 void
@@ -1699,9 +1758,15 @@
 
        chldfunc = signal(SIGCHLD, SIG_DFL);
 #endif
+#ifdef VMS
+       register int tekcopyfd;
 +       register TekLink *Tp;
 +       char initbuf[5];
 +#endif /* VMS */
 
        time(&l);
        tp = localtime(&l);
+       /* VMS needs alternate format??? DRM */
         sprintf(buf, "COPY%d-%02d-%02d.%02d:%02d:%02d", tp->tm_year + 1900,
         tp->tm_mon + 1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
        if(access(buf, F_OK) >= 0) {    /* file exists */
@@ -1709,6 +1774,24 @@
                        Bell(XkbBI_MinorError,0);
                        return;
                }
+#ifdef VMS
+
+       if((tekcopyfd = open(buf, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) {
 +               Bell(XkbBI_MinorError,0);
 +               return;
 +       }
+       chown(buf, screen->uid, screen->gid);
 +       sprintf(initbuf, "%c%c%c%c",
 +           ESC, screen->page.fontsize + '8',
 +           ESC, screen->page.linetype + '`');
 +       write(tekcopyfd, initbuf, 4);
 +       Tp = &Tek0;
 +       do {
+           write(tekcopyfd, (char *)Tp->data, Tp->count);
 +           Tp = Tp->next;
 +       } while(Tp);
 +       close(tekcopyfd);
 +#else /* VMS */
        } else if(access(".", W_OK) < 0) {      /* can't write in directory */
                Bell(XkbBI_MinorError,0);
                return;
@@ -1730,7 +1813,7 @@
            if (tekcopyfd < 0)
                _exit(1);
            sprintf(initbuf, "%c%c%c%c",
-               ESC, screen->page.fontsize + '8',
 +               ESC, screen->page.fontsize + '8',
                 ESC, screen->page.linetype + '`');
            write(tekcopyfd, initbuf, 4);
            Tp = &Tek0;
@@ -1759,5 +1842,6 @@
                    Cleanup(0);
            while ( (waited=nonblocking_wait()) > 0);
 #endif
+#endif /* VMS */
        }
 }
Index: button.c
--- xterm-124+/button.c Thu Dec 30 05:01:00 1999
 +++ xterm-125/button.c  Sun Jan 30 14:25:05 2000
 @@ -1,6 +1,6 @@
  /* $TOG: button.c /main/76 1997/07/30 16:56:19 kaleb $ */
 /*
- * Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 + * Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
   *
  *                         All Rights Reserved
  *
@@ -99,7 +99,9 @@
 
 #define        Coordinate(r,c)         ((r) * (term->screen.max_col+1) + (c))
 
+#if OPT_DEC_LOCATOR
 static ANSI reply;
+#endif
 
 /* Selection/extension variables */
 
@@ -802,7 +804,7 @@
        if ((*p & 0x80) == 0) {
            *q++ = *p++;
        } else if ((*p & 0x7C) == 0x40 && p < s + len - 1) {
-           *q++ = (*p & 0x03) << 6 | (p[1] & 0x3F);
 +           *q++ = ((*p & 0x03) << 6) | (p[1] & 0x3F);
             p += 2;
        } else if ((*p & 0x60) == 0x40) {
            *q++ = '#';
@@ -854,11 +856,11 @@
            codepoint = *p & 0x7F;
            size = 1;
        } else if ((*p & 0x60) == 0x40 && p < s + len - 1) {
-           codepoint = (p[0] & 0x1F) << 6 | (p[1] & 0x3F);
 +           codepoint = ((p[0] & 0x1F) << 6) | (p[1] & 0x3F);
             size = 2;
        } else if ((*p & 0x70) == 0x60 && p < s + len - 2) {
-           codepoint = (p[0] & 0x0F) << 12
 -                     | (p[1] & 0x3F) << 6
 +           codepoint = ((p[0] & 0x0F) << 12)
 +                     | ((p[1] & 0x3F) << 6)
                       | (p[2] & 0x3F);
            size = 3;
        } else if ((*p & 0x78) == 0x70 && p < s + len - 3) {
@@ -928,7 +930,7 @@
       case XA_CUT_BUFFER7: cutbuffer = 7; break;
       default:            cutbuffer = -1;
     }
-    TRACE(("Cutbuffer: %d, utf8_failed: %d\n", cutbuffer, utf8_failed))
 +    TRACE(("Cutbuffer: %d, utf8_failed: %d\n", cutbuffer, utf8_failed));
      if (cutbuffer >= 0) {
        int inbytes;
        unsigned long nbytes;
@@ -1043,18 +1045,39 @@
     /* Doing this one line at a time may no longer be necessary
        because v_write has been re-written. */
 
+  /* on VMS version if tt_pasting isn't set to TRUE then qio
 +     reads aren't blocked and an infinite loop is entered, where
 +     the pasted text shows up as new input, goes in again, shows
 +     up again, ad nauseum. */
 +
+#ifdef VMS
+    tt_pasting = TRUE;
 +#endif
     end = &buf[len];
     lag = buf;
     for (cp = buf; cp != end; cp++)
     {
        if (*cp == '\n') {
            *cp = '\r';
+#ifdef VMS
+           tt_write(lag, cp - lag + 1);
 +#else /* VMS */
            v_write(pty, lag, cp - lag + 1);
+#endif /* VMS */
            lag = cp + 1;
        }
     }
     if (lag != end)
+#ifdef VMS
+       tt_write(lag, end - lag);
 +#else /* VMS */
        v_write(pty, lag, end - lag);
+#endif /* VMS */
+
+#ifdef VMS
+    tt_pasting = FALSE;
 +    tt_start_read();  /* reenable reads or a character may be lost */
 +#endif
 
     if_OPT_WIDE_CHARS(screen,{
        XtFree((char*)buf);
@@ -1195,7 +1218,7 @@
 {
        TScreen *screen = &term->screen;
 
-       TRACE(("StartSelect row=%d, col=%d\n", startrow, startcol))
 +       TRACE(("StartSelect row=%d, col=%d\n", startrow, startcol));
         if (screen->cursor_state)
            HideCursor ();
        if (numberOfClicks == 1) {
@@ -1368,7 +1391,7 @@
 {
        int coord = Coordinate(row, col);
 
-       TRACE(("ExtendExtend row=%d, col=%d\n", row, col))
 +       TRACE(("ExtendExtend row=%d, col=%d\n", row, col));
         if (eventMode == LEFTEXTENSION
         && (coord + (selectUnit!=SELECTCHAR)) > Coordinate(endSRow, endSCol)) {
                /* Whoops, he's changed his mind.  Do RIGHTEXTENSION */
@@ -1904,7 +1927,7 @@
     }
     *lp = '\0';                        /* make sure we have end marked */
 
-    TRACE(("Salted TEXT:%.*s\n", (char *)lp - line, line))
 +    TRACE(("Salted TEXT:%.*s\n", (char *)lp - line, line));
      screen->selection_length = ((char *)lp - line);
     _OwnSelection(term, params, num_params);
 }
@@ -2377,7 +2400,7 @@
        line[count++] = ' ' + row + 1;
 
        TRACE(("mouse at %d,%d button+mask = %#x\n", row, col,
-               (screen->control_eight_bits) ? line[2] : line[3]))
 +               (screen->control_eight_bits) ? line[2] : line[3]));
  
        /* Transmit key sequence to process running under xterm */
        v_write(pty, line, count);
Index: charproc.c
--- xterm-124+/charproc.c       Tue Jan 25 01:45:01 2000
 +++ xterm-125/charproc.c        Mon Jan 31 19:22:53 2000
 @@ -272,20 +272,20 @@
      { "create-menu",           HandleCreateMenu },
     { "dired-button",          DiredButton },
     { "hard-reset",            HandleHardReset },
-    { "ignore",                HandleIgnore },
 -    { "insert",                HandleKeyPressed },  /* alias for insert-seven-bit */
 +    { "ignore",                        HandleIgnore },
 +    { "insert",                        HandleKeyPressed },  /* alias for insert-seven-bit */
      { "insert-eight-bit",      HandleEightBitKeyPressed },
     { "insert-selection",      HandleInsertSelection },
     { "insert-seven-bit",      HandleKeyPressed },
     { "interpret",             HandleInterpret },
-    { "keymap",                HandleKeymapChange },
 +    { "keymap",                        HandleKeymapChange },
      { "popup-menu",            HandlePopupMenu },
-    { "print",                         HandlePrint },
 +    { "print",                 HandlePrint },
      { "quit",                  HandleQuit },
-    { "redraw",                HandleRedraw },
 +    { "redraw",                        HandleRedraw },
      { "scroll-back",           HandleScrollBack },
     { "scroll-forw",           HandleScrollForward },
-    { "secure",                HandleSecure },
 +    { "secure",                        HandleSecure },
      { "select-cursor-end",     HandleKeyboardSelectEnd },
     { "select-cursor-start",   HandleKeyboardSelectStart },
     { "select-end",            HandleSelectEnd },
@@ -301,9 +301,9 @@
     { "set-autolinefeed",      HandleAutoLineFeed },
     { "set-autowrap",          HandleAutoWrap },
     { "set-backarrow",         HandleBackarrow },
-    { "set-cursesemul",        HandleCursesEmul },
 -    { "set-jumpscroll",        HandleJumpscroll },
 -    { "set-marginbell",        HandleMarginBell },
 +    { "set-cursesemul",                HandleCursesEmul },
 +    { "set-jumpscroll",                HandleJumpscroll },
 +    { "set-marginbell",                HandleMarginBell },
      { "set-reverse-video",     HandleReverseVideo },
     { "set-reversewrap",       HandleReverseWrap },
     { "set-scroll-on-key",     HandleScrollKey },
@@ -317,7 +317,7 @@
     { "soft-reset",            HandleSoftReset },
     { "start-cursor-extend",   HandleKeyboardStartExtend },
     { "start-extend",          HandleStartExtend },
-    { "string",                HandleStringEvent },
 +    { "string",                        HandleStringEvent },
      { "vi-button",             ViButton },
     { "visual-bell",           HandleVisualBell },
 #ifdef ALLOWLOGGING
@@ -350,7 +350,7 @@
 #endif
 #if OPT_TEK4014
     { "set-terminal-type",     HandleSetTerminalType },
-    { "set-visibility",        HandleVisibility },
 +    { "set-visibility",                HandleVisibility },
      { "set-tek-text",          HandleSetTekText },
     { "tek-page",              HandleTekPage },
     { "tek-reset",             HandleTekReset },
@@ -508,9 +508,14 @@
 {XtNprinterControlMode, XtCPrinterControlMode, XtRInt, sizeof(int),
        XtOffsetOf(XtermWidgetRec, screen.printer_controlmode),
        XtRInt, (XtPointer) &defaultZERO},
+#ifdef VMS
+#define OS_DEPENDENT_PRINT_COMMAND "print/delete/noflag"
 +#else  /* VMS */
+#define OS_DEPENDENT_PRINT_COMMAND "lpr"
 +#endif /* VMS */
 {XtNprinterCommand,XtCPrinterCommand, XtRString, sizeof(String),
        XtOffsetOf(XtermWidgetRec, screen.printer_command),
-       XtRString, (XtPointer) "lpr"},
 +       XtRString, (XtPointer) OS_DEPENDENT_PRINT_COMMAND},
  {XtNprinterExtent,XtCPrinterExtent, XtRBoolean, sizeof(Boolean),
        XtOffsetOf(XtermWidgetRec, screen.printer_extent),
        XtRBoolean, (XtPointer) &defaultFALSE},
@@ -774,7 +779,12 @@
 static void VTInitI18N (void);
 #endif
 
-static WidgetClassRec xtermClassRec = {
 +#ifdef VMS
+globaldef {"xtermclassrec"} noshare
+#else
 +static
+#endif /* VMS */
+WidgetClassRec xtermClassRec = {
   {
 /* core_class fields */
     /* superclass        */    (WidgetClass) &widgetClassRec,
@@ -812,6 +822,9 @@
   }
 };
 
+#ifdef VMS
+globaldef {"xtermwidgetclass"} noshare
+#endif /* VMS */
  WidgetClass xtermWidgetClass = (WidgetClass)&xtermClassRec;
 
 #if OPT_ISO_COLORS
@@ -902,6 +915,7 @@
         */
 #if OPT_PC_COLORS /* XXXJTL should be settable at runtime (resource or OSC?) */
        if (term->screen.boldColors
+        && (!term->sgr_extended)
          && (fg >= 0)
         && (fg < 8)
         && (term->flags & BOLD))
@@ -915,6 +929,7 @@
 reset_SGR_Foreground(void)
 {
        term->sgr_foreground = -1;
+       term->sgr_extended = 0;
         setExtendedFG();
 }
 
@@ -1046,7 +1061,7 @@
                } else if (parsestate == sos_table) {
                    c &= 0xffff;
                    if (c > 255) {
-                       TRACE(("Found code > 255 while in SOS state: %04X\n", c))
 +                       TRACE(("Found code > 255 while in SOS state: %04X\n", c));
                         c = '?';
                    }
                } else {
@@ -1135,11 +1150,11 @@
                string_area[string_used++] = c;
            } else if (parsestate != esc_table) {
                /* if we were accumulating, we're not any more */
-               string_mode = 0;
 +               string_mode = 0;
                 string_used = 0;
            }
 
-           TRACE(("parse %04X -> %d\n", c, nextstate))
 +           TRACE(("parse %04X -> %d\n", c, nextstate));
  
            switch (nextstate) {
                 case CASE_PRINT:
@@ -1213,7 +1228,7 @@
                         * form feed, line feed, vertical tab
                         */
                        xtermAutoPrint(c);
-                       Index(screen, 1);
 +                       xtermIndex(screen, 1);
                         if (term->flags & LINEFEED)
                                CarriageReturn(screen);
                        do_xevents();
@@ -1512,7 +1527,7 @@
                                reply.a_param[count++] = 2; /* printer */
                                reply.a_param[count++] = 6; /* selective-erase */
 #if OPT_SUNPC_KBD
-                               if (sunKeyboard)
 +                               if (term->keyboard.type == keyboardIsVT220)
  #endif
                                reply.a_param[count++] = 8; /* user-defined-keys */
                                reply.a_param[count++] = 9; /* national replacement charsets */
@@ -1660,13 +1675,14 @@
                                 case 37:
                                        if_OPT_ISO_COLORS(screen,{
                                          term->sgr_foreground = (param[row] - 30);
+                                         term->sgr_extended = 0;
                                           setExtendedFG();
                                        })
                                        break;
                                 case 38:
                                        /* This is more complicated than I'd
                                           like, but it should properly eat all
-                                          the parameters for unsupported modes
 +                                          the parameters for unsupported modes
                                         */
                                        if_OPT_ISO_COLORS(screen,{
                                                row++;
@@ -1677,6 +1693,7 @@
                                                                if (row < nparam &&
                                                                    param[row] < NUM_ANSI_COLORS) {
                                                                        term->sgr_foreground = param[row];
+                                                                       term->sgr_extended = 1;
                                                                         setExtendedFG();
                                                                }
                                                                break;
@@ -1738,6 +1755,7 @@
                                 case 97:
                                        if_OPT_AIX_COLORS(screen,{
                                          term->sgr_foreground = (param[row] - 90 + 8);
+                                         term->sgr_extended = 0;
                                           setExtendedFG();
                                        })
                                        break;
@@ -1928,7 +1946,7 @@
                        break;
 
                 case CASE_GSETS:
-                       TRACE(("CASE_GSETS(%d) = '%c'\n", scstype, c))
 +                       TRACE(("CASE_GSETS(%d) = '%c'\n", scstype, c));
                         screen->gsets[scstype] = c;
                        parsestate = groundtable;
                        break;
@@ -1962,7 +1980,7 @@
 
                 case CASE_CSI_QUOTE_STATE:
                        parsestate = csi_quo_table;
-                       break;
 +                       break;
  
                        /* the ANSI conformance levels are noted in the
                         * vt400 user's manual (I assume they're the non-DEC
@@ -1998,7 +2016,7 @@
                                }
                        }
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_DECSCA:
                        screen->protected_mode = DEC_PROTECT;
@@ -2007,19 +2025,19 @@
                        else if (param[0] == 1)
                                term->flags |= PROTECTED;
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_DECSED:
                        /* DECSED */
                        do_erase_display(screen, param[0], DEC_PROTECT);
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_DECSEL:
                        /* DECSEL */
                        do_erase_line(screen, param[0], DEC_PROTECT);
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_ST:
                        if (!string_used)
@@ -2043,7 +2061,7 @@
                                break;
                        }
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_SOS:
                        /* Start of String */
@@ -2061,36 +2079,36 @@
                        /* Device Control String */
                        string_mode = DCS;
                        parsestate = sos_table;
-                       break;
 +                       break;
  
                 case CASE_APC:
                        /* Application Program Command */
                        string_mode = APC;
                        parsestate = sos_table;
-                       break;
 +                       break;
  
                 case CASE_SPA:
                        screen->protected_mode = ISO_PROTECT;
                        term->flags |= PROTECTED;
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_EPA:
                        term->flags &= ~PROTECTED;
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_SU:
                        /* SU */
                        if((count = param[0]) < 1)
                                count = 1;
-                       Scroll(screen, count);
 +                       xtermScroll(screen, count);
                         parsestate = groundtable;
                        break;
 
                 case CASE_IND:
                        /* IND */
-                       Index(screen, 1);
 +                       xtermIndex(screen, 1);
                         do_xevents();
                        parsestate = groundtable;
                        break;
@@ -2109,7 +2127,7 @@
 
                 case CASE_NEL:
                        /* NEL */
-                       Index(screen, 1);
 +                       xtermIndex(screen, 1);
                         CarriageReturn(screen);
                        do_xevents();
                        parsestate = groundtable;
@@ -2242,7 +2260,7 @@
                 case CASE_S7C1T:
                        show_8bit_control(False);
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_S8C1T:
 #if OPT_VT52_MODE
@@ -2251,7 +2269,7 @@
 #endif
                        show_8bit_control(True);
                        parsestate = groundtable;
-                       break;
 +                       break;
  
                 case CASE_OSC:
                        /* Operating System Command */
@@ -2363,7 +2381,7 @@
        int c = len;
 
        if (v_bufstr == NULL  &&  len > 0) {
-               v_buffer = (Char *) XtMalloc(len);
 +               v_buffer = (Char *) XtMalloc(len);
                 v_bufstr = v_buffer;
                v_bufptr = v_buffer;
                v_bufend = v_buffer + len;
@@ -2379,8 +2397,13 @@
 #endif
 
 #ifndef AMOEBA
+#if VMS
+       if ((1 << f) != pty_mask)
 +               return(tt_write((char *)data, len));
 +#else /* VMS */
        if (!FD_ISSET (f, &pty_mask))
                return(write(f, (char *)data, len));
+#endif /* VMS */
 #else
        if (term->screen.respond != f)
                return(write(f, (char *)data, len));
@@ -2458,9 +2481,15 @@
 
        if (v_bufptr > v_bufstr) {
 #ifndef AMOEBA
+#ifdef VMS
+           riten = tt_write(v_bufstr,v_bufptr - v_bufstr <=  VMS_TERM_BUFFER_SIZE ?
 +                                     v_bufptr - v_bufstr : VMS_TERM_BUFFER_SIZE);
 +           if (riten == 0) return(riten);
 +#else /* VMS */
            riten = write(f, v_bufstr, v_bufptr - v_bufstr <= MAX_PTY_WRITE ?
-                                      v_bufptr - v_bufstr : MAX_PTY_WRITE);
 +                                      v_bufptr - v_bufstr : MAX_PTY_WRITE);
             if (riten < 0)
+#endif /* VMS */
 #else
            riten = v_bufptr - v_bufstr <= MAX_PTY_WRITE ?
                    v_bufptr - v_bufstr : MAX_PTY_WRITE;
@@ -2510,6 +2539,125 @@
        return(c);
 }
 
+
+#ifdef VMS
+static int select_mask;
+static int write_mask;
 +static int pty_read_bytes;
+
 +#define        ptymask()       (v_bufptr > v_bufstr ? pty_mask : 0)
 +
+static int
+in_put(void)
+{
+    int status;
+    Dimension replyWidth, replyHeight;
 +    XtGeometryResult stat;
+
 +    register TScreen *screen = &term->screen;
 +    register char *cp;
 +    register int i;
+
 +    select_mask = pty_mask;    /* force initial read */
 +    for ( ; ;)
+    {
 +
+      /* if the terminal changed size, resize the widget */
 +      if(tt_changed)
+       {
 +         tt_changed = FALSE;
 +
+         stat = XtMakeResizeRequest (
 +                                       (Widget) term,
 +                                       (Dimension) FontWidth(screen)
 +                                       * (tt_width)
 +                                       + 2*screen->border
 +                                       + screen->fullVwin.scrollbar,
 +                                       (Dimension) FontHeight(screen)
 +                                       * (tt_length)
 +                                       + 2 * screen->border,
 +                                       &replyWidth, &replyHeight);
 +
+         if (stat == XtGeometryYes || stat == XtGeometryDone)
 +           {
 +             term->core.width = replyWidth;
 +             term->core.height = replyHeight;
 +
+             ScreenResize (&term->screen,replyWidth,replyHeight,
 +                           &term->flags);
 +           }
 +       }
+
 +       if((select_mask & pty_mask) && (eventMode == NORMAL)) {
 +#ifdef ALLOWLOGGING
+           if(screen->logging){
 +               FlushLog(screen);
 +           }
 +#endif
+
+           if (read_queue.flink != 0) {
 +               VTbuffer.cnt = tt_read(VTbuffer.ptr = VTbuffer.buf);
 +               if(VTbuffer.cnt == 0)
 +                   Panic("input: read returned zero\n", 0);
 +               else
 +               {
 +                   /* strip parity bit */
 +                   for(i = VTbuffer.cnt, cp = VTbuffer.ptr ; i > 0 ; i--)
 +                       *cp++ &= 0177; /* originally CHAR */
 +                       if(screen->scrollWidget && screen->scrollttyoutput &&
 +                           screen->topline < 0)
 +                           /* Scroll to bottom */
 +                        WindowScroll(screen, 0);
 +                       break;
 +               }
 +           }
 +           else {
 +               sys$hiber();
 +           }
 +
+       }
+       if(screen->scroll_amt)
 +           FlushScroll(screen);
 +       if(screen->cursor_set && (screen->cursor_col != screen->cur_col
 +        || screen->cursor_row != screen->cur_row)) {
 +           if(screen->cursor_state)
 +               HideCursor();
 +           ShowCursor();
 +       } else if(screen->cursor_set != screen->cursor_state) {
 +           if(screen->cursor_set)
 +               ShowCursor();
 +           else
 +               HideCursor();
 +       }
+
 +       if (QLength(screen->display)){
 +           select_mask = X_mask;
 +       }
+       else {
 +           write_mask = ptymask();
 +           XFlush(screen->display);
 +           select_mask = Select_mask;
 +           if (eventMode != NORMAL)
 +               select_mask = X_mask;
 +       }
+       if (write_mask & ptymask()) {
 +           v_write(screen->respond, 0, 0);     /* flush buffer */
 +       }
+
 +       if(select_mask & X_mask) {
 +           if (VTbuffer.cnt <= 0) {
 +               VTbuffer.cnt = 0;
 +               VTbuffer.ptr = VTbuffer.buf;
 +           }
 +           xevents();
 +           if (VTbuffer.cnt > 0)
 +               break;
 +       }
+    }
 +    VTbuffer.cnt--;
+    return(*VTbuffer.ptr++);
 +}
+#else /* VMS */
 static fd_set select_mask;
 static fd_set write_mask;
 static int pty_read_bytes;
@@ -2642,6 +2790,7 @@
     }
     return nextPtyData(&VTbuffer);
 }
+#endif /* VMS */
 
 /*
  * process a string of characters according to the character set indicated
@@ -2680,7 +2829,7 @@
                            /* mark that we had to wrap this line */
                            ScrnSetWrapped(screen, screen->cur_row);
                            xtermAutoPrint('\n');
-                           Index(screen, 1);
 +                           xtermIndex(screen, 1);
                             screen->cur_col = 0;
                            screen->do_wrap = 0;
                            this_col = last_col + 1;
@@ -2770,7 +2919,7 @@
                screen->cur_row,
                screen->cur_col,
                curXtermChrSet(screen->cur_row),
-               len, visibleChars(PAIRED_CHARS(str, str2), len)))
 +               len, visibleChars(PAIRED_CHARS(str, str2), len)));
  
        if(screen->cur_row - screen->topline <= screen->max_row) {
                if(screen->cursor_state)
@@ -2796,7 +2945,7 @@
                        TRACE(("%s @%d, calling drawXtermText (%d,%d)\n",
                                __FILE__, __LINE__,
                                screen->cur_col,
-                               screen->cur_row))
 +                               screen->cur_row));
                         drawXtermText(screen, flags, currentGC,
                                CurCursorX(screen, screen->cur_row, screen->cur_col),
                                CursorY(screen, screen->cur_row),
@@ -2858,7 +3007,7 @@
 
     switch( event->type ){
     case MapNotify:
-       TRACE(("HandleStructNotify(MapNotify)\n"))
 +       TRACE(("HandleStructNotify(MapNotify)\n"));
  #if OPT_ZICONBEEP
        if( zIconBeep_flagged ) {
            zIconBeep_flagged = False;
@@ -2879,11 +3028,11 @@
        mapstate = !IsUnmapped;
        break;
     case UnmapNotify:
-       TRACE(("HandleStructNotify(UnmapNotify)\n"))
 +       TRACE(("HandleStructNotify(UnmapNotify)\n"));
         mapstate = IsUnmapped;
        break;
     case ConfigureNotify:
-       TRACE(("HandleStructNotify(ConfigureNotify)\n"))
 +       TRACE(("HandleStructNotify(ConfigureNotify)\n"));
  #if OPT_TOOLBAR
        if (term->screen.Vshow) {
 #ifndef NO_ACTIVE_ICON
@@ -2895,13 +3044,13 @@
                XtVaGetValues(Vwin->menu_bar,
                    XtNheight,      &Vwin->menu_height,
                    NULL);
-               TRACE(("...menu_height %d\n", Vwin->menu_height))
 +               TRACE(("...menu_height %d\n", Vwin->menu_height));
             }
        }
 #endif
        break;
     default:
-       TRACE(("HandleStructNotify(event %d)\n", event->type))
 +       TRACE(("HandleStructNotify(event %d)\n", event->type));
         break;
     }
 }
@@ -2954,7 +3103,7 @@
        register int    i, j;
 
        for (i=0; i<nparam; ++i) {
-               TRACE(("%s %d\n", (func == bitset) ? "DECSET" : "DECRST", param[i]))
 +               TRACE(("%s %d\n", (func == bitset) ? "DECSET" : "DECRST", param[i]));
                 switch (param[i]) {
                case 1:                 /* DECCKM                       */
                        (*func)(&termw->keyboard.flags, MODE_DECCKM);
@@ -3164,26 +3313,23 @@
 #endif
                case 1048:
                        if (!termw->misc.titeInhibit) {
-                               if(func == bitset)
 +                               if(func == bitset)
                                         CursorSave(termw);
                                else
                                        CursorRestore(termw);
                        }
                        break;
                case 1051:
-                       sunFunctionKeys = (func == bitset);
 -                       update_sun_fkeys();
 +                       set_keyboard_type(keyboardIsSun, func == bitset);
                         break;
 #if OPT_HP_FUNC_KEYS
                case 1052:
-                       hpFunctionKeys = (func == bitset);
 -                       update_hp_fkeys();
 +                       set_keyboard_type(keyboardIsHP, func == bitset);
                         break;
 #endif
 #if OPT_SUNPC_KBD
                case 1061:
-                       sunKeyboard = (func == bitset);
 -                       update_sun_kbd();
 +                       set_keyboard_type(keyboardIsVT220, func == bitset);
                         break;
 #endif
                }
@@ -3666,7 +3812,11 @@
                buf[1] = '\n';
                i++;
        }
+#ifdef VMS
+       tt_write(&buf, i);
 +#else /* VMS */
        writePtyData(fd, buf, i);
+#endif /* VMS */
 
        /* If send/receive mode is reset, we echo characters locally */
        if ((term->keyboard.flags & MODE_SRM) == 0) {
@@ -3711,7 +3861,7 @@
 {
        if(screen->alternate)
                return;
-       TRACE(("ToAlternate\n"))
 +       TRACE(("ToAlternate\n"));
         if(!screen->altbuf)
                screen->altbuf = Allocate(screen->max_row + 1, screen->max_col
                 + 1, &screen->abuf_address);
@@ -3725,7 +3875,7 @@
 {
        if(!screen->alternate)
                return;
-       TRACE(("FromAlternate\n"))
 +       TRACE(("FromAlternate\n"));
         screen->alternate = FALSE;
        SwitchBufs(screen);
        update_altscreen();
@@ -3888,7 +4038,7 @@
        XtGeometryResult status;
        XWindowAttributes attrs;
 
-       TRACE(("RequestResize(rows=%d, cols=%d, text=%d)\n", rows, cols, text))
 +       TRACE(("RequestResize(rows=%d, cols=%d, text=%d)\n", rows, cols, text));
  
        askedWidth  = cols;
        askedHeight = rows;
@@ -4037,11 +4187,11 @@
        wnew->dft_foreground = MyBlackPixel(wnew->screen.display);
        wnew->dft_background = MyWhitePixel(wnew->screen.display);
    }
-   TRACE(("Color resource initialization:\n"))
 -   TRACE(("   Default foreground %#lx\n", wnew->dft_foreground))
 -   TRACE(("   Default background %#lx\n", wnew->dft_background))
 -   TRACE(("   Screen foreground  %#lx\n", request->screen.foreground))
 -   TRACE(("   Screen background  %#lx\n", request->core.background_pixel))
 +   TRACE(("Color resource initialization:\n"));
 +   TRACE(("   Default foreground %#lx\n", wnew->dft_foreground));
 +   TRACE(("   Default background %#lx\n", wnew->dft_background));
 +   TRACE(("   Screen foreground  %#lx\n", request->screen.foreground));
 +   TRACE(("   Screen background  %#lx\n", request->core.background_pixel));
  
    wnew->screen.mouse_button = -1;
    wnew->screen.mouse_row = -1;
@@ -4091,7 +4241,7 @@
        wnew->screen.terminal_id = MAX_DECID;
    TRACE(("term_id '%s' -> terminal_id %d\n",
        wnew->screen.term_id,
-       wnew->screen.terminal_id))
 +       wnew->screen.terminal_id));
  
    wnew->screen.ansi_level = (wnew->screen.terminal_id / 100);
    wnew->screen.visualbell = request->screen.visualbell;
@@ -4135,7 +4285,7 @@
    wnew->screen.print_attributes = request->screen.print_attributes;
 #endif
 
-   TRACE(("keyboard_dialect:%s\n", request->screen.keyboard_dialect))
 +   TRACE(("keyboard_dialect:%s\n", request->screen.keyboard_dialect));
     wnew->screen.keyboard_dialect = request->screen.keyboard_dialect;
 
    wnew->screen.input_eight_bits = request->screen.input_eight_bits;
@@ -4167,7 +4317,7 @@
        wnew->screen.font_doublesize = False;
    TRACE(("Doublesize%s enabled, up to %d fonts\n",
        wnew->screen.font_doublesize ? "" : " not",
-       wnew->screen.cache_doublesize))
 +       wnew->screen.cache_doublesize));
  #endif
 
    wnew->num_ptrs = (OFF_ATTRS+1); /* OFF_FLAGS, OFF_CHARS, OFF_ATTRS */
@@ -4180,7 +4330,7 @@
    wnew->screen.colorULMode   = request->screen.colorULMode;
 
    for (i = 0, color_ok = False; i < MAXCOLORS; i++) {
-       TRACE(("Acolors[%d] = %#lx\n", i, request->screen.Acolors[i]))
 +       TRACE(("Acolors[%d] = %#lx\n", i, request->screen.Acolors[i]));
         wnew->screen.Acolors[i] = request->screen.Acolors[i];
        if (wnew->screen.Acolors[i] != wnew->dft_foreground
        && wnew->screen.Acolors[i] != request->screen.foreground
@@ -4195,7 +4345,7 @@
     */
    if (!color_ok) {
        wnew->screen.colorMode = False;
-       TRACE(("All colors are foreground or background: disable colorMode\n"))
 +       TRACE(("All colors are foreground or background: disable colorMode\n"));
     }
 
 #if OPT_EXT_COLORS
@@ -4204,6 +4354,7 @@
    wnew->num_ptrs = (OFF_COLOR+1);
 #endif
    wnew->sgr_foreground = -1;
+   wnew->sgr_extended = 0;
  #endif /* OPT_ISO_COLORS */
 
 #if OPT_HIGHLIGHT_COLOR
@@ -4231,6 +4382,7 @@
    wnew->cur_foreground = 0;
    wnew->cur_background = 0;
 
+   wnew->keyboard.type = keyboardIsDefault;
     wnew->keyboard.flags = MODE_SRM;
    if (wnew->screen.backarrow_key)
           wnew->keyboard.flags |= MODE_DECBKM;
@@ -4560,7 +4712,7 @@
               *t,
               *ns,
               *end,
-               buf[32];
 +               buf[32];
      XIM                xim = (XIM) NULL;
     XIMStyles  *xim_styles;
     XIMStyle   input_style = 0;
@@ -4871,7 +5023,7 @@
        }
 
        TRACE(("%s @%d, ShowCursor calling drawXtermText cur(%d,%d)\n", __FILE__, __LINE__,
-               screen->cur_row, screen->cur_col))
 +               screen->cur_row, screen->cur_col));
  
        drawXtermText(screen, flags, currentGC,
                x = CurCursorX(screen, screen->cur_row, screen->cur_col),
@@ -4884,7 +5036,7 @@
                screen->box->y = y;
                XDrawLines (screen->display, VWindow(screen),
                            screen->cursoroutlineGC ? screen->cursoroutlineGC
-                                                   : currentGC,
 +                                                   : currentGC,
                             screen->box, NBOX, CoordModePrevious);
        }
        screen->cursor_state = ON;
@@ -4954,7 +5106,7 @@
        }
 
        TRACE(("%s @%d, HideCursor calling drawXtermText cur(%d,%d)\n", __FILE__, __LINE__,
-               screen->cursor_row, screen->cursor_col))
 +               screen->cursor_row, screen->cursor_col));
         drawXtermText(screen, flags, currentGC,
                CurCursorX(screen, screen->cursor_row, screen->cursor_col),
                CursorY(screen, screen->cursor_row),
@@ -5084,13 +5236,13 @@
                update_jumpscroll();
 
                if(screen->c132 && (term->flags & IN132COLUMNS)) {
-                       Dimension junk;
 +                       Dimension junk;
                         XtMakeResizeRequest(
                            (Widget) term,
                            (Dimension) 80*FontWidth(screen)
                                + 2 * screen->border + Scrollbar(screen),
                            (Dimension) FontHeight(screen)
-                               * (screen->max_row + 1) + 2 * screen->border,
 +                               * (screen->max_row + 1) + 2 * screen->border,
                             &junk, &junk);
                        XSync(screen->display, FALSE);  /* synchronize */
                        if(XtAppPending(app_con))
Index: charsets.c
--- xterm-124+/charsets.c       Mon Sep 27 16:12:18 1999
 +++ xterm-125/charsets.c        Sun Jan 30 14:25:07 2000
 @@ -4,7 +4,7 @@
  
 /************************************************************
 
-Copyright 1998, 1999 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1998-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -251,7 +251,7 @@
        TRACE(("CHARSET GL=%c(G%d) GR=%c(G%d) %s\n",
                leftset,  screen->curss ? screen->curss : screen->curgl,
                rightset, screen->curgr,
-               visibleIChar(buf, ptr-buf)))
 +               visibleIChar(buf, ptr-buf)));
  
        for (s = buf; s < ptr; ++s) {
                int eight = CharOf(E2A(*s));
Index: ctlseqs.ms
--- xterm-124+/ctlseqs.ms       Thu Dec 30 05:01:00 1999
 +++ xterm-125/ctlseqs.ms        Mon Jan 31 10:52:38 2000
 @@ -749,7 +749,7 @@
  disabled by the \fBtiteInhibit\fP resource)
   \*(Ps = \*1\*0\*5\*1 \(-> Set Sun function-key mode.
   \*(Ps = \*1\*0\*5\*2 \(-> Set HP function-key mode.
-  \*(Ps = \*1\*0\*6\*1 \(-> Set Sun/PC keyboard mode.
 +  \*(Ps = \*1\*0\*6\*1 \(-> Set Sun/PC keyboard emulation of VT220 keyboard.
  .
 .IP \\*(Cs\\*(Pm\\*s\\*i
 Media Copy (MC)
@@ -819,7 +819,7 @@
 disabled by the \fBtiteInhibit\fP resource)
   \*(Ps = \*1\*0\*5\*1 \(-> Reset Sun function-key mode.
   \*(Ps = \*1\*0\*5\*2 \(-> Reset HP function-key mode.
-  \*(Ps = \*1\*0\*6\*1 \(-> Reset Sun/PC keyboard mode.
 +  \*(Ps = \*1\*0\*6\*1 \(-> Reset Sun/PC keyboard emulation of VT220 keyboard.
  .
 .IP \\*(Cs\\*(Pm\\*s\\*m
 Character Attributes (SGR)
Index: cursor.c
--- xterm-124+/cursor.c Thu Dec 30 05:01:00 1999
 +++ xterm-125/cursor.c  Sat Jan 29 18:58:59 2000
 @@ -158,7 +158,7 @@
   * Won't leave scrolling region. No carriage return.
  */
 void
-Index(register TScreen *screen, register int amount)
 +xtermIndex(register TScreen *screen, register int amount)
  {
        register int j;
 
@@ -173,7 +173,7 @@
        }
 
        CursorDown(screen, j = screen->bot_marg - screen->cur_row);
-       Scroll(screen, amount - j);
 +       xtermScroll(screen, amount - j);
  }
 
 /*
Index: data.c
--- xterm-124+/data.c   Mon Sep 27 16:12:18 1999
 +++ xterm-125/data.c    Mon Jan 31 11:31:18 2000
 @@ -60,13 +60,8 @@
  XtAppContext app_con;
 XtermWidget term;      /* master data structure for client */
 char *xterm_name;      /* argv[0] */
-Boolean sunFunctionKeys;
 int hold_screen;
 
-#if OPT_HP_FUNC_KEYS
-Boolean hpFunctionKeys;
-#endif
-
 #if OPT_ZICONBEEP
 int zIconBeep;  /* non-zero means beep; see charproc.c for details -IAN! */
 Boolean zIconBeep_flagged; /* True if the icon name has been changed */
@@ -78,15 +73,17 @@
                        the cost of an extra request to the server */
 #endif
 
-#if OPT_SUNPC_KBD
-Boolean sunKeyboard;
-#endif
-
 int am_slave = 0;      /* set to 1 if running as a slave process */
 int max_plus1;
+#ifdef VMS
+int Select_mask;
+int X_mask;
+int pty_mask;
+#else /* VMS */
 fd_set Select_mask;
 fd_set X_mask;
 fd_set pty_mask;
+#endif /* VMS */
 char *ptydev;
 char *ttydev;
 #ifdef ALLOWLOGGING
Index: data.h
--- xterm-124+/data.h   Thu Oct 14 05:57:38 1999
 +++ xterm-125/data.h    Mon Jan 31 11:31:23 2000
 @@ -34,6 +34,21 @@
  
 extern XtAppContext app_con;
 
+#ifdef VMS
+/* actually in vms.c */
+extern int tt_width;
 +extern int tt_length;
+extern int tt_changed;
+extern int tt_pasting;
 +extern int tt_new_output;
+#define VMS_TERM_BUFFER_SIZE   500
 +struct q_head {
+       int flink;
 +       int blink;
 +};
+extern struct q_head read_queue;
+#endif
 +
 #if OPT_TEK4014
 extern Char *Tpushb;
 extern Char *Tpushback;
@@ -54,24 +69,15 @@
 extern char *ptydev;
 extern char *ttydev;
 extern char *xterm_name;
-extern Boolean sunFunctionKeys;
 extern int hold_screen;
 
-#if OPT_HP_FUNC_KEYS
-extern Boolean hpFunctionKeys;
+#if OPT_ZICONBEEP
 +extern int zIconBeep;
+extern Boolean zIconBeep_flagged;
 #endif
 
-#if OPT_ZICONBEEP 
-extern int zIconBeep; 
-extern Boolean zIconBeep_flagged; 
 -#endif 
-
-#if OPT_SAME_NAME 
 -extern Boolean sameName; 
-#endif 
 -
-#if OPT_SUNPC_KBD
-extern Boolean sunKeyboard;
+#if OPT_SAME_NAME
 +extern Boolean sameName;
 #endif
 
 extern PtyData VTbuffer;
@@ -83,9 +89,15 @@
 extern int debug;
 #endif /* DEBUG */
 
+#ifdef VMS
+extern int Select_mask;
+extern int X_mask;
 +extern int pty_mask;
+#else /* VMS */
 extern fd_set Select_mask;
 extern fd_set X_mask;
 extern fd_set pty_mask;
+#endif /* VMS */
 
 extern int waitingForTrackInfo;
 
Index: doublechr.c
--- xterm-124+/doublechr.c      Mon Sep 27 16:12:18 1999
 +++ xterm-125/doublechr.c       Sun Jan 30 14:25:09 2000
 @@ -4,7 +4,7 @@
  
 /************************************************************
 
-Copyright 1997 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1997-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -62,7 +62,7 @@
        if (oldChrSet == newChrSet)
                return;
 
-       TRACE(("repaint_line(%2d,%2d) (%d)\n", currow, screen->cur_col, newChrSet))
 +       TRACE(("repaint_line(%2d,%2d) (%d)\n", currow, screen->cur_col, newChrSet));
         HideCursor();
 
        /* If switching from single-width, keep the cursor in the visible part
@@ -136,7 +136,7 @@
 discard_font(TScreen *screen, XTermFonts *data)
 {
        TRACE(("discard_font chrset=%d %s\n", data->chrset,
-               (data->fn != 0) ? data->fn : "<no-name>"))
 +               (data->fn != 0) ? data->fn : "<no-name>"));
  
        data->chrset = 0;
        data->flags = 0;
@@ -162,14 +162,14 @@
        XTermFonts *data = screen->double_fonts;
 
        flags &= BOLD;
-       TRACE(("xterm_Double_index chrset=%#x, flags=%#x\n", chrset, flags))
 +       TRACE(("xterm_Double_index chrset=%#x, flags=%#x\n", chrset, flags));
  
        for (n = 0; n < screen->fonts_used; n++) {
                if (data[n].chrset == chrset
                 && data[n].flags == flags) {
                        if (n != 0) {
                                XTermFonts save;
-                               TRACE(("...xterm_Double_index -> %d (OLD:%d)\n", n, screen->fonts_used))
 +                               TRACE(("...xterm_Double_index -> %d (OLD:%d)\n", n, screen->fonts_used));
                                 save = data[n];
                                while (n > 0) {
                                        data[n] = data[n-1];
@@ -183,7 +183,7 @@
 
        /* Not, found, push back existing fonts and create a new entry */
        if (screen->fonts_used >= screen->cache_doublesize) {
-               TRACE(("...xterm_Double_index: discard oldest\n"))
 +               TRACE(("...xterm_Double_index: discard oldest\n"));
                 discard_font(screen, &(data[screen->fonts_used - 1]));
        } else {
                screen->fonts_used += 1;
@@ -191,7 +191,7 @@
        for (n = screen->fonts_used; n > 0; n--)
                data[n] = data[n-1];
 
-       TRACE(("...xterm_Double_index -> (NEW:%d)\n", screen->fonts_used))
 +       TRACE(("...xterm_Double_index -> (NEW:%d)\n", screen->fonts_used));
  
        data[0].chrset = chrset;
        data[0].flags = flags;
@@ -233,11 +233,11 @@
        }
        data->fn = name;
 
-       TRACE(("xterm_DoubleGC %s %d: %s\n", flags&BOLD ? "BOLD" : "NORM", n, name))
 +       TRACE(("xterm_DoubleGC %s %d: %s\n", flags&BOLD ? "BOLD" : "NORM", n, name));
  
        if ((data->fs = XLoadQueryFont (screen->display, name)) == 0)
                return 0;
-       TRACE(("-> OK\n"))
 +       TRACE(("-> OK\n"));
  
        gcv.graphics_exposures = TRUE;  /* default */
        gcv.font       = data->fs->fid;
Index: fontutils.c
--- xterm-124+/fontutils.c      Mon Sep 27 16:12:18 1999
 +++ xterm-125/fontutils.c       Sun Jan 30 11:33:51 2000
 @@ -4,7 +4,7 @@
  
 /************************************************************
 
-Copyright 1998 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1998-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -317,12 +317,12 @@
         || old_props.res_x      != res_y
         || old_props.pixel_size != pixel_size
         || strcmp(old_props.spacing, props->spacing)) {
-               TRACE(("xtermSpecialFont(atts = %#x, chrset = %#x)\n", atts, chrset))
 -               TRACE(("res_x      = %d\n", res_x))
 -               TRACE(("res_y      = %d\n", res_y))
 -               TRACE(("point_size = %s\n", props->point_size))
 -               TRACE(("pixel_size = %d\n", pixel_size))
 -               TRACE(("spacing    = %s\n", props->spacing))
 +               TRACE(("xtermSpecialFont(atts = %#x, chrset = %#x)\n", atts, chrset));
 +               TRACE(("res_x      = %d\n", res_x));
 +               TRACE(("res_y      = %d\n", res_y));
 +               TRACE(("point_size = %s\n", props->point_size));
 +               TRACE(("pixel_size = %d\n", pixel_size));
 +               TRACE(("spacing    = %s\n", props->spacing));
                 old_props.res_x      = res_x;
                old_props.res_x      = res_y;
                old_props.pixel_size = pixel_size;
@@ -462,7 +462,7 @@
                strcpy (tmpname, nfontname);
        }
 
-       TRACE(("xtermLoadFont normal %s\n", nfontname))
 +       TRACE(("xtermLoadFont normal %s\n", nfontname));
  
        if (!(nfs = XLoadQueryFont (screen->display, nfontname))) goto bad;
        if (EmptyFont(nfs))
@@ -473,21 +473,21 @@
                fp = get_font_name_props(screen->display, nfs, normal);
                if (fp != 0) {
                        bfontname = bold_font_name(fp);
-                       TRACE(("...derived bold %s\n", bfontname))
 +                       TRACE(("...derived bold %s\n", bfontname));
                 }
                if (bfontname == 0
                 || (bfs = XLoadQueryFont (screen->display, bfontname)) == 0) {
                        bfs = nfs;
-                       TRACE(("...cannot load a matching bold font\n"))
 +                       TRACE(("...cannot load a matching bold font\n"));
                 } else if (!same_font_size(nfs, bfs)
                 || !got_bold_font(screen->display, bfs, bfontname)) {
                        XFreeFont(screen->display, bfs);
                        bfs = nfs;
-                       TRACE(("...did not get a matching bold font\n"))
 +                       TRACE(("...did not get a matching bold font\n"));
                 }
        } else if ((bfs = XLoadQueryFont (screen->display, bfontname)) == 0) {
                bfs = nfs;
-               TRACE(("...cannot load bold font %s\n", bfontname))
 +               TRACE(("...cannot load bold font %s\n", bfontname));
         }
 
        if (EmptyFont(bfs))
@@ -497,7 +497,7 @@
         && (is_fixed_font(nfs) && is_fixed_font(bfs))) {
                XFreeFont(screen->display, bfs);
                bfs = nfs;
-               TRACE(("...fixing mismatched normal/bold fonts\n"))
 +               TRACE(("...fixing mismatched normal/bold fonts\n"));
                 /*
                 * If we're given a nonnull bfontname here, it came from a
                 * resource setting.  Perhaps the user did something like set
@@ -525,7 +525,7 @@
                        nfs->min_bounds.width,
                        nfs->max_bounds.width,
                        bfs->min_bounds.width,
-                       bfs->max_bounds.width))
 +                       bfs->max_bounds.width));
                 proportional = True;
        }
 
@@ -620,7 +620,7 @@
 
        screen->enbolden = screen->bold_mode
                && ((nfs == bfs) || same_font_name(normal, bfontname));
-       TRACE(("Will %suse 1-pixel offset/overstrike to simulate bold\n", screen->enbolden ? "" : "not "))
 +       TRACE(("Will %suse 1-pixel offset/overstrike to simulate bold\n", screen->enbolden ? "" : "not "));
  
        set_menu_font (False);
        screen->menu_font_number = fontnum;
@@ -750,7 +750,7 @@
                if (font->max_byte1 == 0) {
 #if OPT_WIDE_CHARS
                        if (ch > 255) {
-                               TRACE(("xtermMissingChar %#04x (row)\n", ch))
 +                               TRACE(("xtermMissingChar %#04x (row)\n", ch));
                                 return True;
                        }
 #endif
@@ -763,7 +763,7 @@
 #endif
 
                if (CI_NONEXISTCHAR(pc)) {
-                       TRACE(("xtermMissingChar %#04x (!exists)\n", ch))
 +                       TRACE(("xtermMissingChar %#04x (!exists)\n", ch));
                         return True;
                }
        }
@@ -948,7 +948,7 @@
                         && !xtermMissingChar(n, (flags & BOLD)
                                  ? screen->fnt_bold
                                  : screen->fnt_norm)) {
-                               TRACE(("...use xterm-style linedrawing\n"))
 +                               TRACE(("...use xterm-style linedrawing\n"));
                                 ch = n;
                                break;
                        }
@@ -958,7 +958,7 @@
 
        TRACE(("DRAW_BOX(%d) cell %dx%d at %d,%d%s\n",
                ch, screen->fnt_high, screen->fnt_wide, y, x,
-               (ch < 0 || ch >= (int)(sizeof(lines)/sizeof(lines[0]))) ? "-BAD": ""))
 +               (ch < 0 || ch >= (int)(sizeof(lines)/sizeof(lines[0]))) ? "-BAD": ""));
  
        if (!XGetGCValues(screen->display, gc, GCBackground, &values))
                return;
@@ -1049,7 +1049,7 @@
                        if (fs != 0) {
                                screen->menu_font_sizes[n] = FontSize(fs);
                                TRACE(("menu_font_sizes[%d] = %ld\n", n,
-                                       screen->menu_font_sizes[n]))
 +                                       screen->menu_font_sizes[n]));
                                 XFreeFont (screen->display, fs);
                        }
                }
@@ -1174,7 +1174,7 @@
 
     TRACE(("SetVTFont(i=%d, name1=%s, name2=%s)\n", i,
        name1 ? name1 : "<null>",
-       name2 ? name2 : "<null>"))
 +       name2 ? name2 : "<null>"));
  
     if (i >= 0 && i < NMENUFONTS) {
        if (i == fontMenu_fontsel) {    /* go get the selection */
Index: input.c
--- xterm-124+/input.c  Sun Jan 30 18:41:54 2000
 +++ xterm-125/input.c   Mon Jan 31 11:32:37 2000
 @@ -60,6 +60,11 @@
  #include <xterm.h>
 
 #include <X11/keysym.h>
+
+#ifdef VMS
+#include <X11/keysymdef.h>
+#endif
 +
 #ifdef HAVE_X11_DECKEYSYM_H
 #include <X11/DECkeysym.h>
 #endif
@@ -195,7 +200,7 @@
        for (n = 0; n < sizeof(table)/sizeof(table[0]); n++) {
                if (table[n].before == keysym) {
                        keysym = table[n].after;
-                       TRACE(("...Input keypad changed to %#04lx\n", keysym))
 +                       TRACE(("...Input keypad changed to %#04lx\n", keysym));
                         break;
                }
        }
@@ -210,7 +215,7 @@
  */
 #define isModified(event) \
     (event->state & \
-       (Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask ))
 +       (Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask ))
  
 #define VT52_KEYPAD \
        if_OPT_VT52_MODE(screen,{ \
@@ -363,7 +368,7 @@
                eightbit ? " 8bit" : " 7bit",
                IsFunctionKey(keysym)     ? " FKey"     : "",
                IsMiscFunctionKey(keysym) ? " MiscFKey" : "",
-               IsEditFunctionKey(keysym) ? " EditFkey" : ""))
 +               IsEditFunctionKey(keysym) ? " EditFkey" : ""));
  
 #if OPT_SUNPC_KBD
        /*
@@ -371,12 +376,12 @@
         * Other (Sun, PC) keyboards commonly have keypad(+), but no keypad(,)
         * - it's a pain for users to work around.
         */
-       if (!sunFunctionKeys
 +       if (term->keyboard.type != keyboardIsSun
          && (event->state & ShiftMask) == 0
-        && sunKeyboard
 +        && term->keyboard.type == keyboardIsVT220
          && keysym == XK_KP_Add) {
                keysym = XK_KP_Separator;
-               TRACE(("...Input keypad(+), change keysym to %#04lx\n", keysym))
 +               TRACE(("...Input keypad(+), change keysym to %#04lx\n", keysym));
         }
 #endif
 
@@ -399,7 +404,7 @@
         && ((term->misc.num_lock == 0)
          || (term->misc.num_lock & event->state) != 0)) {
                keypad_mode = 0;
-               TRACE(("...Input num_lock, force keypad_mode off\n"))
 +               TRACE(("...Input num_lock, force keypad_mode off\n"));
         }
 #endif
 
@@ -412,9 +417,9 @@
         */
        if (screen->meta_sends_esc
         && !term->misc.meta_trans
-        && (event->state & term->misc.meta_left
 -         || event->state & term->misc.meta_right)) {
 -               TRACE(("...input is modified by META\n"))
 +        && ((event->state & term->misc.meta_left) != 0
 +         || (event->state & term->misc.meta_right)) != 0) {
 +               TRACE(("...input is modified by META\n"));
                 eightbit = False;
                unparseputc (ESC, pty);  /* escape */
        }
@@ -426,7 +431,7 @@
        if (event->state != 0
         && !(IsKeypadKey(keysym) && keypad_mode)
 #if OPT_SUNPC_KBD
-        && !sunKeyboard
 +        && term->keyboard.type != keyboardIsVT220
  #endif
 #if OPT_VT52_MODE
         && screen->ansi_level != 0
@@ -436,8 +441,8 @@
            modify_parm = (event->state & ControlMask) ? ctl : normal
 #if OPT_NUM_LOCK
            if (term->misc.real_NumLock
-            && (event->state & term->misc.alt_left
 -             || event->state & term->misc.alt_right)) {
 +            && ((event->state & term->misc.alt_left) != 0
 +             || (event->state & term->misc.alt_right)) != 0) {
                 if (event->state & ShiftMask) {
                    ModifierParm(8, 4);
                } else {
@@ -475,12 +480,12 @@
           ^ ((event->state & ControlMask) != 0))
         && (keysym == XK_BackSpace)) {
                strbuf[0] = '\177';
-               TRACE(("...Input backarrow changed to %d\n", *strbuf))
 +               TRACE(("...Input backarrow changed to %d\n", *strbuf));
         }
 
 #if OPT_SUNPC_KBD
        /* make an DEC editing-keypad from a Sun or PC editing-keypad */
-       if (sunKeyboard)
 +       if (term->keyboard.type == keyboardIsVT220)
                 keysym = TranslateFromSUNPC(keysym);
        else
 #endif
@@ -488,16 +493,16 @@
 #ifdef XK_KP_Home
        if (keysym >= XK_KP_Home && keysym <= XK_KP_Begin) {
                keysym += XK_Home - XK_KP_Home;
-               TRACE(("...Input keypad changed to %#04lx\n", keysym))
 +               TRACE(("...Input keypad changed to %#04lx\n", keysym));
         }
 #endif
        }
 
 #if OPT_HP_FUNC_KEYS
-       if (hpFunctionKeys
 +       if (term->keyboard.type == keyboardIsHP
          && (reply.a_final = hpfuncvalue (keysym)) != 0) {
                reply.a_type = ESC;
-               MODIFIER_PARM
 +               MODIFIER_PARM;
                 unparseseq(&reply, pty);
        } else
 #endif
@@ -505,13 +510,13 @@
                reply.a_type = SS3;
                reply.a_final = keysym-XK_KP_F1+'P';
                VT52_CURSOR_KEYS
-               MODIFIER_PARM
 +               MODIFIER_PARM;
                 unparseseq(&reply, pty);
                key = TRUE;
 #if 0  /* OPT_SUNPC_KBD should suppress - but only for vt220 compatibility */
-       } else if (sunKeyboard
 -               && screen->old_fkeys == False
 -               && screen->ansi_level <= 1
 +       } else if (term->keyboard.type == keyboardIsVT220
 +               && screen->old_fkeys == False
 +               && screen->ansi_level <= 1
                 && IsEditFunctionKey(keysym)) {
                key = FALSE;    /* ignore editing-keypad in vt100 mode */
 #endif
@@ -521,22 +526,24 @@
                        reply.a_type = SS3;
                        reply.a_final = curfinal[keysym-XK_Home];
                        VT52_CURSOR_KEYS
-                       MODIFIER_PARM
 +                       MODIFIER_PARM;
                         unparseseq(&reply, pty);
                } else {
                        reply.a_type = CSI;
                        if_OPT_VT52_MODE(screen,{ reply.a_type = ESC; })
                        reply.a_final = curfinal[keysym-XK_Home];
-                       MODIFIER_PARM
 +                       MODIFIER_PARM;
                         unparseseq(&reply, pty);
                }
                key = TRUE;
         } else if (IsFunctionKey(keysym)
                || IsMiscFunctionKey(keysym)
                || IsEditFunctionKey(keysym)
-               || (keysym == XK_Delete)) {
 +               || (keysym == XK_Delete
 +                && term->keyboard.type != keyboardIsSun 
 +                && !screen->old_fkeys)) {
  #if OPT_SUNPC_KBD
-               if (sunKeyboard) {
 +               if (term->keyboard.type == keyboardIsVT220) {
                         if ((event->state & ControlMask)
                         && (keysym >= XK_F1 && keysym <= XK_F12))
                                keysym += 12;
@@ -546,7 +553,7 @@
                dec_code = decfuncvalue(keysym);
                if ((event->state & ShiftMask)
 #if OPT_SUNPC_KBD
-                && sunKeyboard
 +                && term->keyboard.type == keyboardIsVT220
  #endif
                 && ((string = (Char *)udk_lookup(dec_code, &nbytes)) != 0)) {
                        while (nbytes-- > 0)
@@ -556,14 +563,14 @@
                /*
                 * Interpret F1-F4 as PF1-PF4 for VT52, VT100
                 */
-               else if (!sunFunctionKeys
 +               else if (term->keyboard.type != keyboardIsSun 
                  && screen->old_fkeys == False
                 && (dec_code >= 11 && dec_code <= 14))
                {
                        reply.a_type = SS3;
                        VT52_CURSOR_KEYS
                        reply.a_final = A2E(dec_code - 11 + E2A('P')) ;
-                       MODIFIER_PARM
 +                       MODIFIER_PARM;
                         unparseseq(&reply, pty);
                }
 #endif
@@ -571,8 +578,8 @@
                        reply.a_type = CSI;
                        reply.a_nparam = 1;
                        reply.a_final = 0;
-                       MODIFIER_PARM
 -                       if (sunFunctionKeys) {
 +                       MODIFIER_PARM;
 +                       if (term->keyboard.type == keyboardIsSun ) {
                                 reply.a_param[0] = sunfuncvalue (keysym);
                                reply.a_final = 'z';
 #ifdef XK_ISO_Left_Tab
@@ -594,7 +601,7 @@
                        reply.a_type  = SS3;
                        reply.a_final = kypd_apl[keysym-XK_KP_Space];
                        VT52_KEYPAD
-                       MODIFIER_PARM
 +                       MODIFIER_PARM;
                         unparseseq(&reply, pty);
                } else {
                        unparseputc(kypd_num[keysym-XK_KP_Space], pty);
@@ -618,9 +625,9 @@
                         */
                        if (eightbit
                         && screen->meta_sends_esc
-                        && (event->state & term->misc.meta_left
 -                         || event->state & term->misc.meta_right)) {
 -                               TRACE(("...input-char is modified by META\n"))
 +                        && ((event->state & term->misc.meta_left) != 0
 +                         || (event->state & term->misc.meta_right)) != 0) {
 +                               TRACE(("...input-char is modified by META\n"));
                                 eightbit = False;
                                unparseputc (ESC, pty);  /* escape */
                        }
@@ -629,7 +636,7 @@
                                if (CharOf(*string) < 128) {
                                        TRACE(("...input shift from %d to %d\n",
                                                CharOf(*string),
-                                               CharOf(*string) | 0x80))
 +                                               CharOf(*string) | 0x80));
                                         *string |= 0x80;
                                }
                                eightbit = False;
@@ -642,7 +649,7 @@
                                        (CharOf(*string) == cmp)
                                                ? "unchanged"
                                                : "changed to",
-                                       CharOf(cmp)))
 +                                       CharOf(cmp)));
                                 *string = cmp;
                        } else if (eightbit) {
                                unparseputc (ESC, pty);  /* escape */
@@ -656,7 +663,7 @@
                key = TRUE;
        }
        if(key && !TEK4014_ACTIVE(screen))
-               AdjustAfterInput(screen);
 +               AdjustAfterInput(screen);
  #ifdef ENABLE_PRINT
        if (keysym == XK_F2) TekPrint();
 #endif
@@ -668,7 +675,7 @@
 {
        int     pty     = screen->respond;
 
-       TRACE(("InputString %s\n", visibleChars(PAIRED_CHARS(string,0), nbytes)))
 +       TRACE(("InputString %s\n", visibleChars(PAIRED_CHARS(string,0), nbytes)));
  #if OPT_TEK4014
        if(nbytes && screen->TekGIN) {
                TekEnqMouse(*string++);
@@ -679,7 +686,7 @@
        while (nbytes-- != 0)
                unparseputc(*string++, pty);
        if (!TEK4014_ACTIVE(screen))
-               AdjustAfterInput(screen);
 +               AdjustAfterInput(screen);
  }
 
 /* These definitions are DEC-style (e.g., vt320) */
@@ -734,7 +741,7 @@
 static int
 hpfuncvalue (KeySym  keycode)
 {
-       switch (keycode) {
 +       switch (keycode) {
                 case XK_Up:             return('A');
                case XK_Down:           return('B');
                case XK_Right:          return('C');
@@ -771,7 +778,7 @@
 static int
 sunfuncvalue (KeySym  keycode)
 {
-       switch (keycode) {
 +       switch (keycode) {
                 case XK_F1:     return(224);
                case XK_F2:     return(225);
                case XK_F3:     return(226);
@@ -886,7 +893,7 @@
                        TRACE(("%s mask %#lx is%s modifier\n", \
                                #name, \
                                term->misc.name, \
-                               ModifierName(term->misc.name)))
 +                               ModifierName(term->misc.name)));
  /*
  * Determine which modifier mask (if any) applies to the Num_Lock keysym.
  *
@@ -905,7 +912,7 @@
 
     if (keymap != 0) {
 
-       TRACE(("VTInitModifiers\n"))
 +       TRACE(("VTInitModifiers\n"));
         for (i = k = 0, mask = 1; i < 8; i++, mask <<= 1) {
            for (j = 0; j < keymap->max_keypermod; j++) {
                KeyCode code = keymap->modifiermap[k];
@@ -935,7 +942,7 @@
          || term->misc.alt_right != 0)
         && (TranslationsUseKeyword(toplevel, "alt")
          || TranslationsUseKeyword((Widget)term, "alt"))) {
-           TRACE(("ALT is used as a modifier in translations (ignore mask)\n"))
 +           TRACE(("ALT is used as a modifier in translations (ignore mask)\n"));
             term->misc.alt_left = 0;
            term->misc.alt_right = 0;
        }
@@ -948,7 +955,7 @@
          || term->misc.meta_right != 0)
         && (TranslationsUseKeyword(toplevel, "meta")
          || TranslationsUseKeyword((Widget)term, "meta"))) {
-           TRACE(("META is used as a modifier in translations\n"))
 +           TRACE(("META is used as a modifier in translations\n"));
             term->misc.meta_trans = True;
        }
 
Index: link_axp.com
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/link_axp.com      Sat Jan 29 15:47:10 2000
 @@ -0,0 +1,106 @@
 +$ SAVE_VERIFY='F$VERIFY(0)
+$ if p1 .Eqs. "CLEAN" then goto clean
 +$ if p1 .Eqs. "CLOBBER" then goto clobber
 +$ if p1 .Eqs. "INSTALL" then goto install
 +$!
+$!     Compile the X11R4 Xterm application
 +$!
+$ Set Symbol/Scope=NoGlobal
+$!
 +$!  Define logicals pointing to the needed directories
 +$!
+$ x11lib_device = f$parse("[.lib]",,,"DEVICE")
 +$ x11lib_directory = f$parse("[.lib]",,,"DIRECTORY")
 +$ define/nolog x11lib 'x11lib_device''x11lib_directory'
 +$!
+$ x11inc_device = f$parse("[]",,,"DEVICE")
 +$ x11inc_directory = f$parse("[]",,,"DIRECTORY")
 +$ define/nolog x11inc 'x11inc_device''x11inc_directory'
 +$!
+$ xmu_device = f$parse("[.lib.xmu]",,,"DEVICE")
 +$ xmu_directory = f$parse("[.lib.xmu]",,,"DIRECTORY")
 +$ define/nolog x11xmu 'xmu_device''xmu_directory'
 +$!
+$ xbm_device = f$parse("[.lib.x11]",,,"DEVICE")
 +$ xbm_directory = f$parse("[.lib.x11]",,,"DIRECTORY")
 +$ define/nolog x11xbm 'xbm_device''xbm_directory'
 +$!
+$ xaw_device = f$parse("[.lib.xaw]",,,"DEVICE")
 +$ xaw_directory = f$parse("[.lib.xaw]",,,"DIRECTORY")
 +$ define/nolog x11xaw 'xaw_device''xaw_directory'
 +$!
+$ x11vms_device = f$parse("[.lib.misc]",,,"DEVICE")
 +$ x11vms_directory = f$parse("[.lib.misc]",,,"DIRECTORY")
 +$ define/nolog x11vms 'x11vms_device''x11vms_directory'
 +$!
+$!  Get the compiler options via the logical name COPTS
 +$!
+$ cc_options = f$trnlnm("COPTS")
+$!
 +$!  Get the linker options via the logical name LOPTS
 +$!
+$ link_options = f$trnlnm("LOPTS")
+$!
 +$ write sys$output "Building XTERM Image"
 +$ CALL MAKE XTERM.EXE  "LINK ''link_options' /EXE=XTERM.EXE_AXP/CROSS/FULL/MAP=XTERM.MAP XTERM_AXP/OPT" *.OBJ
 +$!
+$ deassign x11lib
+$ deassign x11vms
+$ deassign x11xmu
+$ deassign x11xbm
+$ deassign x11xaw
+$!
+$ exit
+$!
+$ Clobber:     ! Delete executables, Purge directory and clean up object files and listings
 +$ Delete/noconfirm/log *.exe;*
+$!
 +$ Clean:       ! Purge directory, clean up object files and listings
 +$ Purge
+$ Delete/noconfirm/log *.lis;*
 +$ Delete/noconfirm/log *.obj;*
+$!
 +$ exit
+$!
+$ Install:
+$ Copy/log *.exe x11bin:
+$ exit
 +$!
+$MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES
 +$ V = 'F$Verify(0)
+$! P1 = What we are trying to make
 +$! P2 = Command to make it
 +$! P3 - P8  What it depends on
 +$
+$ If F$Search(P1) .Eqs. "" Then Goto Makeit
 +$ Time = F$CvTime(F$File(P1,"RDT"))
+$arg=3
 +$Loop:
+$      Argument = P'arg
 +$      If Argument .Eqs. "" Then Goto Exit
 +$      El=0
+$Loop2:
 +$      File = F$Element(El," ",Argument)
 +$      If File .Eqs. " " Then Goto Endl
 +$      AFile = ""
 +$Loop3:
+$      OFile = AFile
 +$      AFile = F$Search(File)
 +$      If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
 +$      If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
 +$      Goto Loop3
 +$NextEL:
+$      El = El + 1
 +$      Goto Loop2
 +$EndL:
+$ arg=arg+1
+$ If arg .Le. 8 Then Goto Loop
 +$ Goto Exit
+$
+$Makeit:
+$ Set Verify
+$ 'P2
+$ VV='F$Verify(0)
+$Exit:
+$ If V Then Set Verify
+$ENDSUBROUTINE
 Index: main.c
--- xterm-124+/main.c   Sun Jan 30 18:41:54 2000
 +++ xterm-125/main.c    Mon Jan 31 19:50:37 2000
 @@ -344,6 +344,7 @@
  #else
 
 #ifndef linux
+#ifndef VMS
 #ifndef USE_POSIX_TERMIOS
 #ifndef USE_SYSV_TERMIO
 #include <sgtty.h>
@@ -358,6 +359,7 @@
 #ifdef __osf__
 #define setpgrp setpgid
 #endif
+#endif /* !VMS */
 #endif /* !linux */
 
 #endif /* __QNX__ */
@@ -385,7 +387,9 @@
 #define NOFILE OPEN_MAX
 #endif
 #elif !defined(MINIX) && !defined(WIN32) && !defined(Lynx) && !defined(__GNU__) && !defined(__MVS__)
+#ifndef VMS
 #include <sys/param.h> /* for NOFILE */
+#endif /* !VMS */
 #endif
 
 #if defined(BSD) && (BSD >= 199103)
@@ -525,12 +529,14 @@
        }
 #endif
 
+#ifndef VMS
 static SIGNAL_T reapchild (int n);
-static char *base_name (char *name);
 -static int pty_search (int *pty);
  static int spawn (void);
-static void get_terminal (void);
+static int pty_search (int *pty);
  static void remove_termcap_entry (char *buf, char *str);
+#endif /* ! VMS */
+static char *base_name (char *name);
 +static void get_terminal (void);
 static void resize (TScreen *s, char *oldtc, char *newtc);
 
 static Bool added_utmp_entry = False;
@@ -610,6 +616,7 @@
 #define CWERASE CONTROL('W')
 #endif
 
+#ifndef VMS
 #ifdef USE_SYSV_TERMIO
 /* The following structures are initialized in main() in order
 ** to eliminate any assumptions about the internal order of their
@@ -647,6 +654,7 @@
 };
 #endif /* sony */
 #endif /* USE_SYSV_TERMIO */
+#endif /* ! VMS */
 
 /*
  * SYSV has the termio.c_cc[V] and ltchars; BSD has tchars and ltchars;
@@ -1639,13 +1647,6 @@
 #endif
        hold_screen = resource.hold_screen ? 1 : 0;
        xterm_name = resource.xterm_name;
-       sunFunctionKeys = resource.sunFunctionKeys;
 -#if OPT_SUNPC_KBD
-       sunKeyboard = resource.sunKeyboard;
 -#endif
-#if OPT_HP_FUNC_KEYS
-       hpFunctionKeys = resource.hpFunctionKeys;
 -#endif
        if (strcmp(xterm_name, "-") == 0) xterm_name = DFT_TERMTYPE;
        if (resource.icon_geometry != NULL) {
            int scr, junk;
@@ -1732,6 +1733,14 @@
                0);
            /* this causes the initialize method to be called */
 
+#if OPT_HP_FUNC_KEYS
+       init_keyboard_type(keyboardIsHP, resource.hpFunctionKeys);
 +#endif
+       init_keyboard_type(keyboardIsSun, resource.sunFunctionKeys);
 +#if OPT_SUNPC_KBD
+       init_keyboard_type(keyboardIsVT220, resource.sunKeyboard);
 +#endif
+
        screen = &term->screen;
 
        inhibit = 0;
@@ -1780,7 +1789,7 @@
         so the debug feature is disabled by default. */
        int i = -1;
        if(debug) {
-               creat_as (getuid(), getgid(), "xterm.debug.log", 0666);
 +               creat_as (getuid(), getgid(), "xterm.debug.log", 0666);
                 i = open ("xterm.debug.log", O_WRONLY | O_TRUNC, 0666);
        }
        if(i >= 0) {
@@ -1818,6 +1827,7 @@
 
        spawn ();
 
+#ifndef VMS
        /* Child process is out there, let's catch its termination */
        (void) signal (SIGCHLD, reapchild);
 
@@ -1890,6 +1900,7 @@
                (1 + ConnectionNumber(screen->display)) :
                (1 + screen->respond);
 
+#endif /* !VMS */
 #ifdef DEBUG
        if (debug) printf ("debugging on\n");
 #endif /* DEBUG */
@@ -2252,6 +2263,7 @@
 #endif /* USE_HANDSHAKE else !USE_HANDSHAKE */
 
 
+#ifndef VMS
 #ifndef AMOEBA
 extern char **environ;
 
@@ -2427,21 +2439,21 @@
                                lmode = d_lmode;
 #endif /* TIOCLSET */
 #ifdef USE_SYSV_TERMIO
-                       if(ioctl(tty, TCGETA, &tio) == -1)
 -                               tio = d_tio;
 +                       if(ioctl(tty, TCGETA, &tio) == -1)
 +                               tio = d_tio;
  #elif defined(USE_POSIX_TERMIOS)
                        if (tcgetattr(tty, &tio) == -1)
-                               tio = d_tio;
 +                               tio = d_tio;
  #else   /* !USE_SYSV_TERMIO && !USE_POSIX_TERMIOS */
                        if(ioctl(tty, TIOCGETP, (char *)&sg) == -1)
-                               sg = d_sg;
 +                               sg = d_sg;
                         if(ioctl(tty, TIOCGETC, (char *)&tc) == -1)
-                               tc = d_tc;
 +                               tc = d_tc;
                         if(ioctl(tty, TIOCGETD, (char *)&discipline) == -1)
-                               discipline = d_disipline;
 +                               discipline = d_disipline;
  #ifdef sony
                        if(ioctl(tty, TIOCKGET, (char *)&jmode) == -1)
-                               jmode = d_jmode;
 +                               jmode = d_jmode;
                         if(ioctl(tty, TIOCKGETC, (char *)&jtc) == -1)
                                jtc = d_jtc;
 #endif /* sony */
@@ -2465,7 +2477,7 @@
                                __FILE__, __LINE__,
                                resource.ptyInitialErase,
                                resource.backarrow_is_erase,
-                               initial_erase))
 +                               initial_erase));
  #endif
 
 #ifdef MINIX
@@ -2577,11 +2589,11 @@
        TRACE(("%s @%d, resource ptyInitialErase:%d, backspace_is_erase:%d\n",
                __FILE__, __LINE__,
                resource.ptyInitialErase,
-               resource.backarrow_is_erase))
 +               resource.backarrow_is_erase));
         if (!resource.ptyInitialErase) {
                char temp[1024], *p = temp;
                char *s = tgetstr(TERMCAP_ERASE, &p);
-               TRACE(("extracting initial_erase value from termcap\n"))
 +               TRACE(("extracting initial_erase value from termcap\n"));
                 if (s != 0) {
                        if (*s == '^') {
                                if (*++s == '?') {
@@ -2598,7 +2610,7 @@
                                initial_erase = *s;
                        }
                        initial_erase = CharOf(initial_erase);
-                       TRACE(("... initial_erase:%d\n", initial_erase))
 +                       TRACE(("... initial_erase:%d\n", initial_erase));
                 }
        }
        if (resource.backarrow_is_erase && initial_erase == 127) {
@@ -3140,7 +3152,7 @@
                        __FILE__, __LINE__,
                        resource.ptyInitialErase,
                        override_tty_modes,
-                       ttymodelist[XTTYMODE_erase].set))
 +                       ttymodelist[XTTYMODE_erase].set));
                 if (! resource.ptyInitialErase
                 && !override_tty_modes
                 && !ttymodelist[XTTYMODE_erase].set) {
@@ -3166,7 +3178,7 @@
                /* copy the environment before Setenving */
                for (i = 0 ; environ [i] != NULL ; i++)
                    ;
-               /* compute number of Setenv() calls below */
 +               /* compute number of xtermSetenv() calls below */
                 envsize = 1;    /* (NULL terminating entry) */
                envsize += 3;   /* TERM, WINDOWID, DISPLAY */
 #ifdef HAVE_UTMP
@@ -3186,16 +3198,16 @@
                envnew = (char **) calloc ((unsigned) i + envsize, sizeof(char *));
                memmove( (char *)envnew, (char *)environ, i * sizeof(char *));
                environ = envnew;
-               Setenv ("TERM=", TermName);
 +               xtermSetenv ("TERM=", TermName);
                 if(!TermName)
                        *newtc = 0;
 
                sprintf (buf, "%lu",
                         ((unsigned long) XtWindow (XtParent(CURRENT_EMU(screen)))));
-               Setenv ("WINDOWID=", buf);
 +               xtermSetenv ("WINDOWID=", buf);
  
                /* put the display into the environment of the shell*/
-               Setenv ("DISPLAY=", XDisplayString (screen->display));
 +               xtermSetenv ("DISPLAY=", XDisplayString (screen->display));
  
                signal(SIGTERM, SIG_DFL);
 
@@ -3271,7 +3283,7 @@
 #ifdef HAVE_UTMP
                pw = getpwuid(screen->uid);
                if (pw && pw->pw_name)
-                   Setenv ("LOGNAME=", pw->pw_name); /* for POSIX */
 +                   xtermSetenv ("LOGNAME=", pw->pw_name); /* for POSIX */
  #ifdef USE_SYSV_UTMP
                /* Set up our utmp entry now.  We need to do it here
                ** for the following reasons:
@@ -3331,7 +3343,7 @@
                (void) strncpy(buf, DisplayString(screen->display),
                               sizeof(buf));
 #ifndef linux
-               {
 +               {
                     char *disfin = strrchr(buf, ':');
                    if (disfin)
                        *disfin = '\0';
@@ -3514,20 +3526,20 @@
                {
                char numbuf[12];
                sprintf (numbuf, "%d", screen->max_col + 1);
-               Setenv("COLUMNS=", numbuf);
 +               xtermSetenv("COLUMNS=", numbuf);
                 sprintf (numbuf, "%d", screen->max_row + 1);
-               Setenv("LINES=", numbuf);
 +               xtermSetenv("LINES=", numbuf);
                 }
 #ifdef HAVE_UTMP
                if (pw) {       /* SVR4 doesn't provide these */
                    if (!getenv("HOME"))
-                       Setenv("HOME=", pw->pw_dir);
 +                       xtermSetenv("HOME=", pw->pw_dir);
                     if (!getenv("SHELL"))
-                       Setenv("SHELL=", pw->pw_shell);
 +                       xtermSetenv("SHELL=", pw->pw_shell);
                 }
 #endif /* HAVE_UTMP */
 #ifdef OWN_TERMINFO_DIR
-               Setenv("TERMINFO=", OWN_TERMINFO_DIR);
 +               xtermSetenv("TERMINFO=", OWN_TERMINFO_DIR);
  #endif
 #else /* USE_SYSV_ENVVARS */
                if(!TEK4014_ACTIVE(screen) && *newtc) {
@@ -3556,19 +3568,19 @@
                }
 #endif
                if(*newtc)
-                   Setenv ("TERMCAP=", newtc);
 +                   xtermSetenv ("TERMCAP=", newtc);
  #endif /* USE_SYSV_ENVVARS */
 
 
                /* need to reset after all the ioctl bashing we did above */
 #if defined(TIOCSSIZE) && (defined(sun) && !defined(SVR4))
                i = ioctl (0, TIOCSSIZE, &ts);
-               TRACE(("spawn TIOCSSIZE %dx%d return %d\n", ts.ts_lines, ts.ts_cols, i))
 +               TRACE(("spawn TIOCSSIZE %dx%d return %d\n", ts.ts_lines, ts.ts_cols, i));
  #elif defined(TIOCSWINSZ)
                i = ioctl (0, TIOCSWINSZ, (char *)&ws);
-               TRACE(("spawn TIOCSWINSZ %dx%d return %d\n", ws.ws_row, ws.ws_col, i))
 +               TRACE(("spawn TIOCSWINSZ %dx%d return %d\n", ws.ws_row, ws.ws_col, i));
  #else
-               TRACE(("spawn cannot tell pty its size\n"))
 +               TRACE(("spawn cannot tell pty its size\n"));
  #endif /* sun vs TIOCSWINSZ */
 
                signal(SIGHUP, SIG_DFL);
@@ -3686,7 +3698,7 @@
                        break;
                default:
                        fprintf(stderr, "%s: unexpected handshake status %d\n",
-                               xterm_name, handshake.status);
 +                               xterm_name, handshake.status);
                 }
            }
            /* close our sides of the pipes */
@@ -3963,7 +3975,7 @@
     for (i = 0 ; environ[i] != NULL ; i++)
        ;
 
-    /* compute number of Setenv() calls below */
 +    /* compute number of xtermSetenv() calls below */
      envsize = 1;       /* (NULL terminating entry) */
     envsize += 3;      /* TERM, WINDOWID, DISPLAY */
     envsize += 2;      /* HOME, SHELL */
@@ -3971,19 +3983,19 @@
     envnew = (char **) calloc ((unsigned) i + envsize, sizeof(char *));
     bcopy((char *)environ, (char *)envnew, i * sizeof(char *));
     environ = envnew;
-    Setenv ("TERM=", TermName);
 +    xtermSetenv ("TERM=", TermName);
      if(!TermName) *newtc = 0;
 
     sprintf (buf, "%lu",
        ((unsigned long) XtWindow (XtParent(CURRENT_EMU(screen)))));
-    Setenv ("WINDOWID=", buf);
 +    xtermSetenv ("WINDOWID=", buf);
  
     /* put the display into the environment of the shell*/
-    Setenv ("DISPLAY=", XDisplayString (screen->display));
 +    xtermSetenv ("DISPLAY=", XDisplayString (screen->display));
  
     /* always provide a HOME and SHELL definition */
-    if (!getenv("HOME")) Setenv("HOME=", DEF_HOME);
 -    if (!getenv("SHELL")) Setenv("SHELL=", DEF_SHELL);
 +    if (!getenv("HOME")) xtermSetenv("HOME=", DEF_HOME);
 +    if (!getenv("SHELL")) xtermSetenv("SHELL=", DEF_SHELL);
  
     if(!TEK4014_ACTIVE(screen) && *newtc) {
        strcpy (termcap, newtc);
@@ -4004,7 +4016,7 @@
            strcat (newtc, ":im=\\E[4h:ei=\\E[4l:mi:");
     }
     if (*newtc)
-       Setenv ("TERMCAP=", newtc);
 +       xtermSetenv ("TERMCAP=", newtc);
  
     /*
      * Execute specified program or shell. Use find_program to
@@ -4243,7 +4255,7 @@
        register int li_first = 0;
        register char *temp;
 
-       TRACE(("resize %s\n", oldtc))
 +       TRACE(("resize %s\n", oldtc));
         if ((ptr1 = strindex (oldtc, "co#")) == NULL){
                strcat (oldtc, "co#80:");
                ptr1 = strindex (oldtc, "co#");
@@ -4274,10 +4286,11 @@
                        : screen->max_row + 1);
        ptr2 = strchr(ptr2, ':');
        strcat (temp, ptr2);
-       TRACE(("   ==> %s\n", newtc))
 +       TRACE(("   ==> %s\n", newtc));
  #endif /* USE_SYSV_ENVVARS */
 }
 
+#endif /* ! VMS */
 /*
  * Does a non-blocking wait for a child process.  If the system
  * doesn't support non-blocking wait, do nothing.
@@ -4306,6 +4319,8 @@
        return pid;
 }
 
+#ifndef VMS
+
 /* ARGSUSED */
 static SIGNAL_T reapchild (int n GCC_UNUSED)
 {
@@ -4332,6 +4347,7 @@
 
     SIGNAL_RETURN;
 }
+#endif /* !VMS */
 
 static void
 remove_termcap_entry (char *buf, char *str)
@@ -4341,7 +4357,7 @@
     int count = 0;
     size_t len = strlen(str);
 
-    TRACE(("*** remove_termcap_entry('%s', '%s')\n", str, buf))
 +    TRACE(("*** remove_termcap_entry('%s', '%s')\n", str, buf));
  
     while (*buf != 0) {
        if (!count && !strncmp(buf, str, len)) {
@@ -4355,7 +4371,7 @@
            }
            while ((*first++ = *buf++) != 0)
                ;
-           TRACE(("...removed_termcap_entry('%s', '%s')\n", str, base))
 +           TRACE(("...removed_termcap_entry('%s', '%s')\n", str, base));
             return;
        } else if (*buf == '\\') {
            buf++;
@@ -4368,7 +4384,7 @@
        if (*buf != 0)
            buf++;
     }
-    TRACE(("...cannot remove\n"))
 +    TRACE(("...cannot remove\n"));
  }
 
 /*
@@ -4402,21 +4418,26 @@
            s++;
            c = ((*s == '?') ? 0177 : CONTROL(*s));
            if (*s == '-') {
-#if defined(HAVE_POSIX_VDISABLE)
-               c = _POSIX_VDISABLE;
 -#elif defined(_PC_VDISABLE)
+               c = -1;
                 errno = 0;
-               c = fpathconf(0, _PC_VDISABLE);
 +#if defined(_POSIX_VDISABLE) && defined(HAVE_UNISTD_H)
 +               c = _POSIX_VDISABLE;
 +#endif
+#if defined(_PC_VDISABLE)
                if (c == -1) {
-                   if (errno != 0)
 -                       continue;       /* skip this (error) */
 -                   c = 0377;
 +                   c = fpathconf(0, _PC_VDISABLE);
 +                   if (c == -1) {
 +                       if (errno != 0)
 +                           continue;   /* skip this (error) */
 +                       c = 0377;
 +                   }
                 }
 #elif defined(VDISABLE)
-               c = VDISABLE;
 -#else
-               continue;               /* ignore */
 +               if (c == -1)
 +                   c = VDISABLE;
  #endif
+               if (c == -1)
 +                   continue;           /* ignore */
             }
        } else {
            c = *s;
@@ -4428,6 +4449,7 @@
     }
 }
 
+#ifndef VMS /* don't use pipes on OpenVMS */
  int GetBytesAvailable (int fd)
 {
 #ifdef AMOEBA
@@ -4475,6 +4497,7 @@
     return poll (pollfds, 1, 0);
 #endif
 }
+#endif /* !VMS */
 
 /* Utility function to try to hide system differences from
    everybody who used to call killpg() */
@@ -4482,7 +4505,7 @@
 int
 kill_process_group(int pid, int sig)
 {
-    TRACE(("kill_process_group(pid=%d, sig=%d)\n", pid, sig))
 +    TRACE(("kill_process_group(pid=%d, sig=%d)\n", pid, sig));
  #ifdef AMOEBA
     if (pid != 2) {
        fprintf(stderr, "%s:  unexpected process id %d.\n", ProgramName, pid);
Index: make.com
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/make.com  Sat Jan 29 19:07:46 2000
 @@ -0,0 +1,88 @@
 +$! make.com
+$! 25-JAN-2000, David Mathog
+$! builds xaw3d, xmu, and then xterm.
 +$!
+$!************************************************************
 +$!
+$! set up logicals for XAW, XMU and so forth
 +$!
+$ define x11_directory decw$include
+$ thisfile = f$environment("PROCEDURE")
 +$ thisis   = f$parse(thisfile,,,"DEVICE") + f$parse(thisfile,,,"DIRECTORY")
 +$ thisis = thisis - "]"
+$ define xaw_directory "''thisis'.lib.xaw3d]"
 +$ define xmu_directory "''thisis'.lib.xmu]"
 +$ define bitmap_directory "''thisis'.lib.bitmaps]"
 +$ define/trans=(concealed) thisX11 "''thisis.lib.]"
 +$ define X11 thisx11,decw$include
+$!
 +$! note, ansi doesn't work with this variant of X11R5.
 +$!
+$! don't build libs in debug mode
 +$ if(P1 .eqs. "" .AND. P2 .eqs. "")
 +$ then
+$!
+$! build XMU
+$!
+$ set ver
+$ set def [.lib.xmu]
+$ @make
 +$!
+$! build XAW3D
+$!
+$ set def [-.xaw3d]
+$ @make
 +$ set def [--]
+$ set nover
+$!
+$! move the two libraries to this level
 +$!
+$ rename [.lib...]*.olb []
+$ endif
 +$!
+$ if(P1 .nes. "")
+$ then
 +$   ccstub := cc/standard=vaxc/include=[]/debug/noopt
 +$   mylink :== link/debug
+$ else
 +$   ccstub := cc/standard=vaxc/include=[]
 +$   mylink :== link
+$ endif
 +$ mycc :== 'ccstub' -
+/define=(VMS,OPT_TEK4014,ALLOWLOGGING,OPT_NUM_LOCK)
 +$!
+$! OPT_TOOLBAR doesn't work - it pulls in calls through Xaw3d and Xmu for
 +$! XSHAPECOMBINEMASK and XSHAPEQUERYEXTENSION
 +$! which seem not to exist in DW MOtif 1.2-5
 +$!
+$!
+$ set ver
+$ mycc BUTTON.C
+$ mycc CHARPROC.C
+$ mycc CHARSETS.C
+$ mycc CURSOR.C
+$ mycc DATA.C
+$ mycc DOUBLECHR.C
+$ mycc FONTUTILS.C
+$ mycc INPUT.C
+$ mycc KEYSYM2UCS.C
+$ mycc MAIN.C
+$ mycc MENU.C
+$ mycc MISC.C
+$ mycc PRINT.C
+$ mycc PTYDATA.C
+$! mycc RESIZE.C
+$ mycc SCREEN.C
+$ mycc SCROLLBAR.C
+$ mycc TABS.C
+$ mycc TEKPROC.C
+$ mycc TEKPRSTBL.C
+$ mycc TRACE.C
+$ mycc TTYSVR.C
+$ mycc UTIL.C
+$ mycc VMS.C
+$ mycc VTPRSTBL.C
+$!
+$ mylink/exe=xterm.exe xterm_axp.opt/option
 +$ set nover
+$ exit
Index: menu.c
--- xterm-124+/menu.c   Thu Dec 30 05:01:00 1999
 +++ xterm-125/menu.c    Mon Jan 31 11:40:11 2000
 @@ -2,7 +2,7 @@
  /* $XFree86: xc/programs/xterm/menu.c,v 3.28 1999/12/30 02:05:54 robin Exp $ */
 /*
 
-Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -182,13 +182,13 @@
     { "num-lock",      do_num_lock,    NULL },
     { "meta-esc",      do_meta_esc,    NULL },
 #endif
+#if OPT_HP_FUNC_KEYS
+    { "hp function-keys",do_hp_fkeys,  NULL },
 +#endif
     { "sun function-keys",do_sun_fkeys,        NULL },
 #if OPT_SUNPC_KBD
     { "sun keyboard",  do_sun_kbd,     NULL },
 #endif
-#if OPT_HP_FUNC_KEYS
-    { "hp function-keys",do_hp_fkeys,  NULL },
 -#endif
     { "line2",         NULL,           NULL },
     { "suspend",       do_suspend,     NULL },
     { "continue",      do_continue,    NULL },
@@ -352,7 +352,7 @@
 
     Widget m;
     TScreen *screen = &xtw->screen;
-    MenuHeader *data = &menu_names[num]; 
 +    MenuHeader *data = &menu_names[num];
      MenuList *list = select_menu(w, num);
     struct _MenuEntry *entries = data->entry_list;
     int nentries = data->entry_len;
@@ -590,10 +590,12 @@
 /* ARGSUSED */
 static void handle_send_signal (Widget gw GCC_UNUSED, int sig)
 {
+#ifndef VMS
     register TScreen *screen = &term->screen;
 
     if (hold_screen > 1) hold_screen = 0;
     if (screen->pid > 1) kill_process_group (screen->pid, sig);
+#endif
 }
 
 
@@ -715,15 +717,6 @@
     update_decbkm();
 }
 
-static void do_sun_fkeys (
-       Widget gw GCC_UNUSED,
 -       XtPointer closure GCC_UNUSED,
 -       XtPointer data GCC_UNUSED)
 -{
-    sunFunctionKeys = ! sunFunctionKeys;
 -    update_sun_fkeys();
-}
 -
 #if OPT_NUM_LOCK
 static void do_num_lock (
        Widget gw GCC_UNUSED,
@@ -744,31 +737,37 @@
 }
 #endif
 
-
-#if OPT_SUNPC_KBD
-static void do_sun_kbd (
+#if OPT_HP_FUNC_KEYS
 +static void do_hp_fkeys (
        Widget gw GCC_UNUSED,
        XtPointer closure GCC_UNUSED,
        XtPointer data GCC_UNUSED)
 {
-    sunKeyboard = ! sunKeyboard;
 -    update_sun_kbd();
+    toggle_keyboard_type(keyboardIsHP);
  }
 #endif
 
+static void do_sun_fkeys (
+       Widget gw GCC_UNUSED,
 +       XtPointer closure GCC_UNUSED,
 +       XtPointer data GCC_UNUSED)
 +{
+    toggle_keyboard_type(keyboardIsSun);
 +}
 
-#if OPT_HP_FUNC_KEYS
-static void do_hp_fkeys (
+#if OPT_SUNPC_KBD
 +/*
+ * This really means "Sun/PC keyboard emulating VT220".
 + */
+static void do_sun_kbd (
        Widget gw GCC_UNUSED,
        XtPointer closure GCC_UNUSED,
        XtPointer data GCC_UNUSED)
 {
-    hpFunctionKeys = ! hpFunctionKeys;
 -    update_hp_fkeys();
+    toggle_keyboard_type(keyboardIsVT220);
  }
 #endif
 
-
 /*
  * The following cases use the pid instead of the process group so that we
  * don't get hosed by programs that change their process group
@@ -879,12 +878,7 @@
        XtPointer closure GCC_UNUSED,
        XtPointer data GCC_UNUSED)
 {
-    term->flags ^= REVERSE_VIDEO;
      ReverseVideo (term);
-
-    /* cancel out the internal state changes, so menus are decoupled */
 -    term->flags ^= REVERSE_VIDEO;
 -    term->misc.re_verse = !term->misc.re_verse;
  }
 
 
@@ -1479,7 +1473,7 @@
        String *params,
        Cardinal *param_count)
 {
-    handle_toggle (do_sun_fkeys, (int) sunFunctionKeys,
 +    handle_toggle (do_sun_fkeys, term->keyboard.type == keyboardIsSun,
                    params, *param_count, w, (XtPointer)0, (XtPointer)0);
 }
 
@@ -1512,7 +1506,7 @@
        String *params,
        Cardinal *param_count)
 {
-    handle_toggle (do_sun_kbd, (int) sunKeyboard,
 +    handle_toggle (do_sun_kbd, term->keyboard.type == keyboardIsVT220,
                    params, *param_count, w, (XtPointer)0, (XtPointer)0);
 }
 #endif
@@ -1524,7 +1518,7 @@
        String *params,
        Cardinal *param_count)
 {
-    handle_toggle (do_hp_fkeys, (int) hpFunctionKeys,
 +    handle_toggle (do_hp_fkeys, term->keyboard.type == keyboardIsHP,
                    params, *param_count, w, (XtPointer)0, (XtPointer)0);
 }
 #endif
@@ -1893,7 +1887,7 @@
     { "insert",                        HandleKeyPressed }, /* alias */
     { "insert-eight-bit",      HandleEightBitKeyPressed },
     { "insert-seven-bit",      HandleKeyPressed },
-    { "secure",                HandleSecure },
 +    { "secure",                        HandleSecure },
      { "string",                        HandleStringEvent },
 };
 
@@ -1913,7 +1907,7 @@
 
        params[0] = closure;
        params[1] = 0;
-       TRACE(("InitPopup(%s)\n", params[0]))
 +       TRACE(("InitPopup(%s)\n", params[0]));
  
        domenu(gw, (XEvent *)0, params, &count);
 
@@ -1939,7 +1933,7 @@
        TRACE(("...SetupShell(%s) -> %s -> %#lx\n",
                menu_names[n].internal_name,
                external_name,
-               (long)shell[n].w))
 +               (long)shell[n].w));
  
        sprintf(temp, "%sButton", menu_names[n].internal_name);
        menu_tops[n] = XtVaCreateManagedWidget (temp,
@@ -1961,7 +1955,7 @@
        Widget menu_tops[NUM_POPUP_MENUS];
 #endif
 
-       TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014"))
 +       TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014"));
  
        if (shell == toplevel) {
            XawSimpleMenuAddGlobalActions (app_con);
@@ -2011,7 +2005,7 @@
        *menus = shell;
 #endif
 
-       TRACE(("...shell=%#lx\n", (long) shell))
 -       TRACE(("...forms=%#lx\n", (long) *forms))
 -       TRACE(("...menus=%#lx\n", (long) *menus))
 +       TRACE(("...shell=%#lx\n", (long) shell));
 +       TRACE(("...forms=%#lx\n", (long) *forms));
 +       TRACE(("...menus=%#lx\n", (long) *menus));
  }
Index: menu.h
--- xterm-124+/menu.h   Thu Dec 30 05:01:00 1999
 +++ xterm-125/menu.h    Mon Jan 31 11:16:37 2000
 @@ -2,7 +2,7 @@
  /* $XFree86: xc/programs/xterm/menu.h,v 3.17 1999/12/30 02:05:55 robin Exp $ */
 /*
 
-Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -144,13 +144,13 @@
     mainMenu_num_lock,
     mainMenu_meta_esc,
 #endif
+#if OPT_HP_FUNC_KEYS
+    mainMenu_hp_fkeys,
+#endif
      mainMenu_sun_fkeys,
 #if OPT_SUNPC_KBD
     mainMenu_sun_kbd,
 #endif
-#if OPT_HP_FUNC_KEYS
-    mainMenu_hp_fkeys,
-#endif
      mainMenu_line2,
     mainMenu_suspend,
     mainMenu_continue,
@@ -315,20 +315,20 @@
 #define update_sun_fkeys() \
   update_menu_item (term->screen.mainMenu, \
                    mainMenuEntries[mainMenu_sun_fkeys].widget, \
-                   sunFunctionKeys)
 +                   term->keyboard.type == keyboardIsSun)
  
 #if OPT_SUNPC_KBD
 #define update_sun_kbd() \
   update_menu_item (term->screen.mainMenu, \
                    mainMenuEntries[mainMenu_sun_kbd].widget, \
-                   sunKeyboard)
 +                   term->keyboard.type == keyboardIsVT220)
  #endif
 
 #if OPT_HP_FUNC_KEYS
 #define update_hp_fkeys() \
   update_menu_item (term->screen.mainMenu, \
                    mainMenuEntries[mainMenu_hp_fkeys].widget, \
-                   hpFunctionKeys)
 +                   term->keyboard.type == keyboardIsHP)
  #else
 #define update_hp_fkeys() /*nothing*/
 #endif
@@ -346,7 +346,7 @@
 #define update_reversevideo() \
   update_menu_item (term->screen.vtMenu, \
                    vtMenuEntries[vtMenu_reversevideo].widget, \
-                   (term->flags & REVERSE_VIDEO))
 +                   (term->misc.re_verse))
  
 #define update_autowrap() \
   update_menu_item (term->screen.vtMenu, \
Index: misc.c
--- xterm-124+/misc.c   Tue Jan 25 01:45:01 2000
 +++ xterm-125/misc.c    Sat Jan 29 19:54:59 2000
 @@ -93,7 +93,14 @@
  #define environ gblenvp                /* circumvent a bug */
 #endif
 
-extern char **environ;         /* used in 'Setenv()' */
 +#ifdef VMS
+#define XTERM_VMS_LOGFILE "SYS$SCRATCH:XTERM_LOG.TXT"
 +#ifdef ALLOWLOGFILEEXEC
+#undef ALLOWLOGFILEEXEC
+#endif
+#endif /* VMS */
+
+extern char **environ;         /* used in 'xtermSetenv()' */
  
 #if OPT_TEK4014
 #define OUR_EVENT(event,Type) \
@@ -119,8 +126,14 @@
        register TScreen *screen = &term->screen;
 
        if (XtAppPending(app_con)
-       || GetBytesAvailable (ConnectionNumber(screen->display)) > 0)
 -               xevents();
 +       ||
+#if defined(VMS) || defined(__VMS)
 +       screen->display->qlen > 0
 +#else
+       GetBytesAvailable (ConnectionNumber(screen->display)) > 0
 +#endif
+       )
+       xevents();
  }
 
 void
@@ -451,7 +464,7 @@
     struct timeval curtime;
     long now_msecs;
 
-    TRACE(("BELL %d\n", percent))
 +    TRACE(("BELL %d\n", percent));
  
     /* has enough time gone by that we are allowed to ring
        the bell again? */
@@ -609,7 +622,7 @@
                root_y,
                *width,
                *height,
-               root_border))
 +               root_border));
         *width -= (screen->border * 2),
        *height -= (screen->border * 2);
 
@@ -622,7 +635,7 @@
 
            TRACE(("QueryMaximize: WM hints max_w %#x max_h %#x\n",
                    hints.max_width,
-                   hints.max_height))
 +                   hints.max_height));
  
            if ((unsigned) hints.max_width < *width)
                *width = hints.max_width;
@@ -662,7 +675,7 @@
                            screen->restore_x,
                            screen->restore_y,
                            screen->restore_width,
-                           screen->restore_height))
 +                           screen->restore_height));
                 }
 
                XMoveResizeWindow(screen->display,
@@ -679,7 +692,7 @@
                    screen->restore_x,
                    screen->restore_y,
                    screen->restore_width,
-                   screen->restore_height))
 +                   screen->restore_height));
             screen->restore_data = False;
            XMoveResizeWindow(screen->display,
                              VShellWindow,
@@ -747,7 +760,7 @@
 #endif
 }
 
-#if defined(ALLOWLOGGING) || defined(DEBUG)
 +#if (defined(ALLOWLOGGING) || defined(DEBUG)) && !defined(VMS)
  
 /*
  * create a file only if we could with the permissions of the real user id.
@@ -770,7 +783,7 @@
     SIGNAL_T (*chldfunc) (int);
 
     chldfunc = signal(SIGCHLD, SIG_DFL);
-#endif
+#endif /* HAVE_WAITPID */
 
     pid = fork();
     switch (pid)
@@ -784,12 +797,13 @@
            _exit(0);
        } else
            _exit(1);
+       /* NOTREACHED */
      case -1:                   /* error */
        return;
     default:                   /* parent */
 #ifdef HAVE_WAITPID
        waitpid(pid, NULL, 0);
-#else
+#else  /* HAVE_WAITPID */
        waited = wait(NULL);
        signal(SIGCHLD, chldfunc);
        /*
@@ -801,10 +815,10 @@
            if (waited == term->screen.pid)
                Cleanup(0);
        while ( (waited=nonblocking_wait()) > 0);
-#endif
+#endif /* HAVE_WAITPID */
     }
 }
-#endif
+#endif /* defined(ALLOWLOGGING) || defined(DEBUG) */
  
 #ifdef ALLOWLOGGING
 
@@ -843,6 +857,10 @@
 
        if(screen->logging || (screen->inhibit & I_LOG))
                return;
+#ifdef VMS  /* file name is fixed in VMS variant */
 +       screen->logfd = open(XTERM_VMS_LOGFILE, O_CREAT|O_TRUNC|O_APPEND|O_RDWR, 0640);
 +       if(screen->logfd < 0)return; /* open failed */
 +#else /*VMS*/
        if(screen->logfile == NULL || *screen->logfile == 0) {
                if(screen->logfile)
                        free(screen->logfile);
@@ -931,6 +949,7 @@
                                         0644)) < 0)
                        return;
        }
+#endif /*VMS*/
        screen->logstart = CURRENT_EMU_VAL(screen, Tbuffer->ptr, VTbuffer.ptr);
        screen->logging = TRUE;
        update_logging();
@@ -953,6 +972,11 @@
        register IChar *cp;
        register int i;
 
+#ifdef VMS /* avoid logging output loops which otherwise occur sometimes
 +             when there is no output and cp/screen->logstart are 1 apart */
 +       if(!tt_new_output)return;
 +       tt_new_output = FALSE;
 +#endif /* VMS */
        cp = CURRENT_EMU_VAL(screen, Tbuffer->ptr, VTbuffer.ptr);
        if (screen->logstart != 0
         && (i = cp - screen->logstart) > 0) {
@@ -992,11 +1016,11 @@
        Colormap cmap = pTerm->core.colormap;
        char buffer[80];
 
-       TRACE(("ReportAnsiColorRequest %d\n", colornum))
 +       TRACE(("ReportAnsiColorRequest %d\n", colornum));
         color.pixel = pTerm->screen.Acolors[colornum];
        XQueryColor(term->screen.display, cmap, &color);
        sprintf(buffer, "4;%d;rgb:%04x/%04x/%04x",
-                colornum,
 +               colornum,
                 color.red,
                color.green,
                color.blue);
@@ -1018,10 +1042,10 @@
     if (XParseColor(screen->display, cmap, name, &def)
      && XAllocColor(screen->display, cmap, &def)) {
        screen->Acolors[color] = def.pixel;
-       TRACE(("AllocateAnsiColor #%d: %s (pixel %#lx)\n", color, name, def.pixel))
 +       TRACE(("AllocateAnsiColor #%d: %s (pixel %#lx)\n", color, name, def.pixel));
         return(TRUE);
     }
-    TRACE(("AllocateAnsiColor #%d: %s (failed)\n", color, name))
 +    TRACE(("AllocateAnsiColor #%d: %s (failed)\n", color, name));
      return(FALSE);
 }
 
@@ -1035,7 +1059,7 @@
     int color;
     int r = False;
 
-    TRACE(("ChangeAnsiColorRequest string='%s'\n", buf))
 +    TRACE(("ChangeAnsiColorRequest string='%s'\n", buf));
  
     while (buf && *buf) {
        name = strchr(buf, ';');
@@ -1146,7 +1170,7 @@
                 */
                if (buf != 0
                 && strcmp(buf, "?")
-                && ((cp = malloc((unsigned)strlen(buf) + 1)) != NULL) {
 +                && ((cp = malloc((unsigned)strlen(buf) + 1)) != NULL)) {
                         strcpy(cp, buf);
                        if(screen->logfile)
                                free(screen->logfile);
@@ -1529,7 +1553,7 @@
 
        GetOldColors(pTerm);
        color.pixel = pOldColors->colors[ndx];
-       TRACE(("ReportColors %d: %#lx\n", ndx, pOldColors->colors[ndx]))
 +       TRACE(("ReportColors %d: %#lx\n", ndx, pOldColors->colors[ndx]));
         XQueryColor(term->screen.display, cmap, &color);
        sprintf(buffer, "%d;rgb:%04x/%04x/%04x", ndx + 10,
                color.red,
@@ -1623,10 +1647,10 @@
        SET_COLOR_VALUE(pNew, ndx, def.pixel);
        strcpy(newName, name);
        SET_COLOR_NAME(pNew, ndx, newName);
-       TRACE(("AllocateColor #%d: %s (pixel %#lx)\n", ndx, newName, def.pixel))
 +       TRACE(("AllocateColor #%d: %s (pixel %#lx)\n", ndx, newName, def.pixel));
         return(TRUE);
     }
-    TRACE(("AllocateColor #%d: %s (failed)\n", ndx, name))
 +    TRACE(("AllocateColor #%d: %s (failed)\n", ndx, name));
      return(FALSE);
 }
 
@@ -1641,7 +1665,7 @@
 ScrnColors     newColors;
 int            i, ndx;
 
-    TRACE(("ChangeColorsRequest start=%d, names='%s'\n", start, names))
 +    TRACE(("ChangeColorsRequest start=%d, names='%s'\n", start, names));
  
     if ((pOldColors == NULL)
      && (!GetOldColors(pTerm))) {
@@ -1742,7 +1766,7 @@
        }
        cleaning = TRUE;
 
-       TRACE(("Cleanup %d\n", code))
 +       TRACE(("Cleanup %d\n", code));
  
        screen = &term->screen;
 
@@ -1773,12 +1797,12 @@
  * to have to do a realloc().
  */
 void
-Setenv (register char *var, register char *value)
 +xtermSetenv (register char *var, register char *value)
  {
        register int envindex = 0;
        register size_t len = strlen(var);
 
-       TRACE(("Setenv(var=%s, value=%s)\n", var, value))
 +       TRACE(("xtermSetenv(var=%s, value=%s)\n", var, value));
  
        while (environ [envindex] != NULL) {
            if (strncmp (environ [envindex], var, len) == 0) {
@@ -1791,7 +1815,7 @@
            envindex ++;
        }
 
-       TRACE(("...expanding env to %d\n", envindex+1))
 +       TRACE(("...expanding env to %d\n", envindex+1));
  
        environ [envindex] = (char *) malloc ((unsigned)len + strlen (value) + 1);
        (void) strcpy (environ [envindex], var);
@@ -1859,7 +1883,7 @@
 #if OPT_TEK4014
 static void withdraw_window (Display *dpy, Window w, int scr)
 {
-    TRACE(("withdraw_window %#lx\n", (long)w))
 +    TRACE(("withdraw_window %#lx\n", (long)w));
      (void) XmuUpdateMapHints (dpy, w, NULL);
     XWithdrawWindow (dpy, w, scr);
     return;
@@ -1871,7 +1895,7 @@
 {
     register TScreen *screen = &term->screen;
 
-    TRACE(("set_vt_visibility(%d)\n", on))
 +    TRACE(("set_vt_visibility(%d)\n", on));
      if (on) {
        if (!screen->Vshow && term) {
            VTInit ();
@@ -1908,7 +1932,7 @@
 {
     register TScreen *screen = &term->screen;
 
-    TRACE(("set_tek_visibility(%d)\n", on))
 +    TRACE(("set_tek_visibility(%d)\n", on));
      if (on) {
        if (!screen->Tshow && (tekWidget || TekInit())) {
            Widget tekParent = SHELL_OF(tekWidget);
Index: os2main.c
--- xterm-124+/os2main.c        Fri Nov 19 15:27:18 1999
 +++ xterm-125/os2main.c Mon Jan 31 19:23:35 2000
 @@ -927,13 +927,6 @@
          sameName = resource.sameName;
 #endif
        xterm_name = resource.xterm_name;
-       sunFunctionKeys = resource.sunFunctionKeys;
 -#if OPT_SUNPC_KBD
-       sunKeyboard = resource.sunKeyboard;
 -#endif
-#if OPT_HP_FUNC_KEYS
-       hpFunctionKeys = resource.hpFunctionKeys;
 -#endif
        if (strcmp(xterm_name, "-") == 0) xterm_name = DFT_TERMTYPE;
        if (resource.icon_geometry != NULL) {
            int scr, junk;
@@ -1014,6 +1007,14 @@
                0);
            /* this causes the initialize method to be called */
 
+#if OPT_HP_FUNC_KEYS
+       init_keyboard_type(keyboardIsHP, resource.hpFunctionKeys);
 +#endif
+       init_keyboard_type(keyboardIsSun, resource.sunFunctionKeys);
 +#if OPT_SUNPC_KBD
+       init_keyboard_type(keyboardIsVT220, resource.sunKeyboard);
 +#endif
+
         screen = &term->screen;
 
        inhibit = 0;
@@ -1560,7 +1561,7 @@
                        for (i = 0 ; gblenvp [i] != NULL ; i++)
                                ;
 
-                       /* compute number of Setenv() calls below */
 +                       /* compute number of xtermSetenv() calls below */
                         envsize = 1;    /* (NULL terminating entry) */
                        envsize += 3;   /* TERM, WINDOWID, DISPLAY */
                        envsize += 2;   /* COLUMNS, LINES */
@@ -1568,16 +1569,16 @@
                        envnew = (char **) calloc ((unsigned) i + envsize, sizeof(char *));
                        memmove( (char *)envnew, (char *)gblenvp, i * sizeof(char *));
                        gblenvp = envnew;
-                       Setenv ("TERM=", TermName);
 +                       xtermSetenv ("TERM=", TermName);
                         if(!TermName)
                                *newtc = 0;
 
                        sprintf (buf, "%lu",
                                ((unsigned long) XtWindow (XtParent(CURRENT_EMU(screen)))));
-                       Setenv ("WINDOWID=", buf);
 +                       xtermSetenv ("WINDOWID=", buf);
  
                        /* put the display into the environment of the shell*/
-                       Setenv ("DISPLAY=", XDisplayString (screen->display));
 +                       xtermSetenv ("DISPLAY=", XDisplayString (screen->display));
  
                        signal(SIGTERM, SIG_DFL);
 
@@ -1608,9 +1609,9 @@
                        }
 
                        sprintf (numbuf, "%d", screen->max_col + 1);
-                       Setenv("COLUMNS=", numbuf);
 +                       xtermSetenv("COLUMNS=", numbuf);
                         sprintf (numbuf, "%d", screen->max_row + 1);
-                       Setenv("LINES=", numbuf);
 +                       xtermSetenv("LINES=", numbuf);
  
                        /* reconstruct dead environ variable */
                        environ = gblenvp;
Index: print.c
--- xterm-124+/print.c  Fri Jan 21 19:19:54 2000
 +++ xterm-125/print.c   Sun Jan 30 11:37:10 2000
 @@ -4,7 +4,7 @@
  
 /************************************************************
 
-Copyright 1997,1998,1999 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1997-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -55,6 +55,9 @@
 #define Strncmp(a,b,c) strncmp((char *)a,(char *)b,c)
 
 #define SGR_MASK (BOLD|BLINK|UNDERLINE|INVERSE)
+#ifdef VMS
+#define VMS_TEMP_PRINT_FILE "sys$scratch:xterm_print.txt"
 +#endif
 
 static void charToPrinter (int chr);
 static void printLine (int row, int chr);
@@ -68,10 +71,23 @@
 
 static void closePrinter(void)
 {
+#ifdef VMS
+       register TScreen *screen = &term->screen;
 +       char pcommand[256];
 +       (void)sprintf(pcommand,"%s %s;",
 +          screen->printer_command,
 +          VMS_TEMP_PRINT_FILE);
 +#endif
+
        if (Printer != 0) {
                fclose(Printer);
                TRACE(("closed printer, waiting...\n"));
+#ifdef VMS /* This is a quick hack, really should use spawn and check status
 +             or system services and go straight to the queue */
 +               (void) system(pcommand);
 +#else /* VMS */
                while (nonblocking_wait() > 0)
+#endif /* VMS */
                        ;
                Printer = 0;
                initialized = 0;
@@ -82,7 +98,7 @@
 static void printCursorLine(void)
 {
        register TScreen *screen = &term->screen;
-       TRACE(("printCursorLine\n"))
 +       TRACE(("printCursorLine\n"));
         printLine(screen->cur_row, '\n');
 }
 
@@ -224,7 +240,7 @@
        int bot = extent ? screen->max_row : screen->bot_marg;
        int was_open = initialized;
 
-       TRACE(("xtermPrintScreen, rows %d..%d\n", top, bot))
 +       TRACE(("xtermPrintScreen, rows %d..%d\n", top, bot));
  
        while (top <= bot)
                printLine(top++, '\n');
@@ -252,7 +268,7 @@
        if (! screen->altbuf)
                top = - screen->savedlines;
 
-       TRACE(("xtermPrintEverything, rows %d..%d\n", top, bot))
 +       TRACE(("xtermPrintEverything, rows %d..%d\n", top, bot));
         while (top <= bot)
                printLine(top++, '\n');
        if (screen->printer_formfeed)
@@ -308,7 +324,7 @@
 #if OPT_PC_COLORS
                if (term->screen.boldColors
                 && fg > 8
-                && attr & BOLD)
 +                && (attr & BOLD) != 0)
                         fg -= 8;
 #endif
                sprintf(msg + strlen(msg), ";%d", (fg < 8) ? (30 + fg) : (82 + fg));
@@ -324,18 +340,30 @@
 static void charToPrinter(int chr)
 {
        if (!initialized) {
+#if defined(VMS)
+               /*
 +                * This implementation only knows how to write to a file.  When
 +                * the file is closed the print command executes.  Print
 +                * command must be of the form:
 +                *   print/que=name/delete [/otherflags].
 +                */
 +               Printer = fopen(VMS_TEMP_PRINT_FILE, "w");
 +#else
+               /*
 +                * This implementation only knows how to write to a pipe.
 +                */
                 FILE    *input;
                int     my_pipe[2];
                int     c;
                register TScreen *screen = &term->screen;
 
-               if (pipe(my_pipe))
 +               if (pipe(my_pipe))
                         SysError (ERROR_FORK);
                if ((Printer_pid = fork()) < 0)
                        SysError (ERROR_FORK);
 
                if (Printer_pid == 0) {
-                       TRACE(((char *)0))
 +                       TRACE(((char *)0));
                         close(my_pipe[1]);      /* printer is silent */
                        close (screen->respond);
 
@@ -363,8 +391,9 @@
                        close(my_pipe[0]);      /* won't read from printer */
                        Printer = fdopen(my_pipe[1], "w");
                        TRACE(("opened printer from pid %d/%d\n",
-                               (int)getpid(), Printer_pid))
 +                               (int)getpid(), Printer_pid));
                 }
+#endif
                initialized++;
        }
        if (Printer != 0) {
@@ -397,7 +426,7 @@
 {
        register TScreen *screen = &term->screen;
 
-       TRACE(("MediaCopy param=%d, private=%d\n", param, private_seq))
 +       TRACE(("MediaCopy param=%d, private=%d\n", param, private_seq));
  
        if (private_seq) {
                switch (param) {
@@ -406,11 +435,11 @@
                        break;
                case  4:
                        screen->printer_controlmode = 0;
-                       TRACE(("Reset autoprint mode\n"))
 +                       TRACE(("Reset autoprint mode\n"));
                         break;
                case  5:
                        screen->printer_controlmode = 1;
-                       TRACE(("Set autoprint mode\n"))
 +                       TRACE(("Set autoprint mode\n"));
                         break;
                case  10:       /* VT320 */
                        xtermPrintScreen(FALSE);
@@ -427,11 +456,11 @@
                        break;
                case  4:
                        screen->printer_controlmode = 0;
-                       TRACE(("Reset printer controller mode\n"))
 +                       TRACE(("Reset printer controller mode\n"));
                         break;
                case  5:
                        screen->printer_controlmode = 2;
-                       TRACE(("Set printer controller mode\n"))
 +                       TRACE(("Set printer controller mode\n"));
                         break;
                }
        }
@@ -448,7 +477,7 @@
        register TScreen *screen = &term->screen;
 
        if (screen->printer_controlmode == 1) {
-               TRACE(("AutoPrint %d\n", chr))
 +               TRACE(("AutoPrint %d\n", chr));
                 printLine(screen->cursor_row, chr);
                if (Printer != 0)
                        fflush(Printer);
@@ -485,7 +514,7 @@
        static size_t length;
        size_t n;
 
-       TRACE(("In printer:%d\n", chr))
 +       TRACE(("In printer:%d\n", chr));
  
        switch (chr) {
        case 0:
@@ -507,7 +536,7 @@
                         && Strcmp(bfr, tbl[n].seq) == 0) {
                                screen->printer_controlmode = tbl[n].active;
                                TRACE(("Set printer controller mode %sactive\n",
-                                       tbl[n].active ? "" : "in"))
 +                                       tbl[n].active ? "" : "in"));
                                 if (screen->printer_autoclose
                                 && screen->printer_controlmode == 0)
                                        closePrinter();
Index: ptydata.c
--- xterm-124+/ptydata.c        Thu Dec 30 05:01:00 1999
 +++ xterm-125/ptydata.c Sun Jan 30 11:33:51 2000
 @@ -4,7 +4,7 @@
  
 /************************************************************
 
-Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -168,7 +168,7 @@
                TRACE(("UTF-8 count %d, char %04X input %d/%d bytes\n",
                        screen->utf_count,
                        screen->utf_char,
-                       data->cnt, j))
 +                       data->cnt, j));
                 data->cnt = j;
            } else {
                for (i = 0; i < data->cnt; i++)
@@ -183,10 +183,10 @@
            }
 #if OPT_TRACE
            for (i = 0; i < data->cnt; i++) {
-               if (!(i%8)) TRACE(("%s", i ? "\n    " : "READ"))
 -               TRACE((" %04X", data->ptr[i]))
 +               if (!(i%8)) TRACE(("%s", i ? "\n    " : "READ"));
 +               TRACE((" %04X", data->ptr[i]));
             }
-           TRACE(("\n"))
 +           TRACE(("\n"));
  #endif
            return (data->cnt);
        }
Index: ptyx.h
--- xterm-124+/ptyx.h   Fri Jan 21 19:19:54 2000
 +++ xterm-125/ptyx.h    Mon Jan 31 11:00:33 2000
 @@ -4,7 +4,7 @@
   */
 
 /*
- * Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 + * Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
   *
  *                         All Rights Reserved
  *
@@ -794,6 +794,7 @@
        int             cur_foreground; /* current foreground color     */
        int             cur_background; /* current background color     */
        int             sgr_foreground; /* current SGR foreground color */
+       Boolean         sgr_extended;   /* SGR set with extended codes? */
  #endif
 } SavedCursor;
 
@@ -1104,9 +1105,17 @@
 
 #define MULTICLICKTIME 250     /* milliseconds */
 
+typedef enum {
+    keyboardIsDefault,
+    keyboardIsHP,
 +    keyboardIsSun,
+    keyboardIsVT220,
 +} xtermKeyboardType;
+
 typedef struct
 {
-       unsigned        flags;
 +    xtermKeyboardType type;
 +    unsigned   flags;
  } TKeyboard;
 
 typedef struct _Misc {
@@ -1208,6 +1217,7 @@
     Pixel       dft_background;        /* default background color     */
 #if OPT_ISO_COLORS
     int         sgr_foreground;        /* current SGR foreground color */
+    Boolean     sgr_extended;  /* SGR set with extended codes? */
  #endif
 #if OPT_ISO_COLORS || OPT_DEC_CHRSET || OPT_WIDE_CHARS
     int         num_ptrs;      /* number of pointers per row in 'ScrnBuf' */
Index: screen.c
--- xterm-124+/screen.c Thu Dec 30 05:01:00 1999
 +++ xterm-125/screen.c  Sun Jan 30 11:34:22 2000
 @@ -3,7 +3,7 @@
   */
 
 /*
- * Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 + * Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
   *
  *                         All Rights Reserved
  *
@@ -633,7 +633,7 @@
        TRACE(("ScrnRefresh (%d,%d) - (%d,%d)%s\n",
                toprow, leftcol,
                nrows, ncols,
-               force ? " force" : ""))
 +               force ? " force" : ""));
  
        if(screen->cursor_col >= leftcol
        && screen->cursor_col <= (leftcol + ncols - 1)
@@ -818,7 +818,7 @@
                        lastind, col,
                        visibleChars(
                                PAIRED_CHARS(&chars[lastind], WIDEC_PTR(lastind)),
-                               col - lastind)))
 +                               col - lastind)));
                    x = drawXtermText(screen, flags, gc, x, y,
                        cs,
                        PAIRED_CHARS(&chars[lastind], WIDEC_PTR(lastind)),
@@ -859,7 +859,7 @@
           TRACE(("%s @%d, calling drawXtermText %d..%d:%s\n",
                __FILE__, __LINE__,
                lastind, col,
-               visibleChars(PAIRED_CHARS(&chars[lastind], WIDEC_PTR(lastind)), col - lastind)))
 +               visibleChars(PAIRED_CHARS(&chars[lastind], WIDEC_PTR(lastind)), col - lastind)));
            drawXtermText(screen, flags, gc, x, y,
                cs,
                PAIRED_CHARS(&chars[lastind], WIDEC_PTR(lastind)),
@@ -908,7 +908,7 @@
        register int row;
        register int flags = TERM_COLOR_FLAGS;
 
-       TRACE(("ClearBufRows %d..%d\n", first, last))
 +       TRACE(("ClearBufRows %d..%d\n", first, last));
         for (row = first; row <= last; row++) {
            ScrnClrWrapped(screen, row);
            bzero (BUF_CHARS(buf, row), len);
@@ -963,7 +963,7 @@
 #endif /* sun vs TIOCSWINSZ */
        Window tw = VWindow (screen);
 
-       TRACE(("ScreenResize %dx%d\n", height, width))
 +       TRACE(("ScreenResize %dx%d\n", height, width));
  
        /* clear the right and bottom internal border because of NorthWest
           gravity might have left junk on the right and bottom edges */
@@ -995,7 +995,7 @@
                 screen->savelines : 0;
                int delta_rows = rows - (screen->max_row + 1);
 
-               TRACE(("...ScreenResize chars %dx%d\n", rows, cols))
 +               TRACE(("...ScreenResize chars %dx%d\n", rows, cols));
  
                if(screen->cursor_state)
                        HideCursor();
@@ -1081,7 +1081,7 @@
        ts.ts_lines = rows;
        ts.ts_cols = cols;
        code = ioctl (screen->respond, TIOCSSIZE, &ts);
-       TRACE(("return %d from TIOCSSIZE %dx%d\n", code, rows, cols))
 +       TRACE(("return %d from TIOCSSIZE %dx%d\n", code, rows, cols));
  #ifdef SIGWINCH
        if(screen->pid > 1) {
                int     pgrp;
@@ -1097,7 +1097,7 @@
        ws.ws_xpixel = width;
        ws.ws_ypixel = height;
        code = ioctl (screen->respond, TIOCSWINSZ, (char *)&ws);
-       TRACE(("return %d from TIOCSWINSZ %dx%d\n", code, rows, cols))
 +       TRACE(("return %d from TIOCSWINSZ %dx%d\n", code, rows, cols));
  #ifdef notdef  /* change to SIGWINCH if this doesn't work for you */
        if(screen->pid > 1) {
                int     pgrp;
@@ -1107,7 +1107,7 @@
        }
 #endif /* SIGWINCH */
 #else
-       TRACE(("ScreenResize cannot do anything to pty\n"))
 +       TRACE(("ScreenResize cannot do anything to pty\n"));
  #endif /* sun vs TIOCSWINSZ */
        return (0);
 }
Index: scrollbar.c
--- xterm-124+/scrollbar.c      Sun Aug 22 14:20:13 1999
 +++ xterm-125/scrollbar.c       Sun Jan 30 11:33:51 2000
 @@ -4,6 +4,35 @@
   */
 
 /*
+ * Copyright 2000 by Thomas E. Dickey <dickey@clark.net>
 + *
+ *                         All Rights Reserved
 + *
+ * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the
 + * "Software"), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sublicense, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
+ *
 + * The above copyright notice and this permission notice shall be included
 + * in all copies or substantial portions of the Software.
 + *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
 + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 + *
+ * Except as contained in this notice, the name(s) of the above copyright
 + * holders shall not be used in advertising or otherwise to promote the
 + * sale, use or other dealings in this Software without prior written
 + * authorization.
+ *
+ *
  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
  *
  *                         All Rights Reserved
@@ -110,7 +139,7 @@
         */
 
        TRACE(("ResizeScreen(min_width=%d, min_height=%d) xw=%#lx\n",
-               min_width, min_height, (long) xw))
 +               min_width, min_height, (long) xw));
  
 #ifndef nothack
        /*
@@ -155,13 +184,13 @@
        TRACE(("...requesting screensize chars %dx%d, pixels %dx%d\n",
                (screen->max_row + 1),
                (screen->max_col + 1),
-               reqHeight, reqWidth))
 +               reqHeight, reqWidth));
  
        geomreqresult = XtMakeResizeRequest ((Widget)xw, reqWidth, reqHeight,
                                             &repWidth, &repHeight);
 
        if (geomreqresult == XtGeometryAlmost) {
-           TRACE(("...almost, retry screensize %dx%d\n", repHeight, repWidth))
 +           TRACE(("...almost, retry screensize %dx%d\n", repHeight, repWidth));
             geomreqresult = XtMakeResizeRequest ((Widget)xw, repWidth,
                                                  repHeight, NULL, NULL);
        }
Index: tabs.c
--- xterm-124+/tabs.c   Sun Oct 25 13:31:39 1998
 +++ xterm-125/tabs.c    Sat Jan 29 19:46:24 2000
 @@ -4,6 +4,34 @@
   */
 
 /*
+ * Copyright 2000 by Thomas E. Dickey <dickey@clark.net>
 + *
+ *                         All Rights Reserved
 + *
+ * Permission is hereby granted, free of charge, to any person obtaining a
 + * copy of this software and associated documentation files (the
 + * "Software"), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sublicense, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
+ *
 + * The above copyright notice and this permission notice shall be included
 + * in all copies or substantial portions of the Software.
 + *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY
 + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 + *
+ * Except as contained in this notice, the name(s) of the above copyright
 + * holders shall not be used in advertising or otherwise to promote the
 + * sale, use or other dealings in this Software without prior written
 + * authorization.
+ *
  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
  *
  *                         All Rights Reserved
@@ -87,7 +115,7 @@
        register TScreen *screen = &term->screen;
 
        if(screen->curses && screen->do_wrap && (term->flags & WRAPAROUND)) {
-               Index(screen, 1);
 +               xtermIndex(screen, 1);
                 col = screen->cur_col = screen->do_wrap = 0;
        }
        for (++col; col<MAX_TABS; ++col)
Index: termcap
--- xterm-124+/termcap  Sun Jan 30 18:41:54 2000
 +++ xterm-125/termcap   Mon Jan 31 19:37:02 2000
 @@ -132,7 +132,7 @@
         :k5=\E[228z:k6=\E[229z:k7=\E[230z:k8=\E[231z:\
        :k9=\E[232z:k;=\E[233z:F1=\E[192z:F2=\E[193z:\
        :%1=\E[196z:&8=\E[195z:@0=\E[200z:kI=\E[2z:\
-       :kN=\E[222z:kP=\E[216z:kh=\E[214z:as@:ae@:ac@:tc=xterm:
 +       :kN=\E[222z:kP=\E[216z:kh=\E[214z:kD=^?:as@:ae@:ac@:tc=xterm:
  #
 # vi may work better with this entry, because vi doesn't use insert mode much.
 # |xterm-ic|xterm-vi|xterm with insert character instead of insert mode:\
Index: terminfo
--- xterm-124+/terminfo Sun Jan 30 18:41:54 2000
 +++ xterm-125/terminfo  Mon Jan 31 12:08:22 2000
 @@ -343,6 +343,7 @@
         kcud1=\EOB,
        kcuf1=\EOC,
        kcuu1=\EOA,
+       kdch1=\177,
         kend=\E[220z,
        kent=\EOM,
        kf1=\E[224z,
Index: testxmc.c
--- xterm-124+/testxmc.c        Mon May  3 16:47:48 1999
 +++ xterm-125/testxmc.c Sun Jan 30 11:34:22 2000
 @@ -4,7 +4,7 @@
  
 /************************************************************
 
-Copyright 1997 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1997-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -136,7 +136,7 @@
        if (found) {
                unsigned save = term->flags;
                term->flags ^= whichone;
-               TRACE(("XMC Writing glitch (%d/%d) after SGR %d\n", my_attrs, whichone, param))
 +               TRACE(("XMC Writing glitch (%d/%d) after SGR %d\n", my_attrs, whichone, param));
                 dotext(screen, '?', glitch, screen->xmc_glitch);
                term->flags = save;
        }
@@ -202,7 +202,7 @@
                changed ? "Ripple" : "Nochange",
                term->flags & my_attrs ? "on" : "off",
                my_attrs, start,
-               screen->cur_row, screen->cur_col, row, col))
 +               screen->cur_row, screen->cur_col, row, col));
  
        if (changed) {
                ScrnRefresh (screen, screen->cur_row, 0, row + 1 - screen->cur_row, screen->max_col + 1, True);
Index: trace.h
--- xterm-124+/trace.h  Tue Jan 25 01:45:01 2000
 +++ xterm-125/trace.h   Sun Jan 30 11:27:14 2000
 @@ -46,7 +46,7 @@
         __attribute__ ((format(printf,1,2)))
 #endif
        ;
-#define TRACE(p) Trace p;
+#define TRACE(p) Trace p
  
 extern char *  visibleChars (PAIRED_CHARS(Char *buf, Char *buf2), unsigned len);
 extern char *  visibleIChar (IChar *, unsigned);
Index: util.c
--- xterm-124+/util.c   Fri Jan 21 19:19:54 2000
 +++ xterm-125/util.c    Mon Jan 31 11:54:14 2000
 @@ -4,7 +4,7 @@
   */
 
 /*
- * Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 + * Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
   *
  *                         All Rights Reserved
  *
@@ -64,6 +64,7 @@
 #include <menu.h>
 #include <fontutils.h>
 
+#include <stdio.h>
 #include <ctype.h>
 
 extern Bool waiting_for_initial_map;
@@ -191,7 +192,7 @@
  * requires: amount > 0
  */
 void
-Scroll(register TScreen *screen, register int amount)
 +xtermScroll(register TScreen *screen, register int amount)
  {
        register int i = screen->bot_marg - screen->top_marg + 1;
        register int shift;
@@ -1088,7 +1089,7 @@
        register int toprow, leftcol, nrows, ncols;
 
        TRACE(("handle_translated_exposure (%d,%d) - (%d,%d)\n",
-               rect_y, rect_x, rect_height, rect_width))
 +               rect_y, rect_x, rect_height, rect_width));
  
        toprow = (rect_y - screen->border) / FontHeight(screen);
        if(toprow < 0)
@@ -1401,7 +1402,7 @@
 
                TRACE(("DRAWTEXT%c[%4d,%4d] (%d) %d:%.*s\n",
                        screen->cursor_state == OFF ? ' ' : '*',
-                       y, x, chrset, len, (int)len, text))
 +                       y, x, chrset, len, (int)len, text));
  
                if (gc2 != 0) { /* draw actual double-sized characters */
                        XFontStruct *fs = screen->double_fonts[xterm_Double_index(chrset, flags)].fs;
@@ -1476,7 +1477,7 @@
                                x += len * FontWidth(screen);
                        }
 
-                       TRACE(("drewtext [%4d,%4d]\n", y, x))
 +                       TRACE(("drewtext [%4d,%4d]\n", y, x));
                         SAVE_FONT_INFO (screen);
 
                } else {        /* simulate double-sized characters */
@@ -1556,7 +1557,7 @@
                TRACE(("drawtext%c[%4d,%4d] (%d) %d:%s\n",
                        screen->cursor_state == OFF ? ' ' : '*',
                        y, x, chrset, len,
-                       visibleChars(PAIRED_CHARS(text, text2), len)))
 +                       visibleChars(PAIRED_CHARS(text, text2), len)));
                 y += FontAscent(screen);
 
 #if OPT_WIDE_CHARS
@@ -1890,4 +1891,51 @@
 #endif
        }
        return ch;
+}
+
+void set_keyboard_type(xtermKeyboardType type, Bool set)
 +{
+    xtermKeyboardType save = term->keyboard.type;
 +
+    if (set) {
+       term->keyboard.type = type;
 +    } else {
+       term->keyboard.type = keyboardIsDefault;
 +    }
+
+    if (save != term->keyboard.type) {
 +       update_hp_fkeys();
 +       update_sun_fkeys();
 +       update_sun_kbd();
 +    }
+}
+
+void toggle_keyboard_type(xtermKeyboardType type)
 +{
+    xtermKeyboardType save = term->keyboard.type;
 +
+    if (term->keyboard.type == type) {
 +       term->keyboard.type = keyboardIsDefault;
 +    } else {
+       term->keyboard.type = type;
 +    }
+
+    if (save != term->keyboard.type) {
 +       update_hp_fkeys();
 +       update_sun_fkeys();
 +       update_sun_kbd();
 +    }
+}
+
+void init_keyboard_type(xtermKeyboardType type, Bool set)
 +{
+    static Bool wasSet = False;
 +
+    if (set) {
+       if (wasSet) {
 +           fprintf(stderr, "Conflicting keyboard type option\n");
 +       }
+       term->keyboard.type = type;
 +       wasSet = True;
 +    }
 }
Index: version.h
--- xterm-124+/version.h        Sun Jan 30 18:41:54 2000
 +++ xterm-125/version.h Mon Jan 31 20:34:27 2000
 @@ -6,5 +6,5 @@
   * XFree86 to which this version of xterm has been built.  The number in
  * parentheses is my patch number (T.Dickey).
  */
-#define XTERM_PATCH   124
-#define XFREE86_VERSION "XFree86 3.9.17b"
 +#define XTERM_PATCH   125
+#define XFREE86_VERSION "XFree86 3.9.17c"
 Index: vms.c
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/vms.c     Sun Jan 30 14:47:04 2000
 @@ -0,0 +1,725 @@
 +/* $XFree86$ */
+
+/*  vms.c
+ *
+ * This module contains the VMS version of the routine SPAWN (from the module
 + * MAIN.C) and the routines that do IO to the pseudo terminal.
 + *
+ * Modification History:
+ * Stephan Jansen 1-Mar-1990  Original version
 + * Hal R. Brand   5-Sep-1990  Added code to propagate DECW$DISPLAY
 + * Aaron Leonard 11-Sep-1990  Fix string descriptor lengths
 + * Stephan Jansen 2-Dec-1991  Modify to use new Pseudo terminal drivers
 + *                            (patterned after photo.c by Forrest A. Kenney)
 + * Patrick Mahan  7-Jan-1991  Removed reference to <dvidef.h> from VMS.C
 + *                           Forced device type to be VT102 since that is
 + *                           what we are emulating.
 + */
+
+#include <libdef.h>
+#include <lnmdef.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "ptyx.h"
+#include "data.h"
+#include "vms.h"
+
+#define PTD$C_SEND_XON         0       /* Pseudo Terminal Driver event      */
 +#define PTD$C_SEND_BELL                1
 +#define PTD$C_SEND_XOFF        2
 +#define PTD$C_STOP_OUTPUT      3
 +#define PTD$C_RESUME_OUTPUT    4
 +#define PTD$C_CHAR_CHANGED     5
 +#define PTD$C_ABORT_OUTPUT     6
 +#define PTD$C_START_READ       7
 +#define PTD$C_MIDDLE_READ      8
 +#define PTD$C_END_READ                 9
 +#define PTD$C_ENABLE_READ      10
 +#define PTD$C_DISABLE_READ     11
 +#define PTD$C_MAX_EVENTS       12
 +
+#define        BUFFERS                 6
 +#define        PAGE                    512
 +
+typedef struct tt_buffer
+{
 +unsigned int   flink;
+unsigned int   blink;
 +short  int     status;
 +short  int     length;
 +char           data[VMS_TERM_BUFFER_SIZE];
 +} TT_BUF_STRUCT;
+
+TT_BUF_STRUCT          *tt_w_buff;
 +struct q_head           _align(QUADWORD)       buffer_queue = (0,0);
 +struct q_head           _align(QUADWORD)       read_queue = (0,0);
 +
+static char          tt_name[64];
 +static $DESCRIPTOR   (tt_name_desc, &tt_name);
 +
+static char          ws_name[64];
 +static $DESCRIPTOR   (ws_name_desc, &ws_name);
 +
+static struct        tt_char {
 +   char        class;
 +   char        type;
 +   short int   page_width;
 +   char        characteristics[3];
 +   char        length;
 +   int         extended;
 + } tt_mode, tt_chars, orig_tt_chars;
 +
+struct mem_region
+{
+  TT_BUF_STRUCT *start;
+  TT_BUF_STRUCT *end;
 +} ret_addr;
+
+int read_stopped = FALSE;
+int write_stopped = FALSE;
 +
+int tt_width;
+int tt_length;
+int tt_changed;
+int tt_pasting=FALSE;         /* drm */
 +int tt_new_output=FALSE;      /* Cleared by flushlog(), set whenever something new
 +   goes to the screen through tt_write */
 +
+int trnlnm(char *in,int id,char *out);
 +int tt_write(char *tt_write_buf,int size);
 +void spawn (void);
+
+static void tt_echo_ast(TT_BUF_STRUCT *buff_addr);
 +static void tt_read_ast(TT_BUF_STRUCT *buff_addr);
 +
+/*
+static void tt_start_read(void);
+*/
 +void tt_start_read(void);
+int tt_read(char *buffer);
+static void send_xon(void);
 +static void send_xoff(void);
+static void send_bell(void);
 +static void char_change(void);
+static void freeBuff (TT_BUF_STRUCT *buff_addr);
 +TT_BUF_STRUCT *getBuff(void);
+static void CloseDown(int exit_status);
 +static void mbx_read_ast(void);
+static void mbx_read(void);
 +
+
+
+#define DESCRIPTOR(name,string) struct dsc$descriptor_s name = \
 +{ strlen(string), DSC$K_DTYPE_T, DSC$K_CLASS_S, string }
 +
+int trnlnm(char *in, int id, char *out)
 +{
+  int status, num, len, attr = LNM$M_CASE_BLIND, foo = id;
 +  short outlen;
+  struct itemlist
+    {
 +      short buffer_length;
 +      short item_code;
 +      char  *buffer_addr;
 +      int   *return_length;
 +    } itmlst[] =
+      {
 +       4  , LNM$_INDEX    , &foo, 0,
 +       255, LNM$_STRING   , out , &outlen,
 +       4  , LNM$_MAX_INDEX, &num, &len,
 +       0  , 0
 +       };
+  DESCRIPTOR(lognam,in);
 +  DESCRIPTOR(tabnam,"LNM$DCL_LOGICAL");
+
 +  status = sys$trnlnm(&attr,&tabnam,&lognam,0,itmlst);
 +  if(status != SS$_NORMAL) return(-1);   /* error status */
 +  out[outlen] = 0;         /* terminate the output string */
 +  return(++num);         /* return number of translations */
 +}
+
+static int           pty;
 +static int           Xsocket;
 +
+void spawn (void)
+{
+  int                  status;
 +  static $DESCRIPTOR   (dtime, "0 00:00:00.01");
 +  static int           delta[2];
 +  register TScreen     *screen = &term->screen;
 +  static struct IOSB   iosb;
 +  static unsigned int  flags;
 +  static unsigned int  uic;
 +  static char          imagename[64];
 +  static int           privs;
 +  static $DESCRIPTOR(device, "FTA0:");
 +  static int           type;
 +  static int           class;
 +  static int           devdepend;
 +  static int           mem_size;
 +  int                  i;
 +
+  /* if pid and mbx_chan are nonzero then close them in CloseDown() */
 +  pid = 0;
+  mbx_chan = 0;
+
 +  status = SYS$EXPREG (BUFFERS, &ret_addr, 0, 0);
 +  if(!(status & SS$_NORMAL)) lib$signal(status);
 +
+  tt_w_buff = (char *)ret_addr.end - PAGE + 1;
 +
+  /* use one buffer for writing, the reset go in the free buffer queue */
 +  for(i=0; i < BUFFERS-1; i++)
 +    {
+      freeBuff((char *)ret_addr.start +i*PAGE);
 +    }
+
+  /* avoid double MapWindow requests, for wm's that care... */
 +  XtSetMappedWhenManaged( screen->TekEmu ? XtParent(tekWidget) :
 +                        XtParent(term), False );
 +  /* Realize the Tek or VT widget, depending on which mode we're in.
 +     If VT mode, this calls VTRealize (the widget's Realize proc) */
 +  XtRealizeWidget (screen->TekEmu ? XtParent(tekWidget) :
 +                  XtParent(term));
 +
+  /* get the default device characteristics of the pseudo terminal */
 +
+  itemlist[0].buflen      = 4;
 +  itemlist[0].code        = DVI$_DEVTYPE;
 +  itemlist[0].buffer      = &type;
 +  itemlist[0].return_addr = &tt_name_desc.dsc$w_length;
 +
+  itemlist[1].buflen      = 4;
 +  itemlist[1].code        = DVI$_DEVCLASS;
 +  itemlist[1].buffer      = &class;
 +  itemlist[1].return_addr = &tt_name_desc.dsc$w_length;
 +
+  itemlist[2].buflen      = 4;
 +  itemlist[2].code        = DVI$_DEVDEPEND;
 +  itemlist[2].buffer      = &devdepend;
 +  itemlist[2].return_addr = &tt_name_desc.dsc$w_length;
 +
+  itemlist[3].buflen      = 4;
 +  itemlist[3].code        = DVI$_DEVDEPEND2;
 +  itemlist[3].buffer      = &tt_chars.extended;
 +  itemlist[3].return_addr = &tt_name_desc.dsc$w_length;
 +
+  itemlist[4].buflen      = 0;
 +  itemlist[4].code        = 0;
 +
+
+  status = sys$getdviw(0,0,&device,&itemlist,&iosb,0,0,0);
 +  if(!(status & SS$_NORMAL)) lib$signal(status);
 +  if(!(iosb.status & SS$_NORMAL)) lib$signal(iosb.status);
 +
+  tt_chars.type        = DT$_VT102; /* XTerm supports VT102 mode */
 +  tt_chars.class       = class;
 +  tt_chars.page_width  = screen->max_col+1;
 +  tt_chars.length      = screen->max_row+1;
 +
+  /* copy the default char's along with the created window size */
 +
+  bcopy(&devdepend, &tt_chars.characteristics, 3);
 +
+  tt_chars.extended |= TT2$M_ANSICRT | TT2$M_AVO | TT2$M_DECCRT;
 +
+
+  /* create the pseudo terminal with the proper char's */
 +  status = ptd$create(&tt_chan,0,&tt_chars,12,0,0,0,&ret_addr);
 +  if(!(status & SS$_NORMAL)) lib$signal(status);
 +
+
+  /* get the device name of the Pseudo Terminal */
 +
+  itemlist[0].buflen      = 64;
 +  itemlist[0].code        = DVI$_DEVNAM;
 +  itemlist[0].buffer      = &tt_name;
 +  itemlist[0].return_addr = &tt_name_desc.dsc$w_length;
 +
+  /* terminate the list */
 +  itemlist[1].buflen      = 0;
 +  itemlist[1].code        = 0;
 +
+  status = sys$getdviw(0,tt_chan,0,&itemlist,&iosb,0,0,0);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +  if(!(iosb.status & SS$_NORMAL)) CloseDown(iosb.status);
 +
+  /*
+   * set up AST's for XON, XOFF, BELL and characteristics change.
 +   */
+
+  status = ptd$set_event_notification(tt_chan,&send_xon,0,0,PTD$C_SEND_XON);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+  status = ptd$set_event_notification(tt_chan,&send_xoff,0,0,PTD$C_SEND_XOFF);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+  status = ptd$set_event_notification(tt_chan,&send_bell,0,0,PTD$C_SEND_BELL);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+  status = ptd$set_event_notification(tt_chan,&char_change,0,0,PTD$C_CHAR_CHANGED);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+  /* create a mailbox for the detached process to detect hangup */
 +
+  status = sys$crembx(0,&mbx_chan,ACC$K_TERMLEN,0,255,0,0);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+
+  /*
+   * get the device unit number for created process completion
 +   * status to be sent to.
 +   */
+
+  itemlist[0].buflen      = 4;
 +  itemlist[0].code        = DVI$_UNIT;
 +  itemlist[0].buffer      = &mbxunit;
 +  itemlist[0].return_addr = 0;
+
 +  /* terminate the list */
 +  itemlist[1].buflen      = 0;
 +  itemlist[1].code        = 0;
 +
+  status = sys$getdviw(0,mbx_chan,0,&itemlist,&iosb,0,0,0);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +  if(!(iosb.status & SS$_NORMAL)) CloseDown(iosb.status);
 +
+
+  tt_start_read();
+
+  /*
+   * find the current process's UIC so that it can be used in the
 +   * call to sys$creprc
 +   */
+  itemlist[0].buflen = 4;
+  itemlist[0].code = JPI$_UIC;
 +  itemlist[0].buffer = &uic;
 +  itemlist[0].return_addr = 0;
+
 +  /* terminate the list */
 +  itemlist[1].buflen      = 0;
 +  itemlist[1].code        = 0;
 +
+  status = sys$getjpiw(0,0,0,&itemlist,0,0,0);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+  /* Complete a descriptor for the WS (DECW$DISPLAY) device */
 +
+  trnlnm("DECW$DISPLAY",0,ws_name);
+  ws_name_desc.dsc$w_length = strlen(ws_name);
 +
+  /* create the process */
 +  /*  Set sys$error to be the WS (DECW$DISPLAY) device. LOGINOUT  */
 +  /*  has special code for DECWINDOWS that will:                  */
 +  /*    1) do a DEFINE/JOB DECW$DISPLAY 'f$trnlnm(sys$error)'     */
 +  /*    2) then redefine SYS$ERROR to match SYS$OUTPUT!           */
 +  /*  This will propogate DECW$DISPLAY to the XTERM process!!!    */
 +  /*  Thanks go to Joel M Snyder who posted this info to INFO-VAX */
 +
+  flags = PRC$M_INTER | PRC$M_NOPASSWORD | PRC$M_DETACH;
 +  status = sys$creprc(&pid,&image,&tt_name_desc,&tt_name_desc,
 +                     &ws_name_desc,0,0,0,4,uic,mbxunit,flags);
 +  if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+
+  /* hang a read on the mailbox waiting for completion */
 +  mbx_read();
+
+
+/* set time value and schedule a periodic wakeup (every 1/100 of a second)
 + * this is used to prevent the controlling process from using up all the
 + * CPU.  The controlling process will hibernate at strategic points in
 + * the program when it is just waiting for input.
 + */
+
+  status = sys$bintim(&dtime,&delta);
 +  if (!(status & SS$_NORMAL)) CloseDown(status);
 +
+  status = sys$schdwk(0,0,&delta,&delta);
 +  if (!(status & SS$_NORMAL)) CloseDown(status);
 +
+
+  /*
+   * This is rather funky, but it saves me from having to totally
 +   * rewrite some parts of the code (namely in_put in module CHARPROC.C)
 +   */
+  pty = 1;
+  screen->respond = pty;
+  pty_mask = 1 << pty;
 +  Select_mask = pty_mask;
+  X_mask = 1 << Xsocket;
 +
+}
+
+
+/*
+ * This routine handles completion of write with echo.  It takes the
 + * echo buffer and puts it on the read queue.  It will then be processed
 + * by the routine tt_read.  If the echo buffer is empty, it is put back
 + * on the free buffer queue.
 + */
+
+static void tt_echo_ast(TT_BUF_STRUCT *buff_addr)
 +{
+  int status;
+
+  if (buff_addr->length != 0)
 +    {
+      status = LIB$INSQTI(buff_addr, &read_queue);
 +      if((status != SS$_NORMAL) && (status != LIB$_ONEENTQUE))
 +       {
+         CloseDown(status);
 +       }
+    }
 +  else
+    {
+      freeBuff(buff_addr);
 +    }
+}
+
+
+/*
+ * This routine writes to the pseudo terminal.  If there is a free
 + * buffer then write with an echo buffer completing asyncronously, else
 + * write syncronously using the buffer reserved for writing.  All errors
 + *  are fatal, except DATAOVERUN and DATALOST,these errors can be ignored.
 +
+ CAREFUL! Whatever calls this must NOT pass more than VMS_TERM_BUFFER_SIZE
 + bytes at a time.  This definition has been moved to VMS.H
 +
+ */
+
+int tt_write(char *tt_write_buf, int size)
 +{
+  int status;
+  TT_BUF_STRUCT *echoBuff;
+
 +  /* if writing stopped, return 0 until Xon */
 +  if(write_stopped) return (0);
+
 +  memmove(&tt_w_buff->data,tt_write_buf,size);
 +
+  echoBuff = getBuff();
+  if (echoBuff != LIB$_QUEWASEMP)
 +    {
+      status = PTD$WRITE (tt_chan, &tt_echo_ast, echoBuff,
 +                         &tt_w_buff->status, size,
 +                         &echoBuff->status, VMS_TERM_BUFFER_SIZE);
 +    }
+  else
+    {
+      status = PTD$WRITE (tt_chan, 0, 0, &tt_w_buff->status, size, 0, 0);
 +    }
+  if (status & SS$_NORMAL)
 +    {
+      if ((tt_w_buff->status != SS$_NORMAL) &&
 +         (tt_w_buff->status != SS$_DATAOVERUN) &&
 +         (tt_w_buff->status != SS$_DATALOST))
 +       {
+         CloseDown(tt_w_buff->status);
 +       }
+    }
 +  else
+    {
+      CloseDown(status);
 +    }
+
+  return(size);
+}
+
+
+/*
+ * This routine is called when a read to the pseudo terminal completes.
 + * Put the newly read buffer onto the read queue.  It will be processed
 + * and freed in the routine tt_read.
 + */
+
+static void tt_read_ast(TT_BUF_STRUCT *buff_addr)
 +{
+  int status;
+
+  if (buff_addr->status & SS$_NORMAL)
 +    {
+      status = LIB$INSQTI(buff_addr, &read_queue);
 +      if ((status != SS$_NORMAL) && (status != LIB$_ONEENTQUE))
 +       {
+         CloseDown(status);
 +       }
+    }
 +  else
+    CloseDown(buff_addr->status);
 +
+  tt_start_read();
+  sys$wake(0,0);
+  return;
+}
+
+
+/*
+ * If there is a free buffer on the buffer queue then Start a read from
 + * the pseudo terminal, otherwise set a flag, the reading will be restarted
 + * in the routine freeBuff when a buffer is freed.
 + */
+
+void tt_start_read(void)
+{
+  int status;
+  static int size;
+  TT_BUF_STRUCT *buff_addr;
 +
+  buff_addr = getBuff();
+  if (buff_addr != LIB$_QUEWASEMP)
 +    {
+      if(!tt_pasting){
+      status = PTD$READ (0, tt_chan, &tt_read_ast, buff_addr,
 +                        &buff_addr->status, VMS_TERM_BUFFER_SIZE);
 +      if ((status & SS$_NORMAL) != SS$_NORMAL)
 +       {
+         CloseDown(status);
 +       }
+      }
 +      }
+  else
 +    {
+      read_stopped = TRUE;
 +    }
+  return;
+}
+
+
+/*
+ * Get data from the pseudo terminal.  Return the data from the first item
 + * on the read queue, and put that buffer back onto the free buffer queue.
 + * Return the length or zero if the read queue is empty.
 + *
+ */
+
+int tt_read(char *buffer)
+{
 +  TT_BUF_STRUCT *read_buff;
+  int status;
 +  int len;
+
+   status = LIB$REMQHI(&read_queue, &read_buff);
 +   if(status == LIB$_QUEWASEMP){
 +     return(0);
+   }
 +   else if (status & SS$_NORMAL)
 +     {
+       len = read_buff->length;
 +       memmove(buffer,&read_buff->data,len);
 +       freeBuff(read_buff);
 +       tt_new_output=TRUE; /* DRM something will be written */
 +     }
+   else
+     CloseDown(status);
+
 +   return(len);
+}
+
+
+/*
+ * if xon then it is safe to start writing again.
 + */
+
+static void send_xon(void)
+{
 +  write_stopped = FALSE;
+}
 +
+
+/*
+ * If Xoff then stop writing to the pseudo terminal until you get Xon.
 + */
+static void send_xoff(void)
+{
 +  write_stopped = TRUE;
+}
 +
+
+
+/*
+ * Beep the terminal to let the user know data will be lost because
 + * of too much data.
+ */
 +
+static void send_bell(void)
+{
 +   Bell();
+}
+
+/*
+ * if the pseudo terminal's characteristics change, check to see if the
 + * page size changed.  If it did, resize the widget, otherwise, ignore
 + * it!  This routine just gets the new term dimensions and sets a flag
 + * to indicate the term chars have changed.  The widget gets resized in
 + * the routine in_put in the module CHARPROC.C.  You cant resize the
 + * widget in this routine because this is an AST and X is not reenterent.
 + */
+
+static void char_change(void)
+{
 +  int status;
+
+  /*
+   * Dont do anything if in Tek mode
 +   */
+
+  if(!(term->screen.TekEmu))
+    {
 +      status = sys$qiow(0,tt_chan,IO$_SENSEMODE,0,0,0,&tt_mode,8,0,0,0,0);
 +      if(!(status & SS$_NORMAL)) CloseDown(status);
 +
+      if((term->screen.max_row != tt_mode.length) ||
 +        (term->screen.max_col != tt_mode.page_width))
 +       {
+         tt_length = tt_mode.length;
 +         tt_width =  tt_mode.page_width;
 +
+         tt_changed = TRUE;
 +
+       }
+    }
 +}
+
+
+/*
+ * Put a free buffer back onto the buffer queue.  If reading was
 + * stopped for lack of free buffers, start reading again.
 + */
+
+static void freeBuff (TT_BUF_STRUCT *buff_addr)
 +{
+  int ast_stat;
+  int status;
+
+  ast_stat = SYS$SETAST(0);
+  if (!read_stopped)
 +    {
+      LIB$INSQHI(buff_addr, &buffer_queue);
 +    }
+  else
+    {
+      status = PTD$READ (0, tt_chan, &tt_read_ast, buff_addr,
 +                        &buff_addr->status, VMS_TERM_BUFFER_SIZE);
 +      if (status & SS$_NORMAL)
 +       {
+         read_stopped = FALSE;
 +       }
+      else
 +       {
+         CloseDown(status);
 +       }
+    }
 +  if (ast_stat == SS$_WASSET) ast_stat = SYS$SETAST(1);
 +}
+
+
+/*
+ * return a free buffer from the buffer queue.
 + */
+
+TT_BUF_STRUCT *getBuff(void)
+{
 +  int status;
+  TT_BUF_STRUCT *buff_addr;
+
 +  status = LIB$REMQHI(&buffer_queue, &buff_addr);
 +  if (status & SS$_NORMAL)
 +    {
+      return(buff_addr);
 +    }
+  else
+    {
+      return(status);
+    }
 +}
+
+
+/*
+ * Close down and exit.  Kill the detached process (if it still
 + * exists), deassign mailbox channell (if assigned), cancel any
 + * waiting IO to the pseudo terminal and delete it, exit with any
 + * status information.
+ */
 +
+static void CloseDown(int exit_status)
 +{
+  int status;
+
+  /* if process has not terminated, do so now! */
 +  if(pid != 0)
+    {
 +      status = sys$forcex(&pid,0,0);
 +      if(!(status & SS$_NORMAL)) lib$signal(status);
 +    }
+
+  /* if mbx_chan is assigned, deassign it */
 +  if(mbx_chan != 0)
+    {
 +      sys$dassgn(mbx_chan);
 +    }
+
+  /* cancel pseudo terminal IO requests */
 +  status = ptd$cancel(tt_chan);
+  if(!(status & SS$_NORMAL)) lib$signal(status);
 +
+  /* delete pseudo terminal */
 +  status = ptd$delete(tt_chan);
+  if(!(status & SS$_NORMAL)) lib$signal(status);
 +
+  if(!(exit_status & SS$_NORMAL)) lib$signal(exit_status);
 +
+  exit(1);
+
+}
+
+
+/*
+ * This routine gets called when the detached process terminates (for
 + * whatever reason).  The mailbox buffer has final exit status.  Close
 + * down and exit.
+ */
 +
+static void mbx_read_ast(void)
+{
 +  int status;
+
+  pid = 0;
+
+  status = mbx_read_iosb.status;
 +  if (!(status & SS$_NORMAL)) CloseDown(status);
 +
+  status = (unsigned long int) mbx_buf.acc$l_finalsts;
 +  if (!(status & SS$_NORMAL)) CloseDown(status);
 +
+  CloseDown(1);
+
+}
+
+
+/*
+ * This routine starts a read on the mailbox associated with the detached
 + * process.  The AST routine gets called when the detached process terminates.
 + */
+
+static void mbx_read(void)
+{
 +int status;
+static int size;
+
+   size = ACC$K_TERMLEN;
+   status = sys$qio(0,mbx_chan,
 +          IO$_READVBLK,
 +          &mbx_read_iosb,
 +          &mbx_read_ast,
 +          0,
 +          &mbx_buf,
 +          size,0,0,0,0);
 +
+   if (!(status & SS$_NORMAL)) CloseDown(status);
 +
+   return;
+}
Index: vms.h
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/vms.h     Sun Jan 30 14:41:01 2000
 @@ -0,0 +1,39 @@
 +/* $XFree86$ */
+
+/* vms.h
+ */
+#include <ssdef.h>
+#include <iodef.h>
+#include <msgdef.h>
+#include <descrip.h>
+#include <dvidef.h>
+#include <jpidef.h>
+#include <prcdef.h>
+#include <dcdef.h>
+#include <ttdef.h>
+#include <tt2def.h>
+#include <accdef.h>
+#include <prvdef.h>
+
+struct IOSB
+{
+       short int status;
 +       short int len;
 +       int unused;
 +} mbx_read_iosb,iosb;
+
+#define MAXITEMLIST   5
+
 +short int      tt_chan;    /* channel to the Pseudo terminal */
 +short int      mbx_chan;   /* channel to the mailbox */
 +struct accdef  mbx_buf;    /* mailbox buffer */
 +short int      mbxunit;    /* mailbox unit number */
 +int            pid;            /* PID of created process */
 +static $DESCRIPTOR  (image, "SYS$SYSTEM:LOGINOUT.EXE");
 +
+static struct      items {
 +       short int       buflen;
 +       short int       code;
 +       int             buffer;
 +       int             return_addr;
 +} itemlist[MAXITEMLIST];
Index: xterm.dat
 --- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/xterm.dat Sun Jan 30 11:15:59 2000
 @@ -0,0 +1,153 @@
 +*title: Xterm
+*iconName: Xterm
+*c132: TRUE
+*scrollBar: on
+*saveLines:    1000
+XTerm.JoinSession:False
 +
+! turn off NumLock support - there is some conflict or problem on VMS
 +*numLock: false
+
+*SimpleMenu*BackingStore: NotUseful
+*SimpleMenu*menuLabel.font: -adobe-helvetica-bold-r-normal--*-120-*-*-*-*-iso*-*
 +*SimpleMenu*menuLabel.vertSpace:   100
 +*SimpleMenu*HorizontalMargins: 16
+*SimpleMenu*Sme.height:    16
 +*SimpleMenu*Cursor: left_ptr
+
 +*mainMenu.Label:  Main Options
+*mainMenu*securekbd*Label:  Secure Keyboard
 +*mainMenu*allowsends*Label:  Allow SendEvents
 +*mainMenu*logging*Label:  Log to File
 +*mainMenu*print*Label:  Print Window
+*mainMenu*redraw*Label:  Redraw Window
 +*mainMenu*8-bit control*Label: 8-Bit Controls
 +*mainMenu*backarrow key*Label: Backarrow Key
 +*mainMenu*num-lock*Label: Alt/NumLock Modifiers
 +*mainMenu*meta-esc*Label: Meta Sends Escape
 +*mainMenu*sun function-keys*Label: Sun Function-Keys
 +*mainMenu*sun keyboard*Label: VT220 Keyboard
 +*mainMenu*hp function-keys*Label: HP Function-Keys
 +*mainMenu*suspend*Label:  Send STOP Signal
 +*mainMenu*suspend*Sensitive: FALSE
+*mainMenu*continue*Label:  Send CONT Signal
 +*mainMenu*continue*Sensitive: FALSE
+*mainMenu*interrupt*Label:  Send INT Signal
 +*mainMenu*interrupt*Sensitive: FALSE
+*mainMenu*hangup*Label:  Send HUP Signal
 +*mainMenu*hangup*Sensitive: FALSE
+*mainMenu*terminate*Label:  Send TERM Signal
 +*mainMenu*terminate*Sensitive:  FALSE
+*mainMenu*kill*Label:  Send KILL Signal
 +*mainMenu*kill*Sensitive:  FALSE
+*mainMenu*quit*Label:  Quit
 +
+*vtMenu.Label:  VT Options
+*vtMenu*scrollbar*Label:  Enable Scrollbar
 +*vtMenu*jumpscroll*Label:  Enable Jump Scroll
 +*vtMenu*reversevideo*Label:  Enable Reverse Video
 +*vtMenu*autowrap*Label:  Enable Auto Wraparound
 +*vtMenu*reversewrap*Label:  Enable Reverse Wraparound
 +*vtMenu*autolinefeed*Label:  Enable Auto Linefeed
 +*vtMenu*appcursor*Label:  Enable Application Cursor Keys
 +*vtMenu*appkeypad*Label:  Enable Application Keypad
 +*vtMenu*scrollkey*Label:  Scroll to Bottom on Key Press
 +*vtMenu*scrollttyoutput*Label:  Scroll to Bottom on Tty Output
 +*vtMenu*allow132*Label: Allow 80/132 Column Switching
 +*vtMenu*cursesemul*Label:  Enable Curses Emulation
 +*vtMenu*visualbell*Label:  Enable Visual Bell
 +*vtMenu*marginbell*Label:  Enable Margin Bell
 +*vtMenu*cursorblink*Label: Enable Blinking Cursor
 +*vtMenu*titeInhibit*Label:  Enable Alternate Screen Switching
 +*vtMenu*activeicon*Label: Enable Active Icon
 +*vtMenu*softreset*Label:  Do Soft Reset
 +*vtMenu*hardreset*Label:  Do Full Reset
 +*vtMenu*clearsavedlines*Label:  Reset and Clear Saved Lines
 +*vtMenu*tekshow*Label:  Show Tek Window
 +*vtMenu*tekmode*Label:  Switch to Tek Mode
 +*vtMenu*vthide*Label:  Hide VT Window
 +*vtMenu*altscreen*Label:  Show Alternate Screen
 +
+*fontMenu.Label:  VT Fonts
+*fontMenu*fontdefault*Label:       Default
 +*VT100*font:               -bitstream-terminal-medium-r-normal-gs-18-180-75-75-c-110-iso8859-1
 +*fontMenu*font1*Label:     Tiny
 +*VT100*font1:              -misc-fixed-medium-r-normal--8-60-*-*-c-50-iso8859-1
 +*fontMenu*font2*Label:     Small
 +*VT100*font2:              -misc-fixed-medium-r-normal--10-70-*-*-c-60-iso8859-1
 +*fontMenu*font3*Label:     Medium
 +*VT100*font3:              -misc-fixed-medium-r-normal--13-120-*-*-c-70-iso8859-1
 +*fontMenu*font4*Label:     Large
 +*VT100*font4:              -bitstream-terminal-medium-r-normal-gs-18-180-75-75-c-110-iso8859-1
 +*fontMenu*font5*Label:     Huge
 +*VT100*font5:              -bitstream-terminal-medium-r-normal-gs-36-280-100-100-c-220-iso8859-1
 +*fontMenu*font6*Label:     Large-Narrow
 +*VT100*font6:              -bitstream-terminal-medium-r-narrow--18-180-75-75-c-70-iso8859-1
 +*fontMenu*fontescape*Label:        Escape Sequence
 +*fontMenu*fontsel*Label:           Selection
 +!fontescape and fontsel overridden by application
 +*fontMenu*font-doublesize*Label: Doublesized Characters
 +*fontMenu*font-loadable*Label: VT220 Soft Fonts
 +
+*tekMenu.Label:  Tek Options
+*tekMenu*tektextlarge*Label:  Large Characters
 +*tekMenu*tektext2*Label:  #2 Size Characters
 +*tekMenu*tektext3*Label:  #3 Size Characters
 +*tekMenu*tektextsmall*Label:  Small Characters
 +*tekMenu*tekpage*Label:  PAGE
+*tekMenu*tekreset*Label:  RESET
 +*tekMenu*tekcopy*Label:  COPY
+*tekMenu*vtshow*Label:  Show VT Window
 +*tekMenu*vtmode*Label:  Switch to VT Mode
 +*tekMenu*tekhide*Label:  Hide Tek Window
 +
+*tek4014*fontLarge: -misc-fixed-medium-r-normal--15-140-*-*-c-90-iso8859-1
 +*tek4014*font2: -misc-fixed-medium-r-normal--13-120-*-*-c-70-iso8859-1
 +*tek4014*font3: -misc-fixed-medium-r-normal--10-100-*-*-c-60-iso8859-1
 +*tek4014*fontSmall: -misc-fixed-medium-r-normal--8-80-*-*-c-50-iso8859-1
 +
+! Enable Colour by default.
+
 +*VT100*colorMode: on
+*VT100*boldColors: on
+*VT100*dynamicColors: on
+
+*VT100*highlightColor: red
+*VT100*cursorColor: white
+!bold text color
+*VT100*colorBDMode: on
+*VT100*colorBD: green
+!blinking text color
+*VT100*colorBLMode: on
+*VT100*colorBL: red
+
+
+! Uncomment this use color for underline attribute
 +!*VT100*colorULMode: on
+!*VT100*underLine: off
+
+! Uncomment this to use color for the bold attribute
 +*VT100*colorBDMode: on
+
+! Uncomment this to use the bold/underline colors in preference to other colors
 +*VT100*colorAttrMode: on
+
+*VT100*color0: black
+*VT100*color1: red3
+*VT100*color2: green3
+*VT100*color3: yellow3
+*VT100*color4: blue3
+*VT100*color5: magenta3
+*VT100*color6: cyan3
+*VT100*color7: gray90
+*VT100*color8: gray30
+*VT100*color9: red
+*VT100*color10: green
+*VT100*color11: yellow
+*VT100*color12: blue
+*VT100*color13: magenta
+*VT100*color14: cyan
+*VT100*color15: white
+*VT100*colorUL: yellow
+*VT100*colorBD: white
+
Index: xterm.h
--- xterm-124+/xterm.h  Sun Jan 30 18:41:54 2000
 +++ xterm-125/xterm.h   Mon Jan 31 19:50:44 2000
 @@ -2,7 +2,7 @@
  
 /************************************************************
 
-Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 +Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
  
                         All Rights Reserved
 
@@ -201,16 +201,6 @@
 
 /***====================================================================***/
 
-#ifndef HAVE_CONFIG_H
-
-#if defined(_POSIX_VDISABLE) && (_POSIX_VDISABLE != -1) && defined(HAVE_UNISTD_H)
 -#define HAVE_POSIX_VDISABLE 1
-#endif
 -
-#endif /* HAVE_CONFIG_H */
-
 -/***====================================================================***/
 -
 #define XtNallowSendEvents     "allowSendEvents"
 #define XtNalwaysHighlight     "alwaysHighlight"
 #define XtNanswerbackString    "answerbackString"
@@ -396,6 +386,15 @@
 #define XtCGeometry            "Geometry"
 #endif
 
+#ifdef VMS
+#define        XtCbackground           "background"
 +#define        XtCbordercolor          "borderColor"
 +#define        XtCborderwidth          "borderWidth"
 +#define        XtCforeground           "foreground"
 +#define        XtCfont                 "font"
 +#define        XtCiconic               "iconic"
 +#endif
+
 /***====================================================================***/
 
 #ifdef __cplusplus
@@ -488,8 +487,8 @@
 extern void CursorSave (XtermWidget tw);
 extern void CursorSet (TScreen *screen, int row, int col, unsigned flags);
 extern void CursorUp (TScreen *screen, int  n);
-extern void Index (TScreen *screen, int amount);
  extern void RevIndex (TScreen *screen, int amount);
+extern void xtermIndex (TScreen *screen, int amount);
  
 /* doublechr.c */
 extern void xterm_DECDHL (Bool top);
@@ -557,9 +556,6 @@
 extern void Panic (char *s, int a);
 extern void Redraw (void);
 extern void ReverseOldColors (void);
-extern void Setenv (char *var, char *value);
 -extern void SysError (int i);
-extern void VisualBell (void);
  extern void creat_as (int uid, int gid, char *pathname, int mode);
 extern void do_dcs (Char *buf, size_t len);
 extern void do_osc (Char *buf, int len, int final);
@@ -572,7 +568,10 @@
 extern void set_tek_visibility (Boolean on);
 extern void set_vt_visibility (Boolean on);
 extern void switch_modes (Bool tovt);
+extern void SysError (int i);
+extern void VisualBell (void);
  extern void xevents (void);
+extern void xtermSetenv (char *var, char *value);
  extern void xt_error (String message);
 
 #if OPT_MAXIMIZE
@@ -677,12 +676,15 @@
 extern void InsertLine (TScreen *screen, int n);
 extern void RevScroll (TScreen *screen, int amount);
 extern void ReverseVideo (XtermWidget termw);
-extern void Scroll (TScreen *screen, int amount);
  extern void do_erase_display (TScreen *screen, int param, int mode);
 extern void do_erase_line (TScreen *screen, int param, int mode);
+extern void init_keyboard_type (xtermKeyboardType, Bool set);
  extern void recolor_cursor (Cursor cursor, unsigned long fg, unsigned long bg);
 extern void resetXtermGC (TScreen *screen, int flags, Bool hilite);
 extern void scrolling_copy_area (TScreen *screen, int firstline, int nlines, int amount);
+extern void set_keyboard_type (xtermKeyboardType type, Bool set);
 +extern void toggle_keyboard_type (xtermKeyboardType type);
 +extern void xtermScroll (TScreen *screen, int amount);
  
 #if OPT_ISO_COLORS
 
Index: xterm.log.html
--- xterm-124+/xterm.log.html   Sun Jan 30 18:41:54 2000
 +++ xterm-125/xterm.log.html    Mon Jan 31 19:55:24 2000
 @@ -41,6 +41,7 @@
  xc/programs/Xserver/hw/xfree86).
 
 <UL>
+<LI><A HREF="#xterm_125">Patch #125 - 2000/1/31 - XFree86 3.9.17c</A>
  <LI><A HREF="#xterm_124">Patch #124 - 2000/1/27 - XFree86 3.9.17b</A>
 <LI><A HREF="#xterm_123">Patch #123 - 2000/1/22 - XFree86 3.9.17a</A>
 <LI><A HREF="#xterm_122">Patch #122 - 1999/12/28 - XFree86 3.9.16f</A>
@@ -167,6 +168,41 @@
 <LI><A HREF="#xterm_02">Patch #2 - 1996/1/7</A>
 <LI><A HREF="#xterm_01">Patch #1 - 1996/1/6</A>
 </UL>
+
+<H1><A NAME="xterm_125">Patch #125 - 2000/1/31 - XFree86 3.9.17c</A></H1>
 +<ul>
+       <li>integrate patch by David Mathog
 +         <mathog@seqaxp.bio.caltech.edu> to make this work on OpenVMS
 +
+       <li>rename some functions, e.g., <code>Index</code> to
 +         <code>xtermIndex</code> so that ports such as VMS which link
 +         externals ignoring case will not have library conflicts (reported by
 +         David Mathog).
 +
+       <li>correct logic of <code>do_reversevideo()</code>, which did not
 +         update the corresponding popup menu check mark (reported by David
 +         Mathog, this was a detail overlooked in patch #94).
 +
+       <li>change TRACE macro so semicolon is not within definition, making
 +         <em>indent</em> and similar programs work better.
 +
+       <li>add <code>depend</code> rule to Makefile.in
 +
+       <li>modify logic of boldColors resource to suppress it if an extended
 +         color control has been used, e.g., for 88-color or 256-color mode
 +         (patch by Todd Larason).
 +
+       <li>revise logic that handles menus and input translation for keyboard
 +         type so only one can be selected at a time.
 +
+       <li>restore kdch1=\177 for the Sun function-key type, and make the
 +         the Delete key send DEL (\177) if the oldXtermFKeys resource is set.
 +
+       <li>rephrase logic and ifdef's for POSIX VDISABLE to avoid preprocessor
 +         expression that will not compile on NetBSD/x86 1.4.1 (reported by
 +         Takaaki Nomura <amadeus@yk.rim.or.jp>).
 +
+</ul>
 
 <H1><A NAME="xterm_124">Patch #124 - 2000/1/27 - XFree86 3.9.17b</A></H1>
 <ul>
Index: xterm.man
--- xterm-124+/xterm.man        Sun Jan 30 18:41:54 2000
 +++ xterm-125/xterm.man Mon Jan 31 12:03:54 2000
 @@ -2,7 +2,7 @@
  .\" $XFree86: xc/programs/xterm/xterm.man,v 3.55 2000/01/29 18:58:43 dawes Exp $
 .\"
 .\"
-.\" Copyright 1999 by Thomas E. Dickey <dickey@clark.net>
 +.\" Copyright 1999-2000 by Thomas E. Dickey <dickey@clark.net>
  .\"
 .\"                         All Rights Reserved
 .\"
@@ -1228,6 +1228,7 @@
 If ``true'', xterm will use old-style control sequences for function keys F1 to F4,
 for compatibility with X Consortium xterm.  Otherwise, it uses the VT100-style
 codes for PF1 to PF4.
+Also, if ``true'', the Delete key sends DEL (127).
  The default is ``false.''
 .TP 8
 .B "pointerColor (\fPclass\fB Foreground)"
Index: xterm_axp.opt
--- /dev/null   Sun Jul 17 19:46:18 1994
 +++ xterm-125/xterm_axp.opt     Sat Jan 29 15:47:10 2000
 @@ -0,0 +1,28 @@
 +BUTTON.OBJ
+CHARPROC.OBJ
+CHARSETS.OBJ
+CURSOR.OBJ
+DATA.OBJ
+DOUBLECHR.OBJ
+FONTUTILS.OBJ
+INPUT.OBJ
+KEYSYM2UCS.OBJ
+MAIN.OBJ
+MENU.OBJ
+MISC.OBJ
+PRINT.OBJ
+PTYDATA.OBJ
+SCREEN.OBJ
+SCROLLBAR.OBJ
+TABS.OBJ
+TEKPROC.OBJ
+TEKPRSTBL.OBJ
+TRACE.OBJ
+TTYSVR.OBJ
+UTIL.OBJ
+VMS.OBJ
+VTPRSTBL.OBJ
+XAW3DLIB.OLB/LIB
+XMULIB.OLB/LIB
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
 Index: xtermcfg.hin
--- xterm-124+/xtermcfg.hin     Thu Jan 27 21:01:34 2000
 +++ xterm-125/xtermcfg.hin      Mon Jan 31 19:51:57 2000
 @@ -41,7 +41,6 @@
  #undef DFT_TERMTYPE            /* AC_ARG_WITH(default-term-type) */
 #undef HAVE_LASTLOG_H          /* CF_LASTLOG */
 #undef HAVE_PATHS_H            /* CF_LASTLOG */
-#undef HAVE_POSIX_VDISABLE     /* CF_POSIX_VDISABLE */
  #undef HAVE_STDLIB_H           /* AC_CHECK_HEADERS(stdlib.h) */
 #undef HAVE_STRERROR           /* AC_CHECK_FUNCS(strerror) */
 #undef HAVE_SYS_WAIT_H         /* AC_HEADER_SYS_WAIT */