enum { PAIR_NORMAL = 0, }; char *g_line_buff; void tui_line_buff_free(void) { if (g_line_buff) { free(g_line_buff); } g_line_buff = NULL; } void tui_line_buff_resize(void) { tui_line_buff_free(); g_line_buff = calloc(COLS + 1, sizeof(char)); } void tui_line(bool clear, int line, int color, int attr, const char *format, ...) { assert(line >= 0); assert(format); if (line >= LINES) { return; } if (clear) { move(line, 0); clrtoeol(); } va_list args; attron(COLOR_PAIR(color) | attr); va_start(args, format); vsnprintf(g_line_buff, COLS, format, args); mvprintw(line, 1, "%s", g_line_buff); va_end(args); attroff(COLOR_PAIR(color) | attr); } void tui_clear_line(int l) { tui_line(true, l, PAIR_NORMAL, A_NORMAL, ""); } void tui_field(int line, int col, int color, int attr, const char *format, ...) { assert(line >= 0); assert(col >= 0); assert(format); if (line >= LINES || col >= COLS) { return; } va_list args; attron(COLOR_PAIR(color) | attr); va_start(args, format); vsnprintf(g_line_buff, COLS - col, format, args); mvprintw(line, col, "%s", g_line_buff); va_end(args); attroff(COLOR_PAIR(color) | attr); } void tui_str_field(int l, const char *label, const char *value) { assert(label); assert(value); tui_line(false, l, PAIR_NORMAL, A_NORMAL, "%s : %18s", label, value); } void tui_ulx_field(int l, const char *label, uint64_t value) { assert(label); tui_line(false, l, PAIR_NORMAL, A_NORMAL, "%-4s : %#18lx", label, value); } void tui_float_field(int l, const char *label, float value) { assert(label); tui_line(false, l, PAIR_NORMAL, A_NORMAL, "%-4s : %18.1f", label, value); }