aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul LeoNerd Evans <leonerd@leonerd.org.uk>2008-02-10 19:23:18 +0000
committerPaul LeoNerd Evans <leonerd@leonerd.org.uk>2008-02-10 19:23:18 +0000
commitc71e1928a203855b10bc2524900fd00a48a8435e (patch)
tree82bbf5f0acb9cefd5cd76d662c2dda42a3de2b2d
parentb3647c4861f6b46bf8054259a768f0e8b1ea3017 (diff)
downloadtermo-c71e1928a203855b10bc2524900fd00a48a8435e.tar.gz
termo-c71e1928a203855b10bc2524900fd00a48a8435e.tar.xz
termo-c71e1928a203855b10bc2524900fd00a48a8435e.zip
Have 'termkey_advisereadable' return a value indicating if it's likely useful to call it again
-rw-r--r--termkey.c13
-rw-r--r--termkey.h3
2 files changed, 11 insertions, 5 deletions
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);