From 077eadbc008f8c75d2efb7bf7ec0bd3dfb075ced Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 4 Aug 2020 04:26:03 +0000
Subject: [PATCH] Some users have complained about moue support being enabled
 by default, so made it enabled/disabled per-user-terminal settings. This
 means that if you were already enjoying mouse support, you're going to have
 to turn it on to keep enjoying it. It also means there's currently no way to
 enable/use mouse support pre-logon, but I have ideas about how to support
 that for sysops that want that.

---
 src/sbbs3/con_out.cpp     |  2 +-
 src/sbbs3/inkey.cpp       |  6 +++---
 src/sbbs3/logon.cpp       |  4 +++-
 src/sbbs3/newuser.cpp     |  4 ++++
 src/sbbs3/sbbsdefs.h      |  3 ++-
 src/sbbs3/text.h          |  2 ++
 src/sbbs3/text_defaults.c |  5 ++++-
 src/sbbs3/useredit.cpp    | 11 ++++++++++-
 8 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/sbbs3/con_out.cpp b/src/sbbs3/con_out.cpp
index ddcb6fc8a8..fe67ac1434 100644
--- a/src/sbbs3/con_out.cpp
+++ b/src/sbbs3/con_out.cpp
@@ -519,7 +519,7 @@ long sbbs_t::term_supports(long cmp_flags)
 	long flags = ((sys_status&SS_USERON) && !(useron.misc&AUTOTERM)) ? useron.misc : autoterm;
 
 	if((sys_status&SS_USERON) && (useron.misc&AUTOTERM))
-		flags |= useron.misc & (NO_EXASCII | SWAP_DELETE | COLOR | ICE_COLOR);
+		flags |= useron.misc & (NO_EXASCII | SWAP_DELETE | COLOR | ICE_COLOR | MOUSE);
 
 	return(cmp_flags ? ((flags&cmp_flags)==cmp_flags) : (flags&TERM_FLAGS));
 }
diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp
index 2af3a12434..96d64604b3 100644
--- a/src/sbbs3/inkey.cpp
+++ b/src/sbbs3/inkey.cpp
@@ -390,7 +390,7 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 								return handle_ctrlkey(TERM_KEY_ABORT, mode);
 							return 0;
 						}
-						if(pause_inside)
+						if(pause_inside && y == rows - 1)
 							return '\r';
 					} else if(button == '`' && console&CON_MOUSE_SCROLL) {
 						return TERM_KEY_UP;
@@ -464,7 +464,7 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 								return handle_ctrlkey(TERM_KEY_ABORT, mode);
 							return 0;
 						}
-						if(pause_inside)
+						if(pause_inside && y == rows - 1)
 							return '\r';
 					} else if(button == 0x40 && console&CON_MOUSE_SCROLL) {
 						return TERM_KEY_UP;
@@ -559,7 +559,7 @@ char sbbs_t::handle_ctrlkey(char ch, long mode)
 
 void sbbs_t::set_mouse(long flags)
 {
-	if(term_supports(ANSI)) {
+	if(term_supports(ANSI|MOUSE)) {
 		long mode = mouse_mode & ~flags;
 		if(mode & MOUSE_MODE_X10)	ansi_mouse(ANSI_MOUSE_X10, false);
 		if(mode & MOUSE_MODE_NORM)	ansi_mouse(ANSI_MOUSE_NORM, false);
diff --git a/src/sbbs3/logon.cpp b/src/sbbs3/logon.cpp
index e996789803..3284d34dcc 100644
--- a/src/sbbs3/logon.cpp
+++ b/src/sbbs3/logon.cpp
@@ -80,10 +80,12 @@ bool sbbs_t::logon()
 	if(useron.rest&FLAG('G')) {     /* Guest account */
 		useron.misc=(cfg.new_misc&(~ASK_NSCAN));
 		useron.rows=0;
-		useron.misc&=~(ANSI|RIP|NO_EXASCII|COLOR|PETSCII);
+		useron.misc &= ~TERM_FLAGS;
 		useron.misc|=autoterm;
 		if(!(useron.misc&(ANSI|PETSCII)) && text[AnsiTerminalQ][0] && yesno(text[AnsiTerminalQ]))
 			useron.misc|=ANSI;
+		if((useron.misc&ANSI) && text[MouseTerminalQ][0] && yesno(text[MouseTerminalQ]))
+			useron.misc|=MOUSE;
 		if((useron.misc&RIP) || !(cfg.uq&UQ_COLORTERM)
 			|| (useron.misc&(ANSI|PETSCII) && yesno(text[ColorTerminalQ])))
 			useron.misc|=COLOR;
diff --git a/src/sbbs3/newuser.cpp b/src/sbbs3/newuser.cpp
index 1dd69fe688..c57e0fb758 100644
--- a/src/sbbs3/newuser.cpp
+++ b/src/sbbs3/newuser.cpp
@@ -165,6 +165,10 @@ BOOL sbbs_t::newuser()
 				useron.misc|=COLOR; 
 			else
 				useron.misc&=~COLOR;
+			if(text[MouseTerminalQ][0] && yesno(text[MouseTerminalQ]))
+				useron.misc |= MOUSE;
+			else
+				useron.misc &= ~MOUSE;
 		}
 		else
 			useron.rows = TERM_ROWS_DEFAULT;
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index 5c6c3a65b5..e7d8b4fd35 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -668,8 +668,9 @@ typedef enum {						/* Values for xtrn_t.event				*/
 #define SWAP_DELETE	(1L<<27)		/* Swap Delete and Backspace keys		*/
 #define ICE_COLOR	(1L<<28)		/* Bright background color support		*/
 #define UTF8		(1L<<29)		/* UTF-8 terminal						*/
+#define MOUSE		(1L<<31)		/* Mouse supported terminal				*/
 
-#define TERM_FLAGS		(ANSI|COLOR|NO_EXASCII|RIP|WIP|HTML|PETSCII|SWAP_DELETE|ICE_COLOR|UTF8)
+#define TERM_FLAGS		(ANSI|COLOR|RIP|WIP|HTML|SWAP_DELETE|ICE_COLOR|MOUSE|CHARSET_FLAGS)
 #define CHARSET_FLAGS	(NO_EXASCII|PETSCII|UTF8)
 #define CHARSET_ASCII	NO_EXASCII	// US-ASCII
 #define CHARSET_PETSCII	PETSCII		// CBM-ASCII
diff --git a/src/sbbs3/text.h b/src/sbbs3/text.h
index 6065e3a5b4..83d59069c1 100644
--- a/src/sbbs3/text.h
+++ b/src/sbbs3/text.h
@@ -841,6 +841,8 @@ enum {
 	,MsgPostedToYouVia
 	,Unlimited
 	,NodeConnectionRaw
+	,MouseTerminalQ
+	,TerminalMouse
 
 	,TOTAL_TEXT
 };
diff --git a/src/sbbs3/text_defaults.c b/src/sbbs3/text_defaults.c
index b83d6415b2..d4f8d8fcd7 100644
--- a/src/sbbs3/text_defaults.c
+++ b/src/sbbs3/text_defaults.c
@@ -1351,7 +1351,7 @@ const char * const text_defaults[TOTAL_TEXT]={
 		"\x65\x63\x74\x65\x64\x2e\x0d\x0a" // 815 PetTerminalDetected
 	,"\x41\x72\x65\x20\x79\x6f\x75\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x43\x42\x4d\x2f\x50\x45\x54\x53\x43\x49\x49\x20\x74\x65\x72\x6d"
 		"\x69\x6e\x61\x6c" // 816 PetTerminalQ
-	,"\x41\x75\x74\x6f\x20\x44\x65\x74\x65\x63\x74\x20" // 817 TerminalAutoDetect
+	,"\x41\x75\x74\x6f\x20" // 817 TerminalAutoDetect
 	,"\x63\x6f\x6c\x75\x6d\x6e\x73" // 818 TerminalColumns
 	,"\x72\x6f\x77\x73" // 819 TerminalRows
 	,"\x28\x6d\x6f\x6e\x6f\x29\x20" // 820 TerminalMonochrome
@@ -1372,4 +1372,7 @@ const char * const text_defaults[TOTAL_TEXT]={
 		"\x6e\x20\x01\x68\x25\x73\x20\x01\x6e\x01\x6d\x25\x73\x0d\x0a" // 828 MsgPostedToYouVia
 	,"\x75\x6e\x6c\x69\x6d\x69\x74\x65\x64" // 829 Unlimited
 	,"\x20\x76\x69\x61\x20\x72\x61\x77" // 830 NodeConnectionRaw
+	,"\x44\x6f\x65\x73\x20\x79\x6f\x75\x72\x20\x74\x65\x72\x6d\x69\x6e\x61\x6c\x20\x73\x75\x70\x70\x6f\x72\x74\x20\x6d\x6f\x75\x73\x65"
+		"\x20\x72\x65\x70\x6f\x72\x74\x69\x6e\x67" // 831 MouseTerminalQ
+	,"\x28\x6d\x6f\x75\x73\x65\x29\x20" // 832 TerminalMouse
 };
diff --git a/src/sbbs3/useredit.cpp b/src/sbbs3/useredit.cpp
index b72c91bc0d..1a48fd2fb0 100644
--- a/src/sbbs3/useredit.cpp
+++ b/src/sbbs3/useredit.cpp
@@ -806,11 +806,12 @@ void sbbs_t::maindflts(user_t* user)
 							,user->misc&AUTOTERM ? text[TerminalAutoDetect]:nulstr
 							,cols, text[TerminalColumns]);
 		else
-			safe_snprintf(str,sizeof(str),"%s%s / %s %s%s"
+			safe_snprintf(str,sizeof(str),"%s%s / %s %s%s%s"
 							,user->misc&AUTOTERM ? text[TerminalAutoDetect]:nulstr
 							,term_charset(term)
 							,term_type(term)
 							,term&COLOR ? (term&ICE_COLOR ? text[TerminalIceColor] : text[TerminalColor]) : text[TerminalMonochrome]
+							,term&MOUSE ? text[TerminalMouse] : ""
 							,term&SWAP_DELETE ? "DEL=BS" : nulstr);
 		add_hotspot('T');
 		bprintf(text[UserDefaultsTerminal], truncsp(str));
@@ -950,6 +951,14 @@ void sbbs_t::maindflts(user_t* user)
 					} else
 						user->misc &= ~COLOR;
 				}
+				if(sys_status&SS_ABORT)
+					break;
+				if(term&ANSI) {
+					if(text[MouseTerminalQ][0] && yesno(text[MouseTerminalQ]))
+						user->misc |= MOUSE;
+					else
+						user->misc &= ~MOUSE;
+				}
 				if(sys_status&SS_ABORT)
 					break;
 				if(!(term&PETSCII)) {
-- 
GitLab