XFree86 3.1.2Ea - xterm patch #16 - 1996/6/25 - T.Dickey Adam Tla/lka told me a couple of weeks ago that I'd missed some of the background coloring in xterm. I investigated, and found that while I'd picked up on the clear-to-bottom and clear-to-end-of-line operations, I'd overlooked the insert/delete lines. Just so I wouldn't overlook any more of these, I updated a copy of vttest to test ISO colors and bce (background color erase). This patch introduces a new function, ClearCurBackground, whose calls replace the direct XClearArea calls that I'd overlooked. (There's also a few compiler warnings fixed, etc ;-) -------------------------------------------------------------------------------- button.c | 2 - charproc.c | 14 +++---- misc.c | 2 - util.c | 114 +++++++++++++++++++++++++++++------------------------------ xterm.h | 1 5 files changed, 66 insertions, 67 deletions -------------------------------------------------------------------------------- Index: button.c --- xterm/button.c Mon Jun 10 13:03:46 1996 +++ xterm-16/button.c Tue Jun 25 17:25:54 1996 @@ -108,6 +108,7 @@ static int replyToEmacs; static Boolean ConvertSelection PROTO_XT_CVT_SELECT_ARGS; +static SelectUnit EvalSelectUnit PROTO((Time buttonDownTime, SelectUnit defaultUnit)); static char *SaveText PROTO((TScreen *screen, int row, int scol, int ecol, char *lp, int *eol)); static int LastTextCol PROTO((int row)); static int Length PROTO((TScreen *screen, int row, int scol, int ecol)); @@ -122,7 +123,6 @@ static void SelectSet PROTO((Widget w, XEvent *event, String *params, Cardinal num_params)); static void SelectionDone PROTO((Widget w, Atom *selection, Atom *target)); static void SelectionReceived PROTO_XT_SEL_CB_ARGS; -static void SetSelectUnit PROTO((Time buttonDownTime, SelectUnit defaultUnit)); static void StartSelect PROTO((int startrow, int startcol)); static void TrackDown PROTO((XButtonEvent *event)); static void _GetSelection PROTO((Widget w, Time ev_time, String *params, Cardinal num_params)); Index: charproc.c --- xterm/charproc.c Mon Jun 10 13:03:46 1996 +++ xterm-16/charproc.c Tue Jun 25 17:56:54 1996 @@ -2408,13 +2408,11 @@ { register int rows = screen->max_row + 1; char *save [MAX_PTRS * MAX_ROWS]; + Size_t len = MAX_PTRS * sizeof(char *) * rows; - memmove( (char *)save, (char *)screen->buf, - MAX_PTRS * sizeof(char *) * rows); - memmove( (char *)screen->buf, (char *)screen->altbuf, - MAX_PTRS * sizeof(char *) * rows); - memmove( (char *)screen->altbuf, (char *)save, - 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); } void @@ -2897,7 +2895,7 @@ for(ns=s=tmp; ns && *s;) { while (*s && isspace(*s)) s++; if (!*s) break; - if ((ns = end = index(s, ',')) == 0) + if ((ns = end = strchr(s, ',')) == 0) end = s + strlen(s); while (isspace(*end)) end--; *end = '\0'; @@ -2932,7 +2930,7 @@ for(s = tmp; s && !found;) { while (*s && isspace(*s)) s++; if (!*s) break; - if ((ns = end = index(s, ',')) != 0) + if ((ns = end = strchr(s, ',')) != 0) ns++; else end = s + strlen(s); Index: misc.c --- xterm/misc.c Sun Mar 17 13:33:40 1996 +++ xterm-16/misc.c Tue Jun 25 17:56:50 1996 @@ -974,7 +974,7 @@ if (names[0]==';') thisName= NULL; else thisName= names; - names= index(names,';'); + names = strchr(names,';'); if (names!=NULL) { *names= '\0'; names++; Index: util.c --- xterm/util.c Mon May 6 14:30:48 1996 +++ xterm-16/util.c Tue Jun 25 17:25:38 1996 @@ -117,16 +117,13 @@ screen->scroll_amt = 0; screen->refresh_amt = 0; if(refreshheight > 0) { - XClearArea ( - screen->display, - TextWindow(screen), - (int) screen->border + screen->scrollbar, + ClearCurBackground(screen, (int) refreshtop * FontHeight(screen) + screen->border, - (unsigned) Width(screen), + (int) screen->border + screen->scrollbar, (unsigned) refreshheight * FontHeight(screen), - FALSE); + (unsigned) Width(screen)); ScrnRefresh(screen, refreshtop, 0, refreshheight, - screen->max_col + 1, False); + screen->max_col + 1, False); } } @@ -239,14 +236,11 @@ } scrolling_copy_area(screen, scrolltop+amount, scrollheight, amount); if(refreshheight > 0) { - XClearArea ( - screen->display, - TextWindow(screen), - (int) screen->border + screen->scrollbar, - (int) refreshtop * FontHeight(screen) + screen->border, - (unsigned) Width(screen), - (unsigned) refreshheight * FontHeight(screen), - FALSE); + ClearCurBackground(screen, + (int) refreshtop * FontHeight(screen) + screen->border, + (int) screen->border + screen->scrollbar, + (unsigned) refreshheight * FontHeight(screen), + (unsigned) Width(screen)); if(refreshheight > shift) refreshheight = shift; } @@ -319,15 +313,13 @@ screen->scrolls++; } scrolling_copy_area(screen, scrolltop-amount, scrollheight, -amount); - if(refreshheight > 0) - XClearArea ( - screen->display, - TextWindow(screen), - (int) screen->border + screen->scrollbar, + if(refreshheight > 0) { + ClearCurBackground(screen, (int) refreshtop * FontHeight(screen) + screen->border, - (unsigned) Width(screen), + (int) screen->border + screen->scrollbar, (unsigned) refreshheight * FontHeight(screen), - FALSE); + (unsigned) Width(screen)); + } } ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg, amount, screen->max_col + 1); @@ -381,15 +373,13 @@ if((i = screen->cur_row + refreshheight - 1 - bot) > 0) refreshheight -= i; vertical_copy_area(screen, scrolltop-n, scrollheight, -n); - if(refreshheight > 0) - XClearArea ( - screen->display, - TextWindow(screen), - (int) screen->border + screen->scrollbar, + if(refreshheight > 0) { + ClearCurBackground(screen, (int) refreshtop * FontHeight(screen) + screen->border, - (unsigned) Width(screen), + (int) screen->border + screen->scrollbar, (unsigned) refreshheight * FontHeight(screen), - FALSE); + (unsigned) Width(screen)); + } } /* adjust screen->buf */ ScrnInsertLine(screen->buf, screen->bot_marg, screen->cur_row, n, @@ -459,15 +449,13 @@ } } vertical_copy_area(screen, scrolltop+n, scrollheight, n); - if(refreshheight > 0) - XClearArea ( - screen->display, - TextWindow(screen), - (int) screen->border + screen->scrollbar, + if(refreshheight > 0) { + ClearCurBackground(screen, (int) refreshtop * FontHeight(screen) + screen->border, - (unsigned) Width(screen), + (int) screen->border + screen->scrollbar, (unsigned) refreshheight * FontHeight(screen), - FALSE); + (unsigned) Width(screen)); + } } /* adjust screen->buf */ if(screen->scrollWidget && !screen->alternate && screen->cur_row == 0) @@ -583,12 +571,11 @@ if((height = screen->cur_row + top) > screen->max_row) height = screen->max_row; if((height -= top) > 0) { - useCurBackground(TRUE); - XClearArea(screen->display, TextWindow(screen), - screen->border + screen->scrollbar, top * - FontHeight(screen) + screen->border, - Width(screen), height * FontHeight(screen), FALSE); - useCurBackground(FALSE); + ClearCurBackground(screen, + top * FontHeight(screen) + screen->border, + screen->border + screen->scrollbar, + height * FontHeight(screen), + Width(screen)); } if(screen->cur_row - screen->topline <= screen->max_row) @@ -611,13 +598,11 @@ if(screen->scroll_amt) FlushScroll(screen); if(++top <= screen->max_row) { - useCurBackground(TRUE); - XClearArea(screen->display, TextWindow(screen), - screen->border + screen->scrollbar, top * - FontHeight(screen) + screen->border, - Width(screen), (screen->max_row - top + 1) * - FontHeight(screen), FALSE); - useCurBackground(FALSE); + ClearCurBackground(screen, + top * FontHeight(screen) + screen->border, + screen->border + screen->scrollbar, + (screen->max_row - top + 1) * FontHeight(screen), + Width(screen)); } } ClearBufRows(screen, screen->cur_row + 1, screen->max_row); @@ -742,13 +727,11 @@ if((top = -screen->topline) <= screen->max_row) { if(screen->scroll_amt) FlushScroll(screen); - useCurBackground(TRUE); - XClearArea(screen->display, TextWindow(screen), - screen->border + screen->scrollbar, - top * FontHeight(screen) + screen->border, - Width(screen), (screen->max_row - top + 1) * - FontHeight(screen), FALSE); - useCurBackground(FALSE); + ClearCurBackground(screen, + top * FontHeight(screen) + screen->border, + screen->border + screen->scrollbar, + (screen->max_row - top + 1) * FontHeight(screen), + Width(screen)); } ClearBufRows (screen, 0, screen->max_row); } @@ -1257,11 +1240,28 @@ * in the current SGR background. Otherwise, reset to the window's default * background. */ -void useCurBackground(Bool flag) +void useCurBackground(flag) + Bool flag; { TScreen *screen = &term->screen; int color = flag ? term->cur_background : -1; Pixel bg = getXtermBackground(term->flags, color); XSetWindowBackground(screen->display, TextWindow(screen), bg); +} + +/* + * Using the "current" SGR background, clear a rectangle. + */ +void ClearCurBackground(screen, top,left, height,width) + register TScreen *screen; + int top; + int left; + unsigned height; + unsigned width; +{ + useCurBackground(TRUE); + XClearArea (screen->display, TextWindow(screen), + left, top, width, height, FALSE); + useCurBackground(FALSE); } Index: xterm.h --- xterm/xterm.h Mon May 6 14:30:48 1996 +++ xterm-16/xterm.h Tue Jun 25 17:26:16 1996 @@ -174,6 +174,7 @@ extern void ChangeColors PROTO((XtermWidget tw, ScrnColors *pNew)); extern void ClearAbove PROTO((TScreen *screen)); extern void ClearBelow PROTO((TScreen *screen)); +extern void ClearCurBackground PROTO((TScreen *screen, int top, int left, unsigned height, unsigned width)); extern void ClearLeft PROTO((TScreen *screen)); extern void ClearLine PROTO((TScreen *screen)); extern void ClearRight PROTO((TScreen *screen));