#include "term.h" #include char __term_input_buffer__[8] = {' ',' ',' ',' ',' ',' ',' ',' '}; void set_char_push_back(char t) { char tmp1; char hold1; char hold2; hold1 = __term_input_buffer__[0]; for(int i = 0; i < 8 - 1; i++) { hold2 = __term_input_buffer__[i+1]; __term_input_buffer__[i+1] = hold1; hold1 = hold2; } __term_input_buffer__[0] = t; } // if windows is defined. #if defined(_WIN64) || defined(_WIN32) #include #include struct tart_vec2 term_current_size() { struct tart_vec2 ret; CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); unsigned int rows = (csbi.srWindow.Right - csbi.srWindow.Left + 1); unsigned int cols = (csbi.srWindow.Bottom - csbi.srWindow.Top + 1); unsigned short max_short = 0XFFFF; if(rows < max_short && cols < max_short) { ret = (struct tart_vec2){(unsigned short) rows ,(unsigned short) cols}; } return ret; } HANDLE __term_input_thread; int __term_input_thread_stop; DWORD WINAPI input_threaded_func(void* data) { while(__term_input_thread_stop == 1) { if(_kbhit()) set_char_push_back(_getch()); } return 0; } int term_threaded_input_init() { __term_input_thread_stop = 1; __term_input_thread = CreateThread(NULL,0,input_threaded_func,NULL, 0, NULL); return 0; } int term_threaded_input_stop() { __term_input_thread_stop = 0; WaitForSingleObject(__term_input_thread, INFINITE); return 0; } #else #include #include #include #include #include #include struct tart_vec2 term_current_size() { struct tart_vec2 ret; struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); unsigned int rows = w.ws_col; unsigned int cols = w.ws_row; unsigned short max_short = 0XFFFF; if(rows < max_short && cols < max_short) { ret = (struct tart_vec2){(unsigned short) rows ,(unsigned short) cols}; } return ret; } struct termios old, current; void init_termios(int args) { tcgetattr(0, &old); current = old; current.c_lflag &= ~ICANON; if(args == 0x01) { current.c_lflag |= ECHO; } else { current.c_lflag &= ~ECHO; } tcsetattr(0,TCSAFLUSH, ¤t); } void reset_termios(void) { tcsetattr(0, TCSAFLUSH, &old); } char term_getch() { char tmp; init_termios(0x00); tmp = getchar(); reset_termios(); return tmp; } char term_getche() { char tmp; init_termios(0x01); tmp = getchar(); reset_termios(); return tmp; } pthread_t input_thread; void* input_threaded_func(void* vargp) { int myid = getpid(); while(1) { set_char_push_back(term_getch()); } return NULL; } int term_threaded_input_stop() { pthread_cancel(input_thread); return 1; } int term_threaded_input_init() { pthread_create(&input_thread, NULL, input_threaded_func, NULL); return 1; } #endif char term_tinputi(int idx){ if(idx < 8) { return __term_input_buffer__[idx]; } return 0x0; } char* term_tinputb() { return __term_input_buffer__; } char term_tinput() { return __term_input_buffer__[0]; } void term_disable_cursor() { printf("\033[?25l", stdout); } void term_enable_cursor() { printf("\033[?25h", stdout); }