diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2013-12-26 00:37:59 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-12-26 09:22:02 -0500 |
commit | 6dd601354f14b5cd7a0a4103811e52ccec22ac53 (patch) | |
tree | f12c46aa00fa66a3c16164348bc3704315e2c73c /tools | |
parent | e8e684a58b9bddde3fdb1a65cd26eb7a3e1e746e (diff) |
perf ui/tui: Implement header window
Implement a simple, full-screen header window which shows session header
(metadata) information. Press 'i' key to display the header window.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1388036284-32342-4-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/Makefile.perf | 1 | ||||
-rw-r--r-- | tools/perf/ui/browser.h | 2 | ||||
-rw-r--r-- | tools/perf/ui/browsers/header.c | 127 | ||||
-rw-r--r-- | tools/perf/ui/browsers/hists.c | 6 |
4 files changed, 136 insertions, 0 deletions
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf index 97a2145e4cc6..3638b0bd20dc 100644 --- a/tools/perf/Makefile.perf +++ b/tools/perf/Makefile.perf | |||
@@ -489,6 +489,7 @@ ifndef NO_SLANG | |||
489 | LIB_OBJS += $(OUTPUT)ui/browsers/hists.o | 489 | LIB_OBJS += $(OUTPUT)ui/browsers/hists.o |
490 | LIB_OBJS += $(OUTPUT)ui/browsers/map.o | 490 | LIB_OBJS += $(OUTPUT)ui/browsers/map.o |
491 | LIB_OBJS += $(OUTPUT)ui/browsers/scripts.o | 491 | LIB_OBJS += $(OUTPUT)ui/browsers/scripts.o |
492 | LIB_OBJS += $(OUTPUT)ui/browsers/header.o | ||
492 | LIB_OBJS += $(OUTPUT)ui/tui/setup.o | 493 | LIB_OBJS += $(OUTPUT)ui/tui/setup.o |
493 | LIB_OBJS += $(OUTPUT)ui/tui/util.o | 494 | LIB_OBJS += $(OUTPUT)ui/tui/util.o |
494 | LIB_OBJS += $(OUTPUT)ui/tui/helpline.o | 495 | LIB_OBJS += $(OUTPUT)ui/tui/helpline.o |
diff --git a/tools/perf/ui/browser.h b/tools/perf/ui/browser.h index 7d45d2f53601..118cca29dd26 100644 --- a/tools/perf/ui/browser.h +++ b/tools/perf/ui/browser.h | |||
@@ -59,6 +59,8 @@ int ui_browser__help_window(struct ui_browser *browser, const char *text); | |||
59 | bool ui_browser__dialog_yesno(struct ui_browser *browser, const char *text); | 59 | bool ui_browser__dialog_yesno(struct ui_browser *browser, const char *text); |
60 | int ui_browser__input_window(const char *title, const char *text, char *input, | 60 | int ui_browser__input_window(const char *title, const char *text, char *input, |
61 | const char *exit_msg, int delay_sec); | 61 | const char *exit_msg, int delay_sec); |
62 | struct perf_session_env; | ||
63 | int tui__header_window(struct perf_session_env *env); | ||
62 | 64 | ||
63 | void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int whence); | 65 | void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int whence); |
64 | unsigned int ui_browser__argv_refresh(struct ui_browser *browser); | 66 | unsigned int ui_browser__argv_refresh(struct ui_browser *browser); |
diff --git a/tools/perf/ui/browsers/header.c b/tools/perf/ui/browsers/header.c new file mode 100644 index 000000000000..89c16b988618 --- /dev/null +++ b/tools/perf/ui/browsers/header.c | |||
@@ -0,0 +1,127 @@ | |||
1 | #include "util/cache.h" | ||
2 | #include "util/debug.h" | ||
3 | #include "ui/browser.h" | ||
4 | #include "ui/ui.h" | ||
5 | #include "ui/util.h" | ||
6 | #include "ui/libslang.h" | ||
7 | #include "util/header.h" | ||
8 | #include "util/session.h" | ||
9 | |||
10 | static void ui_browser__argv_write(struct ui_browser *browser, | ||
11 | void *entry, int row) | ||
12 | { | ||
13 | char **arg = entry; | ||
14 | char *str = *arg; | ||
15 | char empty[] = " "; | ||
16 | bool current_entry = ui_browser__is_current_entry(browser, row); | ||
17 | unsigned long offset = (unsigned long)browser->priv; | ||
18 | |||
19 | if (offset >= strlen(str)) | ||
20 | str = empty; | ||
21 | else | ||
22 | str = str + offset; | ||
23 | |||
24 | ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED : | ||
25 | HE_COLORSET_NORMAL); | ||
26 | |||
27 | slsmg_write_nstring(str, browser->width); | ||
28 | } | ||
29 | |||
30 | static int list_menu__run(struct ui_browser *menu) | ||
31 | { | ||
32 | int key; | ||
33 | unsigned long offset; | ||
34 | const char help[] = | ||
35 | "h/?/F1 Show this window\n" | ||
36 | "UP/DOWN/PGUP\n" | ||
37 | "PGDN/SPACE\n" | ||
38 | "LEFT/RIGHT Navigate\n" | ||
39 | "q/ESC/CTRL+C Exit browser"; | ||
40 | |||
41 | if (ui_browser__show(menu, "Header information", "Press 'q' to exit") < 0) | ||
42 | return -1; | ||
43 | |||
44 | while (1) { | ||
45 | key = ui_browser__run(menu, 0); | ||
46 | |||
47 | switch (key) { | ||
48 | case K_RIGHT: | ||
49 | offset = (unsigned long)menu->priv; | ||
50 | offset += 10; | ||
51 | menu->priv = (void *)offset; | ||
52 | continue; | ||
53 | case K_LEFT: | ||
54 | offset = (unsigned long)menu->priv; | ||
55 | if (offset >= 10) | ||
56 | offset -= 10; | ||
57 | menu->priv = (void *)offset; | ||
58 | continue; | ||
59 | case K_F1: | ||
60 | case 'h': | ||
61 | case '?': | ||
62 | ui_browser__help_window(menu, help); | ||
63 | continue; | ||
64 | case K_ESC: | ||
65 | case 'q': | ||
66 | case CTRL('c'): | ||
67 | key = -1; | ||
68 | break; | ||
69 | default: | ||
70 | continue; | ||
71 | } | ||
72 | |||
73 | break; | ||
74 | } | ||
75 | |||
76 | ui_browser__hide(menu); | ||
77 | return key; | ||
78 | } | ||
79 | |||
80 | static int ui__list_menu(int argc, char * const argv[]) | ||
81 | { | ||
82 | struct ui_browser menu = { | ||
83 | .entries = (void *)argv, | ||
84 | .refresh = ui_browser__argv_refresh, | ||
85 | .seek = ui_browser__argv_seek, | ||
86 | .write = ui_browser__argv_write, | ||
87 | .nr_entries = argc, | ||
88 | }; | ||
89 | |||
90 | return list_menu__run(&menu); | ||
91 | } | ||
92 | |||
93 | int tui__header_window(struct perf_session_env *env) | ||
94 | { | ||
95 | int i, argc = 0; | ||
96 | char **argv; | ||
97 | struct perf_session *session; | ||
98 | char *ptr, *pos; | ||
99 | size_t size; | ||
100 | FILE *fp = open_memstream(&ptr, &size); | ||
101 | |||
102 | session = container_of(env, struct perf_session, header.env); | ||
103 | perf_header__fprintf_info(session, fp, true); | ||
104 | fclose(fp); | ||
105 | |||
106 | for (pos = ptr, argc = 0; (pos = strchr(pos, '\n')) != NULL; pos++) | ||
107 | argc++; | ||
108 | |||
109 | argv = calloc(argc + 1, sizeof(*argv)); | ||
110 | if (argv == NULL) | ||
111 | goto out; | ||
112 | |||
113 | argv[0] = pos = ptr; | ||
114 | for (i = 1; (pos = strchr(pos, '\n')) != NULL; i++) { | ||
115 | *pos++ = '\0'; | ||
116 | argv[i] = pos; | ||
117 | } | ||
118 | |||
119 | BUG_ON(i != argc + 1); | ||
120 | |||
121 | ui__list_menu(argc, argv); | ||
122 | |||
123 | out: | ||
124 | free(argv); | ||
125 | free(ptr); | ||
126 | return 0; | ||
127 | } | ||
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index d43ec79ea4e3..0d9dd99507ee 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
@@ -1417,6 +1417,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, | |||
1417 | 1417 | ||
1418 | /* help messages are sorted by lexical order of the hotkey */ | 1418 | /* help messages are sorted by lexical order of the hotkey */ |
1419 | const char report_help[] = HIST_BROWSER_HELP_COMMON | 1419 | const char report_help[] = HIST_BROWSER_HELP_COMMON |
1420 | "i Show header information\n" | ||
1420 | "P Print histograms to perf.hist.N\n" | 1421 | "P Print histograms to perf.hist.N\n" |
1421 | "r Run available scripts\n" | 1422 | "r Run available scripts\n" |
1422 | "s Switch to another data file in PWD\n" | 1423 | "s Switch to another data file in PWD\n" |
@@ -1513,6 +1514,11 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, | |||
1513 | if (is_report_browser(hbt)) | 1514 | if (is_report_browser(hbt)) |
1514 | goto do_data_switch; | 1515 | goto do_data_switch; |
1515 | continue; | 1516 | continue; |
1517 | case 'i': | ||
1518 | /* env->arch is NULL for live-mode (i.e. perf top) */ | ||
1519 | if (env->arch) | ||
1520 | tui__header_window(env); | ||
1521 | continue; | ||
1516 | case K_F1: | 1522 | case K_F1: |
1517 | case 'h': | 1523 | case 'h': |
1518 | case '?': | 1524 | case '?': |