|
@@ -195,9 +195,9 @@ static bool hist_browser__toggle_fold(struct hist_browser *self)
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
-static int hist_browser__run(struct hist_browser *self, const char *title,
|
|
|
|
- struct newtExitStruct *es)
|
|
|
|
|
|
+static int hist_browser__run(struct hist_browser *self, const char *title)
|
|
{
|
|
{
|
|
|
|
+ int key;
|
|
char str[256], unit;
|
|
char str[256], unit;
|
|
unsigned long nr_events = self->hists->stats.nr_events[PERF_RECORD_SAMPLE];
|
|
unsigned long nr_events = self->hists->stats.nr_events[PERF_RECORD_SAMPLE];
|
|
|
|
|
|
@@ -227,11 +227,9 @@ static int hist_browser__run(struct hist_browser *self, const char *title,
|
|
newtFormAddHotKey(self->b.form, NEWT_KEY_ENTER);
|
|
newtFormAddHotKey(self->b.form, NEWT_KEY_ENTER);
|
|
|
|
|
|
while (1) {
|
|
while (1) {
|
|
- ui_browser__run(&self->b, es);
|
|
|
|
|
|
+ key = ui_browser__run(&self->b);
|
|
|
|
|
|
- if (es->reason != NEWT_EXIT_HOTKEY)
|
|
|
|
- break;
|
|
|
|
- switch (es->u.key) {
|
|
|
|
|
|
+ switch (key) {
|
|
case 'D': { /* Debug */
|
|
case 'D': { /* Debug */
|
|
static int seq;
|
|
static int seq;
|
|
struct hist_entry *h = rb_entry(self->b.top,
|
|
struct hist_entry *h = rb_entry(self->b.top,
|
|
@@ -251,12 +249,12 @@ static int hist_browser__run(struct hist_browser *self, const char *title,
|
|
break;
|
|
break;
|
|
/* fall thru */
|
|
/* fall thru */
|
|
default:
|
|
default:
|
|
- return 0;
|
|
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+out:
|
|
ui_browser__hide(&self->b);
|
|
ui_browser__hide(&self->b);
|
|
- return 0;
|
|
|
|
|
|
+ return key;
|
|
}
|
|
}
|
|
|
|
|
|
static char *callchain_list__sym_name(struct callchain_list *self,
|
|
static char *callchain_list__sym_name(struct callchain_list *self,
|
|
@@ -687,8 +685,6 @@ static struct hist_browser *hist_browser__new(struct hists *hists)
|
|
|
|
|
|
static void hist_browser__delete(struct hist_browser *self)
|
|
static void hist_browser__delete(struct hist_browser *self)
|
|
{
|
|
{
|
|
- newtFormDestroy(self->b.form);
|
|
|
|
- newtPopWindow();
|
|
|
|
free(self);
|
|
free(self);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -725,7 +721,6 @@ int hists__browse(struct hists *self, const char *helpline, const char *ev_name)
|
|
struct pstack *fstack;
|
|
struct pstack *fstack;
|
|
const struct thread *thread_filter = NULL;
|
|
const struct thread *thread_filter = NULL;
|
|
const struct dso *dso_filter = NULL;
|
|
const struct dso *dso_filter = NULL;
|
|
- struct newtExitStruct es;
|
|
|
|
char msg[160];
|
|
char msg[160];
|
|
int key = -1;
|
|
int key = -1;
|
|
|
|
|
|
@@ -749,70 +744,63 @@ int hists__browse(struct hists *self, const char *helpline, const char *ev_name)
|
|
annotate = -2, zoom_dso = -2, zoom_thread = -2,
|
|
annotate = -2, zoom_dso = -2, zoom_thread = -2,
|
|
browse_map = -2;
|
|
browse_map = -2;
|
|
|
|
|
|
- if (hist_browser__run(browser, msg, &es))
|
|
|
|
- break;
|
|
|
|
|
|
+ key = hist_browser__run(browser, msg);
|
|
|
|
|
|
thread = hist_browser__selected_thread(browser);
|
|
thread = hist_browser__selected_thread(browser);
|
|
dso = browser->selection->map ? browser->selection->map->dso : NULL;
|
|
dso = browser->selection->map ? browser->selection->map->dso : NULL;
|
|
|
|
|
|
- if (es.reason == NEWT_EXIT_HOTKEY) {
|
|
|
|
- key = es.u.key;
|
|
|
|
-
|
|
|
|
- switch (key) {
|
|
|
|
- case NEWT_KEY_F1:
|
|
|
|
- goto do_help;
|
|
|
|
- case NEWT_KEY_TAB:
|
|
|
|
- case NEWT_KEY_UNTAB:
|
|
|
|
- /*
|
|
|
|
- * Exit the browser, let hists__browser_tree
|
|
|
|
- * go to the next or previous
|
|
|
|
- */
|
|
|
|
- goto out_free_stack;
|
|
|
|
- default:;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- switch (key) {
|
|
|
|
- case 'a':
|
|
|
|
- if (browser->selection->map == NULL &&
|
|
|
|
- browser->selection->map->dso->annotate_warned)
|
|
|
|
- continue;
|
|
|
|
- goto do_annotate;
|
|
|
|
- case 'd':
|
|
|
|
- goto zoom_dso;
|
|
|
|
- case 't':
|
|
|
|
- goto zoom_thread;
|
|
|
|
- case 'h':
|
|
|
|
- case '?':
|
|
|
|
-do_help:
|
|
|
|
- ui__help_window("-> Zoom into DSO/Threads & Annotate current symbol\n"
|
|
|
|
- "<- Zoom out\n"
|
|
|
|
- "a Annotate current symbol\n"
|
|
|
|
- "h/?/F1 Show this window\n"
|
|
|
|
- "d Zoom into current DSO\n"
|
|
|
|
- "t Zoom into current Thread\n"
|
|
|
|
- "q/CTRL+C Exit browser");
|
|
|
|
|
|
+ switch (key) {
|
|
|
|
+ case NEWT_KEY_F1:
|
|
|
|
+ goto do_help;
|
|
|
|
+ case NEWT_KEY_TAB:
|
|
|
|
+ case NEWT_KEY_UNTAB:
|
|
|
|
+ /*
|
|
|
|
+ * Exit the browser, let hists__browser_tree
|
|
|
|
+ * go to the next or previous
|
|
|
|
+ */
|
|
|
|
+ goto out_free_stack;
|
|
|
|
+ case 'a':
|
|
|
|
+ if (browser->selection->map == NULL &&
|
|
|
|
+ browser->selection->map->dso->annotate_warned)
|
|
continue;
|
|
continue;
|
|
- default:;
|
|
|
|
- }
|
|
|
|
- if (is_exit_key(key)) {
|
|
|
|
- if (key == NEWT_KEY_ESCAPE &&
|
|
|
|
- !ui__dialog_yesno("Do you really want to exit?"))
|
|
|
|
- continue;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (es.u.key == NEWT_KEY_LEFT) {
|
|
|
|
- const void *top;
|
|
|
|
|
|
+ goto do_annotate;
|
|
|
|
+ case 'd':
|
|
|
|
+ goto zoom_dso;
|
|
|
|
+ case 't':
|
|
|
|
+ goto zoom_thread;
|
|
|
|
+ case 'h':
|
|
|
|
+ case '?':
|
|
|
|
+do_help:
|
|
|
|
+ ui__help_window("-> Zoom into DSO/Threads & Annotate current symbol\n"
|
|
|
|
+ "<- Zoom out\n"
|
|
|
|
+ "a Annotate current symbol\n"
|
|
|
|
+ "h/?/F1 Show this window\n"
|
|
|
|
+ "d Zoom into current DSO\n"
|
|
|
|
+ "t Zoom into current Thread\n"
|
|
|
|
+ "q/CTRL+C Exit browser");
|
|
|
|
+ continue;
|
|
|
|
+ case NEWT_KEY_ENTER:
|
|
|
|
+ case NEWT_KEY_RIGHT:
|
|
|
|
+ /* menu */
|
|
|
|
+ break;
|
|
|
|
+ case NEWT_KEY_LEFT: {
|
|
|
|
+ const void *top;
|
|
|
|
|
|
- if (pstack__empty(fstack))
|
|
|
|
- continue;
|
|
|
|
- top = pstack__pop(fstack);
|
|
|
|
- if (top == &dso_filter)
|
|
|
|
- goto zoom_out_dso;
|
|
|
|
- if (top == &thread_filter)
|
|
|
|
- goto zoom_out_thread;
|
|
|
|
|
|
+ if (pstack__empty(fstack))
|
|
continue;
|
|
continue;
|
|
- }
|
|
|
|
|
|
+ top = pstack__pop(fstack);
|
|
|
|
+ if (top == &dso_filter)
|
|
|
|
+ goto zoom_out_dso;
|
|
|
|
+ if (top == &thread_filter)
|
|
|
|
+ goto zoom_out_thread;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ case NEWT_KEY_ESCAPE:
|
|
|
|
+ if (!ui__dialog_yesno("Do you really want to exit?"))
|
|
|
|
+ continue;
|
|
|
|
+ /* Fall thru */
|
|
|
|
+ default:
|
|
|
|
+ goto out_free_stack;
|
|
}
|
|
}
|
|
|
|
|
|
if (browser->selection->sym != NULL &&
|
|
if (browser->selection->sym != NULL &&
|
|
@@ -925,10 +913,6 @@ int hists__tui_browse_tree(struct rb_root *self, const char *help)
|
|
const char *ev_name = __event_name(hists->type, hists->config);
|
|
const char *ev_name = __event_name(hists->type, hists->config);
|
|
|
|
|
|
key = hists__browse(hists, help, ev_name);
|
|
key = hists__browse(hists, help, ev_name);
|
|
-
|
|
|
|
- if (is_exit_key(key))
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
switch (key) {
|
|
switch (key) {
|
|
case NEWT_KEY_TAB:
|
|
case NEWT_KEY_TAB:
|
|
next = rb_next(nd);
|
|
next = rb_next(nd);
|
|
@@ -940,7 +924,7 @@ int hists__tui_browse_tree(struct rb_root *self, const char *help)
|
|
continue;
|
|
continue;
|
|
nd = rb_prev(nd);
|
|
nd = rb_prev(nd);
|
|
default:
|
|
default:
|
|
- break;
|
|
|
|
|
|
+ return key;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|