perf ui browser: Use libslang to read keys

Just another step in stopping the use of libnewt in perf.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-uy6s534uqxq8tenh6s3k8ocj@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 29208e57
...@@ -472,6 +472,7 @@ else ...@@ -472,6 +472,7 @@ else
LIB_H += util/ui/browser.h LIB_H += util/ui/browser.h
LIB_H += util/ui/browsers/map.h LIB_H += util/ui/browsers/map.h
LIB_H += util/ui/helpline.h LIB_H += util/ui/helpline.h
LIB_H += util/ui/keysyms.h
LIB_H += util/ui/libslang.h LIB_H += util/ui/libslang.h
LIB_H += util/ui/progress.h LIB_H += util/ui/progress.h
LIB_H += util/ui/util.h LIB_H += util/ui/util.h
......
...@@ -118,7 +118,7 @@ static void hists__find_annotations(struct hists *self, int evidx, ...@@ -118,7 +118,7 @@ static void hists__find_annotations(struct hists *self, int evidx,
int nr_events) int nr_events)
{ {
struct rb_node *nd = rb_first(&self->entries), *next; struct rb_node *nd = rb_first(&self->entries), *next;
int key = KEY_RIGHT; int key = K_RIGHT;
while (nd) { while (nd) {
struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node); struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
...@@ -130,7 +130,7 @@ static void hists__find_annotations(struct hists *self, int evidx, ...@@ -130,7 +130,7 @@ static void hists__find_annotations(struct hists *self, int evidx,
notes = symbol__annotation(he->ms.sym); notes = symbol__annotation(he->ms.sym);
if (notes->src == NULL) { if (notes->src == NULL) {
find_next: find_next:
if (key == KEY_LEFT) if (key == K_LEFT)
nd = rb_prev(nd); nd = rb_prev(nd);
else else
nd = rb_next(nd); nd = rb_next(nd);
...@@ -141,10 +141,10 @@ static void hists__find_annotations(struct hists *self, int evidx, ...@@ -141,10 +141,10 @@ static void hists__find_annotations(struct hists *self, int evidx,
key = hist_entry__tui_annotate(he, evidx, nr_events, key = hist_entry__tui_annotate(he, evidx, nr_events,
NULL, NULL, 0); NULL, NULL, 0);
switch (key) { switch (key) {
case KEY_RIGHT: case K_RIGHT:
next = rb_next(nd); next = rb_next(nd);
break; break;
case KEY_LEFT: case K_LEFT:
next = rb_prev(nd); next = rb_prev(nd);
break; break;
default: default:
......
...@@ -125,16 +125,13 @@ static inline int hist_entry__tui_annotate(struct hist_entry *self __used, ...@@ -125,16 +125,13 @@ static inline int hist_entry__tui_annotate(struct hist_entry *self __used,
{ {
return 0; return 0;
} }
#define KEY_LEFT -1 #define K_LEFT -1
#define KEY_RIGHT -2 #define K_RIGHT -2
#else #else
#include <newt.h> #include "ui/keysyms.h"
int hist_entry__tui_annotate(struct hist_entry *he, int evidx, int nr_events, int hist_entry__tui_annotate(struct hist_entry *he, int evidx, int nr_events,
void(*timer)(void *arg), void *arg, int delay_secs); void(*timer)(void *arg), void *arg, int delay_secs);
#define KEY_LEFT NEWT_KEY_LEFT
#define KEY_RIGHT NEWT_KEY_RIGHT
int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,
void(*timer)(void *arg), void *arg, void(*timer)(void *arg), void *arg,
int refresh); int refresh);
......
...@@ -11,10 +11,9 @@ ...@@ -11,10 +11,9 @@
#include <sys/ttydefaults.h> #include <sys/ttydefaults.h>
#include "browser.h" #include "browser.h"
#include "helpline.h" #include "helpline.h"
#include "keysyms.h"
#include "../color.h" #include "../color.h"
int newtGetKey(void);
static int ui_browser__percent_color(struct ui_browser *browser, static int ui_browser__percent_color(struct ui_browser *browser,
double percent, bool current) double percent, bool current)
{ {
...@@ -292,16 +291,55 @@ void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries) ...@@ -292,16 +291,55 @@ void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries)
browser->seek(browser, browser->top_idx, SEEK_SET); browser->seek(browser, browser->top_idx, SEEK_SET);
} }
static int ui__getch(int delay_secs)
{
struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
fd_set read_set;
int err, key;
FD_ZERO(&read_set);
FD_SET(0, &read_set);
if (delay_secs) {
timeout.tv_sec = delay_secs;
timeout.tv_usec = 0;
}
err = select(1, &read_set, NULL, NULL, ptimeout);
if (err == 0)
return K_TIMER;
if (err == -1) {
if (errno == EINTR)
return K_RESIZE;
return K_ERROR;
}
key = SLang_getkey();
if (key != K_ESC)
return key;
FD_ZERO(&read_set);
FD_SET(0, &read_set);
timeout.tv_sec = 0;
timeout.tv_usec = 20;
err = select(1, &read_set, NULL, NULL, &timeout);
if (err == 0)
return K_ESC;
SLang_ungetkey(key);
return SLkp_getkey();
}
int ui_browser__run(struct ui_browser *self, int delay_secs) int ui_browser__run(struct ui_browser *self, int delay_secs)
{ {
int err, key; int err, key;
struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
pthread__unblock_sigwinch(); pthread__unblock_sigwinch();
while (1) { while (1) {
off_t offset; off_t offset;
fd_set read_set;
pthread_mutex_lock(&ui__lock); pthread_mutex_lock(&ui__lock);
err = __ui_browser__refresh(self); err = __ui_browser__refresh(self);
...@@ -310,20 +348,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -310,20 +348,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
if (err < 0) if (err < 0)
break; break;
FD_ZERO(&read_set); key = ui__getch(delay_secs);
FD_SET(0, &read_set);
if (delay_secs) { if (key == K_RESIZE) {
timeout.tv_sec = delay_secs;
timeout.tv_usec = 0;
}
err = select(1, &read_set, NULL, NULL, ptimeout);
if (err > 0 && FD_ISSET(0, &read_set))
key = newtGetKey();
else if (err == 0)
break;
else {
pthread_mutex_lock(&ui__lock); pthread_mutex_lock(&ui__lock);
SLtt_get_screen_size(); SLtt_get_screen_size();
SLsmg_reinit_smg(); SLsmg_reinit_smg();
...@@ -335,9 +362,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -335,9 +362,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
} }
if (self->use_navkeypressed && !self->navkeypressed) { if (self->use_navkeypressed && !self->navkeypressed) {
if (key == NEWT_KEY_DOWN || key == NEWT_KEY_UP || if (key == K_DOWN || key == K_UP ||
key == NEWT_KEY_PGDN || key == NEWT_KEY_PGUP || key == K_PGDN || key == K_PGUP ||
key == NEWT_KEY_HOME || key == NEWT_KEY_END || key == K_HOME || key == K_END ||
key == ' ') { key == ' ') {
self->navkeypressed = true; self->navkeypressed = true;
continue; continue;
...@@ -346,7 +373,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -346,7 +373,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
} }
switch (key) { switch (key) {
case NEWT_KEY_DOWN: case K_DOWN:
if (self->index == self->nr_entries - 1) if (self->index == self->nr_entries - 1)
break; break;
++self->index; ++self->index;
...@@ -355,7 +382,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -355,7 +382,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
self->seek(self, +1, SEEK_CUR); self->seek(self, +1, SEEK_CUR);
} }
break; break;
case NEWT_KEY_UP: case K_UP:
if (self->index == 0) if (self->index == 0)
break; break;
--self->index; --self->index;
...@@ -364,7 +391,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -364,7 +391,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
self->seek(self, -1, SEEK_CUR); self->seek(self, -1, SEEK_CUR);
} }
break; break;
case NEWT_KEY_PGDN: case K_PGDN:
case ' ': case ' ':
if (self->top_idx + self->height > self->nr_entries - 1) if (self->top_idx + self->height > self->nr_entries - 1)
break; break;
...@@ -376,7 +403,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -376,7 +403,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
self->top_idx += offset; self->top_idx += offset;
self->seek(self, +offset, SEEK_CUR); self->seek(self, +offset, SEEK_CUR);
break; break;
case NEWT_KEY_PGUP: case K_PGUP:
if (self->top_idx == 0) if (self->top_idx == 0)
break; break;
...@@ -389,10 +416,10 @@ int ui_browser__run(struct ui_browser *self, int delay_secs) ...@@ -389,10 +416,10 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
self->top_idx -= offset; self->top_idx -= offset;
self->seek(self, -offset, SEEK_CUR); self->seek(self, -offset, SEEK_CUR);
break; break;
case NEWT_KEY_HOME: case K_HOME:
ui_browser__reset_index(self); ui_browser__reset_index(self);
break; break;
case NEWT_KEY_END: case K_END:
offset = self->height - 1; offset = self->height - 1;
if (offset >= self->nr_entries) if (offset >= self->nr_entries)
offset = self->nr_entries - 1; offset = self->nr_entries - 1;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "../../sort.h" #include "../../sort.h"
#include "../../symbol.h" #include "../../symbol.h"
#include <pthread.h> #include <pthread.h>
#include <newt.h>
static void ui__error_window(const char *fmt, ...) static void ui__error_window(const char *fmt, ...)
{ {
...@@ -265,18 +266,14 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx, ...@@ -265,18 +266,14 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
} }
switch (key) { switch (key) {
case -1: case K_TIMER:
/*
* FIXME we need to check if it was
* es.reason == NEWT_EXIT_TIMER
*/
if (timer != NULL) if (timer != NULL)
timer(arg); timer(arg);
if (delay_secs != 0) if (delay_secs != 0)
symbol__annotate_decay_histogram(sym, evidx); symbol__annotate_decay_histogram(sym, evidx);
continue; continue;
case NEWT_KEY_TAB: case K_TAB:
if (nd != NULL) { if (nd != NULL) {
nd = rb_prev(nd); nd = rb_prev(nd);
if (nd == NULL) if (nd == NULL)
...@@ -284,7 +281,7 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx, ...@@ -284,7 +281,7 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
} else } else
nd = self->curr_hot; nd = self->curr_hot;
break; break;
case NEWT_KEY_UNTAB: case K_UNTAB:
if (nd != NULL) if (nd != NULL)
nd = rb_next(nd); nd = rb_next(nd);
if (nd == NULL) if (nd == NULL)
...@@ -299,8 +296,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx, ...@@ -299,8 +296,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
if (annotate_browser__toggle_source(self)) if (annotate_browser__toggle_source(self))
ui_helpline__puts(help); ui_helpline__puts(help);
continue; continue;
case NEWT_KEY_ENTER: case K_ENTER:
case NEWT_KEY_RIGHT: case K_RIGHT:
if (self->selection == NULL) { if (self->selection == NULL) {
ui_helpline__puts("Huh? No selection. Report to linux-kernel@vger.kernel.org"); ui_helpline__puts("Huh? No selection. Report to linux-kernel@vger.kernel.org");
continue; continue;
...@@ -350,8 +347,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx, ...@@ -350,8 +347,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
timer, arg, delay_secs); timer, arg, delay_secs);
} }
continue; continue;
case NEWT_KEY_LEFT: case K_LEFT:
case NEWT_KEY_ESCAPE: case K_ESC:
case 'q': case 'q':
case CTRL('c'): case CTRL('c'):
goto out; goto out;
......
...@@ -344,7 +344,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name, ...@@ -344,7 +344,7 @@ static int hist_browser__run(struct hist_browser *self, const char *ev_name,
/* Expand the whole world. */ /* Expand the whole world. */
hist_browser__set_folding(self, true); hist_browser__set_folding(self, true);
break; break;
case NEWT_KEY_ENTER: case K_ENTER:
if (hist_browser__toggle_fold(self)) if (hist_browser__toggle_fold(self))
break; break;
/* fall thru */ /* fall thru */
...@@ -872,8 +872,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -872,8 +872,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
} }
switch (key) { switch (key) {
case NEWT_KEY_TAB: case K_TAB:
case NEWT_KEY_UNTAB: case K_UNTAB:
if (nr_events == 1) if (nr_events == 1)
continue; continue;
/* /*
...@@ -891,7 +891,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -891,7 +891,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
goto zoom_dso; goto zoom_dso;
case 't': case 't':
goto zoom_thread; goto zoom_thread;
case NEWT_KEY_F1: case K_F1:
case 'h': case 'h':
case '?': case '?':
ui__help_window("h/?/F1 Show this window\n" ui__help_window("h/?/F1 Show this window\n"
...@@ -909,11 +909,11 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -909,11 +909,11 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
"d Zoom into current DSO\n" "d Zoom into current DSO\n"
"t Zoom into current Thread\n"); "t Zoom into current Thread\n");
continue; continue;
case NEWT_KEY_ENTER: case K_ENTER:
case NEWT_KEY_RIGHT: case K_RIGHT:
/* menu */ /* menu */
break; break;
case NEWT_KEY_LEFT: { case K_LEFT: {
const void *top; const void *top;
if (pstack__empty(fstack)) { if (pstack__empty(fstack)) {
...@@ -931,7 +931,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, ...@@ -931,7 +931,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
goto zoom_out_thread; goto zoom_out_thread;
continue; continue;
} }
case NEWT_KEY_ESCAPE: case K_ESC:
if (!left_exits && if (!left_exits &&
!ui__dialog_yesno("Do you really want to exit?")) !ui__dialog_yesno("Do you really want to exit?"))
continue; continue;
...@@ -1091,12 +1091,11 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, ...@@ -1091,12 +1091,11 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu,
key = ui_browser__run(&menu->b, delay_secs); key = ui_browser__run(&menu->b, delay_secs);
switch (key) { switch (key) {
case -1: case K_TIMER:
/* FIXME we need to check if it was es.reason == NEWT_EXIT_TIMER */
timer(arg); timer(arg);
continue; continue;
case NEWT_KEY_RIGHT: case K_RIGHT:
case NEWT_KEY_ENTER: case K_ENTER:
if (!menu->selection) if (!menu->selection)
continue; continue;
pos = menu->selection; pos = menu->selection;
...@@ -1114,19 +1113,19 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, ...@@ -1114,19 +1113,19 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu,
arg, delay_secs); arg, delay_secs);
ui_browser__show_title(&menu->b, title); ui_browser__show_title(&menu->b, title);
switch (key) { switch (key) {
case NEWT_KEY_TAB: case K_TAB:
if (pos->node.next == &evlist->entries) if (pos->node.next == &evlist->entries)
pos = list_entry(evlist->entries.next, struct perf_evsel, node); pos = list_entry(evlist->entries.next, struct perf_evsel, node);
else else
pos = list_entry(pos->node.next, struct perf_evsel, node); pos = list_entry(pos->node.next, struct perf_evsel, node);
goto browse_hists; goto browse_hists;
case NEWT_KEY_UNTAB: case K_UNTAB:
if (pos->node.prev == &evlist->entries) if (pos->node.prev == &evlist->entries)
pos = list_entry(evlist->entries.prev, struct perf_evsel, node); pos = list_entry(evlist->entries.prev, struct perf_evsel, node);
else else
pos = list_entry(pos->node.prev, struct perf_evsel, node); pos = list_entry(pos->node.prev, struct perf_evsel, node);
goto browse_hists; goto browse_hists;
case NEWT_KEY_ESCAPE: case K_ESC:
if (!ui__dialog_yesno("Do you really want to exit?")) if (!ui__dialog_yesno("Do you really want to exit?"))
continue; continue;
/* Fall thru */ /* Fall thru */
...@@ -1136,9 +1135,9 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, ...@@ -1136,9 +1135,9 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu,
default: default:
continue; continue;
} }
case NEWT_KEY_LEFT: case K_LEFT:
continue; continue;
case NEWT_KEY_ESCAPE: case K_ESC:
if (!ui__dialog_yesno("Do you really want to exit?")) if (!ui__dialog_yesno("Do you really want to exit?"))
continue; continue;
/* Fall thru */ /* Fall thru */
......
#ifndef _PERF_KEYSYMS_H_
#define _PERF_KEYSYMS_H_ 1
#include "libslang.h"
#define K_DOWN SL_KEY_DOWN
#define K_END SL_KEY_END
#define K_ENTER '\r'
#define K_ESC 033
#define K_F1 SL_KEY_F(1)
#define K_HOME SL_KEY_HOME
#define K_LEFT SL_KEY_LEFT
#define K_PGDN SL_KEY_NPAGE
#define K_PGUP SL_KEY_PPAGE
#define K_RIGHT SL_KEY_RIGHT
#define K_TAB '\t'
#define K_UNTAB SL_KEY_UNTAB
#define K_UP SL_KEY_UP
/* Not really keys */
#define K_TIMER -1
#define K_ERROR -2
#define K_RESIZE -3
#endif /* _PERF_KEYSYMS_H_ */
...@@ -24,4 +24,6 @@ ...@@ -24,4 +24,6 @@
#define sltt_set_color SLtt_set_color #define sltt_set_color SLtt_set_color
#endif #endif
#define SL_KEY_UNTAB 0x1000
#endif /* _PERF_UI_SLANG_H_ */ #endif /* _PERF_UI_SLANG_H_ */
...@@ -18,6 +18,18 @@ static void newt_suspend(void *d __used) ...@@ -18,6 +18,18 @@ static void newt_suspend(void *d __used)
newtResume(); newtResume();
} }
static int ui__init(void)
{
int err = SLkp_init();
if (err < 0)
goto out;
SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
out:
return err;
}
static void ui__exit(void) static void ui__exit(void)
{ {
SLtt_set_cursor_visibility(1); SLtt_set_cursor_visibility(1);
...@@ -44,6 +56,7 @@ void setup_browser(bool fallback_to_pager) ...@@ -44,6 +56,7 @@ void setup_browser(bool fallback_to_pager)
use_browser = 1; use_browser = 1;
newtInit(); newtInit();
ui__init();
newtSetSuspendCallback(newt_suspend, NULL); newtSetSuspendCallback(newt_suspend, NULL);
ui_helpline__init(); ui_helpline__init();
ui_browser__init(); ui_browser__init();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment