Skip to content
Snippets Groups Projects
Select Git revision
  • dailybuild_linux-x64
  • master default protected
  • dailybuild_win32
  • sqlite
  • rip_abstraction
  • dailybuild_macos-armv8
  • dd_file_lister_filanem_in_desc_color
  • mode7
  • dd_msg_reader_are_you_there_warning_improvement
  • c23-playing
  • syncterm-1.3
  • syncterm-1.2
  • test-build
  • hide_remote_connection_with_telgate
  • 638-can-t-control-c-during-a-file-search
  • add_body_to_pager_email
  • mingw32-build
  • cryptlib-3.4.7
  • ree/mastermind
  • new_user_dat
  • sbbs320d
  • syncterm-1.6
  • syncterm-1.5
  • syncterm-1.4
  • sbbs320b
  • syncterm-1.3
  • syncterm-1.2
  • syncterm-1.2rc6
  • syncterm-1.2rc5
  • push
  • syncterm-1.2rc4
  • syncterm-1.2rc2
  • syncterm-1.2rc1
  • sbbs319b
  • sbbs318b
  • goodbuild_linux-x64_Sep-01-2020
  • goodbuild_win32_Sep-01-2020
  • goodbuild_linux-x64_Aug-31-2020
  • goodbuild_win32_Aug-31-2020
  • goodbuild_win32_Aug-30-2020
40 results

ansiterm.cpp

Blame
  • ansiterm.cpp 4.36 KiB
    /* ansiterm.cpp */
    
    /* Synchronet ANSI terminal functions */
    
    /* $Id$ */
    
    /****************************************************************************
     * @format.tab-size 4		(Plain Text/Source Code File Header)			*
     * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
     *																			*
     * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html		*
     *																			*
     * This program is free software; you can redistribute it and/or			*
     * modify it under the terms of the GNU General Public License				*
     * as published by the Free Software Foundation; either version 2			*
     * of the License, or (at your option) any later version.					*
     * See the GNU General Public License for more details: gpl.txt or			*
     * http://www.fsf.org/copyleft/gpl.html										*
     *																			*
     * Anonymous FTP access to the most recent released source is available at	*
     * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
     *																			*
     * Anonymous CVS access to the development source and modification history	*
     * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
     * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
     *     (just hit return, no password is necessary)							*
     * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
     *																			*
     * For Synchronet coding style and modification guidelines, see				*
     * http://www.synchro.net/source.html										*
     *																			*
     * You are encouraged to submit any modifications (preferably in Unix diff	*
     * format) via e-mail to mods@synchro.net									*
     *																			*
     * Note: If this box doesn't appear square, then you need to fix your tabs.	*
     ****************************************************************************/
    
    #include "sbbs.h"
    
    #define TIMEOUT_ANSI_GETXY	5	// Seconds
    
    /****************************************************************************/
    /* Returns the ANSI code to obtain the value of atr. Mixed attributes		*/
    /* high intensity colors, or background/forground cobinations don't work.   */
    /* A call to attr is more appropriate, being it is intelligent				*/
    /****************************************************************************/
    char *sbbs_t::ansi(int atr)
    {
    
    	switch(atr) {
    
    		/* Special case */
    		case ANSI_NORMAL:
    			return("\x1b[0m");
    		case BLINK:
    			return("\x1b[5m");
    
    		/* Foreground */
    		case HIGH:
    			return("\x1b[1m");
    		case BLACK:
    			return("\x1b[30m");
    		case RED:
    			return("\x1b[31m");
    		case GREEN:
    			return("\x1b[32m");
    		case BROWN:
    			return("\x1b[33m");
    		case BLUE:
    			return("\x1b[34m");
    		case MAGENTA:
    			return("\x1b[35m");
    		case CYAN:
    			return("\x1b[36m");
    		case LIGHTGRAY:
    			return("\x1b[37m");
    
    		/* Background */
    		case BG_BLACK:
    			return("\x1b[40m");
    		case BG_RED:
    			return("\x1b[41m");
    		case BG_GREEN:
    			return("\x1b[42m");
    		case BG_BROWN:
    			return("\x1b[43m");
    		case BG_BLUE:
    			return("\x1b[44m");
    		case BG_MAGENTA:
    			return("\x1b[45m");
    		case BG_CYAN:
    			return("\x1b[46m");
    		case BG_LIGHTGRAY:
    			return("\x1b[47m"); 
    	}
    
    	return("-Invalid use of ansi()-");
    }
    
    void sbbs_t::ansi_getlines()
    {
    	if(useron.misc&ANSI && !useron.rows         /* Auto-detect rows */
    		&& online==ON_REMOTE) {                 /* Remote */
    		SYNC;
    		putcom("\x1b[s\x1b[99B\x1b[6n\x1b[u");
    		while(online && !rioctl(RXBC) /* && !lkbrd(1) */)
    			checkline();
    		inkey(0); }
    }
    
    
    void sbbs_t::ansi_getxy(int* x, int* y)
    {
    	int 	rsp=0, ch;
    
        *x=0;
        *y=0;
    
    	rputs("\x1b[6n");	/* Request cusor position */
    
        time_t start=time(NULL);
        sys_status&=~SS_ABORT;
        while(online && !(sys_status&SS_ABORT)) {
    		if((ch=incom())!=NOINP) {
    			if(ch==ESC && rsp==0) {
                	rsp++;
    				start=time(NULL);
    			}
                else if(ch=='[' && rsp==1) {
                	rsp++;
    				start=time(NULL);
    			}
                else if(isdigit(ch) && rsp==2) {
                   	(*y)*=10;
                    (*y)+=(ch&0xf);
    				start=time(NULL);
                }
                else if(ch==';' && rsp>=2) {
                	rsp++;
    				start=time(NULL);
    			}
                else if(isdigit(ch) && rsp==3) {
                	(*x)*=10;
                    (*x)+=(ch&0xf);
    				start=time(NULL);
                }
                else if(ch=='R' && rsp)
                	break;
    			else
    				ungetkey(ch);
            }
        	if(time(NULL)-start>TIMEOUT_ANSI_GETXY) {
            	lprintf("!Node %d: TIMEOUT in ansi_getxy", cfg.node_num);
                break;
            }
        }
    }