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

  
 
  

home | help
TERMKEY(7)		Miscellaneous Information Manual	      TERMKEY(7)

NAME
     termkey - terminal keypress reading library

DESCRIPTION
     termkey  is  a  library that allows programs to read and interpret keypress
     and other events from a terminal. It understands encoding schemes	used  by
     terminals	to  encode  keypresses, and UTF-8 , allowing it to return events
     representing key events.

     termkey operates in a pseudo object-oriented fashion. It provides one func-
     tion, termkey_new(3), that returns a pointer to  a  newly-allocated  struc-
     ture. All other functions take this pointer as their first argument. A typ-
     ical  use	of this library would consist of a call to termkey_new() to con-
     struct a  new  instance  to  represent  the  stdin  stream,  then	use  the
     termkey_waitkey(3) function to wait for and interpret key press events. The
     termkey_destroy(3) function can be used to deallocate resources used by the
     instance if the program has finished using it.

   Reading Events
     Each  instance  of  a termkey structure may be used in one of three ways by
     the program. It may be used synchronously, blocking to wait for  keypresses
     from  a  filehandle. It may be used asynchronously, returning keypresses if
     they are available, while co-operating with a non-blocking program.  Or  it
     may  be used abstractly, interpreting key press bytes fed to it directly by
     the containing program.

     To  obtain  the  next  key  event	synchronously,	a   program   may   call
     termkey_waitkey(3).  This	will  either  return  an event from its internal
     buffer, or block until a key is available, returning it when it  is  ready.
     It  behaves  similarly to getc(3), fgetc(3), or similar, except that it un-
     derstands and returns entire key press events, rather than single bytes.

     To work with  an  asynchronous  program,  two  other  functions  are  used.
     termkey_advisereadable(3) informs a termkey instance that more bytes of in-
     put may be available from its file handle, so it should call read(2) to ob-
     tain them. The program can then call termkey_getkey(3) to extract key press
     events out of the internal buffer, in a way similar to termkey_waitkey().

     Finally,  bytes  of input can be fed into the termkey instance directly, by
     calling termkey_push_bytes(3). This may be useful if the bytes have already
     been read from the terminal by the application, or even in situations  that
     don't  directly involve a terminal filehandle. Because of these situations,
     it is possible to construct a termkey instance not associated with  a  file
     handle, by passing -1 as the file descriptor.

     A	termkey  instance contains a buffer of pending bytes that have been read
     but not yet consumed by termkey_getkey(3).  termkey_get_buffer_remaining(3)
     returns the number of bytes of buffer space currently free in the instance.
     termkey_set_buffer_size(3)  and  termkey_get_buffer_size(3)  can be used to
     control and return the total size of this buffer.

   Key Events
     Key events are stored in structures. Each structure holds	details  of  one
     key event. This structure is defined as follows.

	 typedef struct {
	     TermKeyType type;
	     union {
		 long	    codepoint; /* TERMKEY_TYPE_UNICODE	*/
		 int	    number;    /* TERMKEY_TYPE_FUNCTION */
		 TermKeySym sym;       /* TERMKEY_TYPE_KEYSYM	*/
	     } code;
	     int modifiers;
	     char utf8[7];
	 } TermKeyKey;

     The  type	field  indicates  the type of event, and determines which of the
     members of the code union is valid. It will be one of  the  following  con-
     stants:

     TERMKEY_TYPE_UNICODE
	    a  Unicode	codepoint.  This  value indicates that code.codepoint is
	    valid, and will contain the codepoint number  of  the  keypress.  In
	    Unicode  mode (if the TERMKEY_FLAG_UTF8 bit is set) this will be its
	    Unicode character number. In raw byte mode, this will contain a sin-
	    gle 8-bit byte.

     TERMKEY_TYPE_FUNCTION
	    a numbered function key. This value indicates  that  code.number  is
	    valid, and contains the number of the numbered function key.

     TERMKEY_TYPE_KEYSYM
	    a  symbolic  key.  This  value indicates that code.sym is valid, and
	    contains the symbolic key value.

     TERMKEY_TYPE_MOUSE
	    a mouse button press,  release,  or  movement.  The  code  structure
	    should  be considered opaque; termkey_interpret_mouse(3) may be used
	    to interpret it.

     TERMKEY_TYPE_POSITION
	    a cursor position report. The code structure  should  be  considered
	    opaque; termkey_interpret_position(3) may be used to interpret it.

     TERMKEY_TYPE_MODEREPORT
	    an	ANSI or DEC mode value report. The code structure should be con-
	    sidered opaque; termkey_interpret_modereport(3) may be used  to  in-
	    terpret it.

     TERMKEY_TYPE_DCS
	    a  DCS  sequence including its terminator. The code structure should
	    be considered opaque; termkey_interpret_string(3) may be used to in-
	    terpret it.

     TERMKEY_TYPE_OSC
	    a OSC sequence including its terminator. The code  structure  should
	    be considered opaque; termkey_interpret_string(3) may be used to in-
	    terpret it.

     TERMKEY_TYPE_UNKNOWN_CSI
	    an	unrecognised  CSI sequence. The code structure should be consid-
	    ered opaque; termkey_interpret_csi(3) may be used to interpret it.

     The modifiers  bitmask  is  composed  of  a  bitwise-or  of  the  constants
     TERMKEY_KEYMOD_SHIFT, TERMKEY_KEYMOD_CTRL and TERMKEY_KEYMOD_ALT.

     The utf8 field is only set on events whose type is TERMKEY_TYPE_UNICODE. It
     should not be read for other events.

     Key  events  that represent special keys (type is TERMKEY_TYPE_KEYSYM) have
     with them as symbolic value that identifies the special key,  in  code.sym.
     termkey_get_keyname(3)  may  be  used  to	turn  this symbolic value into a
     string, and termkey_lookup_keyname(3) may be used to turn string names into
     symbolic values.

     A pair of functions are also provided to convert  between	key  events  and
     strings.  termkey_strfkey(3)  converts  a	key  event  into  a  string, and
     termkey_strpkey(3) parses a string turning it into a key event.

     Key events may be compared for equality or ordering by  using  termkey_key-
     cmp(3).

   Control Flags
     Details  of  the behaviour of a termkey instance are controlled by two bit-
     masks of flags. termkey_set_flags(3) and termkey_get_flags(3) set or return
     the flags used to control the  general  behaviour,  and  termkey_set_canon-
     flags(3) and termkey_get_canonflags(3) set or return the flags that control
     the  key  value  canonicalisation	behaviour  performed  by termkey_canoni-
     calise(3).

     The following control flags are recognised.

     TERMKEY_FLAG_NOINTERPRET
	    Do not attempt to interpret C0 codes into  keysyms.  Instead  report
	    them as plain Ctrl-letter events.

     TERMKEY_FLAG_CONVERTKP
	    Convert  xterm's  alternative  keypad  symbols  into the plain ASCII
	    codes they would represent.

     TERMKEY_FLAG_RAW
	    Ignore locale settings; do not attempt to recombine UTF-8 sequences.
	    Instead report only raw values.

     TERMKEY_FLAG_UTF8
	    Ignore locale settings; force UTF-8 recombining on. This flag  over-
	    rides TERMKEY_FLAG_RAW.

     TERMKEY_FLAG_NOTERMIOS
	    Even  if the terminal file descriptor fd represents a TTY device, do
	    not call the tcsetattr(3) termios function on it to set it to canon-
	    ical input mode.

     TERMKEY_FLAG_SPACESYMBOL
	    Report space as being a symbolic key rather  than  a  Unicode  code-
	    point.  Setting  or  clearing  this  flag in fact sets or clears the
	    TERMKEY_CANON_SPACESYMBOL canonicalisation flag.

     TERMKEY_FLAG_CTRLC
	    Disable the SIGINT behaviour of Ctrl-C. If this  flag  is  provided,
	    then  Ctrl-C  will	be  available  as a normal keypress, rather than
	    sending the process group a SIGINT.  This  flag  only  takes  effect
	    without TERMKEY_FLAG_NOTERMIOS; with it, none of the signal keys are
	    disabled anyway.

     TERMKEY_FLAG_EINTR
	    Without  this  flag, IO operations are retried when interrupted by a
	    signal (EINTR). With this flag the TERMKEY_RES_ERROR result  is  re-
	    turned instead.

     TERMKEY_FLAG_NOSTART
	    This   flag   is   only  meaningful  to  the  constructor  functions
	    termkey_new(3) and termkey_new_abstract(3). If set, the  constructor
	    will  not call termkey_start(3) as part of the construction process.
	    The user must call that at some future time before the instance will
	    be usable.

     The following canonicalisation flags are recognised.

     TERMKEY_CANON_SPACESYMBOL
	    If this flag is set then a Unicode space  character  is  represented
	    using  the	TERMKEY_SYM_SPACE symbol. If this flag is not set, it is
	    represented by the U+0020 Unicode codepoint.

     TERMKEY_CANON_DELBS
	    If this flag is set then an ASCII DEL character  is  represented  by
	    the  TERMKEY_SYM_BACKSPACE	symbol.  If  not,  it  is represented by
	    TERMKEY_SYM_DEL. An ASCII BS  character  is  always  represented  by
	    TERMKEY_SYM_BACKSPACE, regardless of this flag.

   Multi-byte Events
     Special  keys, mouse events, and UTF-8 encoded Unicode text, are all repre-
     sented by more than one byte. If the start of a multi-byte sequence is seen
     by termkey_waitkey() it will wait a short time to see if the  remainder  of
     the  sequence  arrives. If the sequence remains unfinished after this time-
     out, it will be returned in its incomplete state. Partial escape  sequences
     are  returned  as	an  Escape key (TERMKEY_SYM_ESCAPE) followed by the text
     contained in the sequence. Partial UTF-8 sequences are returned as the Uni-
     code replacement character, U+FFFD.

     The amount  of  time  that  the  termkey  instance  will  wait  is  set  by
     termkey_set_waittime(3),  and  is returned by termkey_get_waittime(3). Ini-
     tially it will be set to 50 miliseconds.

   Mouse Events
     The TERMKEY_TYPE_MOUSE event type indicates a mouse event. The  code  field
     of  the  event structure should be considered opaque, though modifiers will
     be valid. In  order  to  obtain  the  details  of	the  mouse  event,  call
     termkey_interpret_mouse(3)  passing the event structure and pointers to in-
     tegers to store the result in.

     termkey recognises three mouse protocols: the original X10 protocol (CSI  M
     followed  by three bytes), SGR encoding (CSI < ... M, as requested by CSI ?
     1006 h), and rxvt encoding (CSI ... M, as requested by CSI ? 1015 h). Which
     encoding is in use is inferred automatically by termkey, and does not  need
     to be specified explicitly.

   Position Events
     The  TERMKEY_TYPE_POSITION  event	type indicates a cursor position report.
     This is typically sent by a terminal in response to the Report Cursor Posi-
     tion command (CSI ? 6 n). The event bytes are opaque, but can  be	obtained
     by  calling  termkey_interpret_position(3)  passing the event structure and
     pointers to integers to store the result in. Note that only a DEC	CPR  se-
     quence  (CSI ? R) is recognised, and not the non-DEC prefixed CSI R because
     the latter could be interpreted as the F3 function key instead.

   Mode Reports
     The TERMKEY_TYPE_MODEREPORT event type indicates an ANSI or  DEC  mode  re-
     port.  This is typically sent by a terminal in response to the Request Mode
     command (CSI $p or CSI ? $p). The event bytes are opaque, but  can  be  ob-
     tained  by calling termkey_interpret_modereport(3) passing the event struc-
     ture and pointers to integers to store the result in.

   Control Strings
     The TERMKEY_TYPE_DCS and TERMKEY_TYPE_OSC event types indicate a DCS or OSC
     control string. These are typically sent by the  terminal	in  response  of
     similar  kinds  of  strings  being  sent as queries by the application. The
     event bytes are opaque, but the body of the string itself can  be	obtained
     by  calling termkey_interpret_string(3) immediately after this event is re-
     ceived. The underlying termkey instance itself can only store  one  pending
     string, so the application should be sure to call this function in a timely
     manner  soon after the event is received; at the very least, before calling
     any other functions that will insert bytes into or remove key  events  from
     the instance.

   Unrecognised CSIs
     The  TERMKEY_TYPE_UNKNOWN_CSI  event type indicates a CSI sequence that the
     termkey does not recognise. It will have been extracted  from  the  stream,
     but  is  available  to the application to inspect by calling termkey_inter-
     pret_csi(3). It is important that if the application wishes to inspect this
     sequence it is done immediately, before any  other  IO  operations  on  the
     termkey   instance   (specifically,  before  calling  termkey_waitkey()  or
     termkey_getkey() again), otherwise the buffer space  consumed  by	the  se-
     quence  will  be  overwritten.  Other types of key event do not suffer this
     limitation as the TermKeyKey structure is sufficient to contain all the in-
     formation required.

SEE ALSO
     termkey_new(3), termkey_waitkey(3), termkey_getkey(3)

								      TERMKEY(7)

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

home | help