XFree86 3.1.2Ec - xterm patch #21 - T.Dickey This patch does the following: + fixes some minor typography in the control-sequences documentation (it didn't occur to me til I'd sent the last patch that I could use ghostview for previewing the troff output ;-) + adjusts the shell's background color in ReverseVideo so that flicker in resizing is reduced + adds an ifdef OPT_ISO_COLORS to allow configuring xterm without the ISO color support (saves a lot of memory) + used that ifdef to isolate/modify logic so that if the user doesn't have the colorMode enabled, then ISO color support is disabled (saving memory). (If anyone needs numbers, I had savedLines set to 2000, and found a reduction from ~700k to ~400k of allocated memory, according to Purify). To do: + I think I've got a double-negative in the color sense (if the xterm is started in reverse video, and the application clears it, I get a "white" background when my modified vttest says it should be black -- I'll investigate). + time-permitting, implement ech/ech1 terminal capabilities, and protected characters. -------------------------------------------------------------------------------- doc/specs/xterm/ctlseqs.ms | 14 !!!! programs/xterm/charproc.c | 80 ++-!!!!!!!!!!!!!!!!!!!!!!! programs/xterm/ptyx.h | 31 +++++!!!!! programs/xterm/screen.c | 139 +++-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! programs/xterm/util.c | 49 ++-!!!!!!!!!!!!! programs/xterm/xterm.h | 34 ++++++++-! 6 files changed, 72 insertions, 10 deletions, 265 modifications -------------------------------------------------------------------------------- Index: ctlseqs.ms *** /build/x11r6/XFree86-960721/xc/doc/specs/xterm/ctlseqs.ms Wed Jul 24 21:03:44 1996 --- /build/x11r6/XFree86-current/xc/doc/specs/xterm/ctlseqs.ms Thu Jul 25 06:29:05 1996 *************** *** 415,432 **** \*(Ps = \*7 \(-> Refresh the xterm window. \*(Ps = \*8 ; \fIheight ; width\fP \(-> Resize the text area to [height;width] in characters. \*(Ps = \*1\*1 \(-> Report xterm window state. ! If the xterm window is open (non-iconified), it returns ``\*(Es [ 1 t''. ! If the xterm window is iconified, it returns ``\*(Es [ 2 t''. \*(Ps = \*1\*3 \(-> Report xterm window position as ! \*(Es [ 3 ; x ; y t \*(Ps = \*1\*4 \(-> Report xterm window in pixels as ! \*(Es\*s\*([[\*s\*4\*s\*;\*sheight\*s\*;\*swidth\*s\*t \*(Ps = \*1\*8 \(-> Report the size of the text area in characters as ! \*(Es\*s\*([[\*s\*8\*s\*;\*sheight\*s\*;\*swidth t \*(Ps = \*2\*0 \(-> Report xterm window's icon label as ! \*(Es\*s\*]\*s\*L\*slabel\*s\*(Es\*s\*(bS \*(Ps = \*2\*1 \(-> Report xterm window's title as ! \*(Es\*s\*]\*s\*l\*stitle\*s\*(Es\*s\*(bS .IP \\*(Es\\*([[\\*(Ps\\*s\\*x Request Terminal Parameters (DECREQTPARM) .IP \\*(Es\\*([[\\*?\\*(Pm\\*s\\*h --- 415,432 ---- \*(Ps = \*7 \(-> Refresh the xterm window. \*(Ps = \*8 ; \fIheight ; width\fP \(-> Resize the text area to [height;width] in characters. \*(Ps = \*1\*1 \(-> Report xterm window state. ! If the xterm window is open (non-iconified), it returns \*(Es\*([[\*1\*t. ! If the xterm window is iconified, it returns \*(Es\*([[\*2\*t. \*(Ps = \*1\*3 \(-> Report xterm window position as ! \*(Es\*([[\*3\*;\*(Ix\*;\*(Iy\*t \*(Ps = \*1\*4 \(-> Report xterm window in pixels as ! \*(Es\*s\*([[\*s\*4\*s\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t \*(Ps = \*1\*8 \(-> Report the size of the text area in characters as ! \*(Es\*s\*([[\*s\*8\*s\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*t \*(Ps = \*2\*0 \(-> Report xterm window's icon label as ! \*(Es\*s\*]\*s\*L\*s\fIlabel\fP\*s\*(Es\*s\*(bS \*(Ps = \*2\*1 \(-> Report xterm window's title as ! \*(Es\*s\*]\*s\*l\*s\fItitle\fP\*s\*(Es\*s\*(bS .IP \\*(Es\\*([[\\*(Ps\\*s\\*x Request Terminal Parameters (DECREQTPARM) .IP \\*(Es\\*([[\\*?\\*(Pm\\*s\\*h Index: charproc.c *** /build/x11r6/XFree86-960721/xc/programs/xterm/charproc.c Sun Jul 21 19:11:02 1996 --- /build/x11r6/XFree86-current/xc/programs/xterm/charproc.c Wed Jul 24 20:09:29 1996 *************** *** 586,591 **** --- 586,592 ---- XtOffsetOf(XtermWidgetRec, misc.open_im), XtRImmediate, (XtPointer)TRUE}, #endif + #if OPT_ISO_COLORS {XtNcolor0, XtCForeground, XtRPixel, sizeof(Pixel), XtOffsetOf(XtermWidgetRec, screen.Acolors[COLOR_0]), XtRString, "XtDefaultForeground"}, *************** *** 649,654 **** --- 650,656 ---- {XtNcolorBDMode, XtCColorMode, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, screen.colorBDMode), XtRBoolean, (XtPointer) &defaultFALSE}, + #endif /* OPT_ISO_COLORS */ {XtNdynamicColors, XtCDynamicColors, XtRBoolean, sizeof(Boolean), XtOffsetOf(XtermWidgetRec, misc.dynamicColors), XtRBoolean, (XtPointer) &defaultTRUE}, *************** *** 709,714 **** --- 711,717 ---- WidgetClass xtermWidgetClass = (WidgetClass)&xtermClassRec; + #if OPT_ISO_COLORS /* * The terminal's foreground and background colors are set via two mechanisms: * text (cur_foreground, cur_background values that are passed down to *************** *** 754,759 **** --- 757,763 ---- XSetBackground(screen->display, screen->normalboldGC, bg); XSetForeground(screen->display, screen->reverseboldGC, bg); } + #endif /* OPT_ISO_COLORS */ static void VTparse() { *************** *** 1105,1139 **** switch (param[row]) { case DEFAULT: case 0: ! if (term->flags & FG_COLOR) SGR_Foreground(-1); ! if (term->flags & BG_COLOR) SGR_Background(-1); term->flags &= ~(INVERSE|BOLD|UNDERLINE); break; case 1: case 5: /* Blink, really. */ term->flags |= BOLD; ! if( screen->colorMode && ! screen->colorBDMode) { ! if (!(term->flags & FG_COLOR) || ! (term->cur_foreground==COLOR_UL)){ ! SGR_Foreground(COLOR_BD); } ! else /* Set highlight bit */ ! if (term->cur_foreground < 8) ! term->cur_foreground |= 8; ! } break; case 4: /* Underscore */ term->flags |= UNDERLINE; ! if( screen->colorMode && ! screen->colorULMode) { ! if (!(term->flags & FG_COLOR)) { ! SGR_Foreground(COLOR_UL); } ! } break; case 7: term->flags |= INVERSE; --- 1109,1147 ---- switch (param[row]) { case DEFAULT: case 0: ! if_OPT_ISO_COLORS(screen,{ ! if (term->flags & FG_COLOR) SGR_Foreground(-1); ! if (term->flags & BG_COLOR) SGR_Background(-1); + }) term->flags &= ~(INVERSE|BOLD|UNDERLINE); break; case 1: case 5: /* Blink, really. */ term->flags |= BOLD; ! if_OPT_ISO_COLORS(screen,{ ! if (screen->colorBDMode) { ! if (!(term->flags & FG_COLOR) || ! (term->cur_foreground==COLOR_UL)){ ! SGR_Foreground(COLOR_BD); ! } ! else /* Set highlight bit */ ! if (term->cur_foreground < 8) ! term->cur_foreground |= 8; } ! }) break; case 4: /* Underscore */ term->flags |= UNDERLINE; ! if_OPT_ISO_COLORS(screen,{ ! if (screen->colorULMode) { ! if (!(term->flags & FG_COLOR)) { ! SGR_Foreground(COLOR_UL); ! } } ! }) break; case 7: term->flags |= INVERSE; *************** *** 1159,1176 **** case 35: case 36: case 37: ! if( screen->colorMode ) { SGR_Foreground( (param[row] - 30) ! /* Set highlight bit if bold */ ! | ((term->flags & BOLD) ? 8 : 0)); ! } break; case 39: ! if( screen->colorMode ) { SGR_Foreground(-1); ! } break; case 40: case 41: --- 1167,1184 ---- case 35: case 36: case 37: ! if_OPT_ISO_COLORS(screen,{ SGR_Foreground( (param[row] - 30) ! /* Set highlight bit if bold */ ! | ((term->flags & BOLD) ? 8 : 0)); ! }) break; case 39: ! if_OPT_ISO_COLORS(screen,{ SGR_Foreground(-1); ! }) break; case 40: case 41: *************** *** 1180,1201 **** case 45: case 46: case 47: ! if( screen->colorMode ) { SGR_Background(param[row] - 40); ! } break; case 49: ! if( screen->colorMode ) { SGR_Background(-1); ! } break; case 100: ! if( screen->colorMode ) { if (term->flags & FG_COLOR) SGR_Foreground(-1); if (term->flags & BG_COLOR) SGR_Background(-1); ! } break; } } --- 1188,1209 ---- case 45: case 46: case 47: ! if_OPT_ISO_COLORS(screen,{ SGR_Background(param[row] - 40); ! }) break; case 49: ! if_OPT_ISO_COLORS(screen,{ SGR_Background(-1); ! }) break; case 100: ! if_OPT_ISO_COLORS(screen,{ if (term->flags & FG_COLOR) SGR_Foreground(-1); if (term->flags & BG_COLOR) SGR_Background(-1); ! }) break; } } *************** *** 2576,2582 **** register TScreen *screen; { register int rows = screen->max_row + 1; ! char *save [MAX_PTRS * MAX_ROWS]; Size_t len = MAX_PTRS * sizeof(char *) * rows; memcpy ( (char *)save, (char *)screen->buf, len); --- 2584,2590 ---- register TScreen *screen; { register int rows = screen->max_row + 1; ! char *save [4 /* MAX_PTRS */ * MAX_ROWS]; Size_t len = MAX_PTRS * sizeof(char *) * rows; memcpy ( (char *)save, (char *)screen->buf, len); *************** *** 2849,2858 **** new->screen.menu_font_names[fontMenu_fontsel] = NULL; new->screen.menu_font_number = fontMenu_fontdefault; new->screen.colorMode = request->screen.colorMode; new->screen.colorULMode = request->screen.colorULMode; new->screen.colorBDMode = request->screen.colorBDMode; - new->screen.underline = request->screen.underline; for (i = 0; i < MAXCOLORS; i++) { new->screen.Acolors[i] = request->screen.Acolors[i]; } --- 2857,2867 ---- new->screen.menu_font_names[fontMenu_fontsel] = NULL; new->screen.menu_font_number = fontMenu_fontdefault; + #if OPT_ISO_COLORS + new->num_ptrs = request->screen.colorMode ? 4 : 2; new->screen.colorMode = request->screen.colorMode; new->screen.colorULMode = request->screen.colorULMode; new->screen.colorBDMode = request->screen.colorBDMode; for (i = 0; i < MAXCOLORS; i++) { new->screen.Acolors[i] = request->screen.Acolors[i]; } *************** *** 2863,2868 **** --- 2872,2879 ---- new->screen.original_fg = request->screen.foreground; new->screen.original_bg = request->core.background_pixel; } + #endif /* OPT_ISO_COLORS */ + new->screen.underline = request->screen.underline; new->cur_foreground = 0; new->cur_background = 0; *************** *** 3378,3384 **** { register TScreen *screen = &term->screen; GC currentGC; ! register int x, y, flags, fg, bg; char c; Boolean in_selection; --- 3389,3395 ---- { register TScreen *screen = &term->screen; GC currentGC; ! register int x, y, flags, fg = 0, bg = 0; char c; Boolean in_selection; *************** *** 3387,3394 **** c = SCRN_BUF_CHARS(screen, screen->cursor_row)[screen->cursor_col]; flags = SCRN_BUF_ATTRS(screen, screen->cursor_row)[screen->cursor_col]; ! fg = SCRN_BUF_FORES(screen, screen->cursor_row)[screen->cursor_col]; ! bg = SCRN_BUF_BACKS(screen, screen->cursor_row)[screen->cursor_col]; if (screen->cursor_row > screen->endHRow || (screen->cursor_row == screen->endHRow && --- 3398,3408 ---- c = SCRN_BUF_CHARS(screen, screen->cursor_row)[screen->cursor_col]; flags = SCRN_BUF_ATTRS(screen, screen->cursor_row)[screen->cursor_col]; ! ! if_OPT_ISO_COLORS(screen,{ ! fg = SCRN_BUF_FORES(screen, screen->cursor_row)[screen->cursor_col]; ! bg = SCRN_BUF_BACKS(screen, screen->cursor_row)[screen->cursor_col]; ! }) if (screen->cursor_row > screen->endHRow || (screen->cursor_row == screen->endHRow && Index: ptyx.h *** /build/x11r6/XFree86-960721/xc/programs/xterm/ptyx.h Thu Jul 18 22:00:40 1996 --- /build/x11r6/XFree86-current/xc/programs/xterm/ptyx.h Wed Jul 24 20:09:29 1996 *************** *** 275,280 **** --- 275,287 ---- /***====================================================================***/ + #define OPT_ISO_COLORS 1 /* true if xterm is configured with ISO colors */ + + /***====================================================================***/ + + #if OPT_ISO_COLORS + #define if_OPT_ISO_COLORS(screen, code) if(screen->colorMode) code + #define TERM_COLOR_FLAGS (term->flags & (FG_COLOR|BG_COLOR)) #define MAXCOLORS 18 #define COLOR_0 0 #define COLOR_1 1 *************** *** 294,313 **** #define COLOR_15 15 #define COLOR_BD 16 #define COLOR_UL 17 ! ! #define MAX_PTRS 4 /* the number of pointers per row in 'ScrnBuf' */ /* ScrnBuf-level macros */ #define BUF_CHARS(buf, row) (buf[MAX_PTRS * (row) + 0]) #define BUF_ATTRS(buf, row) (buf[MAX_PTRS * (row) + 1]) #define BUF_FORES(buf, row) (buf[MAX_PTRS * (row) + 2]) #define BUF_BACKS(buf, row) (buf[MAX_PTRS * (row) + 3]) /* TScreen-level macros */ #define SCRN_BUF_CHARS(screen, row) BUF_CHARS(screen->buf, row) #define SCRN_BUF_ATTRS(screen, row) BUF_ATTRS(screen->buf, row) #define SCRN_BUF_FORES(screen, row) BUF_FORES(screen->buf, row) #define SCRN_BUF_BACKS(screen, row) BUF_BACKS(screen->buf, row) typedef struct { /* These parameters apply to both windows */ --- 301,335 ---- #define COLOR_15 15 #define COLOR_BD 16 #define COLOR_UL 17 ! #else ! #define if_OPT_ISO_COLORS(screen, code) /* nothing */ ! #define TERM_COLOR_FLAGS 0 ! #endif /* OPT_ISO_COLORS */ ! ! /* the number of pointers per row in 'ScrnBuf' */ ! #if OPT_ISO_COLORS ! #define MAX_PTRS term->num_ptrs ! #else ! #define MAX_PTRS 2 ! #endif /* ScrnBuf-level macros */ #define BUF_CHARS(buf, row) (buf[MAX_PTRS * (row) + 0]) #define BUF_ATTRS(buf, row) (buf[MAX_PTRS * (row) + 1]) + + #if OPT_ISO_COLORS #define BUF_FORES(buf, row) (buf[MAX_PTRS * (row) + 2]) #define BUF_BACKS(buf, row) (buf[MAX_PTRS * (row) + 3]) + #endif /* TScreen-level macros */ #define SCRN_BUF_CHARS(screen, row) BUF_CHARS(screen->buf, row) #define SCRN_BUF_ATTRS(screen, row) BUF_ATTRS(screen->buf, row) + + #if OPT_ISO_COLORS #define SCRN_BUF_FORES(screen, row) BUF_FORES(screen->buf, row) #define SCRN_BUF_BACKS(screen, row) BUF_BACKS(screen->buf, row) + #endif typedef struct { /* These parameters apply to both windows */ *************** *** 333,344 **** --- 355,368 ---- Pixel cursorcolor; /* Cursor color */ Pixel mousecolor; /* Mouse color */ Pixel mousecolorback; /* Mouse color background */ + #if OPT_ISO_COLORS Pixel Acolors[MAXCOLORS]; /* ANSI color emulation */ Pixel original_fg; /* reference for SGR reset fg */ Pixel original_bg; /* reference for SGR reset bg */ Boolean colorMode; /* are we using color mode? */ Boolean colorULMode; /* use color for underline? */ Boolean colorBDMode; /* use color for bold? */ + #endif int border; /* inner border */ Cursor arrow; /* arrow cursor */ unsigned short send_mouse_pos; /* user wants mouse transition */ *************** *** 570,575 **** --- 594,602 ---- unsigned flags; /* mode flags */ unsigned cur_foreground; /* current foreground color */ unsigned cur_background; /* current background color */ + #if OPT_ISO_COLORS + int num_ptrs; /* number of pointers per row in 'ScrnBuf' */ + #endif unsigned initflags; /* initial mode flags */ Tabs tabs; /* tabstops of the terminal */ Misc misc; /* miscellaneous parameters */ Index: screen.c *** /build/x11r6/XFree86-960721/xc/programs/xterm/screen.c Sun Jul 21 19:11:02 1996 --- /build/x11r6/XFree86-current/xc/programs/xterm/screen.c Wed Jul 24 20:09:29 1996 *************** *** 129,135 **** register Size_t mincols; Char *oldbuf; int move_down = 0, move_up = 0; ! if (sbuf == NULL || *sbuf == NULL) return 0; --- 129,135 ---- register Size_t mincols; Char *oldbuf; int move_down = 0, move_up = 0; ! if (sbuf == NULL || *sbuf == NULL) return 0; *************** *** 206,212 **** register unsigned cur_fg, cur_bg; register int length; /* length of string */ { ! register Char *attrs, *attrs0, *fgs, *bgs; register int avail = screen->max_col - screen->cur_col + 1; register Char *col; register int wrappedbit; --- 206,215 ---- register unsigned cur_fg, cur_bg; register int length; /* length of string */ { ! #if OPT_ISO_COLORS ! register Char *fgs = 0, *bgs = 0; ! #endif ! register Char *attrs; register int avail = screen->max_col - screen->cur_col + 1; register Char *col; register int wrappedbit; *************** *** 218,236 **** col = SCRN_BUF_CHARS(screen, screen->cur_row) + screen->cur_col; attrs = SCRN_BUF_ATTRS(screen, screen->cur_row) + screen->cur_col; - fgs = SCRN_BUF_FORES(screen, screen->cur_row) + screen->cur_col; - bgs = SCRN_BUF_BACKS(screen, screen->cur_row) + screen->cur_col; ! attrs0 = attrs; ! wrappedbit = *attrs0&LINEWRAPPED; flags &= ATTRIBUTES; flags |= CHARDRAWN; memcpy( col, str, length); memset( attrs, flags, length); ! memset( fgs, cur_fg, length); ! memset( bgs, cur_bg, length); if (wrappedbit) ! *attrs0 |= LINEWRAPPED; } static void --- 221,245 ---- col = SCRN_BUF_CHARS(screen, screen->cur_row) + screen->cur_col; attrs = SCRN_BUF_ATTRS(screen, screen->cur_row) + screen->cur_col; ! if_OPT_ISO_COLORS(screen,{ ! fgs = SCRN_BUF_FORES(screen, screen->cur_row) + screen->cur_col; ! bgs = SCRN_BUF_BACKS(screen, screen->cur_row) + screen->cur_col; ! }) ! ! wrappedbit = *attrs & LINEWRAPPED; flags &= ATTRIBUTES; flags |= CHARDRAWN; memcpy( col, str, length); memset( attrs, flags, length); ! ! if_OPT_ISO_COLORS(screen,{ ! memset( fgs, cur_fg, length); ! memset( bgs, cur_bg, length); ! }) ! if (wrappedbit) ! *attrs |= LINEWRAPPED; } static void *************** *** 250,258 **** MAX_PTRS * sizeof(char *) * n); /* clear contents of old rows */ ! if (term->flags & (FG_COLOR|BG_COLOR)) { int last = (n * MAX_PTRS); ! int flags = (term->flags & (FG_COLOR|BG_COLOR)); for (i = 0; i < last; i += MAX_PTRS) { bzero(save[i+0], size); memset(save[i+1], flags, size); --- 259,267 ---- MAX_PTRS * sizeof(char *) * n); /* clear contents of old rows */ ! if (TERM_COLOR_FLAGS) { int last = (n * MAX_PTRS); ! int flags = TERM_COLOR_FLAGS; for (i = 0; i < last; i += MAX_PTRS) { bzero(save[i+0], size); memset(save[i+1], flags, size); *************** *** 277,283 **** int last; register int where, n, size; { ! char *save [MAX_PTRS * MAX_ROWS]; /* save n lines at bottom */ ScrnClearLines(save, sb, (last -= n - 1), n, size); --- 286,292 ---- int last; register int where, n, size; { ! char *save [4 /* MAX_PTRS */ * MAX_ROWS]; /* save n lines at bottom */ ScrnClearLines(save, sb, (last -= n - 1), n, size); *************** *** 313,319 **** register int n, last, size; int where; { ! char *save [MAX_PTRS * MAX_ROWS]; ScrnClearLines(save, sb, where, n, size); --- 322,328 ---- register int n, last, size; int where; { ! char *save [4 /* MAX_PTRS */ * MAX_ROWS]; ScrnClearLines(save, sb, where, n, size); *************** *** 329,347 **** } void ! ScrnInsertChar (sb, row, col, n, size) /* ! Inserts n blanks in sb at row, col. Size is the size of each row. ! */ ! ScrnBuf sb; ! int row, size; ! register int col, n; { register int i, j; register Char *ptr = BUF_CHARS(sb, row); register Char *attrs = BUF_ATTRS(sb, row); int wrappedbit = attrs[0]&LINEWRAPPED; ! int flags = CHARDRAWN | (term->flags & (FG_COLOR|BG_COLOR)); attrs[0] &= ~LINEWRAPPED; /* make sure the bit isn't moved */ for (i = size - 1; i >= col + n; i--) { --- 338,360 ---- } void ! ScrnInsertChar (screen, n, size) /* ! * Inserts n blanks in screen at current row, col. Size is the size of each ! * row. ! */ ! register TScreen *screen; ! register int n; ! int size; { + ScrnBuf sb = screen->buf; + int row = screen->cur_row; + int col = screen->cur_col; register int i, j; register Char *ptr = BUF_CHARS(sb, row); register Char *attrs = BUF_ATTRS(sb, row); int wrappedbit = attrs[0]&LINEWRAPPED; ! int flags = CHARDRAWN | TERM_COLOR_FLAGS; attrs[0] &= ~LINEWRAPPED; /* make sure the bit isn't moved */ for (i = size - 1; i >= col + n; i--) { *************** *** 353,376 **** ptr[i] = ' '; for (i=col; icur_foreground, n); ! if (flags & BG_COLOR) ! memset(BUF_BACKS(sb, row) + col, term->cur_background, n); if (wrappedbit) attrs[0] |= LINEWRAPPED; } void ! ScrnDeleteChar (sb, row, col, n, size) /* ! Deletes n characters in sb at row, col. Size is the size of each row. */ ! ScrnBuf sb; ! register int row, size; ! register int n, col; { register Char *ptr = BUF_CHARS(sb, row); register Char *attrs = BUF_ATTRS(sb, row); register Size_t nbytes = (size - n - col); --- 366,394 ---- ptr[i] = ' '; for (i=col; icur_foreground, n); ! if (flags & BG_COLOR) ! memset(BUF_BACKS(sb, row) + col, term->cur_background, n); ! }) if (wrappedbit) attrs[0] |= LINEWRAPPED; } void ! ScrnDeleteChar (screen, n, size) /* ! Deletes n characters at current row, col. Size is the size of each row. */ ! register TScreen *screen; ! register int size; ! register int n; { + ScrnBuf sb = screen->buf; + int row = screen->cur_row; + int col = screen->cur_col; register Char *ptr = BUF_CHARS(sb, row); register Char *attrs = BUF_ATTRS(sb, row); register Size_t nbytes = (size - n - col); *************** *** 379,389 **** 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); ! if (term->flags & BG_COLOR) ! memset(BUF_BACKS(sb, row) + size - n, term->cur_background, n); if (wrappedbit) attrs[0] |= LINEWRAPPED; } --- 397,410 ---- memcpy (ptr + col, ptr + col + n, nbytes); memcpy (attrs + col, attrs + col + n, nbytes); bzero (ptr + size - n, n); ! memset (attrs + size - n, TERM_COLOR_FLAGS, n); ! ! if_OPT_ISO_COLORS(screen,{ ! if (term->flags & FG_COLOR) ! memset(BUF_FORES(sb, row) + size - n, term->cur_foreground, n); ! if (term->flags & BG_COLOR) ! memset(BUF_BACKS(sb, row) + size - n, term->cur_background, n); ! }) if (wrappedbit) attrs[0] |= LINEWRAPPED; } *************** *** 414,427 **** screen->cursor_row <= maxrow + topline) screen->cursor_state = OFF; for (row = toprow; row <= maxrow; y += FontHeight(screen), row++) { register Char *chars; register Char *attrs; - register Char *fgs, *bgs; register int col = leftcol; int maxcol = leftcol + ncols - 1; int lastind; int flags; ! int fg, bg; int x, n; GC gc; Boolean hilite; --- 435,450 ---- screen->cursor_row <= maxrow + topline) screen->cursor_state = OFF; for (row = toprow; row <= maxrow; y += FontHeight(screen), row++) { + #if OPT_ISO_COLORS + register Char *fgs = 0, *bgs = 0; + #endif register Char *chars; register Char *attrs; register int col = leftcol; int maxcol = leftcol + ncols - 1; int lastind; int flags; ! int fg = 0, bg = 0; int x, n; GC gc; Boolean hilite; *************** *** 436,448 **** chars = SCRN_BUF_CHARS(screen, lastind + topline); attrs = SCRN_BUF_ATTRS(screen, lastind + topline); ! fgs = SCRN_BUF_FORES(screen, lastind + topline); ! bgs = SCRN_BUF_BACKS(screen, lastind + topline); if (row < screen->startHRow || row > screen->endHRow || (row == screen->startHRow && maxcol < screen->startHCol) || (row == screen->endHRow && col >= screen->endHCol)) ! { /* row does not intersect selection; don't hilite */ if (!force) { while (col <= maxcol && (attrs[col] & ~BOLD) == 0 && --- 459,474 ---- chars = SCRN_BUF_CHARS(screen, lastind + topline); attrs = SCRN_BUF_ATTRS(screen, lastind + topline); ! ! if_OPT_ISO_COLORS(screen,{ ! fgs = SCRN_BUF_FORES(screen, lastind + topline); ! bgs = SCRN_BUF_BACKS(screen, lastind + topline); ! }) if (row < screen->startHRow || row > screen->endHRow || (row == screen->startHRow && maxcol < screen->startHCol) || (row == screen->endHRow && col >= screen->endHCol)) ! { /* row does not intersect selection; don't hilite */ if (!force) { while (col <= maxcol && (attrs[col] & ~BOLD) == 0 && *************** *** 474,481 **** if (col > maxcol) continue; flags = attrs[col]; ! fg = fgs[col]; ! bg = bgs[col]; gc = updatedXtermGC(screen, flags, fg, bg, hilite); gc_changes |= (flags & (FG_COLOR|BG_COLOR)); --- 500,509 ---- if (col > maxcol) continue; flags = attrs[col]; ! if_OPT_ISO_COLORS(screen,{ ! fg = fgs[col]; ! bg = bgs[col]; ! }) gc = updatedXtermGC(screen, flags, fg, bg, hilite); gc_changes |= (flags & (FG_COLOR|BG_COLOR)); *************** *** 483,491 **** lastind = col; for (; col <= maxcol; col++) { ! if ((attrs[col] != flags) || ! ((flags & FG_COLOR) && (fgs[col] != fg)) || ! ((flags & BG_COLOR) && (bgs[col] != bg))) { XDrawImageString(screen->display, TextWindow(screen), gc, x, y, (char *) &chars[lastind], n = col - lastind); --- 511,522 ---- lastind = col; for (; col <= maxcol; col++) { ! if ((attrs[col] != flags) ! #if OPT_ISO_COLORS ! || ((flags & FG_COLOR) && (fgs[col] != fg)) ! || ((flags & BG_COLOR) && (bgs[col] != bg)) ! #endif ! ) { XDrawImageString(screen->display, TextWindow(screen), gc, x, y, (char *) &chars[lastind], n = col - lastind); *************** *** 501,508 **** lastind = col; flags = attrs[col]; ! fg = fgs[col]; ! bg = bgs[col]; gc = updatedXtermGC(screen, flags, fg, bg, hilite); gc_changes |= (flags & (FG_COLOR|BG_COLOR)); } --- 532,541 ---- lastind = col; flags = attrs[col]; ! if_OPT_ISO_COLORS(screen,{ ! fg = fgs[col]; ! bg = bgs[col]; ! }) gc = updatedXtermGC(screen, flags, fg, bg, hilite); gc_changes |= (flags & (FG_COLOR|BG_COLOR)); } *************** *** 526,535 **** * screen foreground and background so that other functions (e.g., * ClearRight) will get the correct colors. */ ! if (gc_changes & FG_COLOR) SGR_Foreground(term->cur_foreground); ! if (gc_changes & BG_COLOR) SGR_Background(term->cur_background); } void --- 559,570 ---- * screen foreground and background so that other functions (e.g., * ClearRight) will get the correct colors. */ ! if_OPT_ISO_COLORS(screen,{ ! if (gc_changes & FG_COLOR) SGR_Foreground(term->cur_foreground); ! if (gc_changes & BG_COLOR) SGR_Background(term->cur_background); + }) } void *************** *** 544,558 **** ScrnBuf buf = screen->buf; int len = screen->max_col + 1; register int row; ! register int flags = term->flags & (FG_COLOR|BG_COLOR); for (row = first; row <= last; row++) { ! bzero (BUF_CHARS(buf, row), len); ! memset(BUF_ATTRS(buf, row), flags, len); memset(BUF_FORES(buf, row), (flags & FG_COLOR) ? term->cur_foreground : 0, len); memset(BUF_BACKS(buf, row), (flags & BG_COLOR) ? term->cur_background : 0, len); } } --- 579,595 ---- ScrnBuf buf = screen->buf; int len = screen->max_col + 1; register int row; ! register int flags = TERM_COLOR_FLAGS; for (row = first; row <= last; row++) { ! bzero (BUF_CHARS(buf, row), len); ! memset(BUF_ATTRS(buf, row), flags, len); ! if_OPT_ISO_COLORS(screen,{ memset(BUF_FORES(buf, row), (flags & FG_COLOR) ? term->cur_foreground : 0, len); memset(BUF_BACKS(buf, row), (flags & BG_COLOR) ? term->cur_background : 0, len); + }) } } Index: util.c *** /build/x11r6/XFree86-960721/xc/programs/xterm/util.c Thu Jul 18 22:00:40 1996 --- /build/x11r6/XFree86-current/xc/programs/xterm/util.c Wed Jul 24 20:09:29 1996 *************** *** 508,515 **** } } /* adjust screen->buf */ ! ScrnInsertChar(screen->buf, screen->cur_row, screen->cur_col, n, ! screen->max_col + 1); } /* --- 508,514 ---- } } /* adjust screen->buf */ ! ScrnInsertChar(screen, n, screen->max_col + 1); } /* *************** *** 549,556 **** } } /* adjust screen->buf */ ! ScrnDeleteChar (screen->buf, screen->cur_row, screen->cur_col, n, ! screen->max_col + 1); } --- 548,554 ---- } } /* adjust screen->buf */ ! ScrnDeleteChar (screen, n, screen->max_col + 1); } *************** *** 637,649 **** } } bzero(BUF_CHARS(buf, screen->cur_row) + screen->cur_col, len); ! memset(attrs, term->flags & (FG_COLOR|BG_COLOR), len); ! memset(BUF_FORES(buf, screen->cur_row) + screen->cur_col, (term->flags & FG_COLOR) ? term->cur_foreground : 0, len); ! memset(BUF_BACKS(buf, screen->cur_row) + screen->cur_col, (term->flags & BG_COLOR) ? term->cur_background : 0, len); /* with the right part cleared, we can't be wrapping */ attrs[0] &= ~LINEWRAPPED; --- 635,650 ---- } } bzero(BUF_CHARS(buf, screen->cur_row) + screen->cur_col, len); ! memset(attrs, TERM_COLOR_FLAGS, len); ! ! if_OPT_ISO_COLORS(screen,{ ! memset(BUF_FORES(buf, screen->cur_row) + screen->cur_col, (term->flags & FG_COLOR) ? term->cur_foreground : 0, len); ! memset(BUF_BACKS(buf, screen->cur_row) + screen->cur_col, (term->flags & BG_COLOR) ? term->cur_background : 0, len); + }) /* with the right part cleared, we can't be wrapping */ attrs[0] &= ~LINEWRAPPED; *************** *** 657,663 **** register TScreen *screen; { int len = screen->cur_col + 1; ! int flags = CHARDRAWN | (term->flags & (FG_COLOR|BG_COLOR)); if(screen->cursor_state) HideCursor(); --- 658,664 ---- register TScreen *screen; { int len = screen->cur_col + 1; ! int flags = CHARDRAWN | TERM_COLOR_FLAGS; if(screen->cursor_state) HideCursor(); *************** *** 679,689 **** memset(SCRN_BUF_CHARS(screen, screen->cur_row), ' ', len); memset(SCRN_BUF_ATTRS(screen, screen->cur_row), flags, len); ! memset(SCRN_BUF_FORES(screen, screen->cur_row), flags & FG_COLOR ? term->cur_foreground : 0, len); ! memset(SCRN_BUF_BACKS(screen, screen->cur_row), flags & BG_COLOR ? term->cur_background : 0, len); ! } /* --- 680,692 ---- memset(SCRN_BUF_CHARS(screen, screen->cur_row), ' ', len); memset(SCRN_BUF_ATTRS(screen, screen->cur_row), flags, len); ! ! if_OPT_ISO_COLORS(screen,{ ! memset(SCRN_BUF_FORES(screen, screen->cur_row), flags & FG_COLOR ? term->cur_foreground : 0, len); ! memset(SCRN_BUF_BACKS(screen, screen->cur_row), flags & BG_COLOR ? term->cur_background : 0, len); ! }) } /* *************** *** 709,718 **** useCurBackground(FALSE); } } bzero (SCRN_BUF_CHARS(screen, screen->cur_row), (screen->max_col + 1)); bzero (SCRN_BUF_ATTRS(screen, screen->cur_row), (screen->max_col + 1)); ! bzero (SCRN_BUF_FORES(screen, screen->cur_row), (screen->max_col + 1)); ! bzero (SCRN_BUF_BACKS(screen, screen->cur_row), (screen->max_col + 1)); } void --- 712,725 ---- useCurBackground(FALSE); } } + bzero (SCRN_BUF_CHARS(screen, screen->cur_row), (screen->max_col + 1)); bzero (SCRN_BUF_ATTRS(screen, screen->cur_row), (screen->max_col + 1)); ! ! if_OPT_ISO_COLORS(screen,{ ! bzero (SCRN_BUF_FORES(screen, screen->cur_row), (screen->max_col + 1)); ! bzero (SCRN_BUF_BACKS(screen, screen->cur_row), (screen->max_col + 1)); ! }) } void *************** *** 1067,1074 **** * We don't swap colors that happen to match the screen's foreground * and background because that tends to produce bizarre effects. */ ! EXCHANGE( screen->Acolors[0], screen->Acolors[7], tmp ) ! EXCHANGE( screen->Acolors[8], screen->Acolors[15], tmp ) tmp = termw->core.background_pixel; if(screen->cursorcolor == screen->foreground) --- 1074,1083 ---- * We don't swap colors that happen to match the screen's foreground * and background because that tends to produce bizarre effects. */ ! if_OPT_ISO_COLORS(screen,{ ! EXCHANGE( screen->Acolors[0], screen->Acolors[7], tmp ) ! EXCHANGE( screen->Acolors[8], screen->Acolors[15], tmp ) ! }) tmp = termw->core.background_pixel; if(screen->cursorcolor == screen->foreground) *************** *** 1095,1100 **** --- 1104,1115 ---- ScrollBarReverseVideo(screen->scrollWidget); XSetWindowBackground(screen->display, TextWindow(screen), termw->core.background_pixel); + + /* the shell-window's background will be used in the first repainting + * on resizing + */ + XSetWindowBackground(screen->display, VShellWindow, termw->core.background_pixel); + if(tek) { TekReverseVideo(screen); } *************** *** 1201,1207 **** } } ! /* GET_FG */ Pixel getXtermForeground(flags, color) int flags; --- 1216,1222 ---- } } ! #if OPT_ISO_COLORS Pixel getXtermForeground(flags, color) int flags; *************** *** 1217,1223 **** return fg; } - /* GET_BG */ Pixel getXtermBackground(flags, color) int flags; --- 1232,1237 ---- *************** *** 1265,1267 **** --- 1279,1282 ---- left, top, width, height, FALSE); useCurBackground(FALSE); } + #endif /* OPT_ISO_COLORS */ Index: xterm.h *** /build/x11r6/XFree86-960721/xc/programs/xterm/xterm.h Sun Jun 30 12:03:00 1996 --- /build/x11r6/XFree86-current/xc/programs/xterm/xterm.h Wed Jul 24 20:09:29 1996 *************** *** 48,55 **** extern int v_write PROTO((int f, char *d, int len)); extern void FindFontSelection PROTO((char *atom_name, Bool justprobe)); extern void HideCursor PROTO((void)); - extern void SGR_Background PROTO((int color)); - extern void SGR_Foreground PROTO((int color)); extern void SetVTFont PROTO((int i, Bool doresize, char *name1, char *name2)); extern void ShowCursor PROTO((void)); extern void SwitchBufPtrs PROTO((TScreen *screen)); --- 48,53 ---- *************** *** 59,64 **** --- 57,67 ---- extern void unparseputc PROTO((int c, int fd)); extern void unparseseq PROTO((ANSI *ap, int fd)); + #if OPT_ISO_COLORS + extern void SGR_Background PROTO((int color)); + extern void SGR_Foreground PROTO((int color)); + #endif + /* cursor.c */ extern void CarriageReturn PROTO((TScreen *screen)); extern void CursorBack PROTO((TScreen *screen, int n)); *************** *** 140,148 **** extern int ScrnGetAttributes PROTO((TScreen *screen, int row, int col, Char *str, int length)); extern void ClearBufRows PROTO((TScreen *screen, int first, int last)); extern void ScreenWrite PROTO((TScreen *screen, char *str, unsigned flags, unsigned cur_fg, unsigned cur_bg, int length)); ! extern void ScrnDeleteChar PROTO((ScrnBuf sb, int row, int size, int n, int col)); extern void ScrnDeleteLine PROTO((ScrnBuf sb, int n, int last, int size, int where)); ! extern void ScrnInsertChar PROTO((ScrnBuf sb, int row, int size, int col, int n)); extern void ScrnInsertLine PROTO((ScrnBuf sb, int last, int where, int n, int size)); extern void ScrnRefresh PROTO((TScreen *screen, int toprow, int leftcol, int nrows, int ncols, int force)); extern void ScrnSetAttributes PROTO((TScreen *screen, int row, int col, unsigned mask, unsigned value, int length)); --- 143,151 ---- extern int ScrnGetAttributes PROTO((TScreen *screen, int row, int col, Char *str, int length)); extern void ClearBufRows PROTO((TScreen *screen, int first, int last)); extern void ScreenWrite PROTO((TScreen *screen, char *str, unsigned flags, unsigned cur_fg, unsigned cur_bg, int length)); ! extern void ScrnDeleteChar PROTO((TScreen *screen, int n, int size)); extern void ScrnDeleteLine PROTO((ScrnBuf sb, int n, int last, int size, int where)); ! extern void ScrnInsertChar PROTO((TScreen *screen, int n, int size)); extern void ScrnInsertLine PROTO((ScrnBuf sb, int last, int where, int n, int size)); extern void ScrnRefresh PROTO((TScreen *screen, int toprow, int leftcol, int nrows, int ncols, int force)); extern void ScrnSetAttributes PROTO((TScreen *screen, int row, int col, unsigned mask, unsigned value, int length)); *************** *** 167,180 **** /* util.c */ extern GC updatedXtermGC PROTO((TScreen *screen, int flags, int fg, int bg, Bool hilite)); - extern Pixel getXtermBackground PROTO((int flags, int color)); - extern Pixel getXtermForeground PROTO((int flags, int color)); extern int AddToRefresh PROTO((TScreen *screen)); extern int HandleExposure PROTO((TScreen *screen, XEvent *event)); 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)); --- 170,180 ---- *************** *** 191,196 **** --- 191,216 ---- extern void recolor_cursor PROTO((Cursor cursor, unsigned long fg, unsigned long bg)); extern void resetXtermGC PROTO((TScreen *screen, int flags, Bool hilite)); extern void scrolling_copy_area PROTO((TScreen *screen, int firstline, int nlines, int amount)); + + #if OPT_ISO_COLORS + + extern Pixel getXtermBackground PROTO((int flags, int color)); + extern Pixel getXtermForeground PROTO((int flags, int color)); + extern void ClearCurBackground PROTO((TScreen *screen, int top, int left, unsigned height, unsigned width)); extern void useCurBackground PROTO((Bool flag)); + + #else /* !OPT_ISO_COLORS */ + + #define ClearCurBackground(screen, top, left, height, width) \ + XClearArea (screen->display, TextWindow(screen), \ + left, top, width, height, FALSE) + + /* FIXME: Reverse-Video? */ + #define getXtermBackground(flags, color) term->core.background_pixel + #define getXtermForeground(flags, color) term->screen.foreground + + #define useCurBackground(flag) /*nothing*/ + + #endif /* OPT_ISO_COLORS */ #endif /* included_xterm_h */