987
int hists__tui_browse_tree(struct rb_root *self, const char *help)
989
struct rb_node *first = rb_first(self), *nd = first, *next;
993
struct hists *hists = rb_entry(nd, struct hists, rb_node);
994
const char *ev_name = __event_name(hists->type, hists->config);
996
key = hists__browse(hists, help, ev_name);
1001
struct perf_evsel_menu {
1002
struct ui_browser b;
1003
struct perf_evsel *selection;
1006
static void perf_evsel_menu__write(struct ui_browser *browser,
1007
void *entry, int row)
1009
struct perf_evsel_menu *menu = container_of(browser,
1010
struct perf_evsel_menu, b);
1011
struct perf_evsel *evsel = list_entry(entry, struct perf_evsel, node);
1012
bool current_entry = ui_browser__is_current_entry(browser, row);
1013
unsigned long nr_events = evsel->hists.stats.nr_events[PERF_RECORD_SAMPLE];
1014
const char *ev_name = event_name(evsel);
1017
ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED :
1018
HE_COLORSET_NORMAL);
1020
nr_events = convert_unit(nr_events, &unit);
1021
snprintf(bf, sizeof(bf), "%lu%c%s%s", nr_events,
1022
unit, unit == ' ' ? "" : " ", ev_name);
1023
slsmg_write_nstring(bf, browser->width);
1026
menu->selection = evsel;
1029
static int perf_evsel_menu__run(struct perf_evsel_menu *menu, const char *help)
1031
int exit_keys[] = { NEWT_KEY_ENTER, NEWT_KEY_RIGHT, 0, };
1032
struct perf_evlist *evlist = menu->b.priv;
1033
struct perf_evsel *pos;
1034
const char *ev_name, *title = "Available samples";
1037
if (ui_browser__show(&menu->b, title,
1038
"ESC: exit, ENTER|->: Browse histograms") < 0)
1041
ui_browser__add_exit_keys(&menu->b, exit_keys);
1044
key = ui_browser__run(&menu->b);
1047
case NEWT_KEY_RIGHT:
1048
case NEWT_KEY_ENTER:
1049
if (!menu->selection)
1051
pos = menu->selection;
1053
ev_name = event_name(pos);
1054
key = perf_evsel__hists_browse(pos, help, ev_name, true);
1055
ui_browser__show_title(&menu->b, title);
1059
case NEWT_KEY_ESCAPE:
1060
if (!ui__dialog_yesno("Do you really want to exit?"))
998
1068
case NEWT_KEY_TAB:
1069
if (pos->node.next == &evlist->entries)
1070
pos = list_entry(evlist->entries.next, struct perf_evsel, node);
1072
pos = list_entry(pos->node.next, struct perf_evsel, node);
1003
1074
case NEWT_KEY_UNTAB:
1075
if (pos->node.prev == &evlist->entries)
1076
pos = list_entry(evlist->entries.prev, struct perf_evsel, node);
1078
pos = list_entry(pos->node.prev, struct perf_evsel, node);
1089
ui_browser__hide(&menu->b);
1093
static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist,
1096
struct perf_evsel *pos;
1097
struct perf_evsel_menu menu = {
1099
.entries = &evlist->entries,
1100
.refresh = ui_browser__list_head_refresh,
1101
.seek = ui_browser__list_head_seek,
1102
.write = perf_evsel_menu__write,
1103
.nr_entries = evlist->nr_entries,
1108
ui_helpline__push("Press ESC to exit");
1110
list_for_each_entry(pos, &evlist->entries, node) {
1111
const char *ev_name = event_name(pos);
1112
size_t line_len = strlen(ev_name) + 7;
1114
if (menu.b.width < line_len)
1115
menu.b.width = line_len;
1117
* Cache the evsel name, tracepoints have a _high_ cost per
1118
* event_name() call.
1120
if (pos->name == NULL)
1121
pos->name = strdup(ev_name);
1124
return perf_evsel_menu__run(&menu, help);
1127
int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help)
1130
if (evlist->nr_entries == 1) {
1131
struct perf_evsel *first = list_entry(evlist->entries.next,
1132
struct perf_evsel, node);
1133
const char *ev_name = event_name(first);
1134
return perf_evsel__hists_browse(first, help, ev_name, false);
1137
return __perf_evlist__tui_browse_hists(evlist, help);