|
|
1.1 ! root 1: /* inkey.cpp */ ! 2: ! 3: /* Synchronet single key input function (no wait) */ ! 4: ! 5: /* $Id: inkey.cpp,v 1.2 2000/12/11 23:21:11 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include "sbbs.h" ! 39: ! 40: #define LAST_STAT_LINE 16 ! 41: ! 42: #define nosound() ! 43: ! 44: /****************************************************************************/ ! 45: /* Returns character if a key has been hit remotely and responds */ ! 46: /* Called from functions getkey, msgabort and main_sec */ ! 47: /****************************************************************************/ ! 48: char sbbs_t::inkey(long mode) ! 49: { ! 50: char str[512]; ! 51: char tmp[512]; ! 52: uchar ch=0; ! 53: uint i,j; ! 54: ! 55: if(keybuftop!=keybufbot) { ! 56: ch=keybuf[keybufbot++]; ! 57: if(keybufbot==KEY_BUFSIZE) ! 58: keybufbot=0; ! 59: } else ! 60: ch=incom(); ! 61: if(ch==0) { ! 62: if(!(mode&K_GETSTR) || mode&K_LOWPRIO || cfg.node_misc&NM_LOWPRIO) ! 63: mswait(1); ! 64: return(0); ! 65: } ! 66: ! 67: if(cfg.node_misc&NM_7BITONLY ! 68: && (!(sys_status&SS_USERON) || useron.misc&NO_EXASCII)) ! 69: ch&=0x7f; ! 70: ! 71: timeout=time(NULL); ! 72: if(ch==3) { /* Ctrl-C Abort */ ! 73: sys_status|=SS_ABORT; ! 74: if(mode&K_SPIN) /* back space once if on spinning cursor */ ! 75: bputs("\b \b"); ! 76: return(0); } ! 77: if(ch==26 && action!=NODE_PCHT) { /* Ctrl-Z toggle raw input mode */ ! 78: if(mode&K_SPIN) ! 79: bputs("\b "); ! 80: SAVELINE; ! 81: attr(LIGHTGRAY); ! 82: CRLF; ! 83: bputs(text[RawMsgInputModeIsNow]); ! 84: if(console&CON_RAW_IN) ! 85: bputs(text[OFF]); ! 86: else ! 87: bputs(text[ON]); ! 88: console^=CON_RAW_IN; ! 89: CRLF; ! 90: CRLF; ! 91: RESTORELINE; ! 92: lncntr=0; ! 93: if(action!=NODE_MAIN && action!=NODE_XFER) ! 94: return(26); ! 95: return(0); } ! 96: if(console&CON_RAW_IN) /* ignore ctrl-key commands if in raw mode */ ! 97: return(ch); ! 98: ! 99: if(ch<SP) { /* Control chars */ ! 100: if(ch==LF) /* ignore LF's in not in raw mode */ ! 101: return(0); ! 102: if(ch==15) { /* Ctrl-O toggles pause temporarily */ ! 103: useron.misc^=UPAUSE; ! 104: return(0); } ! 105: if(ch==0x10) { /* Ctrl-P Private node-node comm */ ! 106: if(!(sys_status&SS_USERON)) ! 107: return(0); /* keep from being recursive */ ! 108: if(mode&K_SPIN) ! 109: bputs("\b "); ! 110: if(sys_status&SS_SPLITP) { ! 111: #if 0 /* screen size */ ! 112: if((scrnbuf=(uchar*)MALLOC((24L*80L)*2L))==NULL) { ! 113: errormsg(WHERE,ERR_ALLOC,nulstr,(24L*80L)*2L); ! 114: return(CR); } ! 115: gettext(1,1,80,24,scrnbuf); ! 116: x=lclwx(); ! 117: y=lclwy(); ! 118: CLS; ! 119: #endif ! 120: } ! 121: else { ! 122: SAVELINE; ! 123: attr(LIGHTGRAY); ! 124: CRLF; } ! 125: nodesync(); /* read any waiting messages */ ! 126: nodemsg(); /* send a message */ ! 127: SYNC; ! 128: if(sys_status&SS_SPLITP) { ! 129: #if 0 /* screen size */ ! 130: lncntr=0; ! 131: CLS; ! 132: for(i=0;i<((24*80)-1)*2;i+=2) { ! 133: if(scrnbuf[i+1]!=curatr) ! 134: attr(scrnbuf[i+1]); ! 135: outchar(scrnbuf[i]); } ! 136: FREE(scrnbuf); ! 137: GOTOXY(x,y); ! 138: #endif ! 139: } ! 140: else { ! 141: CRLF; ! 142: RESTORELINE; } ! 143: lncntr=0; ! 144: return(0); } ! 145: ! 146: if(ch==21) { /* Ctrl-U Users online */ ! 147: if(!(sys_status&SS_USERON)) ! 148: return(0); ! 149: if(mode&K_SPIN) ! 150: bputs("\b "); ! 151: if(sys_status&SS_SPLITP) { ! 152: #if 0 /* screen size */ ! 153: if((scrnbuf=(uchar*)MALLOC((24L*80L)*2L))==NULL) { ! 154: errormsg(WHERE,ERR_ALLOC,nulstr,(24L*80L)*2L); ! 155: return(CR); } ! 156: gettext(1,1,80,24,scrnbuf); ! 157: x=lclwx(); ! 158: y=lclwy(); ! 159: CLS; ! 160: #endif ! 161: } ! 162: else { ! 163: SAVELINE; ! 164: attr(LIGHTGRAY); ! 165: CRLF; } ! 166: whos_online(true); /* list users */ ! 167: ASYNC; ! 168: if(sys_status&SS_SPLITP) { ! 169: #if 0 /* screen size */ ! 170: CRLF; ! 171: nodesync(); ! 172: pause(); ! 173: CLS; ! 174: for(i=0;i<((24*80)-1)*2;i+=2) { ! 175: if(scrnbuf[i+1]!=curatr) ! 176: attr(scrnbuf[i+1]); ! 177: outchar(scrnbuf[i]); } ! 178: FREE(scrnbuf); ! 179: GOTOXY(x,y); ! 180: #endif ! 181: } ! 182: else { ! 183: CRLF; ! 184: RESTORELINE; } ! 185: lncntr=0; ! 186: return(0); } ! 187: if(ch==20 && !(sys_status&SS_SPLITP)) { /* Ctrl-T Time information */ ! 188: if(!(sys_status&SS_USERON)) ! 189: return(0); ! 190: if(mode&K_SPIN) ! 191: bputs("\b "); ! 192: SAVELINE; ! 193: attr(LIGHTGRAY); ! 194: now=time(NULL); ! 195: bprintf(text[TiLogon],timestr(&logontime)); ! 196: bprintf(text[TiNow],timestr(&now)); ! 197: bprintf(text[TiTimeon] ! 198: ,sectostr(now-logontime,tmp)); ! 199: bprintf(text[TiTimeLeft] ! 200: ,sectostr(timeleft,tmp)); ! 201: SYNC; ! 202: RESTORELINE; ! 203: lncntr=0; ! 204: return(0); } ! 205: if(ch==11 && !(sys_status&SS_SPLITP)) { /* Ctrl-k Control key menu */ ! 206: if(!(sys_status&SS_USERON)) ! 207: return(0); ! 208: if(mode&K_SPIN) ! 209: bputs("\b "); ! 210: SAVELINE; ! 211: attr(LIGHTGRAY); ! 212: lncntr=0; ! 213: bputs(text[ControlKeyMenu]); ! 214: ASYNC; ! 215: RESTORELINE; ! 216: lncntr=0; ! 217: return(0); } ! 218: ! 219: if(ch==ESC && console&CON_R_INPUT) { ! 220: if(mode&K_GETSTR) ! 221: i=60; // 3 seconds in GETSTR mode ! 222: else ! 223: i=20; // 1 second otherwise ! 224: for(;i && !rioctl(RXBC);i--) ! 225: mswait(50); ! 226: if(!i) // timed-out waiting for '[' ! 227: return(ESC); ! 228: ch=incom(); ! 229: if(ch!='[') { ! 230: ungetkey(ESC); ! 231: ungetkey(ch); ! 232: return(0); } ! 233: i=j=0; ! 234: autoterm|=ANSI; /* <ESC>[x means they have ANSI */ ! 235: if(!(useron.misc&ANSI) && useron.misc&AUTOTERM && sys_status&SS_USERON ! 236: && useron.number) { ! 237: useron.misc|=ANSI; ! 238: putuserrec(&cfg,useron.number,U_MISC,8,ultoa(useron.misc,str,16)); } ! 239: while(i<10 && j<30) { /* up to 3 seconds */ ! 240: if(rioctl(RXBC)) { ! 241: ch=incom(); ! 242: if(ch!=';' && !isdigit(ch) && ch!='R') { /* other ANSI */ ! 243: switch(ch) { ! 244: case 'A': ! 245: return(0x1e); /* ctrl-^ (up arrow) */ ! 246: case 'B': ! 247: return(LF); /* ctrl-j (dn arrow) */ ! 248: case 'C': ! 249: return(0x6); /* ctrl-f (rt arrow) */ ! 250: case 'D': ! 251: return(0x1d); /* ctrl-] (lf arrow) */ ! 252: case 'H': ! 253: return(0x2); /* ctrl-b (beg line) */ ! 254: case 'K': ! 255: return(0x5); /* ctrl-e (end line) */ ! 256: } ! 257: ungetkey(ESC); ! 258: ungetkey('['); ! 259: for(j=0;j<i;j++) ! 260: ungetkey(str[j]); ! 261: ungetkey(ch); ! 262: return(0); } ! 263: if(ch=='R') { /* cursor position report */ ! 264: if(i && !(useron.rows)) { /* auto-detect rows */ ! 265: str[i]=0; ! 266: rows=atoi(str); ! 267: if(rows<5 || rows>99) rows=24; } ! 268: return(0); } ! 269: str[i++]=ch; } ! 270: else { ! 271: mswait(100); ! 272: j++; } } ! 273: ! 274: ungetkey(ESC); /* should only get here if time-out */ ! 275: ungetkey('['); ! 276: for(j=0;j<i;j++) ! 277: ungetkey(str[j]); ! 278: return(0); } ! 279: ! 280: } /* end of control chars */ ! 281: ! 282: return(ch); ! 283: } ! 284:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.