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

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 function, termkey_new(3), that
       returns a pointer to a newly-allocated structure. All other functions take this pointer  as  their  first
       argument.  A  typical  use  of  this  library would consist of a call to termkey_new() to construct 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 understands 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  input  may be available from its file handle, so it should call
       read(2) to obtain 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 constants:

       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 single 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   considered   opaque;
              termkey_interpret_modereport(3) may be used to interpret 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 interpret 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 interpret it.

       TERMKEY_TYPE_UNKNOWN_CSI
              an    unrecognised   CSI   sequence.   The   code   structure   should   be   considered   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_keycmp(3).

   Control Flags
       Details   of   the   behaviour   of  a  termkey  instance  are  controlled  by  two  bitmasks  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_canonflags(3)  and  termkey_get_canonflags(3)  set  or return the flags that
       control the key value canonicalisation behaviour performed by termkey_canonicalise(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 overrides 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 canonical input mode.

       TERMKEY_FLAG_SPACESYMBOL
              Report  space  as  being  a symbolic key rather than a Unicode codepoint. 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 returned 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 represented 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 timeout, 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 Unicode 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). Initially 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 integers 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 Position 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 sequence (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 report. 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  obtained  by calling termkey_interpret_modereport(3) passing the event structure 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 received. 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_interpret_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 sequence will be
       overwritten.  Other  types  of  key  event  do  not suffer this limitation as the TermKeyKey structure is
       sufficient to contain all the information required.

SEE ALSO

       termkey_new(3), termkey_waitkey(3), termkey_getkey(3)

                                                                                                      TERMKEY(7)