/* ---------------------------------------------------------- */ /* | Nombre: stermp.c ( Simple Terminal Play) | */ /* | Autor: Gaspar Fernández (blakeyes@totaki.com) | */ /* | Fecha: 05 Enero 2009 | */ /* | Web: http://www.totaki.com/poesiabinaria/ | */ /* ---------------------------------------------------------- */ /* | Descripción: | */ /* | Manejo de colores y posicionamiento de texto en un | */ /* | terminal para nostálgicos de conio.h | */ /* ---------------------------------------------------------- */ /* Este código se distribuye libremente, tal cual, sin garantías. */ /* Pero si utilizas este código, y lo distribuyes, me gustaría que */ /* citaras la fuente, y ya de paso, un enlace al blog no vendría mal :) */ /* Changelog: */ /* 20100629: Varias actualizaciones: */ /* - Creación de la función error() */ /* - Creación de la función term_init() que inicializa las variables globales */ /* - Creación del reemplazo de getch() */ /* - Creación de term_info() */ /* - Creación de save_term_info() */ /* - Creación de restore_term() */ /* - Creación de kbhit(), kbhit2(), __kbhit() y kbhit_pre() */ /* - Creación de macros para agilizar kbhit() */ /* - kbhit_usleep para no congestionar la CPU */ /* - termnoecho() es más corta */ /* - restore_terminal() ahora restaura flags de stdin */ #include #include #include #include #include "stermp.h" #include #include #define KBHIT_USLEEP() { if (kbh_usleep) usleep(kbh_usleep); } #define KBHIT_PRE() { termnoecho(1); fcntl(STDIN_FILENO, F_SETFL, fdflags | O_NONBLOCK); /* Activamos el flag NON_BLOCK para que no se pare la ejecución */ KBHIT_USLEEP(); } /* Equivalencias de colores */ static const char ansicolors[16] = {30, 34, 32, 36, 31, 35, 33, 37, 0, 34, 32, 36, 31, 35, 33, 37}; struct termios orig_tty; /* Atributos de terminal iniciales */ struct termios save_tty; /* Copia de seguridad de atributos de terminal */ int orig_fdf; /* Valor de las banderas inicial */ int fdflags; /* Valor de las banderas */ int kbh_usleep=100000; /* Para no congestionar la CPU con muchos kbhits seguidos, hacemos un usleep tras cada uno */ int __init=0; /* ¿ Se ha inicializado ? */ void clrscr() /* Borrar la pantalla */ { printf("\033[2J"); // Borra pantalla printf("\033[1;1H"); // Posicionamos el cursor en la fila 1 columna 1 } void gotoxy(int x, int y) { printf("\033[%d;%dH", y, x); /* Posicionamos el cursor en X, Y */ } void textcolor(int color) { int atrval=0; if (color & UNDERLINE) /* Si el flag subrayado está activo... */ atrval=UNDERLINE_ATTR; else if (color & BLINK) /* Si el flag intermitente está actvo */ atrval=BLINK_ATTR; else if (color>=BRILLO_MIN) /* Si el color es brillante */ atrval=BRILLO_ATTR; color=ansicolors[color & 15]; /* Eliminamos los atributos */ printf("\033[%d;%dm", atrval, color); } void textbackground(int color) { if (color