Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / tools / perf / ui / browsers / header.c
1 #include "util/cache.h"
2 #include "util/debug.h"
3 #include "ui/browser.h"
4 #include "ui/keysyms.h"
5 #include "ui/ui.h"
6 #include "ui/util.h"
7 #include "ui/libslang.h"
8 #include "util/header.h"
9 #include "util/session.h"
10
11 static void ui_browser__argv_write(struct ui_browser *browser,
12                                    void *entry, int row)
13 {
14         char **arg = entry;
15         char *str = *arg;
16         char empty[] = " ";
17         bool current_entry = ui_browser__is_current_entry(browser, row);
18         unsigned long offset = (unsigned long)browser->priv;
19
20         if (offset >= strlen(str))
21                 str = empty;
22         else
23                 str = str + offset;
24
25         ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED :
26                                                        HE_COLORSET_NORMAL);
27
28         slsmg_write_nstring(str, browser->width);
29 }
30
31 static int list_menu__run(struct ui_browser *menu)
32 {
33         int key;
34         unsigned long offset;
35         const char help[] =
36         "h/?/F1        Show this window\n"
37         "UP/DOWN/PGUP\n"
38         "PGDN/SPACE\n"
39         "LEFT/RIGHT    Navigate\n"
40         "q/ESC/CTRL+C  Exit browser";
41
42         if (ui_browser__show(menu, "Header information", "Press 'q' to exit") < 0)
43                 return -1;
44
45         while (1) {
46                 key = ui_browser__run(menu, 0);
47
48                 switch (key) {
49                 case K_RIGHT:
50                         offset = (unsigned long)menu->priv;
51                         offset += 10;
52                         menu->priv = (void *)offset;
53                         continue;
54                 case K_LEFT:
55                         offset = (unsigned long)menu->priv;
56                         if (offset >= 10)
57                                 offset -= 10;
58                         menu->priv = (void *)offset;
59                         continue;
60                 case K_F1:
61                 case 'h':
62                 case '?':
63                         ui_browser__help_window(menu, help);
64                         continue;
65                 case K_ESC:
66                 case 'q':
67                 case CTRL('c'):
68                         key = -1;
69                         break;
70                 default:
71                         continue;
72                 }
73
74                 break;
75         }
76
77         ui_browser__hide(menu);
78         return key;
79 }
80
81 static int ui__list_menu(int argc, char * const argv[])
82 {
83         struct ui_browser menu = {
84                 .entries    = (void *)argv,
85                 .refresh    = ui_browser__argv_refresh,
86                 .seek       = ui_browser__argv_seek,
87                 .write      = ui_browser__argv_write,
88                 .nr_entries = argc,
89         };
90
91         return list_menu__run(&menu);
92 }
93
94 int tui__header_window(struct perf_session_env *env)
95 {
96         int i, argc = 0;
97         char **argv;
98         struct perf_session *session;
99         char *ptr, *pos;
100         size_t size;
101         FILE *fp = open_memstream(&ptr, &size);
102
103         session = container_of(env, struct perf_session, header.env);
104         perf_header__fprintf_info(session, fp, true);
105         fclose(fp);
106
107         for (pos = ptr, argc = 0; (pos = strchr(pos, '\n')) != NULL; pos++)
108                 argc++;
109
110         argv = calloc(argc + 1, sizeof(*argv));
111         if (argv == NULL)
112                 goto out;
113
114         argv[0] = pos = ptr;
115         for (i = 1; (pos = strchr(pos, '\n')) != NULL; i++) {
116                 *pos++ = '\0';
117                 argv[i] = pos;
118         }
119
120         BUG_ON(i != argc + 1);
121
122         ui__list_menu(argc, argv);
123
124 out:
125         free(argv);
126         free(ptr);
127         return 0;
128 }