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