Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf958003 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

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.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 29208e57
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -472,6 +472,7 @@ else
		LIB_H += util/ui/browser.h
		LIB_H += util/ui/browsers/map.h
		LIB_H += util/ui/helpline.h
		LIB_H += util/ui/keysyms.h
		LIB_H += util/ui/libslang.h
		LIB_H += util/ui/progress.h
		LIB_H += util/ui/util.h
+4 −4
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ static void hists__find_annotations(struct hists *self, int evidx,
				    int nr_events)
{
	struct rb_node *nd = rb_first(&self->entries), *next;
	int key = KEY_RIGHT;
	int key = K_RIGHT;

	while (nd) {
		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,
		notes = symbol__annotation(he->ms.sym);
		if (notes->src == NULL) {
find_next:
			if (key == KEY_LEFT)
			if (key == K_LEFT)
				nd = rb_prev(nd);
			else
				nd = rb_next(nd);
@@ -141,10 +141,10 @@ static void hists__find_annotations(struct hists *self, int evidx,
			key = hist_entry__tui_annotate(he, evidx, nr_events,
						       NULL, NULL, 0);
			switch (key) {
			case KEY_RIGHT:
			case K_RIGHT:
				next = rb_next(nd);
				break;
			case KEY_LEFT:
			case K_LEFT:
				next = rb_prev(nd);
				break;
			default:
+3 −6
Original line number Diff line number Diff line
@@ -125,16 +125,13 @@ static inline int hist_entry__tui_annotate(struct hist_entry *self __used,
{
	return 0;
}
#define KEY_LEFT -1
#define KEY_RIGHT -2
#define K_LEFT -1
#define K_RIGHT -2
#else
#include <newt.h>
#include "ui/keysyms.h"
int hist_entry__tui_annotate(struct hist_entry *he, int evidx, int nr_events,
			     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,
				  void(*timer)(void *arg), void *arg,
				  int refresh);
+53 −26
Original line number Diff line number Diff line
@@ -11,10 +11,9 @@
#include <sys/ttydefaults.h>
#include "browser.h"
#include "helpline.h"
#include "keysyms.h"
#include "../color.h"

int newtGetKey(void);

static int ui_browser__percent_color(struct ui_browser *browser,
				     double percent, bool current)
{
@@ -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);
}

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 err, key;
	struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;

	pthread__unblock_sigwinch();

	while (1) {
		off_t offset;
		fd_set read_set;

		pthread_mutex_lock(&ui__lock);
		err = __ui_browser__refresh(self);
@@ -310,20 +348,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
		if (err < 0)
			break;

		FD_ZERO(&read_set);
		FD_SET(0, &read_set);
		key = ui__getch(delay_secs);

		if (delay_secs) {
			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 {
		if (key == K_RESIZE) {
			pthread_mutex_lock(&ui__lock);
			SLtt_get_screen_size();
			SLsmg_reinit_smg();
@@ -335,9 +362,9 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
		}

		if (self->use_navkeypressed && !self->navkeypressed) {
			if (key == NEWT_KEY_DOWN || key == NEWT_KEY_UP ||
			    key == NEWT_KEY_PGDN || key == NEWT_KEY_PGUP ||
			    key == NEWT_KEY_HOME || key == NEWT_KEY_END ||
			if (key == K_DOWN || key == K_UP ||
			    key == K_PGDN || key == K_PGUP ||
			    key == K_HOME || key == K_END ||
			    key == ' ') {
				self->navkeypressed = true;
				continue;
@@ -346,7 +373,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
		}

		switch (key) {
		case NEWT_KEY_DOWN:
		case K_DOWN:
			if (self->index == self->nr_entries - 1)
				break;
			++self->index;
@@ -355,7 +382,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
				self->seek(self, +1, SEEK_CUR);
			}
			break;
		case NEWT_KEY_UP:
		case K_UP:
			if (self->index == 0)
				break;
			--self->index;
@@ -364,7 +391,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
				self->seek(self, -1, SEEK_CUR);
			}
			break;
		case NEWT_KEY_PGDN:
		case K_PGDN:
		case ' ':
			if (self->top_idx + self->height > self->nr_entries - 1)
				break;
@@ -376,7 +403,7 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
			self->top_idx += offset;
			self->seek(self, +offset, SEEK_CUR);
			break;
		case NEWT_KEY_PGUP:
		case K_PGUP:
			if (self->top_idx == 0)
				break;

@@ -389,10 +416,10 @@ int ui_browser__run(struct ui_browser *self, int delay_secs)
			self->top_idx -= offset;
			self->seek(self, -offset, SEEK_CUR);
			break;
		case NEWT_KEY_HOME:
		case K_HOME:
			ui_browser__reset_index(self);
			break;
		case NEWT_KEY_END:
		case K_END:
			offset = self->height - 1;
			if (offset >= self->nr_entries)
				offset = self->nr_entries - 1;
+8 −11
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include "../../sort.h"
#include "../../symbol.h"
#include <pthread.h>
#include <newt.h>

static void ui__error_window(const char *fmt, ...)
{
@@ -265,18 +266,14 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
		}

		switch (key) {
		case -1:
			/*
 			 * FIXME we need to check if it was
 			 * es.reason == NEWT_EXIT_TIMER
 			 */
		case K_TIMER:
			if (timer != NULL)
				timer(arg);

			if (delay_secs != 0)
				symbol__annotate_decay_histogram(sym, evidx);
			continue;
		case NEWT_KEY_TAB:
		case K_TAB:
			if (nd != NULL) {
				nd = rb_prev(nd);
				if (nd == NULL)
@@ -284,7 +281,7 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
			} else
				nd = self->curr_hot;
			break;
		case NEWT_KEY_UNTAB:
		case K_UNTAB:
			if (nd != NULL)
				nd = rb_next(nd);
				if (nd == NULL)
@@ -299,8 +296,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
			if (annotate_browser__toggle_source(self))
				ui_helpline__puts(help);
			continue;
		case NEWT_KEY_ENTER:
		case NEWT_KEY_RIGHT:
		case K_ENTER:
		case K_RIGHT:
			if (self->selection == NULL) {
				ui_helpline__puts("Huh? No selection. Report to linux-kernel@vger.kernel.org");
				continue;
@@ -350,8 +347,8 @@ static int annotate_browser__run(struct annotate_browser *self, int evidx,
						     timer, arg, delay_secs);
			}
			continue;
		case NEWT_KEY_LEFT:
		case NEWT_KEY_ESCAPE:
		case K_LEFT:
		case K_ESC:
		case 'q':
		case CTRL('c'):
			goto out;
Loading