xref: /kernel/linux/linux-6.6/tools/perf/ui/tui/helpline.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <stdio.h>
362306a36Sopenharmony_ci#include <stdlib.h>
462306a36Sopenharmony_ci#include <string.h>
562306a36Sopenharmony_ci#include <linux/kernel.h>
662306a36Sopenharmony_ci#include <linux/string.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "../helpline.h"
962306a36Sopenharmony_ci#include "../ui.h"
1062306a36Sopenharmony_ci#include "../libslang.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cichar ui_helpline__last_msg[1024];
1362306a36Sopenharmony_cibool tui_helpline__set;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic void tui_helpline__pop(void)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic void tui_helpline__push(const char *msg)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	const size_t sz = sizeof(ui_helpline__current);
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
2462306a36Sopenharmony_ci	SLsmg_set_color(0);
2562306a36Sopenharmony_ci	SLsmg_write_nstring(msg, SLtt_Screen_Cols);
2662306a36Sopenharmony_ci	SLsmg_refresh();
2762306a36Sopenharmony_ci	strlcpy(ui_helpline__current, msg, sz);
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic int tui_helpline__show(const char *format, va_list ap)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	int ret;
3362306a36Sopenharmony_ci	static int backlog;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	mutex_lock(&ui__lock);
3662306a36Sopenharmony_ci	ret = vscnprintf(ui_helpline__last_msg + backlog,
3762306a36Sopenharmony_ci			sizeof(ui_helpline__last_msg) - backlog, format, ap);
3862306a36Sopenharmony_ci	backlog += ret;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	tui_helpline__set = true;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if (ui_helpline__last_msg[backlog - 1] == '\n') {
4362306a36Sopenharmony_ci		ui_helpline__puts(ui_helpline__last_msg);
4462306a36Sopenharmony_ci		SLsmg_refresh();
4562306a36Sopenharmony_ci		backlog = 0;
4662306a36Sopenharmony_ci	}
4762306a36Sopenharmony_ci	mutex_unlock(&ui__lock);
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	return ret;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct ui_helpline tui_helpline_fns = {
5362306a36Sopenharmony_ci	.pop	= tui_helpline__pop,
5462306a36Sopenharmony_ci	.push	= tui_helpline__push,
5562306a36Sopenharmony_ci	.show	= tui_helpline__show,
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_civoid ui_helpline__init(void)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	helpline_fns = &tui_helpline_fns;
6162306a36Sopenharmony_ci	ui_helpline__puts(" ");
6262306a36Sopenharmony_ci}
63