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

NAME

       termkey_waitkey - wait for and retrieve the next key event

SYNOPSIS

       #include <termkey.h>

       TermKeyResult termkey_waitkey(TermKey *tk, TermKeyKey *key);

       Link with -ltermkey.

DESCRIPTION

       termkey_waitkey()  attempts  to retrieve a single keypress event from the termkey(7) instance buffer, and
       put it in the structure referred to by key. If successful it will return TERMKEY_RES_KEY to indicate that
       the  structure  now contains a new keypress event. If nothing is in the buffer it will block until one is
       available. If no events are ready and the input stream is now closed, will return TERMKEY_RES_EOF. If  no
       filehandle is associated with this instance, TERMKEY_RES_ERROR is returned with errno set to EBADF.

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

       Some keypresses generate multiple bytes from the terminal. Because there may be network or  other  delays
       between  the  terminal  and  an application using termkey, termkey_waitkey() will attempt to wait for the
       remaining bytes to arrive if it detects the start of a multibyte sequence. If no more bytes arrive within
       a  certain  time,  then  the bytes will be reported as they stand, even if this results in interpreting a
       partially-complete Escape sequence as a literal Escape key followed  by  some  normal  letters  or  other
       symbols. The amount of time to wait can be set by termkey_set_waittime(3).

RETURN VALUE

       termkey_waitkey() returns one of the following constants:

       TERMKEY_RES_KEY
              A key event as been provided.

       TERMKEY_RES_EOF
              No key events are ready and the terminal has been closed, so no more will arrive.

       TERMKEY_RES_ERROR
              An  IO  error  occurred.  errno  will  be  preserved. If the error is EINTR then this will only be
              returned if TERMKEY_FLAG_EINTR flag is not set; if it is then the IO  operation  will  be  retried
              instead. If this is called with terminal IO stopped, due to termkey_stop(3) then errno will be set
              to EINVAL.

EXAMPLE

       The following example program prints details of every keypress until the user presses Ctrl-C.

           // we want optarg
           #define _XOPEN_SOURCE 600

           #include <stdio.h>
           #include <unistd.h>
           #include <errno.h>

           #include "termkey.h"

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

             int mouse = 0;
             int mouse_proto = 0;
             TermKeyFormat format = TERMKEY_FORMAT_VIM;

             char buffer[50];
             TermKey *tk;

             int opt;
             while((opt = getopt(argc, argv, "m::p:")) != -1) {
               switch(opt) {
               case 'm':
                 if(optarg)
                   mouse = atoi(optarg);
                 else
                   mouse = 1000;

                 break;

               case 'p':
                 mouse_proto = atoi(optarg);
                 break;

               default:
                 fprintf(stderr, "Usage: %s [-m]\n", argv[0]);
                 return 1;
               }
             }

             tk = termkey_new(0, TERMKEY_FLAG_SPACESYMBOL|TERMKEY_FLAG_CTRLC);

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

             if(termkey_get_flags(tk) & TERMKEY_FLAG_UTF8)
               printf("Termkey in UTF-8 mode\n");
             else if(termkey_get_flags(tk) & TERMKEY_FLAG_RAW)
               printf("Termkey in RAW mode\n");

             TermKeyResult ret;
             TermKeyKey key;

             if(mouse) {
               printf("\033[?%dhMouse mode active\n", mouse);
               if(mouse_proto)
                 printf("\033[?%dh", mouse_proto);
             }

             while((ret = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) {
               if(ret == TERMKEY_RES_KEY) {
                 termkey_strfkey(tk, buffer, sizeof buffer, &key, format);
                 if(key.type == TERMKEY_TYPE_MOUSE) {
                   int line, col;
                   termkey_interpret_mouse(tk, &key, NULL, NULL, &line, &col);
                   printf("%s at line=%d, col=%d\n", buffer, line, col);
                 }
                 else if(key.type == TERMKEY_TYPE_POSITION) {
                   int line, col;
                   termkey_interpret_position(tk, &key, &line, &col);
                   printf("Cursor position report at line=%d, col=%d\n", line, col);
                 }
                 else if(key.type == TERMKEY_TYPE_MODEREPORT) {
                   int initial, mode, value;
                   termkey_interpret_modereport(tk, &key, &initial, &mode, &value);
                   printf("Mode report %s mode %d = %d\n", initial ? "DEC" : "ANSI", mode, value);
                 }
                 else if(key.type == TERMKEY_TYPE_UNKNOWN_CSI) {
                   long args[16];
                   size_t nargs = 16;
                   unsigned long command;
                   termkey_interpret_csi(tk, &key, args, &nargs, &command);
                   printf("Unrecognised CSI %c %ld;%ld %c%c\n", (char)(command >> 8), args[0], args[1], (char)(command >> 16), (char)command);
                 }
                 else {
                   printf("Key %s\n", buffer);
                 }

                 if(key.type == TERMKEY_TYPE_UNICODE &&
                    key.modifiers & TERMKEY_KEYMOD_CTRL &&
                    (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
                   break;

                 if(key.type == TERMKEY_TYPE_UNICODE &&
                    key.modifiers == 0 &&
                    key.code.codepoint == '?') {
                   // printf("\033[?6n"); // DECDSR 6 == request cursor position
                   printf("\033[?1$p"); // DECRQM == request mode, DEC origin mode
                   fflush(stdout);
                 }
               }
               else if(ret == TERMKEY_RES_ERROR) {
                 if(errno != EINTR) {
                   perror("termkey_waitkey");
                   break;
                 }
                 printf("Interrupted by signal\n");
               }
             }

             if(mouse)
               printf("\033[?%dlMouse mode deactivated\n", mouse);

             termkey_destroy(tk);
           }

COMPATIBILITY

       This function is not available on Windows.

SEE ALSO

       termkey_getkey(3), termkey_set_waittime(3), termkey(7)

                                                                                              TERMKEY_WAITKEY(3)