XFree86 3.9s - xterm patch #54 - 1997/10/17 - T.Dickey This patch does the following: + correct a minor placement problem with the right scrollbar. + implement a new set of control sequences for switching between the normal and alternate VT100 screens. These work around the older sequences limitation that required modification of the runtime $TERMCAP to cooperate with the titeInhibit resource (that can't work with terminfo). I do this by moving all of the functionality of the rmcur terminfo capability into the control sequences. + implement the alternate-screen menu entry -------------------------------------------------------------------------------- doc/specs/xterm/ctlseqs.ms | 9 ++++ programs/xterm/INSTALL | 3 - programs/xterm/charproc.c | 99 ++++++++!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! programs/xterm/menu.c | 5 ! programs/xterm/menu.h | 5 -- programs/xterm/ptyx.h | 31 +++++++++++++! programs/xterm/scrollbar.c | 16 ++++++- programs/xterm/terminfo | 14 ++!!!! programs/xterm/xterm.h | 3 - programs/xterm/xterm.man | 2 10 files changed, 80 insertions, 12 deletions, 95 modifications -------------------------------------------------------------------------------- Index: xterm/ctlseqs.ms *** XFree86-3.9s/xc/doc/specs/xterm/ctlseqs.ms Wed Aug 27 06:48:32 1997 --- XFree86-3.9s-patched/xc/doc/specs/xterm/ctlseqs.ms Thu Oct 16 20:51:41 1997 *************** *** 782,787 **** --- 782,791 ---- See the section \fBMouse Tracking\fP. \*(Ps = \*1\*0\*0\*1 \(-> Use Hilite Mouse Tracking. See the section \fBMouse Tracking\fP. + \*(Ps = \*1\*0\*4\*7 \(-> Use Alternate Screen Buffer (unless + disabled by the \fBtiteInhibit\fP resource) + \*(Ps = \*1\*0\*4\*8 \(-> Save cursor as in DECSC (unless + disabled by the \fBtiteInhibit\fP resource) . .IP \\*(Cs\\*?\\*(Pm\\*s\\*l DEC Private Mode Reset (DECRST) *************** *** 808,813 **** --- 812,822 ---- \*(Ps = \*1\*0\*0\*0 \(-> Don't Send Mouse X & Y on button press and release \*(Ps = \*1\*0\*0\*1 \(-> Don't Use Hilite Mouse Tracking + \*(Ps = \*1\*0\*4\*7 \(-> Use Normal Screen Buffer, clearing screen + first if in the Alternate Screen (unless + disabled by the \fBtiteInhibit\fP resource) + \*(Ps = \*1\*0\*4\*8 \(-> Restore cursor as in DECRC (unless + disabled by the \fBtiteInhibit\fP resource) . .IP \\*(Cs\\*?\\*(Pm\\*s\\*r Restore DEC Private Mode Values. The value of \*(Ps previously saved is Index: INSTALL *** XFree86-3.9s/xc/programs/xterm/INSTALL Tue Oct 14 21:40:58 1997 --- XFree86-3.9s-patched/xc/programs/xterm/INSTALL Fri Oct 17 19:24:55 1997 *************** *** 51,56 **** --with-Xaw3d link with Xaw 3d library --with-neXtaw link with neXT Athena library --with-terminal-id[=V] set default decTerminalID (default: vt100) - - - -- $XFree86: xc/programs/xterm/INSTALL,v 3.3 1997/10/13 17:16:54 hohndel Exp $ --- 51,53 ---- Index: charproc.c *** XFree86-3.9s/xc/programs/xterm/charproc.c Tue Oct 14 21:40:58 1997 --- XFree86-3.9s-patched/xc/programs/xterm/charproc.c Fri Oct 17 19:42:41 1997 *************** *** 2741,2752 **** #endif /* ALLOWLOGFILEONOFF */ break; #endif case 47: /* alternate buffer */ if (!termw->misc.titeInhibit) { ! if(func == bitset) ToAlternate(screen); ! else FromAlternate(screen); } break; case 66: /* DECNKM */ --- 2741,2757 ---- #endif /* ALLOWLOGFILEONOFF */ break; #endif + case 1047: case 47: /* alternate buffer */ if (!termw->misc.titeInhibit) { ! if(func == bitset) { ToAlternate(screen); ! } else { ! if (screen->alternate ! && (param[i] == 1047)) ! ClearScreen(screen); FromAlternate(screen); + } } break; case 66: /* DECNKM */ *************** *** 2769,2774 **** --- 2774,2784 ---- else screen->send_mouse_pos = 0; break; + case 1048: + if (!termw->misc.titeInhibit) { + CursorRestore(termw, &screen->sc); + } + break; } } } *************** *** 2786,2840 **** for (i = 0; i < nparam; i++) { switch (param[i]) { case 1: /* DECCKM */ ! screen->save_modes[0] = termw->keyboard.flags & ! MODE_DECCKM; break; case 3: /* DECCOLM */ if(screen->c132) ! screen->save_modes[1] = termw->flags & IN132COLUMNS; break; case 4: /* DECSCLM (slow scroll) */ ! screen->save_modes[2] = termw->flags & SMOOTHSCROLL; break; case 5: /* DECSCNM */ ! screen->save_modes[3] = termw->flags & REVERSE_VIDEO; break; case 6: /* DECOM */ ! screen->save_modes[4] = termw->flags & ORIGIN; break; case 7: /* DECAWM */ ! screen->save_modes[5] = termw->flags & WRAPAROUND; break; case 8: /* DECARM */ /* ignore autorepeat */ break; case 9: /* mouse bogus sequence */ ! screen->save_modes[7] = screen->send_mouse_pos; break; case 40: /* 132 column mode */ ! screen->save_modes[8] = screen->c132; break; case 41: /* curses hack */ ! screen->save_modes[9] = screen->curses; break; case 44: /* margin bell */ ! screen->save_modes[12] = screen->marginbell; break; case 45: /* reverse wraparound */ ! screen->save_modes[13] = termw->flags & REVERSEWRAP; break; #ifdef ALLOWLOGGING case 46: /* logging */ ! screen->save_modes[14] = screen->logging; break; #endif case 47: /* alternate buffer */ ! screen->save_modes[15] = screen->alternate; break; case 1000: /* mouse bogus sequence */ case 1001: ! screen->save_modes[7] = screen->send_mouse_pos; break; } } --- 2796,2855 ---- for (i = 0; i < nparam; i++) { switch (param[i]) { case 1: /* DECCKM */ ! DoSM(DP_DECCKM, termw->keyboard.flags & MODE_DECCKM); break; case 3: /* DECCOLM */ if(screen->c132) ! DoSM(DP_DECCOLM, termw->flags & IN132COLUMNS); break; case 4: /* DECSCLM (slow scroll) */ ! DoSM(DP_DECSCLM, termw->flags & SMOOTHSCROLL); break; case 5: /* DECSCNM */ ! DoSM(DP_DECSCNM, termw->flags & REVERSE_VIDEO); break; case 6: /* DECOM */ ! DoSM(DP_DECOM, termw->flags & ORIGIN); break; case 7: /* DECAWM */ ! DoSM(DP_DECAWM, termw->flags & WRAPAROUND); break; case 8: /* DECARM */ /* ignore autorepeat */ break; case 9: /* mouse bogus sequence */ ! DoSM(DP_X_X10MSE, screen->send_mouse_pos); break; case 40: /* 132 column mode */ ! DoSM(DP_X_DECCOLM, screen->c132); break; case 41: /* curses hack */ ! DoSM(DP_X_MORE, screen->curses); break; case 44: /* margin bell */ ! DoSM(DP_X_MARGIN, screen->marginbell); break; case 45: /* reverse wraparound */ ! DoSM(DP_X_REVWRAP, termw->flags & REVERSEWRAP); break; #ifdef ALLOWLOGGING case 46: /* logging */ ! DoSM(DP_X_LOGGING, screen->logging); break; #endif + case 1047: /* alternate buffer */ case 47: /* alternate buffer */ ! DoSM(DP_X_ALTSCRN, screen->alternate); break; case 1000: /* mouse bogus sequence */ case 1001: ! DoSM(DP_X_MOUSE, screen->send_mouse_pos); ! break; ! case 1048: ! if (!termw->misc.titeInhibit) { ! CursorSave(termw, &screen->sc); ! } break; } } *************** *** 2854,2928 **** switch (param[i]) { case 1: /* DECCKM */ bitcpy(&termw->keyboard.flags, ! screen->save_modes[0], MODE_DECCKM); update_appcursor(); break; case 3: /* DECCOLM */ if(screen->c132) { ClearScreen(screen); CursorSet(screen, 0, 0, termw->flags); ! if((j = (screen->save_modes[1] & IN132COLUMNS) ? 132 : 80) != ((termw->flags & IN132COLUMNS) ? 132 : 80) || j != screen->max_col + 1) RequestResize(termw, -1, j, TRUE); bitcpy(&termw->flags, ! screen->save_modes[1], IN132COLUMNS); } break; case 4: /* DECSCLM (slow scroll) */ ! if (screen->save_modes[2] & SMOOTHSCROLL) { screen->jumpscroll = 0; if (screen->scroll_amt) FlushScroll(screen); } else screen->jumpscroll = 1; ! bitcpy(&termw->flags, screen->save_modes[2], SMOOTHSCROLL); update_jumpscroll(); break; case 5: /* DECSCNM */ ! if((screen->save_modes[3] ^ termw->flags) & REVERSE_VIDEO) { ! bitcpy(&termw->flags, screen->save_modes[3], REVERSE_VIDEO); ReverseVideo(termw); /* update_reversevideo done in RevVid */ } break; case 6: /* DECOM */ ! bitcpy(&termw->flags, screen->save_modes[4], ORIGIN); CursorSet(screen, 0, 0, termw->flags); break; case 7: /* DECAWM */ ! bitcpy(&termw->flags, screen->save_modes[5], WRAPAROUND); update_autowrap(); break; case 8: /* DECARM */ /* ignore autorepeat */ break; case 9: /* MIT bogus sequence */ ! screen->send_mouse_pos = screen->save_modes[7]; break; case 40: /* 132 column mode */ ! screen->c132 = screen->save_modes[8]; update_allow132(); break; case 41: /* curses hack */ ! screen->curses = screen->save_modes[9]; update_cursesemul(); break; case 44: /* margin bell */ ! if((screen->marginbell = screen->save_modes[12]) == 0) screen->bellarmed = -1; update_marginbell(); break; case 45: /* reverse wraparound */ ! bitcpy(&termw->flags, screen->save_modes[13], REVERSEWRAP); update_reversewrap(); break; #ifdef ALLOWLOGGING case 46: /* logging */ #ifdef ALLOWLOGFILEONOFF ! if(screen->save_modes[14]) StartLog(screen); else CloseLog(screen); --- 2869,2943 ---- switch (param[i]) { case 1: /* DECCKM */ bitcpy(&termw->keyboard.flags, ! screen->save_modes[DP_DECCKM], MODE_DECCKM); update_appcursor(); break; case 3: /* DECCOLM */ if(screen->c132) { ClearScreen(screen); CursorSet(screen, 0, 0, termw->flags); ! if((j = (screen->save_modes[DP_DECCOLM] & IN132COLUMNS) ? 132 : 80) != ((termw->flags & IN132COLUMNS) ? 132 : 80) || j != screen->max_col + 1) RequestResize(termw, -1, j, TRUE); bitcpy(&termw->flags, ! screen->save_modes[DP_DECCOLM], IN132COLUMNS); } break; case 4: /* DECSCLM (slow scroll) */ ! if (screen->save_modes[DP_DECSCLM] & SMOOTHSCROLL) { screen->jumpscroll = 0; if (screen->scroll_amt) FlushScroll(screen); } else screen->jumpscroll = 1; ! bitcpy(&termw->flags, screen->save_modes[DP_DECSCLM], SMOOTHSCROLL); update_jumpscroll(); break; case 5: /* DECSCNM */ ! if((screen->save_modes[DP_DECSCNM] ^ termw->flags) & REVERSE_VIDEO) { ! bitcpy(&termw->flags, screen->save_modes[DP_DECSCNM], REVERSE_VIDEO); ReverseVideo(termw); /* update_reversevideo done in RevVid */ } break; case 6: /* DECOM */ ! bitcpy(&termw->flags, screen->save_modes[DP_DECOM], ORIGIN); CursorSet(screen, 0, 0, termw->flags); break; case 7: /* DECAWM */ ! bitcpy(&termw->flags, screen->save_modes[DP_DECAWM], WRAPAROUND); update_autowrap(); break; case 8: /* DECARM */ /* ignore autorepeat */ break; case 9: /* MIT bogus sequence */ ! DoRM(DP_X_X10MSE, screen->send_mouse_pos); break; case 40: /* 132 column mode */ ! DoRM(DP_X_DECCOLM, screen->c132); update_allow132(); break; case 41: /* curses hack */ ! DoRM(DP_X_MORE, screen->curses); update_cursesemul(); break; case 44: /* margin bell */ ! if((DoRM(DP_X_MARGIN, screen->marginbell)) == 0) screen->bellarmed = -1; update_marginbell(); break; case 45: /* reverse wraparound */ ! bitcpy(&termw->flags, screen->save_modes[DP_X_REVWRAP], REVERSEWRAP); update_reversewrap(); break; #ifdef ALLOWLOGGING case 46: /* logging */ #ifdef ALLOWLOGFILEONOFF ! if(screen->save_modes[DP_X_LOGGING]) StartLog(screen); else CloseLog(screen); *************** *** 2930,2938 **** /* update_logging done by StartLog and CloseLog */ break; #endif case 47: /* alternate buffer */ if (!termw->misc.titeInhibit) { ! if(screen->save_modes[15]) ToAlternate(screen); else FromAlternate(screen); --- 2945,2954 ---- /* update_logging done by StartLog and CloseLog */ break; #endif + case 1047: /* alternate buffer */ case 47: /* alternate buffer */ if (!termw->misc.titeInhibit) { ! if(screen->save_modes[DP_X_ALTSCRN]) ToAlternate(screen); else FromAlternate(screen); *************** *** 2941,2947 **** break; case 1000: /* mouse bogus sequence */ case 1001: ! screen->send_mouse_pos = screen->save_modes[7]; break; } } --- 2957,2968 ---- break; case 1000: /* mouse bogus sequence */ case 1001: ! DoRM(DP_X_MOUSE, screen->send_mouse_pos); ! break; ! case 1048: ! if (!termw->misc.titeInhibit) { ! CursorRestore(termw, &screen->sc); ! } break; } } *************** *** 3231,3236 **** --- 3252,3267 ---- register TScreen *screen = &term->screen; dotext(screen, screen->gsets[(int)(screen->curgl)], buf, buf+i); } + } + + void + ToggleAlternate(screen) + register TScreen *screen; + { + if (screen->alternate) + FromAlternate(screen); + else + ToAlternate(screen); } static void Index: menu.c *** XFree86-3.9s/xc/programs/xterm/menu.c Tue Sep 30 07:04:42 1997 --- XFree86-3.9s-patched/xc/programs/xterm/menu.c Fri Oct 17 19:44:03 1997 *************** *** 277,284 **** screen->vtMenu = create_menu (term, toplevel, "vtMenu", vtMenuEntries, XtNumber(vtMenuEntries)); - /* and turn off the alternate screen entry */ - set_altscreen_sensitivity (FALSE); update_scrollbar(); update_jumpscroll(); update_reversevideo(); --- 277,282 ---- *************** *** 790,796 **** Widget gw GCC_UNUSED; XtPointer closure GCC_UNUSED, data GCC_UNUSED; { ! /* do nothing for now; eventually, will want to flip screen */ } #ifndef NO_ACTIVE_ICON --- 788,795 ---- Widget gw GCC_UNUSED; XtPointer closure GCC_UNUSED, data GCC_UNUSED; { ! TScreen *screen = &term->screen; ! ToggleAlternate(screen); } #ifndef NO_ACTIVE_ICON Index: menu.h *** XFree86-3.9s/xc/programs/xterm/menu.h Fri Sep 19 13:58:52 1997 --- XFree86-3.9s-patched/xc/programs/xterm/menu.h Fri Oct 17 19:37:18 1997 *************** *** 364,374 **** tekMenuEntries[tekMenu_tekhide].widget, \ term->screen.Vshow) - #define set_altscreen_sensitivity(val) \ - set_sensitivity (term->screen.vtMenu,\ - vtMenuEntries[vtMenu_altscreen].widget, (val)) - - /* * macros for mapping font size to tekMenu placement */ --- 364,369 ---- Index: ptyx.h *** XFree86-3.9s/xc/programs/xterm/ptyx.h Tue Oct 14 21:40:58 1997 --- XFree86-3.9s-patched/xc/programs/xterm/ptyx.h Fri Oct 17 19:24:18 1997 *************** *** 479,484 **** --- 479,513 ---- #define SCRN_BUF_CSETS(screen, row) BUF_CSETS(screen->buf, row) #endif + /* indices into save_modes[] */ + typedef enum { + DP_DECCKM, + DP_DECANM, + DP_DECCOLM, /* IN132COLUMNS */ + DP_DECSCLM, + DP_DECSCNM, + DP_DECOM, + DP_DECAWM, + DP_DECARM, + DP_X_X10MSE, + DP_DECPFF, + DP_DECPEX, + DP_DECTCEM, + DP_DECTEK, + DP_X_DECCOLM, + DP_X_MORE, + DP_X_MARGIN, + DP_X_REVWRAP, + DP_X_LOGGING, + DP_X_ALTSCRN, + DP_DECBKM, + DP_X_MOUSE, + DP_LAST + } SaveModes; + + #define DoSM(code,value) screen->save_modes[code] = value + #define DoRM(code,value) value = screen->save_modes[code] + typedef struct { /* These parameters apply to both windows */ Display *display; /* X display for screen */ *************** *** 613,619 **** int scrolls; /* outstanding scroll count, used only with multiscroll */ SavedCursor sc; /* data for restore cursor */ ! int save_modes[19]; /* save dec private modes */ /* Improved VT100 emulation stuff. */ char gsets[4]; /* G0 through G3. */ --- 642,648 ---- int scrolls; /* outstanding scroll count, used only with multiscroll */ SavedCursor sc; /* data for restore cursor */ ! int save_modes[24]; /* save dec/xterm private modes */ /* Improved VT100 emulation stuff. */ char gsets[4]; /* G0 through G3. */ Index: scrollbar.c *** XFree86-3.9s/xc/programs/xterm/scrollbar.c Tue Oct 14 21:40:58 1997 --- XFree86-3.9s-patched/xc/programs/xterm/scrollbar.c Fri Oct 17 19:23:43 1997 *************** *** 344,350 **** int init, doalloc; { register TScreen *screen = &xw->screen; - register int border = 2 * screen->border; register int i; if(screen->fullVwin.scrollbar) --- 344,349 ---- *************** *** 395,400 **** --- 394,414 ---- ScrollBarDrawThumb(screen->scrollWidget); DoResizeScreen (xw); + + #ifdef SCROLLBAR_RIGHT + /* + * Adjust the scrollbar position if we're asked to turn on scrollbars + * for the first time after the xterm is already running. That makes + * the window grow after we've initially configured the scrollbar's + * position. (There must be a better way). + */ + if (term->misc.useRight + && screen->fullVwin.fullwidth < term->core.width) + XtVaSetValues(screen->scrollWidget, + XtNx, screen->fullVwin.fullwidth - screen->scrollWidget->core.border_width, + NULL); + #endif + XtMapWidget(screen->scrollWidget); update_scrollbar (); if (screen->buf) { Index: terminfo *** XFree86-3.9s/xc/programs/xterm/terminfo Wed Aug 27 06:48:32 1997 --- XFree86-3.9s-patched/xc/programs/xterm/terminfo Thu Oct 16 19:23:13 1997 *************** *** 1,6 **** --- 1,12 ---- # $XConsortium: terminfo,v 1.11 94/10/13 21:24:31 gildea Exp $ # $XFree86: xc/programs/xterm/terminfo,v 3.18 1997/08/26 10:01:59 hohndel Exp $ + # # meml locks memory above the cursor; memu unlocks (ala HP terminals) + # rmcup clears memory before switching to the alternate screen. The older + # (deprecated) \E[?47h did not do this, requiring applications to + # embed a \E[2J in the rmcup string. However, that behavior cannot + # be disabled via titeInhibit, making that resource not function as + # intended on systems with terminfo. # xterm|xterm-24|xterms|vs100|xterm terminal emulator (X Window System), am, *************** *** 106,112 **** ri=\EM, rmacs=^O, rmam=\E[?7l, ! rmcup=\E[2J\E[?47l\E8, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, --- 112,118 ---- ri=\EM, rmacs=^O, rmam=\E[?7l, ! rmcup=\E[?1047l\E[?1048l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, *************** *** 122,128 **** sgr0=\E[m\017, smacs=^N, smam=\E[?7h, ! smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, --- 128,134 ---- sgr0=\E[m\017, smacs=^N, smam=\E[?7h, ! smcup=\E[?1048h\E[?1047h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, *************** *** 309,315 **** ri=\215, rmacs=^O, rmam=\233?7l, ! rmcup=\2332J\233?47l\E8, rmir=\2334l, rmkx=\233?1l\E>, rmso=\23327m, --- 315,321 ---- ri=\215, rmacs=^O, rmam=\233?7l, ! rmcup=\233?1047l\233?1048l, rmir=\2334l, rmkx=\233?1l\E>, rmso=\23327m, *************** *** 325,331 **** sgr0=\233m\017, smacs=^N, smam=\233?7h, ! smcup=\E7\233?47h, smir=\2334h, smkx=\233?1h\E=, smso=\2337m, --- 331,337 ---- sgr0=\233m\017, smacs=^N, smam=\233?7h, ! smcup=\233?1048h\233?1047h, smir=\2334h, smkx=\233?1h\E=, smso=\2337m, Index: xterm.h *** XFree86-3.9s/xc/programs/xterm/xterm.h Tue Oct 14 21:40:58 1997 --- XFree86-3.9s-patched/xc/programs/xterm/xterm.h Fri Oct 17 19:43:29 1997 *************** *** 63,74 **** extern void SetVTFont PROTO((int i, Bool doresize, char *name1, char *name2)); extern void ShowCursor PROTO((void)); extern void SwitchBufPtrs PROTO((TScreen *screen)); extern void VTReset PROTO((int full)); extern void VTRun PROTO((void)); extern void dotext PROTO((TScreen *screen, int charset, Char *buf, Char *ptr)); extern void set_cursor_gcs PROTO((TScreen *screen)); - extern void unparseputc1 PROTO((int c, int fd)); extern void unparseputc PROTO((int c, int fd)); extern void unparseseq PROTO((ANSI *ap, int fd)); #if OPT_ISO_COLORS --- 63,75 ---- extern void SetVTFont PROTO((int i, Bool doresize, char *name1, char *name2)); extern void ShowCursor PROTO((void)); extern void SwitchBufPtrs PROTO((TScreen *screen)); + extern void ToggleAlternate PROTO((TScreen *screen)); extern void VTReset PROTO((int full)); extern void VTRun PROTO((void)); extern void dotext PROTO((TScreen *screen, int charset, Char *buf, Char *ptr)); extern void set_cursor_gcs PROTO((TScreen *screen)); extern void unparseputc PROTO((int c, int fd)); + extern void unparseputc1 PROTO((int c, int fd)); extern void unparseseq PROTO((ANSI *ap, int fd)); #if OPT_ISO_COLORS Index: xterm.man *** XFree86-3.9s/xc/programs/xterm/xterm.man Tue Oct 14 21:40:58 1997 --- XFree86-3.9s-patched/xc/programs/xterm/xterm.man Fri Oct 17 19:46:07 1997 *************** *** 1173,1179 **** This entry invokes the \fBset-marginbell(toggle)\fP action. .TP 8 .B "altscreen (\fPclass\fB SmeBSB)" ! This entry is currently disabled. .TP 8 .B "activeicon (\fPclass\fB SMeBSB)" This entry toggles active icons on and off if this feature was --- 1173,1179 ---- This entry invokes the \fBset-marginbell(toggle)\fP action. .TP 8 .B "altscreen (\fPclass\fB SmeBSB)" ! This entry invokes the \fBset-altscreen(toggle)\fP action. .TP 8 .B "activeicon (\fPclass\fB SMeBSB)" This entry toggles active icons on and off if this feature was