Provided by: libtermkey-dev_0.22-2_amd64 bug

NAME

       termkey_getkey, termkey_getkey_force - retrieve the next key event

SYNOPSIS

       #include <termkey.h>

       TermKeyResult termkey_getkey(TermKey *tk, TermKeyKey *key);
       TermKeyResult termkey_getkey_force(TermKey *tk, TermKeyKey *key);

       Link with -ltermkey.

DESCRIPTION

       termkey_getkey()  attempts  to  retrieve a single keypress event from the termkey(7) instance buffer, and
       put it in the structure referred to by key. It returns one of the following values:

       TERMKEY_RES_KEY
              a complete keypress was removed from the buffer, and has been placed in the key structure.

       TERMKEY_RES_AGAIN
              a partial keypress event was found in the buffer, but it  does  not  yet  contain  all  the  bytes
              required.  An  indication  of  what termkey_getkey_force() would return has been placed in the key
              structure.

       TERMKEY_RES_NONE
              no bytes are waiting in the buffer.

       TERMKEY_RES_EOF
               no bytes are ready and the input stream is now closed.

       TERMKEY_RES_ERROR
              called with terminal IO stopped, due to termkey_stop(3). In this case errno will be set to EINVAL.

       termkey_getkey_force() is similar to termkey_getkey() but will not return TERMKEY_RES_AGAIN if a  partial
       match  is  found.  Instead, it will force an interpretation of the bytes, even if this means interpreting
       the start of an Escape-prefixed multi-byte sequence as a literal Escape key followed by normal letters.

       Neither of these functions will block or perform any IO operations on the underlying filehandle.  To  use
       the  instance in an asynchronous program, see termkey_advisereadable(3). For a blocking call suitable for
       use in a synchronous program, use termkey_waitkey(3) instead of  termkey_getkey().  For  providing  input
       without a readable filehandle, use termkey_push_bytes(3).

       Before  returning,  this  function  canonicalises  the  key  structure  according  to the rules given for
       termkey_canonicalise(3).

RETURN VALUE

       termkey_getkey() returns an enumeration of one of TERMKEY_RES_KEY,  TEMRKEY_RES_AGAIN,  TERMKEY_RES_NONE,
       TERMKEY_RES_EOF  or  TERMKEY_RES_ERROR.  termkey_getkey_force()  returns  one  of  the  above, except for
       TERMKEY_RES_AGAIN.

EXAMPLE

       The following example program prints details  of  every  keypress  until  the  user  presses  Ctrl-C.  It
       demonstrates  how to use the termkey instance in a typical poll(2)-driven asynchronous program, which may
       include mixed IO with other file handles.

           // <poll.h> might need this for sigset_t
           #define _XOPEN_SOURCE 600

           #include <poll.h>
           #include <stdio.h>

           #include "termkey.h"

           static void on_key(TermKey *tk, TermKeyKey *key)
           {
             char buffer[50];
             termkey_strfkey(tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM);
             printf("%s\n", buffer);
           }

           int main(int argc, char *argv[])
           {
             TERMKEY_CHECK_VERSION;

             TermKey *tk = termkey_new(0, 0);

             if(!tk) {
               fprintf(stderr, "Cannot allocate termkey instance\n");
               exit(1);
             }

             struct pollfd fd;

             fd.fd = 0; /* the file descriptor we passed to termkey_new() */
             fd.events = POLLIN;

             TermKeyResult ret;
             TermKeyKey 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_UNICODE &&
                    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);
           }

SEE ALSO

       termkey_advisereadable(3), termkey_waitkey(3), termkey_get_waittime(3), termkey(7)

                                                                                               TERMKEY_GETKEY(3)