termo/demo-async.c

74 lines
1.4 KiB
C

// <poll.h> might need this for sigset_t
#define _XOPEN_SOURCE 600
#include <poll.h>
#include <stdio.h>
#include <unistd.h>
#include <locale.h>
#include "termkey.h"
static void
on_key (termkey_t *tk, termkey_key_t *key)
{
char buffer[50];
termkey_strfkey (tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM);
printf ("%s\n", buffer);
}
int
main (int argc, char *argv[])
{
(void) argc;
(void) argv;
TERMKEY_CHECK_VERSION;
setlocale (LC_CTYPE, "");
termkey_t *tk = termkey_new (STDIN_FILENO, NULL, 0);
if (!tk)
{
fprintf (stderr, "Cannot allocate termkey instance\n");
exit (1);
}
struct pollfd fd;
fd.fd = STDIN_FILENO; /* the file descriptor we passed to termkey_new() */
fd.events = POLLIN;
termkey_result_t ret;
termkey_key_t key;
int running = 1;
int nextwait = -1;
while (running)
{
if (poll (&fd, 1, nextwait) == 0)
// Timed out
if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY)
on_key (tk, &key);
if (fd.revents & (POLLIN | POLLHUP | POLLERR))
termkey_advisereadable (tk);
while ((ret = termkey_getkey (tk, &key)) == TERMKEY_RES_KEY)
{
on_key (tk, &key);
if (key.type == TERMKEY_TYPE_KEY
&& (key.modifiers & TERMKEY_KEYMOD_CTRL)
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
running = 0;
}
if (ret == TERMKEY_RES_AGAIN)
nextwait = termkey_get_waittime (tk);
else
nextwait = -1;
}
termkey_destroy (tk);
}