XFree86 3.1.2Ec - xterm patch #19 - 1996/7/21 - T.Dickey This patch does the following: + fixes the core dump that I reported on IRIX 5.2 (in main.c) (it's worth noting that this bug exists in X11R6.1, so I'd like to assume that someone's already submitted a fix to X Consortium...) + change the interpretation of zero rows or columns in a resize-window request to use the root window's size (looking more carefully at dtterm, that seems to be what it does). + change some memmove calls to memcpy for slightly better performance. (also, a couple of memset calls to bzero - Quantify says bzero runs 20% faster, I assume because there's one less argument). + interpret character sets 1 and 2 (so that vttest gives a reasonable result) Both rxvt and dtterm do something equivalent. + fix a minor memory leak in the logic that retrieves the window or icon names (Purify found this for me while I ran vttest). To do: + document the new escape sequences (next patch) + modify xterm so that if color isn't enabled, it doesn't allocate memory for colors -------------------------------------------------------------------------------- button.c | 6 ++-- charproc.c | 72 ++++++++++++++++++++++++++++++++++++++--------------------- main.c | 18 +++++++------- screen.c | 27 +++++++++------------- 4 files changed, 71 insertions, 52 deletions -------------------------------------------------------------------------------- Index: button.c --- xterm-18+/button.c Sun Jun 30 12:03:00 1996 +++ xterm-19/button.c Sun Jul 21 17:37:38 1996 @@ -1205,7 +1205,7 @@ *targetP++ = XA_COMPOUND_TEXT(d); *targetP++ = XA_LENGTH(d); *targetP++ = XA_LIST_LENGTH(d); - memmove( (char*)targetP, (char*)std_targets, sizeof(Atom)*std_length); + memcpy ( (char*)targetP, (char*)std_targets, sizeof(Atom)*std_length); XtFree((char*)std_targets); *type = XA_ATOM; *format = 32; @@ -1230,7 +1230,7 @@ *(long*)*value = 1; else { long temp = 1; - memmove( (char*)*value, ((char*)&temp)+sizeof(long)-4, 4); + memcpy ( (char*)*value, ((char*)&temp)+sizeof(long)-4, 4); } *type = XA_INTEGER; *length = 1; @@ -1243,7 +1243,7 @@ *(long*)*value = xterm->screen.selection_length; else { long temp = xterm->screen.selection_length; - memmove( (char*)*value, ((char*)&temp)+sizeof(long)-4, 4); + memcpy ( (char*)*value, ((char*)&temp)+sizeof(long)-4, 4); } *type = XA_INTEGER; *length = 1; Index: charproc.c --- xterm-18+/charproc.c Thu Jul 18 22:00:40 1996 +++ xterm-19/charproc.c Sun Jul 21 18:24:56 1996 @@ -1797,9 +1797,11 @@ *s = '\036'; /* UK pound sign*/ break; + case '1': case 'B': /* ASCII set */ break; + case '2': case '0': /* special graphics (line drawing) */ for (s=buf; s=0x5f && *s<=0x7e) @@ -1962,7 +1964,7 @@ if((j = func == bitset ? 132 : 80) != ((termw->flags & IN132COLUMNS) ? 132 : 80) || j != screen->max_col + 1) - RequestResize(termw, 0, j, TRUE); + RequestResize(termw, -1, j, TRUE); (*func)(&termw->flags, IN132COLUMNS); } break; @@ -2170,7 +2172,7 @@ if((j = (screen->save_modes[1] & IN132COLUMNS) ? 132 : 80) != ((termw->flags & IN132COLUMNS) ? 132 : 80) || j != screen->max_col + 1) - RequestResize(termw, 0, j, TRUE); + RequestResize(termw, -1, j, TRUE); termw->flags &= ~IN132COLUMNS; termw->flags |= screen->save_modes[1] & IN132COLUMNS; @@ -2277,15 +2279,18 @@ unparseputc(']', screen->respond); unparseputc(code, screen->respond); - if (ok - && XTextPropertyToStringList(text, &list, &length)) { - int n, c; - for (n = 0; n < length; n++) { - char *s = list[n]; - while ((c = *s++) != '\0') - unparseputc(c, screen->respond); + if (ok) { + if (XTextPropertyToStringList(text, &list, &length)) { + int n, c; + for (n = 0; n < length; n++) { + char *s = list[n]; + while ((c = *s++) != '\0') + unparseputc(c, screen->respond); + } + XFreeStringList(list); } - XFreeStringList(list); + if (text->value != 0) + XFree(text->value); } unparseputc(ESC, screen->respond); @@ -2574,9 +2579,9 @@ char *save [MAX_PTRS * MAX_ROWS]; Size_t len = MAX_PTRS * sizeof(char *) * rows; - memmove( (char *)save, (char *)screen->buf, len); - memmove( (char *)screen->buf, (char *)screen->altbuf, len); - memmove( (char *)screen->altbuf, (char *)save, len); + memcpy ( (char *)save, (char *)screen->buf, len); + memcpy ( (char *)screen->buf, (char *)screen->altbuf, len); + memcpy ( (char *)screen->altbuf, (char *)save, len); } void @@ -2642,7 +2647,8 @@ if (event->type == GraphicsExpose) if (HandleExposure (screen, event)) screen->cursor_state = OFF; - if ((event->type == NoExpose) || ((XGraphicsExposeEvent *)event)->count == 0) { + if ((event->type == NoExpose) + || ((XGraphicsExposeEvent *)event)->count == 0) { if (screen->incopy <= 0 && screen->scrolls > 0) screen->scrolls--; if (screen->scrolls) @@ -2689,27 +2695,43 @@ Dimension replyWidth, replyHeight; Dimension askedWidth, askedHeight; XtGeometryResult status; + XWindowAttributes attrs; askedWidth = cols; askedHeight = rows; - if (text) { - if (askedHeight <= 0) - askedHeight = screen->max_row + 1; - if (askedWidth <= 0) - askedWidth = screen->max_col + 1; - askedWidth *= FontWidth(screen); - askedHeight *= FontHeight(screen); + if (askedHeight == 0 + || askedWidth == 0) { + XGetWindowAttributes(XtDisplay(termw), + RootWindowOfScreen(XtScreen(termw)), &attrs); + } + + if (text) { + if (rows != 0) { + if (rows < 0) + askedHeight = screen->max_row + 1; + askedHeight *= FontHeight(screen); + askedHeight += (2 * screen->border); + } - askedWidth += (2 * screen->border) + screen->scrollbar; - askedHeight += (2 * screen->border); + if (cols != 0) { + if (cols < 0) + askedWidth = screen->max_col + 1; + askedWidth *= FontWidth(screen); + askedWidth += (2 * screen->border) + screen->scrollbar; + } } else { - if (askedHeight <= 0) + if (rows < 0) askedHeight = FullHeight(screen); - if (askedWidth <= 0) + if (cols < 0) askedWidth = FullWidth(screen); } + + if (rows == 0) + askedHeight = attrs.height; + if (cols == 0) + askedWidth = attrs.width; status = XtMakeResizeRequest ( (Widget) termw, Index: main.c --- xterm-18+/main.c Mon Jul 8 12:42:24 1996 +++ xterm-19/main.c Sun Jul 21 17:37:39 1996 @@ -2354,7 +2354,7 @@ #endif /* USE_SYSV_TERMIO */ #if defined(UTMP) && defined(USE_SYSV_UTMP) char* ptyname; - char* ptynameptr; + char* ptynameptr = 0; #endif #ifdef USE_USG_PTYS @@ -2912,12 +2912,14 @@ */ #ifdef CRAY #define PTYCHARLEN 4 -#else +#endif + #ifdef __osf__ #define PTYCHARLEN 5 -#else -#define PTYCHARLEN 2 #endif + +#ifndef PTYCHARLEN +#define PTYCHARLEN 2 #endif (void) setutent (); @@ -2929,12 +2931,10 @@ ptynameptr = ptyname; else ptynameptr = ptyname + strlen(ptyname) - PTYCHARLEN; - (void) strncpy(utmp.ut_id, ptynameptr, sizeof (utmp.ut_id)); #else - (void) strncpy(utmp.ut_id,ptyname + sizeof("/dev/tty")-1, - sizeof (utmp.ut_id)); - + ptynameptr = ptyname + sizeof("/dev/tty")-1; #endif + (void) strncpy(utmp.ut_id, ptynameptr, sizeof (utmp.ut_id)); utmp.ut_type = DEAD_PROCESS; /* position to entry in utmp file */ @@ -3741,7 +3741,7 @@ struct utmp *utptr; #endif char* ptyname; - char* ptynameptr; + char* ptynameptr = 0; #if defined(WTMP) && !defined(SVR4) int fd; /* for /etc/wtmp */ int i; Index: screen.c --- xterm-18+/screen.c Thu Jul 18 22:00:40 1996 +++ xterm-19/screen.c Sun Jul 21 18:48:07 1996 @@ -180,7 +180,7 @@ tmp += ncol*move_down; } for (i = 0; i < minrows; i++, tmp += ncol) { - memmove( tmp, base[i], mincols); + memcpy( tmp, base[i], mincols); } /* * update the pointers in sbuf @@ -225,13 +225,10 @@ wrappedbit = *attrs0&LINEWRAPPED; flags &= ATTRIBUTES; flags |= CHARDRAWN; - memmove( col, str, length); - while(length-- > 0) - { - *attrs++ = flags; - *fgs++ = cur_fg; - *bgs++ = cur_bg; - } + memcpy( col, str, length); + memset( attrs, flags, length); + memset( fgs, cur_fg, length); + memset( bgs, cur_bg, length); if (wrappedbit) *attrs0 |= LINEWRAPPED; } @@ -248,7 +245,7 @@ register int i; /* save n lines at where */ - memmove( (char *)save, + memcpy ( (char *)save, (char *) &sb[MAX_PTRS * where], MAX_PTRS * sizeof(char *) * n); @@ -257,7 +254,7 @@ int last = (n * MAX_PTRS); int flags = (term->flags & (FG_COLOR|BG_COLOR)); for (i = 0; i < last; i += MAX_PTRS) { - memset(save[i+0], 0, size); + bzero(save[i+0], size); memset(save[i+1], flags, size); memset(save[i+2], term->cur_foreground, size); memset(save[i+3], term->cur_background, size); @@ -299,7 +296,7 @@ MAX_PTRS * sizeof (char *) * (last - where)); /* reuse storage for new lines at where */ - memmove( (char *) &sb[MAX_PTRS * where], + memcpy ( (char *) &sb[MAX_PTRS * where], (char *)save, MAX_PTRS * sizeof(char *) * n); } @@ -326,7 +323,7 @@ MAX_PTRS * sizeof (char *) * ((last -= n - 1) - where)); /* reuse storage for new bottom lines */ - memmove( (char *) &sb[MAX_PTRS * last], + memcpy ( (char *) &sb[MAX_PTRS * last], (char *)save, MAX_PTRS * sizeof(char *) * n); } @@ -379,9 +376,9 @@ register Size_t nbytes = (size - n - col); int wrappedbit = attrs[0]&LINEWRAPPED; - memmove( ptr + col, ptr + col + n, nbytes); - memmove( attrs + col, attrs + col + n, nbytes); - bzero (ptr + size - n, n); + memcpy (ptr + col, ptr + col + n, nbytes); + memcpy (attrs + col, attrs + col + n, nbytes); + bzero (ptr + size - n, n); memset (attrs + size - n, term->flags & (FG_COLOR|BG_COLOR), n); if (term->flags & FG_COLOR) memset(BUF_FORES(sb, row) + size - n, term->cur_foreground, n);