diff --git a/termkey.c b/termkey.c index d2d557b..6f8b254 100644 --- a/termkey.c +++ b/termkey.c @@ -444,6 +444,7 @@ termkey_result termkey_getkey(termkey_t *tk, termkey_key *key) case TERMKEY_RES_NONE: case TERMKEY_RES_EOF: + case TERMKEY_RES_AGAIN: break; } @@ -569,17 +570,21 @@ void termkey_pushinput(termkey_t *tk, unsigned char *input, size_t inputlen) tk->buffcount += inputlen; } -void termkey_advisereadable(termkey_t *tk) +termkey_result termkey_advisereadable(termkey_t *tk) { unsigned char buffer[64]; // Smaller than the default size size_t len = read(tk->fd, buffer, sizeof buffer); if(len == -1 && errno == EAGAIN) - return; - else if(len < 1) + return TERMKEY_RES_NONE; + else if(len < 1) { tk->is_closed = 1; - else + return TERMKEY_RES_NONE; + } + else { termkey_pushinput(tk, buffer, len); + return TERMKEY_RES_AGAIN; + } } const char *termkey_describe_sym(termkey_t *tk, termkey_keysym code) diff --git a/termkey.h b/termkey.h index 9d61d49..0cfacba 100644 --- a/termkey.h +++ b/termkey.h @@ -73,6 +73,7 @@ typedef enum { TERMKEY_RES_NONE, TERMKEY_RES_KEY, TERMKEY_RES_EOF, + TERMKEY_RES_AGAIN, } termkey_result; enum { @@ -114,7 +115,7 @@ termkey_result termkey_waitkey(termkey_t *tk, termkey_key *key); void termkey_pushinput(termkey_t *tk, unsigned char *input, size_t inputlen); -void termkey_advisereadable(termkey_t *tk); +termkey_result termkey_advisereadable(termkey_t *tk); // Registration of keys and names termkey_keysym termkey_register_keyname(termkey_t *tk, termkey_keysym code, const char *name);