Annotation of sbbs/src/sbbs3/inkey.cpp, revision 1.1.1.1

1.1       root        1: /* inkey.cpp */
                      2: 
                      3: /* Synchronet single key input function (no wait) */
                      4: 
                      5: /* $Id: inkey.cpp,v 1.28 2006/09/07 22:59:26 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 2006 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, unsigned long timeout)
                     49: {
                     50:        uchar   ch=0;
                     51: 
                     52:        if(keybuftop!=keybufbot) {   
                     53:                ch=keybuf[keybufbot++];   
                     54:                if(keybufbot==KEY_BUFSIZE)   
                     55:                        keybufbot=0;   
                     56:        } else 
                     57:                ch=incom(timeout);
                     58: 
                     59:        if(ch==0) {
                     60:                // moved here from getkey() on AUG-29-2001
                     61:                if(sys_status&SS_SYSPAGE) 
                     62:                        sbbs_beep(sbbs_random(800),100);
                     63: #if 0
                     64:                if(!(mode&K_GETSTR) || mode&K_LOWPRIO || cfg.node_misc&NM_LOWPRIO)
                     65:                        YIELD();
                     66: #endif
                     67:                return(0);
                     68:        }
                     69: 
                     70:        if(cfg.node_misc&NM_7BITONLY
                     71:                && (!(sys_status&SS_USERON) || useron.misc&NO_EXASCII))
                     72:                ch&=0x7f; 
                     73: 
                     74:        timeout=time(NULL);
                     75: 
                     76:        /* Is this a control key */
                     77:        if(ch<' ') {
                     78:                if(cfg.ctrlkey_passthru&(1<<ch))        /*  flagged as passthru? */
                     79:                        return(ch);                                             /* do not handle here */
                     80:                return(handle_ctrlkey(ch,mode));
                     81:        }
                     82: 
                     83:        if(mode&K_UPPER)
                     84:                ch=toupper(ch);
                     85: 
                     86:        return(ch);
                     87: }
                     88: 
                     89: char sbbs_t::handle_ctrlkey(char ch, long mode)
                     90: {
                     91:        char    str[512];
                     92:        char    tmp[512];
                     93:        uint    i,j;
                     94: 
                     95:        if(ch==CTRL_C) {  /* Ctrl-C Abort */
                     96:                sys_status|=SS_ABORT;
                     97:                if(mode&K_SPIN) /* back space once if on spinning cursor */
                     98:                        backspace();
                     99:                return(0); 
                    100:        }
                    101:        if(ch==CTRL_Z && !(mode&K_MSG)
                    102:                && action!=NODE_PCHT) {  /* Ctrl-Z toggle raw input mode */
                    103:                if(hotkey_inside>1)     /* only allow so much recursion */
                    104:                        return(0);
                    105:                hotkey_inside++;
                    106:                if(mode&K_SPIN)
                    107:                        bputs("\b ");
                    108:                SAVELINE;
                    109:                attr(LIGHTGRAY);
                    110:                CRLF;
                    111:                bputs(text[RawMsgInputModeIsNow]);
                    112:                if(console&CON_RAW_IN)
                    113:                        bputs(text[OFF]);
                    114:                else
                    115:                        bputs(text[ON]);
                    116:                console^=CON_RAW_IN;
                    117:                CRLF;
                    118:                CRLF;
                    119:                RESTORELINE;
                    120:                lncntr=0;
                    121:                hotkey_inside--;
                    122:                if(action!=NODE_MAIN && action!=NODE_XFER)
                    123:                        return(CTRL_Z);
                    124:                return(0); 
                    125:        }
                    126: 
                    127:        if(console&CON_RAW_IN)   /* ignore ctrl-key commands if in raw mode */
                    128:                return(ch);
                    129: 
                    130: #if 0  /* experimental removal to fix Tracker1's pause module problem with down-arrow */
                    131:        if(ch==LF)                              /* ignore LF's if not in raw mode */
                    132:                return(0);
                    133: #endif
                    134: 
                    135:        /* Global hot key event */
                    136:        for(i=0;i<cfg.total_hotkeys;i++)
                    137:                if(cfg.hotkey[i]->key==ch)
                    138:                        break;
                    139:        if(i<cfg.total_hotkeys) {
                    140:                if(hotkey_inside>1)     /* only allow so much recursion */
                    141:                        return(0);
                    142:                hotkey_inside++;
                    143:                if(mode&K_SPIN)
                    144:                        bputs("\b ");
                    145:                if(!(sys_status&SS_SPLITP)) {
                    146:                        SAVELINE;
                    147:                        attr(LIGHTGRAY);
                    148:                        CRLF; 
                    149:                }
                    150:                external(cmdstr(cfg.hotkey[i]->cmd,nulstr,nulstr,NULL),0);
                    151:                if(!(sys_status&SS_SPLITP)) {
                    152:                        CRLF;
                    153:                        RESTORELINE; 
                    154:                }
                    155:                lncntr=0;
                    156:                hotkey_inside--;
                    157:                return(0);
                    158:        }
                    159: 
                    160:        switch(ch) {
                    161:                case CTRL_O:    /* Ctrl-O toggles pause temporarily */
                    162:                        useron.misc^=UPAUSE;
                    163:                        return(0); 
                    164:                case CTRL_P:    /* Ctrl-P Private node-node comm */
                    165:                        if(!(sys_status&SS_USERON))
                    166:                                return(0);                       /* keep from being recursive */
                    167:                        if(hotkey_inside>1)     /* only allow so much recursion */
                    168:                                return(0);
                    169:                        hotkey_inside++;
                    170:                        if(mode&K_SPIN)
                    171:                                bputs("\b ");
                    172:                        if(!(sys_status&SS_SPLITP)) {
                    173:                                SAVELINE;
                    174:                                attr(LIGHTGRAY);
                    175:                                CRLF; 
                    176:                        }
                    177:                        nodesync();     /* read any waiting messages */
                    178:                        nodemsg();              /* send a message */
                    179:                        SYNC;
                    180:                        if(!(sys_status&SS_SPLITP)) {
                    181:                                CRLF;
                    182:                                RESTORELINE; 
                    183:                        }
                    184:                        lncntr=0;
                    185:                        hotkey_inside--;
                    186:                        return(0); 
                    187: 
                    188:                case CTRL_U:    /* Ctrl-U Users online */
                    189:                        /* needs recursion checking */
                    190:                        if(!(sys_status&SS_USERON))
                    191:                                return(0);
                    192:                        if(hotkey_inside>1)     /* only allow so much recursion */
                    193:                                return(0);
                    194:                        hotkey_inside++;
                    195:                        if(mode&K_SPIN)
                    196:                                bputs("\b ");
                    197:                        if(!(sys_status&SS_SPLITP)) {
                    198:                                SAVELINE;
                    199:                                attr(LIGHTGRAY);
                    200:                                CRLF; 
                    201:                        }
                    202:                        whos_online(true);      /* list users */
                    203:                        ASYNC;
                    204:                        if(!(sys_status&SS_SPLITP)) {
                    205:                                CRLF;
                    206:                                RESTORELINE; 
                    207:                        }
                    208:                        lncntr=0;
                    209:                        hotkey_inside--;
                    210:                        return(0); 
                    211:                case CTRL_T: /* Ctrl-T Time information */
                    212:                        if(sys_status&SS_SPLITP)
                    213:                                return(ch);
                    214:                        if(!(sys_status&SS_USERON))
                    215:                                return(0);
                    216:                        if(hotkey_inside>1)     /* only allow so much recursion */
                    217:                                return(0);
                    218:                        hotkey_inside++;
                    219:                        if(mode&K_SPIN)
                    220:                                bputs("\b ");
                    221:                        SAVELINE;
                    222:                        attr(LIGHTGRAY);
                    223:                        now=time(NULL);
                    224:                        bprintf(text[TiLogon],timestr(&logontime));
                    225:                        bprintf(text[TiNow],timestr(&now));
                    226:                        bprintf(text[TiTimeon]
                    227:                                ,sectostr(now-logontime,tmp));
                    228:                        bprintf(text[TiTimeLeft]
                    229:                                ,sectostr(timeleft,tmp));
                    230:                        SYNC;
                    231:                        RESTORELINE;
                    232:                        lncntr=0;
                    233:                        hotkey_inside--;
                    234:                        return(0); 
                    235:                case CTRL_K:  /*  Ctrl-k Control key menu */
                    236:                        if(sys_status&SS_SPLITP)
                    237:                                return(ch);
                    238:                        if(!(sys_status&SS_USERON))
                    239:                                return(0);
                    240:                        if(hotkey_inside>1)     /* only allow so much recursion */
                    241:                                return(0);
                    242:                        hotkey_inside++;
                    243:                        if(mode&K_SPIN)
                    244:                                bputs("\b ");
                    245:                        SAVELINE;
                    246:                        attr(LIGHTGRAY);
                    247:                        lncntr=0;
                    248:                        bputs(text[ControlKeyMenu]);
                    249:                        ASYNC;
                    250:                        RESTORELINE;
                    251:                        lncntr=0;
                    252:                        hotkey_inside--;
                    253:                        return(0); 
                    254:                case ESC:
                    255:                        i=incom(mode&K_GETSTR ? 3000:1000);
                    256:                        if(i==NOINP)            // timed-out waiting for '['
                    257:                                return(ESC);
                    258:                        ch=i;
                    259:                        if(ch!='[') {
                    260:                                ungetkey(ch);
                    261:                                return(ESC); 
                    262:                        }
                    263:                        i=j=0;
                    264:                        autoterm|=ANSI;                         /* <ESC>[x means they have ANSI */
                    265:                        if(sys_status&SS_USERON && useron.misc&AUTOTERM && !(useron.misc&ANSI)
                    266:                                && useron.number) {
                    267:                                useron.misc|=ANSI;
                    268:                                putuserrec(&cfg,useron.number,U_MISC,8,ultoa(useron.misc,str,16)); 
                    269:                        }
                    270:                        while(i<10 && j<30) {           /* up to 3 seconds */
                    271:                                ch=incom(100);
                    272:                                if(ch==(NOINP&0xff)) {
                    273:                                        j++;
                    274:                                        continue;
                    275:                                }
                    276:                                if(ch!=';' && !isdigit(ch) && ch!='R') {    /* other ANSI */
                    277:                                        switch(ch) {
                    278:                                                case 'A':
                    279:                                                        return(0x1e);   /* ctrl-^ (up arrow) */
                    280:                                                case 'B':
                    281:                                                        return(LF);     /* ctrl-j (dn arrow) */
                    282:                                                case 'C':
                    283:                                                        return(CTRL_F); /* ctrl-f (rt arrow) */
                    284:                                                case 'D':
                    285:                                                        return(0x1d);   /* ctrl-] (lf arrow) */
                    286:                                                case 'H':       /* ANSI:  home cursor */
                    287:                                                        return(CTRL_B); /* ctrl-b (beg line) */
                    288:                                                case 'F':       /* Xterm: cursor preceding line */
                    289:                                                case 'K':       /* ANSI:  clear-to-end-of-line */
                    290:                                                        return(CTRL_E); /* ctrl-e (end line) */
                    291:                                        }
                    292:                                        ungetkey('[');
                    293:                                        for(j=0;j<i;j++)
                    294:                                                ungetkey(str[j]);
                    295:                                        ungetkey(ch);
                    296:                                        return(ESC); 
                    297:                                }
                    298:                                if(ch=='R') {       /* cursor position report */
                    299:                                        if(i && !(useron.rows)) {       /* auto-detect rows */
                    300:                                                str[i]=0;
                    301:                                                rows=atoi(str);
                    302:                                                lprintf(LOG_DEBUG,"Node %d ANSI cursor position report: %u rows"
                    303:                                                        ,cfg.node_num, rows);
                    304:                                                if(rows<10 || rows>99) rows=24; 
                    305:                                        }
                    306:                                        return(0); 
                    307:                                }
                    308:                                str[i++]=ch; 
                    309:                        }
                    310: 
                    311:                        ungetkey('[');
                    312:                        for(j=0;j<i;j++)
                    313:                                ungetkey(str[j]);
                    314:                        return(ESC); 
                    315:        }
                    316:        return(ch);
                    317: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.