|
@@ -273,6 +273,7 @@ static void tsetchar(char*);
|
|
|
static void tsetscroll(int, int);
|
|
|
static void tswapscreen(void);
|
|
|
static void tsetdirt(int, int);
|
|
|
+static void tsetmode(bool, bool, int *, int);
|
|
|
static void tfulldirt(void);
|
|
|
|
|
|
static void ttynew(void);
|
|
@@ -1178,6 +1179,79 @@ tsetscroll(int t, int b) {
|
|
|
term.bot = b;
|
|
|
}
|
|
|
|
|
|
+#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit)))
|
|
|
+
|
|
|
+void
|
|
|
+tsetmode(bool priv, bool set, int *args, int narg) {
|
|
|
+ int *lim, mode;
|
|
|
+
|
|
|
+ for (lim = args + narg; args < lim; ++args) {
|
|
|
+ if(priv) {
|
|
|
+ switch(*args) {
|
|
|
+ case 1:
|
|
|
+ MODBIT(term.mode, set, MODE_APPKEYPAD);
|
|
|
+ break;
|
|
|
+ case 5: /* DECSCNM -- Reverve video */
|
|
|
+ mode = term.mode;
|
|
|
+ MODBIT(term.mode,set, MODE_REVERSE);
|
|
|
+ if (mode != term.mode)
|
|
|
+ draw();
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ MODBIT(term.mode, set, MODE_WRAP);
|
|
|
+ break;
|
|
|
+ case 20:
|
|
|
+ MODBIT(term.mode, set, MODE_CRLF);
|
|
|
+ break;
|
|
|
+ case 12: /* att610 -- Start blinking cursor (IGNORED) */
|
|
|
+ break;
|
|
|
+ case 25:
|
|
|
+ MODBIT(term.c.state, !set, CURSOR_HIDE);
|
|
|
+ break;
|
|
|
+ case 1000: /* 1000,1002: enable xterm mouse report */
|
|
|
+ MODBIT(term.mode, set, MODE_MOUSEBTN);
|
|
|
+ break;
|
|
|
+ case 1002:
|
|
|
+ MODBIT(term.mode, set, MODE_MOUSEMOTION);
|
|
|
+ break;
|
|
|
+ case 1049: /* = 1047 and 1048 */
|
|
|
+ case 47:
|
|
|
+ case 1047:
|
|
|
+ if(IS_SET(MODE_ALTSCREEN))
|
|
|
+ tclearregion(0, 0, term.col-1, term.row-1);
|
|
|
+ if ((set && !IS_SET(MODE_ALTSCREEN)) ||
|
|
|
+ (!set && IS_SET(MODE_ALTSCREEN))) {
|
|
|
+ tswapscreen();
|
|
|
+ }
|
|
|
+ if (*args != 1049)
|
|
|
+ break;
|
|
|
+ /* pass through */
|
|
|
+ case 1048:
|
|
|
+ tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ fprintf(stderr,
|
|
|
+ "erresc: unknown private set/reset mode %d\n",
|
|
|
+ *args);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ switch(*args) {
|
|
|
+ case 4:
|
|
|
+ MODBIT(term.mode, set, MODE_INSERT);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ fprintf(stderr,
|
|
|
+ "erresc: unknown set/reset mode %d\n",
|
|
|
+ *args);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+#undef MODBIT
|
|
|
+
|
|
|
+
|
|
|
void
|
|
|
csihandle(void) {
|
|
|
switch(csiescseq.mode) {
|
|
@@ -1291,58 +1365,7 @@ csihandle(void) {
|
|
|
tinsertblankline(csiescseq.arg[0]);
|
|
|
break;
|
|
|
case 'l': /* RM -- Reset Mode */
|
|
|
- if(csiescseq.priv) {
|
|
|
- switch(csiescseq.arg[0]) {
|
|
|
- case 1:
|
|
|
- term.mode &= ~MODE_APPKEYPAD;
|
|
|
- break;
|
|
|
- case 5: /* DECSCNM -- Remove reverse video */
|
|
|
- if(IS_SET(MODE_REVERSE)) {
|
|
|
- term.mode &= ~MODE_REVERSE;
|
|
|
- draw();
|
|
|
- }
|
|
|
- break;
|
|
|
- case 7:
|
|
|
- term.mode &= ~MODE_WRAP;
|
|
|
- break;
|
|
|
- case 12: /* att610 -- Stop blinking cursor (IGNORED) */
|
|
|
- break;
|
|
|
- case 20:
|
|
|
- term.mode &= ~MODE_CRLF;
|
|
|
- break;
|
|
|
- case 25:
|
|
|
- term.c.state |= CURSOR_HIDE;
|
|
|
- break;
|
|
|
- case 1000: /* disable X11 xterm mouse reporting */
|
|
|
- term.mode &= ~MODE_MOUSEBTN;
|
|
|
- break;
|
|
|
- case 1002:
|
|
|
- term.mode &= ~MODE_MOUSEMOTION;
|
|
|
- break;
|
|
|
- case 1049: /* = 1047 and 1048 */
|
|
|
- case 47:
|
|
|
- case 1047:
|
|
|
- if(IS_SET(MODE_ALTSCREEN)) {
|
|
|
- tclearregion(0, 0, term.col-1, term.row-1);
|
|
|
- tswapscreen();
|
|
|
- }
|
|
|
- if(csiescseq.arg[0] != 1049)
|
|
|
- break;
|
|
|
- case 1048:
|
|
|
- tcursor(CURSOR_LOAD);
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto unknown;
|
|
|
- }
|
|
|
- } else {
|
|
|
- switch(csiescseq.arg[0]) {
|
|
|
- case 4:
|
|
|
- term.mode &= ~MODE_INSERT;
|
|
|
- break;
|
|
|
- default:
|
|
|
- goto unknown;
|
|
|
- }
|
|
|
- }
|
|
|
+ tsetmode(csiescseq.priv, 0, csiescseq.arg, csiescseq.narg);
|
|
|
break;
|
|
|
case 'M': /* DL -- Delete <n> lines */
|
|
|
DEFAULT(csiescseq.arg[0], 1);
|
|
@@ -1366,58 +1389,7 @@ csihandle(void) {
|
|
|
tmoveto(term.c.x, csiescseq.arg[0]-1);
|
|
|
break;
|
|
|
case 'h': /* SM -- Set terminal mode */
|
|
|
- if(csiescseq.priv) {
|
|
|
- switch(csiescseq.arg[0]) {
|
|
|
- case 1:
|
|
|
- term.mode |= MODE_APPKEYPAD;
|
|
|
- break;
|
|
|
- case 5: /* DECSCNM -- Reverve video */
|
|
|
- if(!IS_SET(MODE_REVERSE)) {
|
|
|
- term.mode |= MODE_REVERSE;
|
|
|
- draw();
|
|
|
- }
|
|
|
- break;
|
|
|
- case 7:
|
|
|
- term.mode |= MODE_WRAP;
|
|
|
- break;
|
|
|
- case 20:
|
|
|
- term.mode |= MODE_CRLF;
|
|
|
- break;
|
|
|
- case 12: /* att610 -- Start blinking cursor (IGNORED) */
|
|
|
- /* fallthrough for xterm cvvis = CSI [ ? 12 ; 25 h */
|
|
|
- if(csiescseq.narg > 1 && csiescseq.arg[1] != 25)
|
|
|
- break;
|
|
|
- case 25:
|
|
|
- term.c.state &= ~CURSOR_HIDE;
|
|
|
- break;
|
|
|
- case 1000: /* 1000,1002: enable xterm mouse report */
|
|
|
- term.mode |= MODE_MOUSEBTN;
|
|
|
- break;
|
|
|
- case 1002:
|
|
|
- term.mode |= MODE_MOUSEMOTION;
|
|
|
- break;
|
|
|
- case 1049: /* = 1047 and 1048 */
|
|
|
- case 47:
|
|
|
- case 1047:
|
|
|
- if(IS_SET(MODE_ALTSCREEN))
|
|
|
- tclearregion(0, 0, term.col-1, term.row-1);
|
|
|
- else
|
|
|
- tswapscreen();
|
|
|
- if(csiescseq.arg[0] != 1049)
|
|
|
- break;
|
|
|
- case 1048:
|
|
|
- tcursor(CURSOR_SAVE);
|
|
|
- break;
|
|
|
- default: goto unknown;
|
|
|
- }
|
|
|
- } else {
|
|
|
- switch(csiescseq.arg[0]) {
|
|
|
- case 4:
|
|
|
- term.mode |= MODE_INSERT;
|
|
|
- break;
|
|
|
- default: goto unknown;
|
|
|
- }
|
|
|
- };
|
|
|
+ tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg);
|
|
|
break;
|
|
|
case 'm': /* SGR -- Terminal attribute (color) */
|
|
|
tsetattr(csiescseq.arg, csiescseq.narg);
|