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

  
 
  

home | help
notcurses_input(3)					      notcurses_input(3)

NAME
     notcurses_input - input via notcurses

SYNOPSIS
     #include <notcurses/notcurses.h>

	    struct timespec;
	    struct notcurses;

	    typedef enum {
	      NCTYPE_UNKNOWN,
	      NCTYPE_PRESS,
	      NCTYPE_REPEAT,
	      NCTYPE_RELEASE,
	    } ncintype_e;

	    // An input event. Cell coordinates are currently defined only for mouse
	    // events. It is not guaranteed that we can set the modifiers for a given
	    // ncinput. We encompass single Unicode codepoints, not complete EGCs.
	    // FIXME for abi4, combine the bools into |modifiers|
	    typedef struct ncinput {
	      uint32_t id;	 // Unicode codepoint or synthesized NCKEY event
	      int y, x; 	 // y/x cell coordinate of event, -1 for undefined
	      char utf8[5];	 // utf8 representation, if one exists
	      // DEPRECATED do not use! going away in 4.0
	      bool alt; 	 // was alt held?
	      bool shift;	 // was shift held?
	      bool ctrl;	 // was ctrl held?
	      // END DEPRECATION
	      ncintype_e evtype;
	      unsigned modifiers;// bitmask over NCKEY_MOD_*
	      int ypx, xpx;	 // pixel offsets within cell, -1 for undefined
	      uint32_t eff_text[5];  // Effective utf32 representation, taking
				 // modifier keys into account. This can be multiple
				 // codepoints. Array is zero-terminated.
	    } ncinput;

	    #define NCMICE_NO_EVENTS	 0
	    #define NCMICE_MOVE_EVENT	 0x1
	    #define NCMICE_BUTTON_EVENT  0x2
	    #define NCMICE_DRAG_EVENT	 0x4
	    #define NCMICE_ALL_EVENTS	 0x7

     bool nckey_mouse_p(uint32_t r);

     bool ncinput_nomod_p(const ncinput* ni);

     uint32_t  notcurses_get(struct notcurses* n, const struct timespec* ts, nc-
     input* ni);

     int notcurses_getvec(struct notcurses* n, const struct timespec* ts,  ncin-
     put* ni, int vcount);

     uint32_t notcurses_get_nblock(struct notcurses* n, ncinput* ni);

     uint32_t notcurses_get_blocking(struct notcurses* n, ncinput* ni);

     int notcurses_mice_enable(struct notcurses* n, unsigned eventmask);

     int notcurses_mice_disable(struct notcurses* n);

     int notcurses_inputready_fd(struct notcurses* n);

     static inline bool ncinput_equal_p(const ncinput* n1, const ncinput* n2);

     int notcurses_linesigs_disable(struct notcurses* n);

     int notcurses_linesigs_enable(struct notcurses* n);

     bool ncinput_shift_p(const struct ncinput* n);

     bool ncinput_ctrl_p(const struct ncinput* n);

     bool ncinput_alt_p(const struct ncinput* n);

     bool ncinput_meta_p(const struct ncinput* n);

     bool ncinput_super_p(const struct ncinput* n);

     bool ncinput_hyper_p(const struct ncinput* n);

DESCRIPTION
     notcurses supports input from keyboards and mice, and any device that looks
     like  them.  Mouse support requires a broker such as GPM, Wayland, or Xorg,
     and must be explicitly enabled via notcurses_mice_enable.	The full  32-bit
     range  of	Unicode  is  supported (see unicode(7)), with synthesized events
     mapped above the 1,114,112 codepoints of Unicode 14.0's  seventeen  Planes.
     Unicode  characters  are  returned  directly  as UCS-32, one codepoint at a
     time.  When the input has a UTF8 representation, it  is  written  to  utf8;
     this field is always NUL-terminated.

     notcurses	takes  its  keyboard input from stdin, which will be placed into
     non-blocking mode for the duration of operation.  The terminal is put  into
     non-canonical  mode  (see	termios(3)),  and thus keys are received without
     line-buffering.  notcurses maintains its own buffer  of  input  characters,
     which it will attempt to fill whenever it reads.

     notcurses_get allows a struct timespec to be specified as a timeout.  If ts
     is  NULL,	notcurses_get will block until it reads input, or is interrupted
     by a signal.  If its values are zeroes, there will be no blocking.   Other-
     wise, ts specifies an absolute deadline (taken against CLOCK_MONOTONIC; see
     clock_gettime(2)).   On  timeout, 0 is returned.  Event details will be re-
     ported in ni, unless ni is NULL.

     notcurses_inputready_fd provides a file descriptor suitable  for  use  with
     I/O  multiplexors such as poll(2).  This file descriptor might or might not
     be the actual input file descriptor.  If it readable, notcurses_get can  be
     called without the possibility of blocking.

     ncinput_equal_p  compares	two ncinput structs for data equality (i.e.  not
     considering padding), returning true  if  they  represent	the  same  input
     (though  not  necessarily	the same input event).	Note that NCTYPE_UNKNOWN
     and NCTYPE_PRESS are  considered  equivalent  for	the  purposes  of  ncin-
     put_equal_p.

     notcurses_linesigs_disable  disables conversion of inputs INTR, QUIT, SUSP,
     and DSUSP into SIGINT, SIGQUIT, and SIGTSTP.  These conversions are enabled
     by default.  notcurses_linesigs_enable undoes this action, but  signals  in
     the interim are permanently lost.

     ncinput_shift_p,  ncinput_ctrl_p,	ncinput_alt_p, and ncinput_meta_p test n
     to see if the relevant modifier is set.  This is preferably to directly ac-
     cessing the struct members.

   Mice
     For mouse events, the additional fields y, x, ypx, and xpx are set.   These
     fields are not meaningful for keypress events.  Mouse events can be distin-
     guished  using  the  nckey_mouse_p  predicate.   NCMICE_MOVE_EVENT requests
     events  whenever  the  mouse  moves  when	no  buttons   are   held   down.
     NCMICE_DRAG_EVENT	requests  events  when	the mouse is moving with buttons
     held down.  NCMICE_BUTTON_EVENT  requests	events	then  the  button  state
     changes.  NCMICE_ALL_EVENTS is provided for convenience and future-proofing
     against API (though not ABI) changes.

   Synthesized keypresses
     Many  keys do not have a Unicode representation, let alone ASCII.	Examples
     include the modifier keys (Alt, Meta, etc.), the "function" keys,	and  the
     arrow keys on the numeric keypad.	The special keys available to the termi-
     nal are defined in the terminfo(5) entry, which notcurses loads on startup.
     Upon  receiving  an  escape  code	matching  a  terminfo  input capability,
     notcurses synthesizes a special value.  An escape sequence must  arrive  in
     its  entirety to notcurses; running out of input in the middle of an escape
     sequence will see it rejected.  Likewise, any error while handling  an  es-
     cape  sequence  will  see the lex aborted, and the sequence thus far played
     back as independent literal keystrokes.

     The full list of synthesized keys (there are well over one hundred) can  be
     found in <notcurses/notcurses.h>.	For more details, consult terminfo(5).

   NCKEY_RESIZE
     Unless  the  SIGWINCH  handler  has  been	inhibited  (see notcurses_init),
     Notcurses will  automatically  catch  screen  resizes,  and  synthesize  an
     NCKEY_RESIZE   event.   Upon  receiving  this  event,  the  user  may  call
     notcurses_refresh to force an immediate reflow, or just wait until the next
     call to notcurses_render, when notcurses will pick up  the  resize  itself.
     If the SIGWINCH handler is inhibited, NCKEY_RESIZE is never generated.

   NCKEY_SIGNAL
     Unless  the  SIGWINCH  handler  has  been	inhibited  (see notcurses_init),
     Notcurses will catch SIGCONT, and synthesize an NCKEY_SIGNAL  event.   This
     typically	indicates that the program has been restarted after being paused
     or placed in the background.  The next rasterization will be a full rebuild
     of the screen, as if notcurses_refresh had been called; the user might wish
     to immediately call notcurses_refresh themselves.

   NCKEY_EOF
     Upon reaching the end of input, NCKEY_EOF will be returned.  At this point,
     any further calls will immediately return NCKEY_EOF.  Note that  this  does
     not necessarily result from pressing e.g.	Ctrl+D.

RETURN VALUES
     On  error,  the  get family of functions return (uint32_t)-1.  The cause of
     the error may be determined using errno(3).  Unless the error was a  tempo-
     rary  one	(especially  e.g.  EINTR), notcurses_get probably cannot be use-
     fully called forthwith.  On a  timeout,  0  is  returned.	 Otherwise,  the
     UCS-32 value of a Unicode codepoint, or a synthesized event, is returned.

     If  an  error is encountered before notcurses_getvec has read any input, it
     will return -1.  If it times out before reading any input, it  will  return
     0.  Otherwise, it returns the number of ncinput objects written back.

     notcurses_mice_enable  returns  0	on  success, and non-zero on failure, as
     does notcurses_mice_disable.  Success does  not  necessarily  mean  that  a
     mouse is available nor that all requested events will be generated.

     ncinput_equal_p  returns true if the two ncinput structs represent the same
     input (though not necessarily the same input event), and false otherwise.

NOTES
     Like any other notcurses function, it is an  error  to  call  notcurses_get
     during or after a call to notcurses_stop.	If a thread is always sitting on
     blocking input, it can be tricky to guarantee that this doesn't happen.

     Only  one	thread	may call into the input stack at once, but unlike almost
     every other function in notcurses, notcurses_get and friends can be  called
     concurrently with notcurses_render.

     Do  not  simply  poll the file descriptor associated with stdin to test for
     input  readiness.	 Instead,  use	 the   file   descriptor   returned   by
     notcurses_inputready_fd  to  ensure  compatibility  with future versions of
     Notcurses (it is possible that future versions will process input in  their
     own contexts).

     The full list of synthesized events is available in <notcurses/nckeys.h>.

     In  API4, the various bool modifier fields will go away, and these statuses
     will be merged into the modifiers bitmask.  You are encouraged to use ncin-
     put_shift_p and friends to future-proof your code.

BUGS
     Notcurses attempts to use the XTMODKEYS and Kitty	keyboard  disambiguation
     protocols.  When supported, they eliminate most of these issues.

     The  Shift  key  is traditionally not indicated in conjunction with typical
     Unicode text.  If e.g.  Shift is used to generate a capital letter 'A',  id
     will  equal  'A', and shift will be false.  Similarly, when Ctrl is pressed
     along with a letter, the letter will currently always be  reported  in  its
     uppercase form.  E.g., if Shift, Ctrl, and 'a' are all pressed, this is in-
     distinguishable from Ctrl and 'A'.

     Ctrl  pressed  along with 'J' or 'M', whether Shift is pressed or not, cur-
     rently registers as NCKEY_ENTER.  This will likely change in the future.

     When the Kitty keyboard disambiguation protocol is used, most of these  is-
     sues are resolved.  You can determine whether the protocol is in use by ex-
     amining the output of notcurses-info(1).  If the kbd property is indicated,
     you're using the Kitty protocol.

     Note  that eff_text will always return the effective text value of the key,
     taking into account any meta keys pressed.  (So shift-a will always  return
     'A'  in this field, regardless of if the Kitty keyboard disambiguation pro-
     tocol is used.)  This field generally only can be trusted	on  NCTYPE_PRESS
     and  NCTYPE_REPEAT  events, however.  Also note that this is a (zero-termi-
     nated) array as it can return multiple codepoints.

     Mouse events in the left margins will never be delivered to the application
     (as is intended), but mouse events in the bottom and  right  margins  some-
     times can be if the event occurs prior to a window resize.

     The  ypx  and  xpx  fields are never currently valid (i.e.  they are always
     -1).  This ought be fixed in the future using the SGR PixelMode mouse  pro-
     tocol.

     On some operating systems, CLOCK_REALTIME is used as the basis for timeouts
     instead of CLOCK_MONOTONIC.  This ought be fixed.

SEE ALSO
     notcurses-info(1),  clock_gettime(2),  poll(2), notcurses(3), notcurses_re-
     fresh(3),	notcurses_render(3),  termios(3),  terminfo(5),  ascii(7),  sig-
     nal(7), unicode(7)

AUTHORS
     nick black nickblack@linux.com

				     v3.0.16		      notcurses_input(3)

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

home | help