Added polling for blocking key reads
This commit is contained in:
parent
512cbbdae4
commit
ac69e52faa
5
bb.c
5
bb.c
@ -28,6 +28,7 @@
|
||||
#define writez(fd, str) write(fd, str, strlen(str))
|
||||
#define IS_SELECTED(p) ((p)->atme)
|
||||
|
||||
#define KEY_DELAY -1
|
||||
|
||||
static struct termios orig_termios;
|
||||
static int termfd;
|
||||
@ -544,7 +545,7 @@ static void explore(char *path, int print_dir, int print_selection, char sep)
|
||||
render(&state);
|
||||
skip_redraw:
|
||||
scrolloff = MIN(SCROLLOFF, (height-4)/2);
|
||||
int key = term_getkey(termfd, &mouse_x, &mouse_y);
|
||||
int key = term_getkey(termfd, &mouse_x, &mouse_y, KEY_DELAY);
|
||||
switch (key) {
|
||||
case KEY_MOUSE_LEFT: {
|
||||
struct timespec clicktime;
|
||||
@ -754,7 +755,7 @@ static void explore(char *path, int print_dir, int print_selection, char sep)
|
||||
term_move(0, height-1);
|
||||
writez(termfd, "\e[K\e[1mSort by (a)lphabetic (s)ize (t)ime (p)ermissions:\e[0m \e[?25h");
|
||||
try_sort_again:
|
||||
switch (term_getkey(termfd, &mouse_x, &mouse_y)) {
|
||||
switch (term_getkey(termfd, &mouse_x, &mouse_y, -1)) {
|
||||
case 'a': case 'A':
|
||||
sort_alpha:
|
||||
if (state.sortmethod == SORT_ALPHA)
|
||||
|
51
keys.h
51
keys.h
@ -2,8 +2,10 @@
|
||||
* Definitions of some key character constants
|
||||
*/
|
||||
|
||||
#ifndef KEYS_DEFINED
|
||||
#define KEYS_DEFINED
|
||||
#ifndef _KEYS_DEFINED
|
||||
#define _KEYS_DEFINED
|
||||
|
||||
#include <poll.h>
|
||||
|
||||
#define KEY_F1 (0xFFFF-0)
|
||||
#define KEY_F2 (0xFFFF-1)
|
||||
@ -82,22 +84,27 @@
|
||||
#define KEY_CTRL_8 0x7F /* clash with 'BACKSPACE2' */
|
||||
|
||||
|
||||
static inline int nextchar(int fd)
|
||||
#define ESC_DELAY 10
|
||||
|
||||
static inline int nextchar(int fd, int timeout)
|
||||
{
|
||||
char c;
|
||||
return read(fd, &c, 1) == 1 ? c : -1;
|
||||
struct pollfd pfd = {fd, POLLIN, 0};
|
||||
if (poll(&pfd, 1, timeout) > 0)
|
||||
return read(fd, &c, 1) == 1 ? c : -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int term_getkey(int fd, int *mouse_x, int *mouse_y)
|
||||
int term_getkey(int fd, int *mouse_x, int *mouse_y, int timeout)
|
||||
{
|
||||
int c = nextchar(fd);
|
||||
int c = nextchar(fd, timeout);
|
||||
if (c == '\x1b')
|
||||
goto escape;
|
||||
|
||||
return c;
|
||||
|
||||
escape:
|
||||
c = nextchar(fd);
|
||||
c = nextchar(fd, ESC_DELAY);
|
||||
// Actual escape key:
|
||||
if (c == -1)
|
||||
return KEY_ESC;
|
||||
@ -110,7 +117,7 @@ int term_getkey(int fd, int *mouse_x, int *mouse_y)
|
||||
}
|
||||
|
||||
CSI:
|
||||
c = nextchar(fd);
|
||||
c = nextchar(fd, ESC_DELAY);
|
||||
if (c == -1)
|
||||
return -1;
|
||||
|
||||
@ -122,37 +129,37 @@ int term_getkey(int fd, int *mouse_x, int *mouse_y)
|
||||
case 'F': return KEY_END;
|
||||
case 'H': return KEY_HOME;
|
||||
case '1':
|
||||
switch (nextchar(fd)) {
|
||||
switch (nextchar(fd, ESC_DELAY)) {
|
||||
case '5':
|
||||
return nextchar(fd) == '~' ? KEY_F5 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F5 : -1;
|
||||
case '7':
|
||||
return nextchar(fd) == '~' ? KEY_F6 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F6 : -1;
|
||||
case '8':
|
||||
return nextchar(fd) == '~' ? KEY_F7 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F7 : -1;
|
||||
case '9':
|
||||
return nextchar(fd) == '~' ? KEY_F8 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F8 : -1;
|
||||
default: return -1;
|
||||
}
|
||||
break;
|
||||
case '2':
|
||||
switch (nextchar(fd)) {
|
||||
switch (nextchar(fd, ESC_DELAY)) {
|
||||
case '0':
|
||||
return nextchar(fd) == '~' ? KEY_F9 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F9 : -1;
|
||||
case '1':
|
||||
return nextchar(fd) == '~' ? KEY_F10 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F10 : -1;
|
||||
case '3':
|
||||
return nextchar(fd) == '~' ? KEY_F11 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F11 : -1;
|
||||
case '4':
|
||||
return nextchar(fd) == '~' ? KEY_F12 : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_F12 : -1;
|
||||
default: return -1;
|
||||
}
|
||||
break;
|
||||
case '3':
|
||||
return nextchar(fd) == '~' ? KEY_DELETE : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_DELETE : -1;
|
||||
case '5':
|
||||
return nextchar(fd) == '~' ? KEY_PGUP : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_PGUP : -1;
|
||||
case '6':
|
||||
return nextchar(fd) == '~' ? KEY_PGDN : -1;
|
||||
return nextchar(fd, ESC_DELAY) == '~' ? KEY_PGDN : -1;
|
||||
case '<': { // Mouse clicks
|
||||
int buttons = 0, x = 0, y = 0;
|
||||
char buf;
|
||||
@ -187,7 +194,7 @@ int term_getkey(int fd, int *mouse_x, int *mouse_y)
|
||||
return -1;
|
||||
|
||||
SS3:
|
||||
switch (nextchar(fd)) {
|
||||
switch (nextchar(fd, ESC_DELAY)) {
|
||||
case 'P': return KEY_F1;
|
||||
case 'Q': return KEY_F2;
|
||||
case 'R': return KEY_F3;
|
||||
|
Loading…
Reference in New Issue
Block a user