diff options
| -rw-r--r-- | tools/perf/util/ui/browser.c | 41 | ||||
| -rw-r--r-- | tools/perf/util/ui/browser.h | 3 | ||||
| -rw-r--r-- | tools/perf/util/ui/util.c | 83 |
3 files changed, 97 insertions, 30 deletions
diff --git a/tools/perf/util/ui/browser.c b/tools/perf/util/ui/browser.c index 370c4703cec8..29c68aee00df 100644 --- a/tools/perf/util/ui/browser.c +++ b/tools/perf/util/ui/browser.c | |||
| @@ -488,6 +488,47 @@ static int ui_browser__color_config(const char *var, const char *value, | |||
| 488 | return -1; | 488 | return -1; |
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int whence) | ||
| 492 | { | ||
| 493 | switch (whence) { | ||
| 494 | case SEEK_SET: | ||
| 495 | browser->top = browser->entries; | ||
| 496 | break; | ||
| 497 | case SEEK_CUR: | ||
| 498 | browser->top = browser->top + browser->top_idx + offset; | ||
| 499 | break; | ||
| 500 | case SEEK_END: | ||
| 501 | browser->top = browser->top + browser->nr_entries + offset; | ||
| 502 | break; | ||
| 503 | default: | ||
| 504 | return; | ||
| 505 | } | ||
| 506 | } | ||
| 507 | |||
| 508 | unsigned int ui_browser__argv_refresh(struct ui_browser *browser) | ||
| 509 | { | ||
| 510 | unsigned int row = 0, idx = browser->top_idx; | ||
| 511 | char **pos; | ||
| 512 | |||
| 513 | if (browser->top == NULL) | ||
| 514 | browser->top = browser->entries; | ||
| 515 | |||
| 516 | pos = (char **)browser->top; | ||
| 517 | while (idx < browser->nr_entries) { | ||
| 518 | if (!browser->filter || !browser->filter(browser, *pos)) { | ||
| 519 | ui_browser__gotorc(browser, row, 0); | ||
| 520 | browser->write(browser, pos, row); | ||
| 521 | if (++row == browser->height) | ||
| 522 | break; | ||
| 523 | } | ||
| 524 | |||
| 525 | ++idx; | ||
| 526 | ++pos; | ||
| 527 | } | ||
| 528 | |||
| 529 | return row; | ||
| 530 | } | ||
| 531 | |||
| 491 | void ui_browser__init(void) | 532 | void ui_browser__init(void) |
| 492 | { | 533 | { |
| 493 | int i = 0; | 534 | int i = 0; |
diff --git a/tools/perf/util/ui/browser.h b/tools/perf/util/ui/browser.h index a2c707d33c5e..81a8d2afaa9b 100644 --- a/tools/perf/util/ui/browser.h +++ b/tools/perf/util/ui/browser.h | |||
| @@ -44,6 +44,9 @@ int ui_browser__refresh(struct ui_browser *self); | |||
| 44 | int ui_browser__run(struct ui_browser *browser, int delay_secs); | 44 | int ui_browser__run(struct ui_browser *browser, int delay_secs); |
| 45 | void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries); | 45 | void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries); |
| 46 | 46 | ||
| 47 | void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int whence); | ||
| 48 | unsigned int ui_browser__argv_refresh(struct ui_browser *browser); | ||
| 49 | |||
| 47 | void ui_browser__rb_tree_seek(struct ui_browser *self, off_t offset, int whence); | 50 | void ui_browser__rb_tree_seek(struct ui_browser *self, off_t offset, int whence); |
| 48 | unsigned int ui_browser__rb_tree_refresh(struct ui_browser *self); | 51 | unsigned int ui_browser__rb_tree_refresh(struct ui_browser *self); |
| 49 | 52 | ||
diff --git a/tools/perf/util/ui/util.c b/tools/perf/util/ui/util.c index fdf1fc8f08bc..37e6fe081a58 100644 --- a/tools/perf/util/ui/util.c +++ b/tools/perf/util/ui/util.c | |||
| @@ -8,10 +8,54 @@ | |||
| 8 | #include "../cache.h" | 8 | #include "../cache.h" |
| 9 | #include "../debug.h" | 9 | #include "../debug.h" |
| 10 | #include "browser.h" | 10 | #include "browser.h" |
| 11 | #include "keysyms.h" | ||
| 11 | #include "helpline.h" | 12 | #include "helpline.h" |
| 12 | #include "ui.h" | 13 | #include "ui.h" |
| 13 | #include "util.h" | 14 | #include "util.h" |
| 14 | 15 | ||
| 16 | static void ui_browser__argv_write(struct ui_browser *browser, | ||
| 17 | void *entry, int row) | ||
| 18 | { | ||
| 19 | char **arg = entry; | ||
| 20 | bool current_entry = ui_browser__is_current_entry(browser, row); | ||
| 21 | |||
| 22 | ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED : | ||
| 23 | HE_COLORSET_NORMAL); | ||
| 24 | slsmg_write_nstring(*arg, browser->width); | ||
| 25 | } | ||
| 26 | |||
| 27 | static int popup_menu__run(struct ui_browser *menu) | ||
| 28 | { | ||
| 29 | int key; | ||
| 30 | |||
| 31 | if (ui_browser__show(menu, " ", "ESC: exit, ENTER|->: Select option") < 0) | ||
| 32 | return -1; | ||
| 33 | |||
| 34 | while (1) { | ||
| 35 | key = ui_browser__run(menu, 0); | ||
| 36 | |||
| 37 | switch (key) { | ||
| 38 | case K_RIGHT: | ||
| 39 | case K_ENTER: | ||
| 40 | key = menu->index; | ||
| 41 | break; | ||
| 42 | case K_LEFT: | ||
| 43 | case K_ESC: | ||
| 44 | case 'q': | ||
| 45 | case CTRL('c'): | ||
| 46 | key = -1; | ||
| 47 | break; | ||
| 48 | default: | ||
| 49 | continue; | ||
| 50 | } | ||
| 51 | |||
| 52 | break; | ||
| 53 | } | ||
| 54 | |||
| 55 | ui_browser__hide(menu); | ||
| 56 | return key; | ||
| 57 | } | ||
| 58 | |||
| 15 | static void newt_form__set_exit_keys(newtComponent self) | 59 | static void newt_form__set_exit_keys(newtComponent self) |
| 16 | { | 60 | { |
| 17 | newtFormAddHotKey(self, NEWT_KEY_LEFT); | 61 | newtFormAddHotKey(self, NEWT_KEY_LEFT); |
| @@ -31,36 +75,15 @@ static newtComponent newt_form__new(void) | |||
| 31 | 75 | ||
| 32 | int ui__popup_menu(int argc, char * const argv[]) | 76 | int ui__popup_menu(int argc, char * const argv[]) |
| 33 | { | 77 | { |
| 34 | struct newtExitStruct es; | 78 | struct ui_browser menu = { |
| 35 | int i, rc = -1, max_len = 5; | 79 | .entries = (void *)argv, |
| 36 | newtComponent listbox, form = newt_form__new(); | 80 | .refresh = ui_browser__argv_refresh, |
| 37 | 81 | .seek = ui_browser__argv_seek, | |
| 38 | if (form == NULL) | 82 | .write = ui_browser__argv_write, |
| 39 | return -1; | 83 | .nr_entries = argc, |
| 40 | 84 | }; | |
| 41 | listbox = newtListbox(0, 0, argc, NEWT_FLAG_RETURNEXIT); | 85 | |
| 42 | if (listbox == NULL) | 86 | return popup_menu__run(&menu); |
| 43 | goto out_destroy_form; | ||
| 44 | |||
| 45 | newtFormAddComponent(form, listbox); | ||
| 46 | |||
| 47 | for (i = 0; i < argc; ++i) { | ||
| 48 | int len = strlen(argv[i]); | ||
| 49 | if (len > max_len) | ||
| 50 | max_len = len; | ||
| 51 | if (newtListboxAddEntry(listbox, argv[i], (void *)(long)i)) | ||
| 52 | goto out_destroy_form; | ||
| 53 | } | ||
| 54 | |||
| 55 | newtCenteredWindow(max_len, argc, NULL); | ||
| 56 | newtFormRun(form, &es); | ||
| 57 | rc = newtListboxGetCurrent(listbox) - NULL; | ||
| 58 | if (es.reason == NEWT_EXIT_HOTKEY) | ||
| 59 | rc = -1; | ||
| 60 | newtPopWindow(); | ||
| 61 | out_destroy_form: | ||
| 62 | newtFormDestroy(form); | ||
| 63 | return rc; | ||
| 64 | } | 87 | } |
| 65 | 88 | ||
| 66 | int ui__help_window(const char *text) | 89 | int ui__help_window(const char *text) |
