|
|
1.1 ! root 1: /* ansiterm.cpp */ ! 2: ! 3: /* Synchronet ANSI terminal functions */ ! 4: ! 5: /* $Id: ansiterm.cpp,v 1.11 2006/08/23 01:33:29 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 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: /****************************************************************************/ ! 47: char *sbbs_t::ansi(int atr) ! 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: ! 100: void sbbs_t::ansi_getlines() ! 101: { ! 102: if(sys_status&SS_USERON && useron.misc&ANSI && !useron.rows /* Auto-detect rows */ ! 103: && online==ON_REMOTE) { /* Remote */ ! 104: SYNC; ! 105: putcom("\x1b[s\x1b[99B\x1b[6n\x1b[u"); ! 106: inkey(K_NONE,TIMEOUT_ANSI_GETXY*1000); ! 107: } ! 108: } ! 109: ! 110: bool sbbs_t::ansi_getxy(int* x, int* y) ! 111: { ! 112: int rsp=0, ch; ! 113: ! 114: *x=0; ! 115: *y=0; ! 116: ! 117: putcom("\x1b[6n"); /* Request cusor position */ ! 118: ! 119: time_t start=time(NULL); ! 120: sys_status&=~SS_ABORT; ! 121: while(online && !(sys_status&SS_ABORT)) { ! 122: if((ch=incom(1000))!=NOINP) { ! 123: if(ch==ESC && rsp==0) { ! 124: rsp++; ! 125: start=time(NULL); ! 126: } ! 127: else if(ch=='[' && rsp==1) { ! 128: rsp++; ! 129: start=time(NULL); ! 130: } ! 131: else if(isdigit(ch) && rsp==2) { ! 132: if(y!=NULL) { ! 133: (*y)*=10; ! 134: (*y)+=(ch&0xf); ! 135: } ! 136: start=time(NULL); ! 137: } ! 138: else if(ch==';' && rsp>=2) { ! 139: rsp++; ! 140: start=time(NULL); ! 141: } ! 142: else if(isdigit(ch) && rsp==3) { ! 143: if(x!=NULL) { ! 144: (*x)*=10; ! 145: (*x)+=(ch&0xf); ! 146: } ! 147: start=time(NULL); ! 148: } ! 149: else if(ch=='R' && rsp) ! 150: break; ! 151: else ! 152: ungetkey(ch); ! 153: } ! 154: if(time(NULL)-start>TIMEOUT_ANSI_GETXY) { ! 155: lprintf(LOG_NOTICE,"Node %d !TIMEOUT in ansi_getxy", cfg.node_num); ! 156: return(false); ! 157: } ! 158: } ! 159: ! 160: return(true); ! 161: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.