1// SPDX-License-Identifier: GPL-2.0 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5#include <linux/kernel.h> 6#include <linux/string.h> 7 8#include "../helpline.h" 9#include "../ui.h" 10#include "../libslang.h" 11 12char ui_helpline__last_msg[1024]; 13bool tui_helpline__set; 14 15static void tui_helpline__pop(void) 16{ 17} 18 19static void tui_helpline__push(const char *msg) 20{ 21 const size_t sz = sizeof(ui_helpline__current); 22 23 SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); 24 SLsmg_set_color(0); 25 SLsmg_write_nstring(msg, SLtt_Screen_Cols); 26 SLsmg_refresh(); 27 strlcpy(ui_helpline__current, msg, sz); 28} 29 30static int tui_helpline__show(const char *format, va_list ap) 31{ 32 int ret; 33 static int backlog; 34 35 mutex_lock(&ui__lock); 36 ret = vscnprintf(ui_helpline__last_msg + backlog, 37 sizeof(ui_helpline__last_msg) - backlog, format, ap); 38 backlog += ret; 39 40 tui_helpline__set = true; 41 42 if (ui_helpline__last_msg[backlog - 1] == '\n') { 43 ui_helpline__puts(ui_helpline__last_msg); 44 SLsmg_refresh(); 45 backlog = 0; 46 } 47 mutex_unlock(&ui__lock); 48 49 return ret; 50} 51 52struct ui_helpline tui_helpline_fns = { 53 .pop = tui_helpline__pop, 54 .push = tui_helpline__push, 55 .show = tui_helpline__show, 56}; 57 58void ui_helpline__init(void) 59{ 60 helpline_fns = &tui_helpline_fns; 61 ui_helpline__puts(" "); 62} 63