This library allows easy processing of keyboard entry from terminal-based programs. It handles all the necessary logic to recognise special keys, UTF-8 combining, and so on, with a simple interface.
The library itself comes with a complete collection of manpages that explain the full detail of the functions used. A brief overview will be given here.
Consider the following demonstration program that just prints pressed keys:
#include <stdio.h>
#include "termkey.h"
int main(int argc, char *argv[]) {
char buffer[50];
TermKey *tk = termkey_new(0, 0);
if(!tk) {
fprintf(stderr, "Cannot allocate termkey instance\n");
exit(1);
}
TermKeyResult ret;
TermKeyKey key;
while((ret = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) {
termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_VIM);
printf("You pressed key %s\n", buffer);
if(key.type == TERMKEY_TYPE_UNICODE &&
key.modifiers & TERMKEY_KEYMOD_CTRL &&
(key.code.codepoint == 'C' || key.code.codepoint == 'c'))
break;
}
termkey_destroy(tk);
}
The four functions used here are:
TermKey *termkey_new(int fd, int flags);
Construct a new TermKey instance, to wrap the file descriptor given in fd, using the given flags. The default flags implied by 0 are usually sufficient for most purposes.
TermKeyResult termkey_waitkey(TermKey *tk, TermKeyKey *key);
Synchronously block on terminal input, and return as soon as a key is pressed. Details of the keypress will be put in the key structure provided. This structure is declared as:
typedef struct {
TermKeyType type;
union {
long codepoint; /* TERMKEY_TYPE_UNICODE */
int number; /* TERMKEY_TYPE_FUNCTION */
TermKeySym sym; /* TERMKEY_TYPE_KEYSYM */
char mouse[4]; /* TERMKEY_TYPE_MOUSE
opaque. see termkey_interpret_mouse */
} code;
int modifiers;
char utf8[7];
} TermKeyKey;
size_t termkey_strfkey(TermKey *tk, char *buffer, size_t len,
TermKeyKey key, TermKeyFormat format);
Format a string buffer to contain a string description of the keypress. Similar in operation to snprintf() or strftime().
void termkey_destroy(TermKey *tk);
Frees the memory used by the TermKey instance, and restore the terminal back to its original state.