X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=visor;a=blobdiff_plain;f=visor%2Fsrc%2Fmain_unix.c;fp=visor%2Fsrc%2Fmain_unix.c;h=37406a0d3206d802c1502e659220cde9be4a0eb2;hp=0000000000000000000000000000000000000000;hb=05b4673efbeb372387b0a9359af5046afb87c8cf;hpb=8cae8696beb7f1fa2dfc4e85be2fd5d9cf52a265 diff --git a/visor/src/main_unix.c b/visor/src/main_unix.c new file mode 100644 index 0000000..37406a0 --- /dev/null +++ b/visor/src/main_unix.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include + +static int init(void); +static void cleanup(void); +static void sighandler(int s); + +int term_width, term_height; +int ttyfd; +struct termios saved_term; + +int main(int argc, char **argv) +{ + int res; + char c; + + if(init() == -1) { + return 1; + } + + for(;;) { + if((res = read(ttyfd, &c, 1)) == 0 || (res < 0 && errno != EINTR)) { + break; + } + /* proc input */ + } + + cleanup(); + return 0; +} + +static int init(void) +{ + struct termios term; + struct winsize winsz; + + if((ttyfd = open("/dev/tty", O_RDWR)) == -1) { + perror("failed to open /dev/tty"); + return -1; + } + if(tcgetattr(ttyfd, &term) == -1) { + perror("failed to get terminal attr"); + return -1; + } + saved_term = term; + term.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); + term.c_oflag &= ~OPOST; + term.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); + term.c_cflag = (term.c_cflag & ~(CSIZE | PARENB)) | CS8; + + if(tcsetattr(ttyfd, TCSAFLUSH, &term) == -1) { + perror("failed to change terminal attributes"); + return -1; + } + + ioctl(1, TIOCGWINSZ, &winsz); + term_width = winsz.ws_col; + term_height = winsz.ws_row; + + signal(SIGWINCH, sighandler); + + write(ttyfd, "\033[2J", 4); + + return 0; +} + +static void cleanup(void) +{ + tcsetattr(ttyfd, TCSAFLUSH, &saved_term); + close(ttyfd); +} + +static void sighandler(int s) +{ + struct winsize winsz; + + signal(s, sighandler); + + switch(s) { + case SIGWINCH: + ioctl(1, TIOCGWINSZ, &winsz); + term_width = winsz.ws_col; + term_height = winsz.ws_row; + /* redraw */ + break; + + default: + break; + } +}