INSTALL        |   15 
 Imakefile      |    6 
 MANIFEST       |    4 
 Makefile.in    |    8 
 Tekproc.c      |   61 -
 button.c       |  328 ++++---
 cachedGCs.c    |   50 -
 charproc.c     |  607 +++++++-------
 configure      | 2401 +++++++++++++++++++++++++++++----------------------------
 configure.in   |   25 
 ctlseqs.ms     |    4 
 ctlseqs.txt    |    2 
 cursor.c       |   23 
 data.c         |    4 
 data.h         |    4 
 doublechr.c    |   72 -
 error.h        |   10 
 fontutils.c    |  125 +-
 fontutils.h    |   30 
 input.c        |   11 
 linedata.c     |  251 +++++
 main.c         |   32 
 menu.c         |   39 
 menu.h         |    3 
 misc.c         |  194 ++--
 os2main.c      |    6 
 print.c        |  217 ++---
 ptydata.c      |   76 -
 ptyx.h         |  318 ++++---
 resize.c       |   12 
 resize.man     |   17 
 screen.c       | 1779 +++++++++++++++++++++++++++---------------
 scrollback.c   |  118 ++
 scrollbar.c    |   36 
 tabs.c         |   10 
 termcap        |   27 
 testxmc.c      |   27 
 trace.c        |  192 ++--
 trace.h        |    7 
 util.c         |  658 +++++++--------
 version.h      |    4 
 xterm.h        |  130 +--
 xterm.log.html |   80 +
 xterm.man      |  663 ++++++++-------
 xtermcfg.hin   |   12 
 45 files changed, 5030 insertions(+), 3668 deletions(-)

New commits:
commit d817c5d758a3bc71ff371662c45e37900b186a8e
Author: Julien Cristau <jcris...@debian.org>
Date:   Mon Aug 10 10:53:08 2009 +0200

    Import xterm 244

diff --git a/INSTALL b/INSTALL
index 1485bfb..2f85f3a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
--- $XTermId: INSTALL,v 1.118 2008/12/30 11:43:45 tom Exp $
+-- $XTermId: INSTALL,v 1.121 2009/08/06 00:39:09 tom Exp $
 -------------------------------------------------------------------------------
 -- Copyright 1997-2007,2008 by Thomas E. Dickey
 --
@@ -146,6 +146,12 @@ The options (in alphabetic order):
        not shown.  This makes it simpler to read a build log and see the
        actual warning messages.
 
+  --disable-fifo-lines    enable FIFO-storage for saved-lines
+
+       With patch #244, xterm by default stores saved-lines in a FIFO
+       (circular buffer), which improves performance when the number of saved
+       lines is large.  Disable this option to revert to the pre-244 layout.
+
   --disable-freetype      disable freetype library-support
 
        Do not use freetype libraries if they are found.  Normally they will
@@ -311,6 +317,13 @@ The options (in alphabetic order):
        Do not compile-in code that modifies the icon's title and sounds a
        beep when they receive output.
 
+  --enable-16bit-chars    enable 16-bit characters support
+
+       Enable wide-character support, but store only 16-bits for each wide
+       character.  Unicode values can be larger than 16-bits, up to 21-bits.
+       This uses less memory, but is less complete.  However, most languages
+       are covered by the 16-bit encoding.
+
   --enable-256-color      enable 256-color support
 
        Compile-in code that interprets SGR 38 and 48 for 256-colors.
diff --git a/Imakefile b/Imakefile
index 4646e2b..57a7fd0 100644
--- a/Imakefile
+++ b/Imakefile
@@ -1,4 +1,4 @@
-XCOMM $XTermId: Imakefile,v 1.101 2007/03/18 21:06:18 tom Exp $
+XCOMM $XTermId: Imakefile,v 1.102 2009/04/27 19:26:34 tom Exp $
 XCOMM
 XCOMM                         Attention xterm porters
 XCOMM
@@ -194,13 +194,13 @@ module.o: ; $(CC) -c defines $(CFLAGS) module.c
 #endif
           SRCS1 = button.c cachedGCs.c charproc.c charsets.c cursor.c \
                  data.c doublechr.c fontutils.c input.c \
-                 menu.c misc.c print.c ptydata.c \
+                 linedata.c menu.c misc.c print.c ptydata.c scrollback.c \
                  screen.c scrollbar.c tabs.c util.c xstrings.c xtermcap.c \
                  TekPrsTbl.c Tekproc.c VTPrsTbl.c \
                  $(MAINSRC) $(EXTRASRC) $(UTF8SRC) $(TRACESRC)
           OBJS1 = button.o cachedGCs.o charproc.o charsets.o cursor.o \
                  data.o doublechr.o fontutils.o input.o \
-                 menu.o misc.o print.o ptydata.o \
+                 linedata.o menu.o misc.o print.o ptydata.o scrollback.o \
                  screen.o scrollbar.o tabs.o util.o xstrings.o xtermcap.o \
                  TekPrsTbl.o Tekproc.o VTPrsTbl.o \
                  $(MAINOBJ) $(EXTRAOBJ) $(UTF8OBJ) $(TRACEOBJ)
diff --git a/MANIFEST b/MANIFEST
index 0a8ae68..d311717 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,4 @@
-MANIFEST for xterm-243, version xterm-243
+MANIFEST for xterm-244, version xterm-244
 
--------------------------------------------------------------------------------
 MANIFEST                        this file
 256colres.h                     resource-definitions for 256-color mode
@@ -52,6 +52,7 @@ keysym2ucs.c                    lookup-table for UTF-8 to 
keysyms
 keysym2ucs.h                    interface of keysym2ucs.c
 koi8rxterm                      KOI-8 wrapper from Debian (originally me)
 koi8rxterm.man                  manpage for koi8rxterm
+linedata.c                      manage all line-data for VT100 widget
 link_axp.com                    build-script for VMS port of xterm
 main.c                          main program of 'xterm'
 main.h                          default definitions for 'xterm'
@@ -73,6 +74,7 @@ resize.c                        program to compute/modify 
xterm's window size
 resize.man                      manual page for 'resize'
 run-tic.sh                      run tic, filtering out harmless messages
 screen.c                        VT100 screen update functions
+scrollback.c                    manage scrollback (a big FIFO)
 scrollbar.c                     VT100 scrollbar support functions
 sinstall.sh                     install setuid if existing program was
 tabs.c                          VT100 tabstop support-functions
diff --git a/Makefile.in b/Makefile.in
index 62a2882..671c6e3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-## $XTermId: Makefile.in,v 1.157 2009/01/25 16:39:24 tom Exp $
+## $XTermId: Makefile.in,v 1.158 2009/04/27 19:29:31 tom Exp $
 ##
 ## Copyright 2002-2008,2009 by Thomas E. Dickey
 ##
@@ -83,12 +83,14 @@ EXTRAOBJ    = @EXTRAOBJS@
 
           SRCS1 = button.c cachedGCs.c charproc.c charsets.c cursor.c \
                  data.c doublechr.c fontutils.c input.c \
-                 $(MAINSRC) menu.c misc.c print.c ptydata.c \
+                 linedata.c main.c menu.c misc.c \
+                 print.c ptydata.c scrollback.c \
                  screen.c scrollbar.c tabs.c util.c xstrings.c xtermcap.c \
                  VTPrsTbl.c $(EXTRASRC)
           OBJS1 = button$o cachedGCs$o charproc$o charsets$o cursor$o \
                  data$o doublechr$o fontutils$o input$o \
-                 main$o menu$o misc$o print$o ptydata$o \
+                 linedata$o main$o menu$o misc$o \
+                 print$o ptydata$o scrollback$o \
                  screen$o scrollbar$o tabs$o util$o xstrings$o xtermcap$o \
                  VTPrsTbl$o $(EXTRAOBJ)
           SRCS2 = resize.c xstrings.c
diff --git a/Tekproc.c b/Tekproc.c
index 6edcee0..478393c 100644
--- a/Tekproc.c
+++ b/Tekproc.c
@@ -1,9 +1,8 @@
-/* $XTermId: Tekproc.c,v 1.167 2009/03/28 17:03:35 tom Exp $ */
+/* $XTermId: Tekproc.c,v 1.172 2009/08/09 17:22:34 tom Exp $ */
 
 /*
  * Warning, there be crufty dragons here.
  */
-/* $XFree86: xc/programs/xterm/Tekproc.c,v 3.57 2006/02/13 01:14:57 dickey Exp 
$ */
 
 /*
 
@@ -596,7 +595,7 @@ Tekparse(TekWidget tw)
 
        case CASE_CHAR_SIZE:
            TRACE(("case: character size selector\n"));
-           TekSetFontSize(tw, (int) (c & 03));
+           TekSetFontSize(tw, False, (int) (c & 03));
            Tparsestate = curstate;
            break;
 
@@ -795,7 +794,7 @@ Tinput(TekWidget tw)
            tekRefreshList = tek;
            rptr = tek->data;
            rcnt = tek->count - 1;
-           TekSetFontSize(tw, tek->fontsize);
+           TekSetFontSize(tw, False, tek->fontsize);
            return (IChar) (*rptr++);
        }
        tekRefreshList = (TekLink *) 0;
@@ -938,7 +937,7 @@ TekExpose(Widget w,
        tekscr->cur_X = 0;
        tekscr->cur_Y = TEKHOME;
        tekscr->cur = tekscr->page;
-       TekSetFontSize(tw, tekscr->cur.fontsize);
+       TekSetFontSize(tw, False, tekscr->cur.fontsize);
        tekscr->margin = MARGIN1;
        if (tekscr->TekGIN) {
            tekscr->TekGIN = NULL;
@@ -1392,9 +1391,10 @@ TekRealize(Widget gw,
     int border = 2 * screen->border;
     int pr;
     XGCValues gcv;
-    int winX, winY, width, height;
+    int winX, winY;
+    unsigned width, height;
     char Tdefault[32];
-    unsigned TEKgcFontMask;
+    unsigned long TEKgcFontMask;
 
     TRACE(("TekRealize\n"));
     memset(tekscr, 0, sizeof(tekscr));
@@ -1440,22 +1440,22 @@ TekRealize(Widget gw,
 
     winX = 1;
     winY = 1;
-    width = TEKDEFWIDTH + border;
-    height = TEKDEFHEIGHT + border;
+    width = (unsigned) (TEKDEFWIDTH + border);
+    height = (unsigned) (TEKDEFHEIGHT + border);
 
     TRACE(("parsing T_geometry %s\n", NonNull(term->misc.T_geometry)));
     pr = XParseGeometry(term->misc.T_geometry,
                        &winX,
                        &winY,
-                       (unsigned int *) &width,
-                       (unsigned int *) &height);
+                       &width,
+                       &height);
     TRACE(("... position %d,%d size %dx%d\n", winY, winX, height, width));
     if ((pr & XValue) && (pr & XNegative))
        winX += DisplayWidth(XtDisplay(tw), DefaultScreen(XtDisplay(tw)))
-           - width - (BorderWidth(SHELL_OF(term)) * 2);
+           - (int) width - (BorderWidth(SHELL_OF(term)) * 2);
     if ((pr & YValue) && (pr & YNegative))
        winY += DisplayHeight(XtDisplay(tw), DefaultScreen(XtDisplay(tw)))
-           - height - (BorderWidth(SHELL_OF(term)) * 2);
+           - (int) height - (BorderWidth(SHELL_OF(term)) * 2);
 
     /* set up size hints */
     tw->hints.min_width = TEKMINWIDTH + border;
@@ -1486,15 +1486,15 @@ TekRealize(Widget gw,
        /* set a default size, but do *not* set position */
        tw->hints.flags |= PSize;
     }
-    tw->hints.width = width;
-    tw->hints.height = height;
+    tw->hints.width = (int) width;
+    tw->hints.height = (int) height;
     if ((WidthValue & pr) || (HeightValue & pr))
        tw->hints.flags |= USSize;
     else
        tw->hints.flags |= PSize;
 
     (void) REQ_RESIZE((Widget) tw,
-                     width, height,
+                     (Dimension) width, (Dimension) height,
                      &tw->core.width, &tw->core.height);
 
     /* XXX This is bogus.  We are parsing geometries too late.  This
@@ -1523,8 +1523,8 @@ TekRealize(Widget gw,
 
     TFullWidth(tekscr) = (Dimension) width;
     TFullHeight(tekscr) = (Dimension) height;
-    TWidth(tekscr) = width - border;
-    THeight(tekscr) = height - border;
+    TWidth(tekscr) = (int) width - border;
+    THeight(tekscr) = (int) height - border;
     TekScale(tekscr) = (double) TWidth(tekscr) / TEKWIDTH;
     if ((d = (double) THeight(tekscr) / (TEKHEIGHT + TEKTOPPAD +
                                         TEKBOTTOMPAD)) < TekScale(tekscr))
@@ -1556,7 +1556,7 @@ TekRealize(Widget gw,
     /* if font wasn't successfully opened, then gcv.font will contain
        the Default GC's ID, meaning that we must use the server default font.
      */
-    TEKgcFontMask = (gcv.font == DefaultGCID) ? 0 : GCFont;
+    TEKgcFontMask = (unsigned long) ((gcv.font == DefaultGCID) ? 0 : GCFont);
     tekscr->TnormalGC = XCreateGC(XtDisplay(tw), TWindow(tekscr),
                                  (TEKgcFontMask | GCGraphicsExposures |
                                   GCForeground | GCBackground),
@@ -1649,7 +1649,7 @@ TekGetFontSize(const char *param)
 }
 
 void
-TekSetFontSize(TekWidget tw, int newitem)
+TekSetFontSize(TekWidget tw, Bool fromMenu, int newitem)
 {
     if (tw != 0) {
        TekScreen *tekscr = TekScreenOf(tw);
@@ -1666,7 +1666,8 @@ TekSetFontSize(TekWidget tw, int newitem)
            set_tekfont_menu_item(oldsize, False);
 
            tekscr->cur.fontsize = newsize;
-           tekscr->page.fontsize = newsize;
+           if (fromMenu)
+               tekscr->page.fontsize = newsize;
 
            fid = tw->tek.Tfont[newsize]->fid;
            if (fid == DefaultGCID) {
@@ -1683,11 +1684,13 @@ TekSetFontSize(TekWidget tw, int newitem)
            if (!Ttoggled)
                TCursorToggle(tw, TOGGLE);
 
-           /* we'll get an exposure event after changing fontsize, so we
-            * have to clear the screen to avoid painting over the previous
-            * text.
-            */
-           TekClear(tw);
+           if (fromMenu) {
+               /* we'll get an exposure event after changing fontsize, so we
+                * have to clear the screen to avoid painting over the previous
+                * text.
+                */
+               TekClear(tw);
+           }
        }
     }
 }
@@ -1843,7 +1846,7 @@ TekSimulatePageButton(TekWidget tw, Bool reset)
        TekScreen *tekscr = TekScreenOf(tw);
 
        if (reset) {
-           bzero((char *) &tekscr->cur, sizeof tekscr->cur);
+           memset(&tekscr->cur, 0, sizeof tekscr->cur);
        }
        tekRefreshList = (TekLink *) 0;
        TekPage(tw);
@@ -1884,10 +1887,10 @@ TekCopy(TekWidget tw)
            sprintf(initbuf, "%c%c%c%c",
                    ANSI_ESC, (char) (tekscr->page.fontsize + '8'),
                    ANSI_ESC, (char) (tekscr->page.linetype + '`'));
-           write(tekcopyfd, initbuf, 4);
+           write(tekcopyfd, initbuf, (size_t) 4);
            Tp = &Tek0;
            do {
-               write(tekcopyfd, Tp->data, Tp->count);
+               write(tekcopyfd, Tp->data, (size_t) Tp->count);
                Tp = Tp->next;
            } while (Tp);
            close(tekcopyfd);
diff --git a/button.c b/button.c
index 86e7392..526a902 100644
--- a/button.c
+++ b/button.c
@@ -1,4 +1,4 @@
-/* $XTermId: button.c,v 1.320 2009/03/27 00:00:56 tom Exp $ */
+/* $XTermId: button.c,v 1.349 2009/08/07 23:24:10 tom Exp $ */
 
 /*
  * Copyright 1999-2008,2009 by Thomas E. Dickey
@@ -94,12 +94,22 @@ button.c    Handles button events in the terminal emulator.
        charClass[value & ((sizeof(charClass)/sizeof(charClass[0]))-1)]
 #endif
 
-      /*
-       * We reserve shift modifier for cut/paste operations.  In principle we
-       * can pass through control and meta modifiers, but in practice, the
-       * popup menu uses control, and the window manager is likely to use meta,
-       * so those events are not delivered to SendMousePosition.
-       */
+    /*
+     * We'll generally map rows to indices when doing selection.
+     * Simplify that with a macro.
+     *
+     * Note that ROW2INX() is safe to use with auto increment/decrement for
+     * the row expression since that is evaluated once.
+     */
+#define GET_LINEDATA(screen, row) \
+       getLineData(screen, ROW2INX(screen, row))
+
+    /*
+     * We reserve shift modifier for cut/paste operations.  In principle we
+     * can pass through control and meta modifiers, but in practice, the
+     * popup menu uses control, and the window manager is likely to use meta,
+     * so those events are not delivered to SendMousePosition.
+     */
 #define OurModifiers (ShiftMask | ControlMask | Mod1Mask)
 #define AllModifiers (ShiftMask | LockMask | ControlMask | Mod1Mask | \
                      Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask)
@@ -732,23 +742,29 @@ rowOnCurrentLine(TScreen * screen,
                 int line,
                 int *deltap)   /* must be XButtonEvent */
 {
+    int result = 1;
     int l1, l2;
 
     *deltap = 0;
-    if (line == screen->cur_row)
-       return 1;
-
-    if (line < screen->cur_row)
-       l1 = line, l2 = screen->cur_row;
-    else
-       l2 = line, l1 = screen->cur_row;
-    l1--;
-    while (++l1 < l2)
-       if (!ScrnTstWrapped(screen, l1))
-           return 0;
-    /* Everything is on one "wrapped line" now */
-    *deltap = line - screen->cur_row;
-    return 1;
+    if (line != screen->cur_row) {
+       if (line < screen->cur_row)
+           l1 = line, l2 = screen->cur_row;
+       else
+           l2 = line, l1 = screen->cur_row;
+       l1--;
+       while (++l1 < l2) {
+           LineData *ld = GET_LINEDATA(screen, l1);
+           if (!LineTstWrapped(ld)) {
+               result = 0;
+               break;
+           }
+       }
+       if (result) {
+           /* Everything is on one "wrapped line" now */
+           *deltap = line - screen->cur_row;
+       }
+    }
+    return result;
 }
 
 static int
@@ -867,20 +883,8 @@ ReadLineButton(Widget w,
                goto finish;    /* All this work for this... */
        }
        line = (event->xbutton.y - screen->border) / FontHeight(screen);
-       if (line != screen->cur_row) {
-           int l1, l2;
-
-           if (line < screen->cur_row)
-               l1 = line, l2 = screen->cur_row;
-           else
-               l2 = line, l1 = screen->cur_row;
-           l1--;
-           while (++l1 < l2)
-               if (!ScrnTstWrapped(screen, l1))
-                   goto finish;
-           /* Everything is on one "wrapped line" now */
-           ldelta = line - screen->cur_row;
-       }
+       if (!rowOnCurrentLine(screen, line, &ldelta))
+           goto finish;
        /* Correct by half a width - we are acting on a boundary, not on a 
cell. */
        col = (event->xbutton.x - OriginX(screen) + (FontWidth(screen) - 1)
               / 2)
@@ -1264,7 +1268,7 @@ allocUtf8Targets(Widget w, TScreen * screen)
        Atom *result;
 
        if (!overrideTargets(w, screen->utf8_select_types, &result)) {
-           result = (Atom *) XtMalloc(5 * sizeof(Atom));
+           result = (Atom *) XtMalloc((Cardinal) (5 * sizeof(Atom)));
            if (result == NULL) {
                TRACE(("Couldn't allocate utf-8 selection targets\n"));
            } else {
@@ -1298,7 +1302,7 @@ alloc8bitTargets(Widget w, TScreen * screen)
        Atom *result = 0;
 
        if (!overrideTargets(w, screen->eightbit_select_types, &result)) {
-           result = (Atom *) XtMalloc(5 * sizeof(Atom));
+           result = (Atom *) XtMalloc((Cardinal) (5 * sizeof(Atom)));
            if (result == NULL) {
                TRACE(("Couldn't allocate 8bit selection targets\n"));
            } else {
@@ -1571,7 +1575,7 @@ GettingSelection(Display * dpy, Atom type, Char * line, 
unsigned long len)
 
     TRACE(("Getting %s (%ld)\n", name, (long int) type));
     for (cp = line; cp < line + len; cp++) {
-       TRACE(("[%d:%lu]", cp + 1 - line, len));
+       TRACE(("[%d:%lu]", (int) (cp + 1 - line), len));
        if (isprint(*cp)) {
            TRACE(("%c\n", *cp));
        } else {
@@ -2467,19 +2471,20 @@ PointToCELL(TScreen * screen,
  * Find the last column at which text was drawn on the given row.
  */
 static int
-LastTextCol(TScreen * screen, int row)
+LastTextCol(TScreen * screen, LineData * ld, int row)
 {
-    int inx = ROW2INX(screen, row);
     int i;
     Char *ch;
 
-    if (inx + screen->savedlines >= 0) {
+    if (okScrnRow(screen, row)) {
        for (i = screen->max_col,
-            ch = SCRN_BUF_ATTRS(screen, inx) + i;
+            ch = ld->attribs + i;
             i >= 0 && !(*ch & CHARDRAWN);
-            ch--, i--) ;
+            ch--, i--) {
+           ;
+       }
 #if OPT_DEC_CHRSET
-       if (CSET_DOUBLE(SCRN_BUF_CSETS(screen, inx)[0])) {
+       if (CSET_DOUBLE(GetLineDblCS(ld))) {
            i *= 2;
        }
 #endif
@@ -2587,56 +2592,58 @@ SetCharacterClassRange(int low, /* in range of [0..255] 
*/
 
 #if OPT_WIDE_CHARS
 static int
-class_of(TScreen * screen, CELL * cell)
+class_of(TScreen * screen, LineData * ld, CELL * cell)
 {
     CELL temp = *cell;
     int value;
 
 #if OPT_DEC_CHRSET
-    if (CSET_DOUBLE(SCRN_BUF_CSETS(screen, ROW2INX(screen, temp.row))[0])) {
+    if (CSET_DOUBLE(GetLineDblCS(ld))) {
        temp.col /= 2;
     }
 #endif
 
     value = (int) XTERM_CELL(temp.row, temp.col);
-    if_OPT_WIDE_CHARS(screen, {
-       return CharacterClass(value);
-    });
     return CharacterClass(value);
 }
-#define ClassSelects(screen, cell, cclass) \
-        (class_of(screen, cell) == cclass \
-        || XTERM_CELL((cell)->row, (cell)->col) == HIDDEN_CHAR)
+#define CClassSelects(name, cclass) \
+        (CClassOf(name) == cclass \
+        || XTERM_CELL(screen->name.row, screen->name.col) == HIDDEN_CHAR)
 #else
-#define class_of(screen, cell) charClass[XTERM_CELL((cell)->row, (cell)->col)]
-#define ClassSelects(screen, cell, cclass) \
-        (class_of(screen, (cell)) == cclass)
+#define class_of(screen, ld, cell) charClass[XTERM_CELL((cell)->row, 
(cell)->col)]
+#define CClassSelects(name, cclass) \
+        (class_of(screen, ld.name, &((screen->name))) == cclass)
 #endif
 
+#define CClassOf(name) class_of(screen, ld.name, &((screen->name)))
+
 /*
  * If the given column is past the end of text on the given row, bump to the
  * beginning of the next line.
  */
 static Boolean
 okPosition(TScreen * screen,
+          LineData ** ld,
           CELL * cell)
 {
-    if (cell->col > (LastTextCol(screen, cell->row) + 1)) {
+    if (cell->col > (LastTextCol(screen, *ld, cell->row) + 1)) {
        cell->col = 0;
-       cell->row += 1;
+       *ld = GET_LINEDATA(screen, ++cell->row);
        return False;
     }
     return True;
 }
 
 static void
-trimLastLine(TScreen * screen, CELL * last)
+trimLastLine(TScreen * screen,
+            LineData ** ld,
+            CELL * last)
 {
     if (screen->cutNewline) {
        last->col = 0;
-       ++last->row;
+       *ld = GET_LINEDATA(screen, ++last->row);
     } else {
-       last->col = LastTextCol(screen, last->row) + 1;
+       last->col = LastTextCol(screen, *ld, last->row) + 1;
     }
 }
 
@@ -2647,11 +2654,14 @@ trimLastLine(TScreen * screen, CELL * last)
 static int
 firstRowOfLine(TScreen * screen, int row, Bool visible)
 {
+    LineData *ld = 0;
     int limit = visible ? 0 : -screen->savedlines;
 
     while (row > limit &&
-          ScrnTstWrapped(screen, row - 1))
+          (ld = GET_LINEDATA(screen, row - 1)) != 0 &&
+          LineTstWrapped(ld)) {
        --row;
+    }
     return row;
 }
 
@@ -2661,9 +2671,13 @@ firstRowOfLine(TScreen * screen, int row, Bool visible)
 static int
 lastRowOfLine(TScreen * screen, int row)
 {
+    LineData *ld;
+
     while (row < screen->max_row &&
-          ScrnTstWrapped(screen, row))
+          (ld = GET_LINEDATA(screen, row)) != 0 &&
+          LineTstWrapped(ld)) {
        ++row;
+    }
     return row;
 }
 
@@ -2677,7 +2691,8 @@ lengthOfLines(TScreen * screen, int firstRow, int lastRow)
     int n;
 
     for (n = firstRow; n <= lastRow; ++n) {
-       int value = LastTextCol(screen, n);
+       LineData *ld = GET_LINEDATA(screen, n);
+       int value = LastTextCol(screen, ld, n);
        if (value >= 0)
            length += (unsigned) (value + 1);
     }
@@ -2700,16 +2715,17 @@ make_indexed_text(TScreen * screen, int row, unsigned 
length, int *indexed)
      * string were UTF-8.
      */
     if_OPT_WIDE_CHARS(screen, {
-       need *= (unsigned) (MAX_PTRS * 6);
+       need *= ((screen->lineExtra + 1) * 6);
     });
 
     if ((result = TypeCallocN(Char, need + 1)) != 0) {
+       LineData *ld = GET_LINEDATA(screen, row);
        unsigned used = 0;
        Char *last = result;
 
        do {
            int col = 0;
-           int limit = LastTextCol(screen, row);
+           int limit = LastTextCol(screen, ld, row);
 
            while (col <= limit) {
                Char *next = last;
@@ -2727,9 +2743,10 @@ make_indexed_text(TScreen * screen, int row, unsigned 
length, int *indexed)
                });
 
                if_OPT_WIDE_CHARS(screen, {
-                   int off;
-                   for (off = OFF_FINAL; off < MAX_PTRS; off += 2) {
-                       if ((data = XTERM_CELLC(row, col, off)) == 0)
+                   size_t off;
+                   for_each_combData(off, ld) {
+                       data = XTERM_CELLC(row, col, off);
+                       if (data == 0)
                            break;
                        next = convertToUTF8(next, data);
                    }
@@ -2744,8 +2761,9 @@ make_indexed_text(TScreen * screen, int row, unsigned 
length, int *indexed)
                indexed[used] = next - result;
            }
        } while (used < length &&
-                ScrnTstWrapped(screen, row) &&
-                ++row < screen->max_row);
+                LineTstWrapped(ld) &&
+                (ld = GET_LINEDATA(screen, ++row)) != 0 &&
+                row < screen->max_row);
     }
     /* TRACE(("result:%s\n", result)); */
     return (char *) result;
@@ -2775,7 +2793,8 @@ static void
 columnToCell(TScreen * screen, int row, int col, CELL * cell)
 {
     while (row < screen->max_row) {
-       int last = LastTextCol(screen, row);
+       LineData *ld = GET_LINEDATA(screen, row);
+       int last = LastTextCol(screen, ld, row);
 
        /* TRACE(("last(%d) = %d, have %d\n", row, last, col)); */
        if (col <= last) {
@@ -2785,7 +2804,7 @@ columnToCell(TScreen * screen, int row, int col, CELL * 
cell)
         * Stop if the current row does not wrap (does not continue the current
         * line).
         */
-       if (!ScrnTstWrapped(screen, row)) {
+       if (!LineTstWrapped(ld)) {
            col = last + 1;
            break;
        }
@@ -2804,17 +2823,26 @@ columnToCell(TScreen * screen, int row, int col, CELL * 
cell)
 static int
 cellToColumn(TScreen * screen, CELL * cell)
 {
+    LineData *ld = 0;
     int col = cell->col;
     int row = firstRowOfLine(screen, cell->row, False);
     while (row < cell->row) {
-       col += LastTextCol(screen, row++);
+       ld = GET_LINEDATA(screen, row);
+       col += LastTextCol(screen, ld, row++);
     }
+#if OPT_DEC_CHRSET
+    if (ld == 0)
+       ld = GET_LINEDATA(screen, row);
+    if (CSET_DOUBLE(GetLineDblCS(ld)))
+       col /= 2;
+#endif
     return col;
 }
 
 static void
 do_select_regex(TScreen * screen, CELL * startc, CELL * endc)
 {
+    LineData *ld = GET_LINEDATA(screen, startc->row);
     int inx = ((screen->numberOfClicks - 1) % screen->maxClicks);
     char *expr = screen->selectExpr[inx];
     regex_t preg;
@@ -2823,7 +2851,7 @@ do_select_regex(TScreen * screen, CELL * startc, CELL * 
endc)
     int *indexed;
 
     TRACE(("Select_REGEX:%s\n", NonNull(expr)));
-    if (okPosition(screen, startc) && expr != 0) {
+    if (okPosition(screen, &ld, startc) && expr != 0) {
        if (regcomp(&preg, expr, REG_EXTENDED) == 0) {
            int firstRow = firstRowOfLine(screen, startc->row, True);
            int lastRow = lastRowOfLine(screen, firstRow);
@@ -2877,9 +2905,7 @@ do_select_regex(TScreen * screen, CELL * startc, CELL * 
endc)
                        TRACE(("matched:%d:%s\n",
                               indexed[best_nxt] + 1 -
                               indexed[best_col],
-                              visibleChars(PAIRED_CHARS((Char *) (search +
-                                                                  
indexed[best_col]),
-                                                        0),
+                              visibleChars((Char *) (search + 
indexed[best_col]),
                                            (unsigned) (indexed[best_nxt] +
                                                        1 -
                                                        indexed[best_col]))));
@@ -2887,6 +2913,16 @@ do_select_regex(TScreen * screen, CELL * startc, CELL * 
endc)
                    free(search);
                }
                free(indexed);
+#if OPT_DEC_CHRSET
+               if ((ld = GET_LINEDATA(screen, startc->row)) != 0) {
+                   if (CSET_DOUBLE(GetLineDblCS(ld)))
+                       startc->col *= 2;
+               }
+               if ((ld = GET_LINEDATA(screen, endc->row)) != 0) {
+                   if (CSET_DOUBLE(GetLineDblCS(ld)))
+                       endc->col *= 2;
+               }
+#endif
            }
            regfree(&preg);
        }
@@ -2894,6 +2930,20 @@ do_select_regex(TScreen * screen, CELL * startc, CELL * 
endc)
 }
 #endif /* OPT_SELECT_REGEX */
 
+#define InitRow(name) \
+       ld.name = GET_LINEDATA(screen, screen->name.row)
+
+#define NextRow(name) \
+       ld.name = GET_LINEDATA(screen, ++screen->name.row)
+
+#define PrevRow(name) \
+       ld.name = GET_LINEDATA(screen, --screen->name.row)
+
+#define isPrevWrapped(name) \
+       (screen->name.row > 0 \
+          && (ltmp = GET_LINEDATA(screen, screen->name.row - 1)) != 0 \
+          && LineTstWrapped(ltmp))
+
 /*
  * sets startSel endSel
  * ensuring that they have legal values
@@ -2905,10 +2955,18 @@ ComputeSelect(XtermWidget xw,
              Bool extend)
 {
     TScreen *screen = TScreenOf(xw);
+
     int length;
     int cclass;
     CELL first = *startc;
     CELL last = *endc;
+    Boolean ignored = False;
+
+    struct {
+       LineData *startSel;
+       LineData *endSel;
+    } ld;
+    LineData *ltmp;
 
     TRACE(("ComputeSelect(startRow=%d, startCol=%d, endRow=%d, endCol=%d, 
%sextend)\n",
           first.row, first.col,
@@ -2940,26 +2998,28 @@ ComputeSelect(XtermWidget xw,
        screen->endSel = screen->endRaw = first;
     }
 
+    InitRow(startSel);
+    InitRow(endSel);
+
     switch (screen->selectUnit) {
     case Select_CHAR:
-       (void) okPosition(screen, &(screen->startSel));
-       (void) okPosition(screen, &(screen->endSel));
+       (void) okPosition(screen, &(ld.startSel), &(screen->startSel));
+       (void) okPosition(screen, &(ld.endSel), &(screen->endSel));
        break;
 
     case Select_WORD:
        TRACE(("Select_WORD\n"));
-       if (okPosition(screen, &(screen->startSel))) {
-           cclass = class_of(screen, &(screen->startSel));
+       if (okPosition(screen, &(ld.startSel), &(screen->startSel))) {
+           cclass = CClassOf(startSel);
            do {
                --screen->startSel.col;
-               if (screen->startSel.row > 0
-                   && screen->startSel.col < 0
-                   && ScrnTstWrapped(screen, screen->startSel.row - 1)) {
-                   --screen->startSel.row;
-                   screen->startSel.col = LastTextCol(screen, 
screen->startSel.row);
+               if (screen->startSel.col < 0
+                   && isPrevWrapped(startSel)) {
+                   PrevRow(startSel);
+                   screen->startSel.col = LastTextCol(screen, ld.startSel, 
screen->startSel.row);
                }
            } while (screen->startSel.col >= 0
-                    && ClassSelects(screen, &(screen->startSel), cclass));
+                    && CClassSelects(startSel, cclass));
            ++screen->startSel.col;
        }
 #if OPT_WIDE_CHARS
@@ -2969,26 +3029,26 @@ ComputeSelect(XtermWidget xw,
            screen->startSel.col++;
 #endif
 
-       if (okPosition(screen, &(screen->endSel))) {
-           length = LastTextCol(screen, screen->endSel.row);
-           cclass = class_of(screen, &(screen->endSel));
+       if (okPosition(screen, &(ld.endSel), &(screen->endSel))) {
+           length = LastTextCol(screen, ld.endSel, screen->endSel.row);
+           cclass = CClassOf(endSel);
            do {
                ++screen->endSel.col;
                if (screen->endSel.col > length
-                   && ScrnTstWrapped(screen, screen->endSel.row)) {
+                   && LineTstWrapped(ld.endSel)) {
                    screen->endSel.col = 0;
-                   ++screen->endSel.row;
-                   length = LastTextCol(screen, screen->endSel.row);
+                   NextRow(endSel);
+                   length = LastTextCol(screen, ld.endSel, screen->endSel.row);
                }
            } while (screen->endSel.col <= length
-                    && ClassSelects(screen, &(screen->endSel), cclass));
+                    && CClassSelects(endSel, cclass));
            /* Word-select selects if pointing to any char in "word",
             * especially note that it includes the last character in a word.
             * So we do no --endSel.col and do special eol handling.
             */
            if (screen->endSel.col > length + 1) {
                screen->endSel.col = 0;
-               ++screen->endSel.row;
+               NextRow(endSel);
            }
        }
 #if OPT_WIDE_CHARS
@@ -3003,49 +3063,49 @@ ComputeSelect(XtermWidget xw,
 
     case Select_LINE:
        TRACE(("Select_LINE\n"));
-       while (ScrnTstWrapped(screen, screen->endSel.row)) {
-           ++screen->endSel.row;
+       while (LineTstWrapped(ld.endSel)) {
+           NextRow(endSel);
        }
        if (screen->cutToBeginningOfLine
            || screen->startSel.row < screen->saveStartW.row) {
            screen->startSel.col = 0;
-           while (screen->startSel.row > 0
-                  && ScrnTstWrapped(screen, screen->startSel.row - 1)) {
-               --screen->startSel.row;
+           while (isPrevWrapped(startSel)) {
+               PrevRow(startSel);
            }
        } else if (!extend) {
            if ((first.row < screen->saveStartW.row)
                || (isSameRow(&first, &(screen->saveStartW))
                    && first.col < screen->saveStartW.col)) {
                screen->startSel.col = 0;
-               while (screen->startSel.row > 0
-                      && ScrnTstWrapped(screen, screen->startSel.row - 1)) {
-                   --screen->startSel.row;
+               while (isPrevWrapped(startSel)) {
+                   PrevRow(startSel);
                }
            } else {
                screen->startSel = screen->saveStartW;
            }
        }
-       trimLastLine(screen, &(screen->endSel));
+       trimLastLine(screen, &(ld.endSel), &(screen->endSel));
        break;
 
     case Select_GROUP:         /* paragraph */
        TRACE(("Select_GROUP\n"));
-       if (okPosition(screen, &(screen->startSel))) {
+       if (okPosition(screen, &(ld.startSel), &(screen->startSel))) {
            /* scan backward for beginning of group */
            while (screen->startSel.row > 0 &&
-                  (LastTextCol(screen, screen->startSel.row - 1) > 0 ||
-                   ScrnTstWrapped(screen, screen->startSel.row - 1))) {
-               --screen->startSel.row;
+                  (LastTextCol(screen, ld.startSel, screen->startSel.row -
+                               1) > 0 ||
+                   isPrevWrapped(startSel))) {
+               PrevRow(startSel);
            }
            screen->startSel.col = 0;
            /* scan forward for end of group */
            while (screen->endSel.row < screen->max_row &&
-                  (LastTextCol(screen, screen->endSel.row + 1) > 0 ||
-                   ScrnTstWrapped(screen, screen->endSel.row))) {
-               ++screen->endSel.row;
+                  (LastTextCol(screen, ld.endSel, screen->endSel.row + 1) >
+                   0 ||
+                   LineTstWrapped(ld.endSel))) {
+               NextRow(endSel);
            }
-           trimLastLine(screen, &(screen->endSel));
+           trimLastLine(screen, &(ld.endSel), &(screen->endSel));
        }
        break;
 
@@ -3072,13 +3132,16 @@ ComputeSelect(XtermWidget xw,
 #endif
 
     case NSELECTUNITS:         /* always ignore */
-       return;
+       ignored = True;
+       break;
     }
 
-    /* check boundaries */
-    ScrollSelection(screen, 0, False);
+    if (!ignored) {
+       /* check boundaries */
+       ScrollSelection(screen, 0, False);
+       TrackText(xw, &(screen->startSel), &(screen->endSel));
+    }
 
-    TrackText(xw, &(screen->startSel), &(screen->endSel));
     return;
 }
 
@@ -3249,8 +3312,8 @@ SaltTextAway(XtermWidget xw,
     }
     *lp = '\0';                        /* make sure we have end marked */
 
-    TRACE(("Salted TEXT:%d:%s\n", lp - line,
-          visibleChars(PAIRED_CHARS(line, 0), (unsigned) (lp - line))));
+    TRACE(("Salted TEXT:%d:%s\n", (int) (lp - line),
+          visibleChars(line, (unsigned) (lp - line))));
 
     screen->selection_length = (unsigned long) (lp - line);
     _OwnSelection(xw, params, num_params);
@@ -3452,7 +3515,7 @@ ConvertSelection(Widget w,
            std_targets = (Atom *) (std_return);
            *length = std_length + 6;
 
-           targetP = (Atom *) XtMalloc(sizeof(Atom) * (*length));
+           targetP = (Atom *) XtMalloc((Cardinal) (sizeof(Atom) * (*length)));
            allocP = targetP;
 
            *value = (XtPointer) targetP;
@@ -3635,7 +3698,7 @@ _OwnSelection(XtermWidget xw,
 
     if (count > screen->sel_atoms_size) {
        XtFree((char *) atoms);
-       atoms = (Atom *) XtMalloc(count * sizeof(Atom));
+       atoms = (Atom *) XtMalloc((Cardinal) (count * sizeof(Atom)));
        screen->selection_atoms = atoms;
        screen->sel_atoms_size = count;
     }
@@ -3743,12 +3806,13 @@ UnhiliteSelection(XtermWidget xw)
 /* returns number of chars in line from scol to ecol out */
 /* ARGSUSED */
 static int
-Length(TScreen * screen GCC_UNUSED,
+Length(TScreen * screen,
        int row,
        int scol,
        int ecol)
 {


-- 
To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to