Annotation of sbbs/src/sbbs3/ansiterm.cpp, revision 1.1.1.2

1.1       root        1: /* ansiterm.cpp */
                      2: 
                      3: /* Synchronet ANSI terminal functions */
                      4: 
1.1.1.2 ! root        5: /* $Id: ansiterm.cpp,v 1.20 2009/02/27 06:19:44 rswindell Exp $ */
1.1       root        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:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2009 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       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 TIMEOUT_ANSI_GETXY     5       // Seconds
                     41: 
                     42: /****************************************************************************/
                     43: /* Returns the ANSI code to obtain the value of atr. Mixed attributes          */
                     44: /* high intensity colors, or background/forground cobinations don't work.   */
                     45: /* A call to attr is more appropriate, being it is intelligent                         */
                     46: /****************************************************************************/
1.1.1.2 ! root       47: const char *sbbs_t::ansi(int atr)
1.1       root       48: {
                     49: 
                     50:        switch(atr) {
                     51: 
                     52:                /* Special case */
                     53:                case ANSI_NORMAL:
                     54:                        return("\x1b[0m");
                     55:                case BLINK:
                     56:                        return("\x1b[5m");
                     57: 
                     58:                /* Foreground */
                     59:                case HIGH:
                     60:                        return("\x1b[1m");
                     61:                case BLACK:
                     62:                        return("\x1b[30m");
                     63:                case RED:
                     64:                        return("\x1b[31m");
                     65:                case GREEN:
                     66:                        return("\x1b[32m");
                     67:                case BROWN:
                     68:                        return("\x1b[33m");
                     69:                case BLUE:
                     70:                        return("\x1b[34m");
                     71:                case MAGENTA:
                     72:                        return("\x1b[35m");
                     73:                case CYAN:
                     74:                        return("\x1b[36m");
                     75:                case LIGHTGRAY:
                     76:                        return("\x1b[37m");
                     77: 
                     78:                /* Background */
                     79:                case BG_BLACK:
                     80:                        return("\x1b[40m");
                     81:                case BG_RED:
                     82:                        return("\x1b[41m");
                     83:                case BG_GREEN:
                     84:                        return("\x1b[42m");
                     85:                case BG_BROWN:
                     86:                        return("\x1b[43m");
                     87:                case BG_BLUE:
                     88:                        return("\x1b[44m");
                     89:                case BG_MAGENTA:
                     90:                        return("\x1b[45m");
                     91:                case BG_CYAN:
                     92:                        return("\x1b[46m");
                     93:                case BG_LIGHTGRAY:
                     94:                        return("\x1b[47m"); 
                     95:        }
                     96: 
                     97:        return("-Invalid use of ansi()-");
                     98: }
                     99: 
1.1.1.2 ! root      100: /* insure str is at least 14 bytes in size! */
        !           101: char* sbbs_t::ansi(int atr, int curatr, char* str)
        !           102: {
        !           103:        if(!term_supports(COLOR)) {  /* eliminate colors if user doesn't have them */
        !           104:                if(atr&LIGHTGRAY)       /* if any foreground bits set, set all */
        !           105:                        atr|=LIGHTGRAY;
        !           106:                if(atr&BG_LIGHTGRAY)  /* if any background bits set, set all */
        !           107:                        atr|=BG_LIGHTGRAY;
        !           108:                if(atr&LIGHTGRAY && atr&BG_LIGHTGRAY)
        !           109:                        atr&=~LIGHTGRAY;    /* if background is solid, foreground is black */
        !           110:                if(!atr)
        !           111:                        atr|=LIGHTGRAY;         /* don't allow black on black */
        !           112:        }
        !           113:        if(curatr==atr) { /* text hasn't changed. no sequence needed */
        !           114:                *str=0;
        !           115:                return str;
        !           116:        }
        !           117: 
        !           118:        strcpy(str,"\033[");
        !           119:        if((!(atr&HIGH) && curatr&HIGH) || (!(atr&BLINK) && curatr&BLINK)
        !           120:                || atr==LIGHTGRAY) {
        !           121:                strcat(str,"0;");
        !           122:                curatr=LIGHTGRAY;
        !           123:        }
        !           124:        if(atr&BLINK) {                     /* special attributes */
        !           125:                if(!(curatr&BLINK))
        !           126:                        strcat(str,"5;");
        !           127:        }
        !           128:        if(atr&HIGH) {
        !           129:                if(!(curatr&HIGH))
        !           130:                        strcat(str,"1;"); 
        !           131:        }
        !           132:        if((atr&0x07) != (curatr&0x07)) {
        !           133:                switch(atr&0x07) {
        !           134:                        case BLACK:
        !           135:                                strcat(str,"30;");
        !           136:                                break;
        !           137:                        case RED:
        !           138:                                strcat(str,"31;");
        !           139:                                break;
        !           140:                        case GREEN:
        !           141:                                strcat(str,"32;");
        !           142:                                break;
        !           143:                        case BROWN:
        !           144:                                strcat(str,"33;");
        !           145:                                break;
        !           146:                        case BLUE:
        !           147:                                strcat(str,"34;");
        !           148:                                break;
        !           149:                        case MAGENTA:
        !           150:                                strcat(str,"35;");
        !           151:                                break;
        !           152:                        case CYAN:
        !           153:                                strcat(str,"36;");
        !           154:                                break;
        !           155:                        case LIGHTGRAY:
        !           156:                                strcat(str,"37;");
        !           157:                                break;
        !           158:                }
        !           159:        }
        !           160:        if((atr&0x70) != (curatr&0x70)) {
        !           161:                switch(atr&0x70) {
        !           162:                        /* The BG_BLACK macro is 0x200, so isn't in the mask */
        !           163:                        case 0 /* BG_BLACK */:  
        !           164:                                strcat(str,"40;");
        !           165:                                break;
        !           166:                        case BG_RED:
        !           167:                                strcat(str,"41;");
        !           168:                                break;
        !           169:                        case BG_GREEN:
        !           170:                                strcat(str,"42;");
        !           171:                                break;
        !           172:                        case BG_BROWN:
        !           173:                                strcat(str,"43;");
        !           174:                                break;
        !           175:                        case BG_BLUE:
        !           176:                                strcat(str,"44;");
        !           177:                                break;
        !           178:                        case BG_MAGENTA:
        !           179:                                strcat(str,"45;");
        !           180:                                break;
        !           181:                        case BG_CYAN:
        !           182:                                strcat(str,"46;");
        !           183:                                break;
        !           184:                        case BG_LIGHTGRAY:
        !           185:                                strcat(str,"47;");
        !           186:                                break;
        !           187:                }
        !           188:        }
        !           189:        if(strlen(str)==2)      /* Convert <ESC>[ to blank */
        !           190:                *str=0;
        !           191:        else
        !           192:                str[strlen(str)-1]='m';
        !           193:        return str;
        !           194: }
        !           195: 
1.1       root      196: void sbbs_t::ansi_getlines()
                    197: {
                    198:        if(sys_status&SS_USERON && useron.misc&ANSI && !useron.rows /* Auto-detect rows */
                    199:                && online==ON_REMOTE) {                                                                 /* Remote */
                    200:                SYNC;
1.1.1.2 ! root      201:                putcom("\x1b[s\x1b[255B\x1b[255C\x1b[6n\x1b[u");
        !           202:                inkey(K_ANSI_CPR,TIMEOUT_ANSI_GETXY*1000); 
1.1       root      203:        }
                    204: }
                    205: 
                    206: bool sbbs_t::ansi_getxy(int* x, int* y)
                    207: {
                    208:        int     rsp=0, ch;
                    209: 
                    210:     *x=0;
                    211:     *y=0;
                    212: 
                    213:        putcom("\x1b[6n");      /* Request cusor position */
                    214: 
                    215:     time_t start=time(NULL);
                    216:     sys_status&=~SS_ABORT;
                    217:     while(online && !(sys_status&SS_ABORT)) {
                    218:                if((ch=incom(1000))!=NOINP) {
                    219:                        if(ch==ESC && rsp==0) {
                    220:                rsp++;
                    221:                                start=time(NULL);
                    222:                        }
                    223:             else if(ch=='[' && rsp==1) {
                    224:                rsp++;
                    225:                                start=time(NULL);
                    226:                        }
                    227:             else if(isdigit(ch) && rsp==2) {
                    228:                                if(y!=NULL) {
                    229:                                (*y)*=10;
                    230:                                        (*y)+=(ch&0xf);
                    231:                                }
                    232:                                start=time(NULL);
                    233:             }
                    234:             else if(ch==';' && rsp>=2) {
                    235:                rsp++;
                    236:                                start=time(NULL);
                    237:                        }
                    238:             else if(isdigit(ch) && rsp==3) {
                    239:                                if(x!=NULL) {
                    240:                        (*x)*=10;
                    241:                                        (*x)+=(ch&0xf);
                    242:                                }
                    243:                                start=time(NULL);
                    244:             }
                    245:             else if(ch=='R' && rsp)
                    246:                break;
                    247:                        else
                    248:                                ungetkey(ch);
                    249:         }
                    250:        if(time(NULL)-start>TIMEOUT_ANSI_GETXY) {
                    251:                lprintf(LOG_NOTICE,"Node %d !TIMEOUT in ansi_getxy", cfg.node_num);
                    252:             return(false);
                    253:         }
                    254:     }
                    255: 
                    256:        return(true);
                    257: }
1.1.1.2 ! root      258: 
        !           259: bool sbbs_t::ansi_gotoxy(int x, int y)
        !           260: {
        !           261:        if(term_supports(ANSI)) {
        !           262:                rprintf("\x1b[%d;%dH",y,x);
        !           263:                if(x>0)
        !           264:                        column=x-1;
        !           265:                lncntr=0;
        !           266:                return true;
        !           267:        }
        !           268:        return false;
        !           269: }
        !           270: 
        !           271: bool sbbs_t::ansi_save(void)
        !           272: {
        !           273:        if(term_supports(ANSI)) {
        !           274:                rputs("\x1b[s");
        !           275:                return true;
        !           276:        }
        !           277:        return false;
        !           278: }
        !           279: 
        !           280: bool sbbs_t::ansi_restore(void)
        !           281: {
        !           282:        if(term_supports(ANSI)) {
        !           283:                rputs("\x1b[u");
        !           284:                return true;
        !           285:        }
        !           286:        return false;
        !           287: }

unix.superglobalmegacorp.com

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