#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include "../../util/debug.h" #include "../helpline.h" #include "../ui.h" #include "../libslang.h" char ui_helpline__last_msg[1024]; bool tui_helpline__set; static void tui_helpline__pop(void) { } static void tui_helpline__push(const char *msg) { const size_t sz = sizeof(ui_helpline__current); SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); SLsmg_set_color(0); SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols); SLsmg_refresh(); strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0'; } static int tui_helpline__show(const char *format, va_list ap) { int ret; static int backlog; pthread_mutex_lock(&ui__lock); ret = vscnprintf(ui_helpline__last_msg + backlog, sizeof(ui_helpline__last_msg) - backlog, format, ap); backlog += ret; tui_helpline__set = true; if (ui_helpline__last_msg[backlog - 1] == '\n') { ui_helpline__puts(ui_helpline__last_msg); SLsmg_refresh(); backlog = 0; } pthread_mutex_unlock(&ui__lock); return ret; } struct ui_helpline tui_helpline_fns = { .pop = tui_helpline__pop, .push = tui_helpline__push, .show = tui_helpline__show, }; void ui_helpline__init(void) { helpline_fns = &tui_helpline_fns; ui_helpline__puts(" "); }