From 6294cca6f9bc910b224393e38e3c09eeb821fcb7 Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Thu, 7 Feb 2008 01:17:59 +0000 Subject: [PATCH] Denote general status with return codes, not special key symbols --- demo.c | 3 +- termkey.c | 86 ++++++++++++++++++++++++++----------------------------- termkey.h | 17 +++++++---- 3 files changed, 54 insertions(+), 52 deletions(-) diff --git a/demo.c b/demo.c index 512a99f..540861d 100644 --- a/demo.c +++ b/demo.c @@ -20,9 +20,10 @@ int main(int argc, char *argv[]) { termkey_t *tk = termkey_new(0, TERMKEY_FLAG_CONVERTKP); + termkey_result ret; termkey_key key; - while(termkey_waitkey(tk, &key) && key.code != TERMKEY_SYM_EOF) { + while((ret = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) { if(key.flags & TERMKEY_KEYFLAG_SPECIAL) printf("Key %s%s%s%s (code %d)\n", key.modifiers & TERMKEY_KEYMOD_SHIFT ? "S-" : "", diff --git a/termkey.c b/termkey.c index ef72cbf..73ca994 100644 --- a/termkey.c +++ b/termkey.c @@ -44,7 +44,7 @@ static inline void eatbytes(termkey_t *tk, size_t count) tk->buffvalid -= count; } -static int getkey_csi(termkey_t *tk, size_t introlen, termkey_key *key) +static termkey_result getkey_csi(termkey_t *tk, size_t introlen, termkey_key *key) { size_t csi_end = introlen; @@ -54,10 +54,8 @@ static int getkey_csi(termkey_t *tk, size_t introlen, termkey_key *key) csi_end++; } - if(csi_end >= tk->buffvalid) { - key->code = TERMKEY_SYM_NONE; - return key->code; - } + if(csi_end >= tk->buffvalid) + return TERMKEY_RES_NONE; unsigned char cmd = tk->buffer[csi_end]; int arg1 = -1; @@ -85,7 +83,7 @@ static int getkey_csi(termkey_t *tk, size_t introlen, termkey_key *key) } } - key->code = TERMKEY_SYM_UNKNOWN; + eatbytes(tk, csi_end + 1); switch(cmd) { case 'A': key->code = TERMKEY_SYM_UP; break; @@ -118,31 +116,29 @@ static int getkey_csi(termkey_t *tk, size_t introlen, termkey_key *key) default: fprintf(stderr, "CSI function key %d\n", arg1); + key->code = TERMKEY_SYM_UNKNOWN; } break; default: fprintf(stderr, "CSI arg1=%d arg2=%d cmd=%c\n", arg1, arg2, cmd); + key->code = TERMKEY_SYM_UNKNOWN; } key->modifiers = arg2 == -1 ? 0 : arg2 - 1; key->flags = TERMKEY_KEYFLAG_SPECIAL; - eatbytes(tk, csi_end + 1); - - return key->code; + return TERMKEY_RES_KEY; } -static int getkey_ss3(termkey_t *tk, size_t introlen, termkey_key *key) +static termkey_result getkey_ss3(termkey_t *tk, size_t introlen, termkey_key *key) { - if(introlen + 1 < tk->buffvalid) { - key->code = TERMKEY_SYM_NONE; - return key->code; - } + if(introlen + 1 < tk->buffvalid) + return TERMKEY_RES_NONE; unsigned char cmd = tk->buffer[introlen]; - key->code = TERMKEY_SYM_UNKNOWN; + eatbytes(tk, introlen + 1); switch(cmd) { case 'A': key->code = TERMKEY_SYM_UP; break; @@ -176,7 +172,7 @@ static int getkey_ss3(termkey_t *tk, size_t introlen, termkey_key *key) default: fprintf(stderr, "SS3 %c (0x%02x)\n", cmd, cmd); - break; + key->code = TERMKEY_SYM_UNKNOWN; } key->modifiers = 0; @@ -216,17 +212,13 @@ static int getkey_ss3(termkey_t *tk, size_t introlen, termkey_key *key) } } - eatbytes(tk, introlen + 1); - - return key->code; + return TERMKEY_RES_KEY; } -int termkey_getkey(termkey_t *tk, termkey_key *key) +termkey_result termkey_getkey(termkey_t *tk, termkey_key *key) { - if(tk->buffvalid == 0) { - key->code = tk->is_closed ? TERMKEY_SYM_EOF : TERMKEY_SYM_NONE; - return key->code; - } + if(tk->buffvalid == 0) + return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE; // Now we're sure at least 1 byte is valid unsigned char b0 = tk->buffer[0]; @@ -239,7 +231,7 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) eatbytes(tk, 1); - return key->code; + return TERMKEY_RES_KEY; } unsigned char b1 = tk->buffer[1]; @@ -251,19 +243,26 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) tk->buffer++; - int metakey = termkey_getkey(tk, key); - if(metakey != TERMKEY_SYM_NONE) { - key->modifiers |= TERMKEY_KEYMOD_ALT; - tk->buffer--; - eatbytes(tk, 1); + termkey_result metakey_result = termkey_getkey(tk, key); + + switch(metakey_result) { + case TERMKEY_RES_KEY: + key->modifiers |= TERMKEY_KEYMOD_ALT; + tk->buffer--; + eatbytes(tk, 1); + break; + + case TERMKEY_RES_NONE: + case TERMKEY_RES_EOF: + break; } - return key->code; + return metakey_result; } else if(b0 < 0x20) { // Control key - key->code = TERMKEY_SYM_UNKNOWN; + key->code = 0; if(!(tk->flags & TERMKEY_FLAG_NOINTERPRET)) { // Try to interpret C0 codes that have nice names @@ -274,7 +273,7 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) } } - if(key->code == TERMKEY_SYM_UNKNOWN) { + if(!key->code) { key->code = b0 + 0x40; key->modifiers = TERMKEY_KEYMOD_CTRL; key->flags = 0; @@ -289,7 +288,7 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) eatbytes(tk, 1); - return key->code; + return TERMKEY_RES_KEY; } else if(b0 == 0x20 && !(tk->flags & TERMKEY_FLAG_NOINTERPRET)) { key->code = TERMKEY_SYM_SPACE; @@ -298,7 +297,7 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) eatbytes(tk, 1); - return key->code; + return TERMKEY_RES_KEY; } else if(b0 == 0x7f && !(tk->flags & TERMKEY_FLAG_NOINTERPRET)) { key->code = TERMKEY_SYM_DEL; @@ -307,7 +306,7 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) eatbytes(tk, 1); - return key->code; + return TERMKEY_RES_KEY; } else if(b0 >= 0x20 && b0 < 0x80) { // ASCII lowbyte range @@ -320,17 +319,17 @@ int termkey_getkey(termkey_t *tk, termkey_key *key) eatbytes(tk, 1); - return key->code; + return TERMKEY_RES_KEY; } fprintf(stderr, "TODO - tk->buffer[0] == 0x%02x\n", tk->buffer[0]); return TERMKEY_SYM_NONE; } -int termkey_waitkey(termkey_t *tk, termkey_key *key) +termkey_result termkey_waitkey(termkey_t *tk, termkey_key *key) { - int ret; - while((ret = termkey_getkey(tk, key)) == TERMKEY_SYM_NONE) { + termkey_result ret; + while((ret = termkey_getkey(tk, key)) == TERMKEY_RES_NONE) { termkey_advisereadable(tk); } @@ -362,7 +361,7 @@ void termkey_advisereadable(termkey_t *tk) // Must be kept synchronised with enum termkey_sym_e in termkey.h const char *keynames[] = { - "None", + "NONE", // Special names in C0 "Backspace", @@ -425,10 +424,7 @@ const char *keynames[] = { const char *termkey_describe_sym(int code) { - if(code == -1) - return "EOF"; - - if(code == -2) + if(code == TERMKEY_SYM_UNKNOWN) return "UNKNOWN"; if(code < sizeof(keynames)/sizeof(keynames[0])) diff --git a/termkey.h b/termkey.h index a99e428..202fff6 100644 --- a/termkey.h +++ b/termkey.h @@ -5,9 +5,8 @@ #include typedef enum { - TERMKEY_SYM_EOF = -1, // Stream closed - TERMKEY_SYM_UNKNOWN = -2, - TERMKEY_SYM_NONE = 0, // Did not find a key + TERMKEY_SYM_UNKNOWN = -1, + TERMKEY_SYM_NONE = 0, // Special names in C0 TERMKEY_SYM_BACKSPACE, @@ -68,7 +67,13 @@ typedef enum { TERMKEY_SYM_KPEQUALS, // et cetera ad nauseum -} termkey_sym_e; +} termkey_sym; + +typedef enum { + TERMKEY_RES_NONE, + TERMKEY_RES_KEY, + TERMKEY_RES_EOF, +} termkey_result; enum { TERMKEY_KEYFLAG_SPECIAL = 0x01, // 'code' is a special keycode, not a unicode codepoint @@ -100,8 +105,8 @@ enum { termkey_t *termkey_new(int fd, int flags); void termkey_free(termkey_t *tk); -int termkey_getkey(termkey_t *tk, termkey_key *key); -int termkey_waitkey(termkey_t *tk, termkey_key *key); +termkey_result termkey_getkey(termkey_t *tk, termkey_key *key); +termkey_result termkey_waitkey(termkey_t *tk, termkey_key *key); void termkey_pushinput(termkey_t *tk, unsigned char *input, size_t inputlen);