From 3c97787985a6d762c3162f4582fef8d2ba40795d Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Mon, 29 Jan 2018 17:20:34 +0000
Subject: [PATCH] Attempt to fix CSI ? s/n

These basically never worked as documented.  Now they should, but they can't
save/restore the doorway mode setting since it's not set/cleared using
CSI ? h/l.  If that's really needed (you need to know the doorway state
regardless, so it's more likely that a query doorway command is needed if
anything) it can be added as a separate command.
---
 src/conio/cterm.c   | 56 ++++++++++++++++-----------------------------
 src/conio/cterm.h   |  2 +-
 src/conio/cterm.txt | 16 +++++++++----
 3 files changed, 33 insertions(+), 41 deletions(-)

diff --git a/src/conio/cterm.c b/src/conio/cterm.c
index e74d1e6300..6f76a208f2 100644
--- a/src/conio/cterm.c
+++ b/src/conio/cterm.c
@@ -1126,10 +1126,10 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 							p2=cterm->escbuf+2;
 							GETTEXTINFO(&ti);
 							i=GETVIDEOFLAGS();
-							if(p2>p) {
+							if(!*p2) {
 								/* All the save stuff... */
-								cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_DOORWAY|CTERM_SAVEMODE_ORIGIN);
-								cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_DOORWAY|CTERM_SAVEMODE_ORIGIN);
+								cterm->saved_mode_mask |= (CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN);
+								cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN);
 								cterm->saved_mode |= (cterm->autowrap)?CTERM_SAVEMODE_AUTOWRAP:0;
 								cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0;
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0;
@@ -1137,57 +1137,51 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0;
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0;
 								cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0;
-								cterm->saved_mode |= (cterm->doorway_mode)?CTERM_SAVEMODE_DOORWAY:0;
 								cterm->saved_mode |= (cterm->origin_mode)?CTERM_SAVEMODE_ORIGIN:0;
 								break;
 							}
 							while((p=strtok(p2,";"))!=NULL) {
 								p2=NULL;
-								if(!strcmp(cterm->escbuf,"?6")) {
+								if(!strcmp(p,"6")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_ORIGIN;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT|CTERM_SAVEMODE_ORIGIN);
 									cterm->saved_mode |= cterm->origin_mode?CTERM_SAVEMODE_ORIGIN:0;
 								}
-								if(!strcmp(cterm->escbuf,"?7")) {
+								if(!strcmp(p,"7")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_AUTOWRAP;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_AUTOWRAP|CTERM_SAVEMODE_CURSOR|CTERM_SAVEMODE_ALTCHARS|CTERM_SAVEMODE_NOBRIGHT|CTERM_SAVEMODE_BGBRIGHT);
 									cterm->saved_mode |= cterm->autowrap?CTERM_SAVEMODE_AUTOWRAP:0;
 								}
-								if(!strcmp(cterm->escbuf,"?25")) {
+								if(!strcmp(p,"25")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_CURSOR;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_CURSOR);
 									cterm->saved_mode |= (cterm->cursor==_NORMALCURSOR)?CTERM_SAVEMODE_CURSOR:0;
 								}
-								if(!strcmp(cterm->escbuf,"?31")) {
+								if(!strcmp(p,"31")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_ALTCHARS;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_ALTCHARS);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_ALTCHARS)?CTERM_SAVEMODE_ALTCHARS:0;
 								}
-								if(!strcmp(cterm->escbuf,"?32")) {
+								if(!strcmp(p,"32")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBRIGHT;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBRIGHT);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBRIGHT)?CTERM_SAVEMODE_NOBRIGHT:0;
 								}
-								if(!strcmp(cterm->escbuf,"?33")) {
+								if(!strcmp(p,"33")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_BGBRIGHT;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_BGBRIGHT);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_BGBRIGHT)?CTERM_SAVEMODE_BGBRIGHT:0;
 								}
-								if(!strcmp(cterm->escbuf,"?34")) {
+								if(!strcmp(p,"34")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_BLINKALTCHARS;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_BLINKALTCHARS);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_BLINKALTCHARS)?CTERM_SAVEMODE_BLINKALTCHARS:0;
 								}
-								if(!strcmp(cterm->escbuf,"?35")) {
+								if(!strcmp(p,"35")) {
 									cterm->saved_mode_mask |= CTERM_SAVEMODE_NOBLINK;
 									cterm->saved_mode &= ~(CTERM_SAVEMODE_NOBLINK);
 									cterm->saved_mode |= (i&CIOLIB_VIDEO_NOBLINK)?CTERM_SAVEMODE_NOBLINK:0;
 								}
-								if(!strcmp(cterm->escbuf,"=255")) {
-									cterm->saved_mode_mask |= CTERM_SAVEMODE_DOORWAY;
-									cterm->saved_mode &= ~(CTERM_SAVEMODE_DOORWAY);
-									cterm->saved_mode |= (cterm->doorway_mode)?CTERM_SAVEMODE_DOORWAY:0;
-								}
 							}
 						}
 						break;
@@ -1197,7 +1191,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 							p2=cterm->escbuf+2;
 							GETTEXTINFO(&ti);
 							i=GETVIDEOFLAGS();
-							if(p2>p) {
+							if(!*p2) {
 								/* All the save stuff... */
 								if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN)
 									cterm->origin_mode=(cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) ? true : false;
@@ -1237,32 +1231,26 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 									else
 										i &= ~CIOLIB_VIDEO_BGBRIGHT;
 								}
-								if(cterm->saved_mode_mask & CTERM_SAVEMODE_DOORWAY) {
-									if(cterm->saved_mode & CTERM_SAVEMODE_DOORWAY)
-										cterm->doorway_mode = 1;
-									else
-										cterm->doorway_mode = 0;
-								}
 								SETVIDEOFLAGS(i);
 								break;
 							}
 							while((p=strtok(p2,";"))!=NULL) {
 								p2=NULL;
-								if(!strcmp(cterm->escbuf,"?6")) {
+								if(!strcmp(p,"6")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_ORIGIN)
 										cterm->origin_mode=(cterm->saved_mode & CTERM_SAVEMODE_ORIGIN) ? true : false;
 								}
-								if(!strcmp(cterm->escbuf,"?7")) {
+								if(!strcmp(p,"7")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_AUTOWRAP)
 										cterm->autowrap=(cterm->saved_mode & CTERM_SAVEMODE_AUTOWRAP) ? true : false;
 								}
-								if(!strcmp(cterm->escbuf,"?25")) {
+								if(!strcmp(p,"25")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_CURSOR) {
 										cterm->cursor = (cterm->saved_mode & CTERM_SAVEMODE_CURSOR) ? _NORMALCURSOR : _NOCURSOR;
 										SETCURSORTYPE(cterm->cursor);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?31")) {
+								if(!strcmp(p,"31")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_ALTCHARS) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_ALTCHARS)
 											i |= CIOLIB_VIDEO_ALTCHARS;
@@ -1271,7 +1259,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?32")) {
+								if(!strcmp(p,"32")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBRIGHT) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_NOBRIGHT)
 											i |= CIOLIB_VIDEO_NOBRIGHT;
@@ -1280,7 +1268,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?33")) {
+								if(!strcmp(p,"33")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_BGBRIGHT) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_BGBRIGHT)
 											i |= CIOLIB_VIDEO_BGBRIGHT;
@@ -1289,7 +1277,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?34")) {
+								if(!strcmp(p,"34")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_BLINKALTCHARS) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_BLINKALTCHARS)
 											i |= CIOLIB_VIDEO_BLINKALTCHARS;
@@ -1298,7 +1286,7 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"?35")) {
+								if(!strcmp(p,"35")) {
 									if(cterm->saved_mode_mask & CTERM_SAVEMODE_NOBLINK) {
 										if(cterm->saved_mode & CTERM_SAVEMODE_NOBLINK)
 											i |= CIOLIB_VIDEO_NOBLINK;
@@ -1307,10 +1295,6 @@ static void do_ansi(struct cterminal *cterm, char *retbuf, size_t retsize, int *
 										SETVIDEOFLAGS(i);
 									}
 								}
-								if(!strcmp(cterm->escbuf,"=255")) {
-									if(cterm->saved_mode_mask & CTERM_SAVEMODE_DOORWAY)
-										cterm->autowrap=(cterm->saved_mode & CTERM_SAVEMODE_DOORWAY) ? 1 : 0;
-								}
 							}
 						}
 						break;
diff --git a/src/conio/cterm.h b/src/conio/cterm.h
index 62da8dbd36..bce91dc251 100644
--- a/src/conio/cterm.h
+++ b/src/conio/cterm.h
@@ -98,7 +98,7 @@ struct cterminal {
 #define	CTERM_SAVEMODE_ALTCHARS			0x004
 #define CTERM_SAVEMODE_NOBRIGHT			0x008
 #define CTERM_SAVEMODE_BGBRIGHT			0x010
-#define CTERM_SAVEMODE_DOORWAY			0x020
+	// 0x010 was CTERM_SAVEMODE_DOORWAY
 #define CTERM_SAVEMODE_ORIGIN			0x040
 #define	CTERM_SAVEMODE_BLINKALTCHARS	0x080
 #define CTERM_SAVEMODE_NOBLINK			0x100
diff --git a/src/conio/cterm.txt b/src/conio/cterm.txt
index 00268e8197..cd258bb39c 100644
--- a/src/conio/cterm.txt
+++ b/src/conio/cterm.txt
@@ -646,9 +646,13 @@ CSI [ p1 ] n
 CSI ? [ p1 [ pX ... ] ] s
 	NON-STANDARD EXTENSION
 	Save Mode Setting
-	Saves the current mode states as specified by CSI l and CSI h.  If
+	Saves the current mode states as specified by CSI ? l and CSI ? h.  If
 	p1 is omitted, saves all such states.  If pX is included, saves only
-	the specified states (arguments to CSI l/h).
+	the specified states (arguments to CSI ? l/h).
+
+	Note that currently, CSI ? s with no parameters will save the doorway
+        mode state, which can't be specified with a parameter (since it's set
+        using CSI = 255 h, not CSI ? 255 h).
 
 	SOURCE: SyncTERM only
 
@@ -664,9 +668,13 @@ CSI s
 CSI ? [ p1 [ pX ... ] ]  u
 	NON-STANDARD EXTENSION
 	Restore Mode Setting
-	Saves the current mode states as specified by CSI l and CSI h.  If
+	Saves the current mode states as specified by CSI ? l and CSI ? h.  If
 	p1 is omitted, saves all such states.  If pX is included, restores
-	all the specified states (arguments to CSI l/h)
+	all the specified states (arguments to CSI ? l/h)
+
+	Note that currently, CSI ? u with no parameters will restore the
+	doorway mode state, which can't be specified with a parameter (since
+	it's set using CSI = 255 h, not CSI ? 255 h).
 
 	SOURCE: SyncTERM only
 
-- 
GitLab