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)