From af91e75fa24cad9a6053377277b6cda424a39aba Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Sat, 7 Dec 2002 00:55:37 +0000
Subject: [PATCH] Added support for control key pass-through mask, allows for
 pass-through of control key combinations in inkey() via SCFG or script.

---
 src/sbbs3/inkey.cpp      |  5 +++++
 src/sbbs3/js_console.cpp | 37 +++++++++++++++++++++++--------------
 src/sbbs3/scfgdefs.h     |  1 +
 src/sbbs3/scfglib1.c     |  3 ++-
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp
index a49ae6ccc1..4ddb415257 100644
--- a/src/sbbs3/inkey.cpp
+++ b/src/sbbs3/inkey.cpp
@@ -74,6 +74,11 @@ char sbbs_t::inkey(long mode)
 		ch&=0x7f; 
 
 	timeout=time(NULL);
+
+	/* Is this control key flagged as passthru? */
+	if(ch<' ' && cfg.ctrlkey_passthru&(1<<ch))
+		return(ch);	/* do not handle here */
+
 	if(ch==CTRL_C) {  /* Ctrl-C Abort */
 		sys_status|=SS_ABORT;
 		if(mode&K_SPIN) /* back space once if on spinning cursor */
diff --git a/src/sbbs3/js_console.cpp b/src/sbbs3/js_console.cpp
index e3bab643bb..9b6ded6798 100644
--- a/src/sbbs3/js_console.cpp
+++ b/src/sbbs3/js_console.cpp
@@ -55,6 +55,7 @@ enum {
 	,CON_PROP_TIMELEFT_WARN		/* low timeleft warning flag */
 	,CON_PROP_ABORTABLE
 	,CON_PROP_TELNET_MODE
+	,CON_PROP_CTRLKEY_PASSTHRU
 };
 
 static JSBool js_console_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
@@ -110,6 +111,9 @@ static JSBool js_console_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 				return(JS_FALSE);
 			*vp = STRING_TO_JSVAL(js_str);
 			return(JS_TRUE);
+		case CON_PROP_CTRLKEY_PASSTHRU:
+			val=sbbs->cfg.ctrlkey_passthru;
+			break;
 		default:
 			return(JS_TRUE);
 	}
@@ -171,6 +175,9 @@ static JSBool js_console_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 				break;
 			SAFECOPY(sbbs->question,JS_GetStringBytes(str));
 			break;
+		case CON_PROP_CTRLKEY_PASSTHRU:
+			sbbs->cfg.ctrlkey_passthru=val;
+			break;
 		default:
 			return(JS_TRUE);
 	}
@@ -181,20 +188,21 @@ static JSBool js_console_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 #define CON_PROP_FLAGS JSPROP_ENUMERATE
 
 static struct JSPropertySpec js_console_properties[] = {
-/*		 name				,tinyid					,flags			,getter,setter	*/
-
-	{	"status"			,CON_PROP_STATUS		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"line_counter"		,CON_PROP_LNCNTR 		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"attributes"		,CON_PROP_ATTR			,CON_PROP_FLAGS	,NULL,NULL},
-	{	"top_of_screen"		,CON_PROP_TOS			,CON_PROP_FLAGS	,NULL,NULL},
-	{	"screen_rows"		,CON_PROP_ROWS			,CON_PROP_FLAGS	,NULL,NULL},
-	{	"autoterm"			,CON_PROP_AUTOTERM		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"timeout"			,CON_PROP_TIMEOUT		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"timeleft_warning"	,CON_PROP_TIMELEFT_WARN	,CON_PROP_FLAGS	,NULL,NULL},
-	{	"rio_abortable"		,CON_PROP_ABORTABLE		,CON_PROP_FLAGS	,NULL,NULL},
-	{	"telnet_mode"		,CON_PROP_TELNET_MODE	,CON_PROP_FLAGS	,NULL,NULL},
-	{	"wordwrap"			,CON_PROP_WORDWRAP		,JSPROP_ENUMERATE|JSPROP_READONLY ,NULL,NULL},
-	{	"question"			,CON_PROP_QUESTION		,CON_PROP_FLAGS ,NULL,NULL},
+/*		 name				,tinyid						,flags			,getter,setter	*/
+
+	{	"status"			,CON_PROP_STATUS			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"line_counter"		,CON_PROP_LNCNTR 			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"attributes"		,CON_PROP_ATTR				,CON_PROP_FLAGS	,NULL,NULL},
+	{	"top_of_screen"		,CON_PROP_TOS				,CON_PROP_FLAGS	,NULL,NULL},
+	{	"screen_rows"		,CON_PROP_ROWS				,CON_PROP_FLAGS	,NULL,NULL},
+	{	"autoterm"			,CON_PROP_AUTOTERM			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"timeout"			,CON_PROP_TIMEOUT			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"timeleft_warning"	,CON_PROP_TIMELEFT_WARN		,CON_PROP_FLAGS	,NULL,NULL},
+	{	"rio_abortable"		,CON_PROP_ABORTABLE			,CON_PROP_FLAGS	,NULL,NULL},
+	{	"telnet_mode"		,CON_PROP_TELNET_MODE		,CON_PROP_FLAGS	,NULL,NULL},
+	{	"wordwrap"			,CON_PROP_WORDWRAP			,JSPROP_ENUMERATE|JSPROP_READONLY ,NULL,NULL},
+	{	"question"			,CON_PROP_QUESTION			,CON_PROP_FLAGS ,NULL,NULL},
+	{	"ctrlkey_passthru"	,CON_PROP_CTRLKEY_PASSTHRU	,CON_PROP_FLAGS	,NULL,NULL},
 	{0}
 };
 
@@ -212,6 +220,7 @@ static char* con_prop_desc[] = {
 	,"current telnet mode (see TELNET_MODE_* in sbbsdefs.js for valid values)"
 	,"word-wrap buffer (used by getstr)"
 	,"current yes/no question (set by yesno and noyes)"
+	,"control key pass-through bitmask, set bits represent control key combinations <b>not</b> handled by inkey() method"
 	,NULL
 };
 #endif
diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h
index 42d8b9bff7..819d6bea3b 100644
--- a/src/sbbs3/scfgdefs.h
+++ b/src/sbbs3/scfgdefs.h
@@ -575,6 +575,7 @@ typedef struct
 	ushort	sec_hangup; 			/* Seconds before inactivity hang-up */
 
 	char 	color[TOTAL_COLORS];	/* Different colors for the BBS */
+	ulong	ctrlkey_passthru;		/* Bits represent control keys NOT handled by inkey() */
 
 	char 	wfc_cmd[10][LEN_CMD+1];    /* 0-9 WFC DOS commands */
 	char 	wfc_scmd[12][LEN_CMD+1];   /* F1-F12 WFC shrinking DOS commands */
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index f28c6238ac..c3b11efd7e 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -294,9 +294,10 @@ BOOL read_main_cfg(scfg_t* cfg, char* error)
 	get_str(cfg->logout_mod,instream);
 	get_str(cfg->sync_mod,instream);
 	get_str(cfg->expire_mod,instream);
+	get_int(cfg->ctrlkey_passthru,instream);
 	get_int(c,instream);
 
-	for(i=0;i<224;i++)					/* unused - initialized to NULL */
+	for(i=0;i<222;i++)					/* unused - initialized to NULL */
 		get_int(n,instream);
 	for(i=0;i<254;i++)					/* unused - initialized to 0xff */
 		get_int(n,instream);
-- 
GitLab