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

FreeBSD Manual Pages

  
 
  

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
	      }	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,
       ncinput*	ni);

       int notcurses_getvec(struct notcurses* n, const	struct	timespec*  ts,
       ncinput*	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 syn-
       thesized	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 in-
       to non-blocking mode for	the duration of	operation.   The  terminal  is
       put  into  non-canonical	 mode  (see termios(3)), and thus keys are re-
       ceived 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 in-
       terrupted by a signal.  If its values are  zeroes,  there  will	be  no
       blocking.   Otherwise, ts specifies an absolute deadline	(taken against
       CLOCK_MONOTONIC;	see clock_gettime(2)).	On  timeout,  0	 is  returned.
       Event details will be reported 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 in-
       put  (though  not  necessarily  the  same  input	event).	 Note that NC-
       TYPE_UNKNOWN and	NCTYPE_PRESS are considered equivalent for the purpos-
       es of ncinput_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 di-
       rectly accessing	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 distinguished	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.	 Exam-
       ples  include the modifier keys (Alt, Meta, etc.), the "function" keys,
       and the arrow keys on the numeric keypad.  The special  keys  available
       to  the	terminal 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 se-
       quence  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 escape sequence will see the lex aborted,
       and the sequence	thus far  played  back	as  independent	 literal  key-
       strokes.

       The full	list of	synthesized keys (there	are well over one hundred) can
       be found	in <notcurses/notcurses.h>.  For more details, consult termin-
       fo(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 be-
       ing 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
       temporary  one  (especially e.g.	 EINTR), notcurses_get probably	cannot
       be usefully called forthwith.  On a timeout, 0 is returned.  Otherwise,
       the UCS-32 value	of a Unicode codepoint,	or a synthesized event,	is re-
       turned.

       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  sit-
       ting 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 al-
       most 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/nck-
       eys.h>.

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

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

       The  Shift key is traditionally not indicated in	conjunction with typi-
       cal 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 re-
       ported in its uppercase form.  E.g., if Shift, Ctrl, and	 'a'  are  all
       pressed,	this is	indistinguishable from Ctrl and	'A'.

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

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

       Mouse  events in	the left margins will never be delivered to the	appli-
       cation (as is intended),	but mouse events in the	bottom and right  mar-
       gins sometimes 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
       protocol.

       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), notcurs-
       es_refresh(3), notcurses_render(3), termios(3), terminfo(5),  ascii(7),
       signal(7), unicode(7)

AUTHORS
       nick black <nickblack@linux.com>.

				    v3.0.8		    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+14.3.quarterly>

home | help