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: Arnaldo Carvalho de Melo <acme@redhat.com>
diff --git a/tools/perf/util/ui/browser.c b/tools/perf/util/ui/browser.c
index 06fc9eb..5359f37 100644
--- a/tools/perf/util/ui/browser.c
+++ b/tools/perf/util/ui/browser.c
@@ -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 @@
 	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 @@
 		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 @@
 		}
 
 		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 @@
 		}
 
 		switch (key) {
-		case NEWT_KEY_DOWN:
+		case K_DOWN:
 			if (self->index == self->nr_entries - 1)
 				break;
 			++self->index;
@@ -355,7 +382,7 @@
 				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 @@
 				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 @@
 			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 @@
 			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;