Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
e6e90468 NK |
2 | #include <stdio.h> |
3 | #include <stdlib.h> | |
4 | #include <string.h> | |
5 | #include <pthread.h> | |
6 | ||
7 | #include "../../util/debug.h" | |
8 | #include "../helpline.h" | |
9 | #include "../ui.h" | |
10 | #include "../libslang.h" | |
11 | ||
b56e5331 | 12 | char ui_helpline__last_msg[1024]; |
4397bd2f | 13 | bool tui_helpline__set; |
b56e5331 | 14 | |
e6e90468 NK |
15 | static void tui_helpline__pop(void) |
16 | { | |
17 | } | |
18 | ||
19 | static 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((char *)msg, SLtt_Screen_Cols); | |
26 | SLsmg_refresh(); | |
27 | strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0'; | |
28 | } | |
29 | ||
b56e5331 | 30 | static int tui_helpline__show(const char *format, va_list ap) |
e6e90468 NK |
31 | { |
32 | int ret; | |
33 | static int backlog; | |
34 | ||
35 | pthread_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 | ||
4397bd2f NK |
40 | tui_helpline__set = true; |
41 | ||
e6e90468 NK |
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 | pthread_mutex_unlock(&ui__lock); | |
48 | ||
49 | return ret; | |
50 | } | |
b56e5331 NK |
51 | |
52 | struct ui_helpline tui_helpline_fns = { | |
53 | .pop = tui_helpline__pop, | |
54 | .push = tui_helpline__push, | |
55 | .show = tui_helpline__show, | |
56 | }; | |
57 | ||
58 | void ui_helpline__init(void) | |
59 | { | |
60 | helpline_fns = &tui_helpline_fns; | |
61 | ui_helpline__puts(" "); | |
62 | } |