#include #include #include #include #include #include #include #include #include wchar_t *frame_buffer; wchar_t *barstring[8]; wchar_t *spacestring; int buf_length; char *ttyframe_buffer; char *ttybarstring[8]; char *ttyspacestring; int ttybuf_length; int setecho(int fd, int onoff) { struct termios t; if (tcgetattr(fd, &t) == -1) return -1; if (onoff == 0) t.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL); else t.c_lflag |= (ECHO | ECHOE | ECHOK | ECHONL); if (tcsetattr(fd, TCSANOW, &t) == -1) return -1; return 0; } int init_terminal_noncurses(int tty, int col, int bgcol, int width, int lines, int bar_width) { if (tty) { ttybuf_length = sizeof(char) * width * lines * 10; ttyframe_buffer = (char *)malloc(ttybuf_length); ttyspacestring = (char *)malloc(sizeof(char) * bar_width); // clearing barstrings for (int n = 0; n < 8; n++) { ttybarstring[n] = (char *)malloc(sizeof(char) * bar_width); ttybarstring[n][0] = '\0'; } ttyspacestring[0] = '\0'; ttyframe_buffer[0] = '\0'; // creating barstrings for drawing for (int n = 0; n < bar_width; n++) { strcat(ttybarstring[0], "8"); strcat(ttybarstring[1], "1"); strcat(ttybarstring[2], "2"); strcat(ttybarstring[3], "3"); strcat(ttybarstring[4], "4"); strcat(ttybarstring[5], "5"); strcat(ttybarstring[6], "6"); strcat(ttybarstring[7], "7"); strcat(ttyspacestring, " "); } } else if (!tty) { buf_length = sizeof(wchar_t) * width * lines * 10; frame_buffer = (wchar_t *)malloc(buf_length); spacestring = (wchar_t *)malloc(sizeof(wchar_t) * bar_width); // clearing barstrings for (int n = 0; n < 8; n++) { barstring[n] = (wchar_t *)malloc(sizeof(wchar_t) * bar_width); barstring[n][0] = '\0'; } spacestring[0] = '\0'; frame_buffer[0] = '\0'; // creating barstrings for drawing for (int n = 0; n < bar_width; n++) { wcscat(barstring[0], L"\u2588"); wcscat(barstring[1], L"\u2581"); wcscat(barstring[2], L"\u2582"); wcscat(barstring[3], L"\u2583"); wcscat(barstring[4], L"\u2584"); wcscat(barstring[5], L"\u2585"); wcscat(barstring[6], L"\u2586"); wcscat(barstring[7], L"\u2587"); wcscat(spacestring, L" "); } } col += 30; system("setterm -cursor off"); system("setterm -blank 0"); // output: reset console printf("\033[0m\n"); system("clear"); if (col) printf("\033[%dm", col); // setting color // printf("\033[1m"); // setting "bright" color mode, looks cooler... I think if (bgcol != 0) { bgcol += 40; printf("\033[%dm", bgcol); for (n = (h); n >= 0; n--) { for (i = 0; i < w; i++) { printf(" "); // setting backround color } printf("\n"); } printf("\033[%dA", h); // moving cursor back up } setecho(STDIN_FILENO, 0); return 0; } void get_terminal_dim_noncurses(int *w, int *h) { struct winsize dim; ioctl(STDOUT_FILENO, TIOCGWINSZ, &dim); *h = (int)dim.ws_row; *w = (int)dim.ws_col; system("clear"); // clearing in case of resieze } int draw_terminal_noncurses(int tty, int h, int w, int bars, int bar_width, int bs, int rest, int f[200], int flastd[200]) { int current_char, last_char, n, o, same_line, new_line, cx; struct winsize dim; same_line = 0; new_line = 0; cx = 0; if (tty) { ttyline_buffer[0] = '\0'; for (n = h - 1; n >= 0; n--) { int same_bar = 0; int center_adjusted = 0; for (o = 0; o < bars; o++) { current_char = f[o] - n * 8; last_char = flastd[o] - n * 8; // same as last frame if ((current_char < 1 && last_char < 1) || (current_char > 7 && last_char > 7) || (current_char == last_char)) { same_bar++; } else { if (same_line > 0) { cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "\033[%dB", same_line); // move down new_line += same_line; same_line = 0; } if (same_bar > 0) { cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "\033[%dC", (bar_width + bs) * same_bar); // move forward same_bar = 0; } if (!center_adjusted) { cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "\033[%dC", rest); center_adjusted = 1; } if (current_char < 1) cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "%s", ttyspacestring); else if (current_char > 7) cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "%s", ttybarstring[0]); else cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "%s", ttybarstring[current_char]); cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "\033[%dC", bs); } } if (same_bar != bars) { if (n != 0) { cx += snprintf(ttyline_buffer + cx, ttybuf_length - cx, "\n"); new_line++; } } else { same_line++; } } if (same_line != h) { printf("%s\r\033[%dA", ttyline_buffer, new_line); //\r\033[%dA", ttyline_buffer, h - same_line); fflush(stdout); } } else if (!tty) { // output: check if terminal has been resized ioctl(STDOUT_FILENO, TIOCGWINSZ, &dim); if ((int)dim.ws_row != h || (int)dim.ws_col != w) { free(line_buffer); free(wspacestring); for (int i = 0; i < 8; i++) free(barstring[i]); return -1; } line_buffer[0] = '\0'; for (n = h - 1; n >= 0; n--) { int same_bar = 0; int center_adjusted = 0; for (o = 0; o < bars; o++) { current_char = f[o] - n * 8; last_char = flastd[o] - n * 8; // same as last frame if ((current_char < 1 && last_char < 1) || (current_char > 7 && last_char > 7) || (current_char == last_char)) { same_bar++; } else { if (same_line > 0) { cx += swprintf(line_buffer + cx, buf_length - cx, L"\033[%dB", same_line); // move down new_line += same_line; same_line = 0; } if (same_bar > 0) { cx += swprintf(line_buffer + cx, buf_length - cx, L"\033[%dC", (bar_width + bs) * same_bar); // move forward same_bar = 0; } if (!center_adjusted && rest) { cx += swprintf(line_buffer + cx, buf_length - cx, L"\033[%dC", rest); center_adjusted = 1; } if (current_char < 1) cx += swprintf(line_buffer + cx, buf_length - cx, wspacestring); else if (current_char > 7) cx += swprintf(line_buffer + cx, buf_length - cx, barstring[0]); else cx += swprintf(line_buffer + cx, buf_length - cx, barstring[current_char]); cx += swprintf(line_buffer + cx, buf_length - cx, L"\033[%dC", bs); } } if (same_bar != bars) { if (n != 0) { cx += swprintf(line_buffer + cx, buf_length - cx, L"\n"); new_line++; } } else { same_line++; } } if (same_line != h) { printf("%ls\r\033[%dA", line_buffer, new_line); //\r\033[%dA", line_buffer, h - same_line); fflush(stdout); } } return 0; } // general: cleanup void cleanup_terminal_noncurses(void) { free(frame_buffer); free(ttyframe_buffer); free(spacestring); free(ttyspacestring); for (int i = 0; i < 8; i++) { free(barstring[i]); free(ttybarstring[i]); } setecho(STDIN_FILENO, 1); printf("\033[0m\n"); system("setfont >/dev/null 2>&1"); system("setfont /usr/share/consolefonts/Lat2-Fixed16.psf.gz >/dev/null 2>&1"); system("setterm -cursor on"); system("setterm -blank 10"); system("clear"); }