diff options
Diffstat (limited to 'tools/perf/ui/browsers/header.c')
| -rw-r--r-- | tools/perf/ui/browsers/header.c | 127 | 
1 files changed, 127 insertions, 0 deletions
diff --git a/tools/perf/ui/browsers/header.c b/tools/perf/ui/browsers/header.c new file mode 100644 index 00000000000..89c16b98861 --- /dev/null +++ b/tools/perf/ui/browsers/header.c @@ -0,0 +1,127 @@ +#include "util/cache.h" +#include "util/debug.h" +#include "ui/browser.h" +#include "ui/ui.h" +#include "ui/util.h" +#include "ui/libslang.h" +#include "util/header.h" +#include "util/session.h" + +static void ui_browser__argv_write(struct ui_browser *browser, +				   void *entry, int row) +{ +	char **arg = entry; +	char *str = *arg; +	char empty[] = " "; +	bool current_entry = ui_browser__is_current_entry(browser, row); +	unsigned long offset = (unsigned long)browser->priv; + +	if (offset >= strlen(str)) +		str = empty; +	else +		str = str + offset; + +	ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED : +						       HE_COLORSET_NORMAL); + +	slsmg_write_nstring(str, browser->width); +} + +static int list_menu__run(struct ui_browser *menu) +{ +	int key; +	unsigned long offset; +	const char help[] = +	"h/?/F1        Show this window\n" +	"UP/DOWN/PGUP\n" +	"PGDN/SPACE\n" +	"LEFT/RIGHT    Navigate\n" +	"q/ESC/CTRL+C  Exit browser"; + +	if (ui_browser__show(menu, "Header information", "Press 'q' to exit") < 0) +		return -1; + +	while (1) { +		key = ui_browser__run(menu, 0); + +		switch (key) { +		case K_RIGHT: +			offset = (unsigned long)menu->priv; +			offset += 10; +			menu->priv = (void *)offset; +			continue; +		case K_LEFT: +			offset = (unsigned long)menu->priv; +			if (offset >= 10) +				offset -= 10; +			menu->priv = (void *)offset; +			continue; +		case K_F1: +		case 'h': +		case '?': +			ui_browser__help_window(menu, help); +			continue; +		case K_ESC: +		case 'q': +		case CTRL('c'): +			key = -1; +			break; +		default: +			continue; +		} + +		break; +	} + +	ui_browser__hide(menu); +	return key; +} + +static int ui__list_menu(int argc, char * const argv[]) +{ +	struct ui_browser menu = { +		.entries    = (void *)argv, +		.refresh    = ui_browser__argv_refresh, +		.seek	    = ui_browser__argv_seek, +		.write	    = ui_browser__argv_write, +		.nr_entries = argc, +	}; + +	return list_menu__run(&menu); +} + +int tui__header_window(struct perf_session_env *env) +{ +	int i, argc = 0; +	char **argv; +	struct perf_session *session; +	char *ptr, *pos; +	size_t size; +	FILE *fp = open_memstream(&ptr, &size); + +	session = container_of(env, struct perf_session, header.env); +	perf_header__fprintf_info(session, fp, true); +	fclose(fp); + +	for (pos = ptr, argc = 0; (pos = strchr(pos, '\n')) != NULL; pos++) +		argc++; + +	argv = calloc(argc + 1, sizeof(*argv)); +	if (argv == NULL) +		goto out; + +	argv[0] = pos = ptr; +	for (i = 1; (pos = strchr(pos, '\n')) != NULL; i++) { +		*pos++ = '\0'; +		argv[i] = pos; +	} + +	BUG_ON(i != argc + 1); + +	ui__list_menu(argc, argv); + +out: +	free(argv); +	free(ptr); +	return 0; +}  | 
