mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
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>
This commit is contained in:
parent
29208e573a
commit
cf9580036a
9 changed files with 125 additions and 64 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue