diff --git a/src/sbbs3/inkey.cpp b/src/sbbs3/inkey.cpp index a49ae6ccc1874b1fe3dd267d9a91666217f8eaa6..4ddb4152578a2bea1182d394ad11ee4648161050 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 e3bab643bb0568a7dc373b041c64efa5f8c0edbb..9b6ded6798541685ef59242e3bce48b9eee54034 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 42d8b9bff7c0d3929c66fc69cbeb52570d5e8158..819d6bea3bfef8fd9dcf2babd8809c7157da6881 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 f28c6238ac4ed4a7aa3a66e6caa57ab2c8b35c8e..c3b11efd7ed4bf92b9df1ca515c4e320ad89001a 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);