Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
TERMKEY_GETKEY(3)	   Library Functions Manual	     TERMKEY_GETKEY(3)

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 re-
       turn 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 pro-
       gram, 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 accord-
       ing to the rules	given for termkey_canonicalise(3).

RETURN VALUE
       termkey_getkey()	returns	an enumeration of one of TERMKEY_RES_KEY, TEM-
       RKEY_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 in-
       stance in a typical poll(2)-driven asynchronous program,	which may  in-
       clude 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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=termkey_getkey&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help