2020-01-02 02:23:11 +00:00
|
|
|
% notcurses_input(3)
|
|
|
|
% nick black <nickblack@linux.com>
|
2021-10-23 10:36:18 +00:00
|
|
|
% v2.4.8
|
2020-01-02 02:23:11 +00:00
|
|
|
|
|
|
|
# NAME
|
|
|
|
|
2020-01-04 07:37:55 +00:00
|
|
|
notcurses_input - input via notcurses
|
2020-01-02 02:23:11 +00:00
|
|
|
|
|
|
|
# SYNOPSIS
|
|
|
|
|
2020-04-19 22:46:32 +00:00
|
|
|
**#include <notcurses/notcurses.h>**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
|
|
|
```c
|
2020-02-12 03:44:45 +00:00
|
|
|
struct timespec;
|
|
|
|
struct notcurses;
|
|
|
|
|
2020-01-02 02:23:11 +00:00
|
|
|
typedef struct ncinput {
|
2021-07-25 04:38:33 +00:00
|
|
|
uint32_t id; // Unicode codepoint
|
2020-01-02 02:23:11 +00:00
|
|
|
int y; // Y cell coordinate of event, -1 for undefined
|
|
|
|
int x; // X cell coordinate of event, -1 for undefined
|
|
|
|
bool alt; // Was Alt held during the event?
|
|
|
|
bool shift; // Was Shift held during the event?
|
|
|
|
bool ctrl; // Was Ctrl held during the event?
|
2021-09-20 00:13:02 +00:00
|
|
|
enum {
|
|
|
|
EVTYPE_UNKNOWN,
|
|
|
|
EVTYPE_PRESS,
|
|
|
|
EVTYPE_REPEAT,
|
|
|
|
EVTYPE_RELEASE,
|
|
|
|
} evtype;
|
2020-01-02 02:23:11 +00:00
|
|
|
} ncinput;
|
|
|
|
```
|
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
**bool nckey_mouse_p(uint32_t ***r***);**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2021-05-22 00:06:36 +00:00
|
|
|
**bool ncinput_nomod_p(const ncinput* ***ni***);**
|
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
**uint32_t notcurses_get(struct notcurses* ***n***, const struct timespec* ***ts***, ncinput* ***ni***);**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2021-09-12 07:25:37 +00:00
|
|
|
**int notcurses_getvec(struct notcurses* ***n***, const struct timespec* ***ts***, ncinput* ***ni***, int vcount);**
|
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
**uint32_t notcurses_getc_nblock(struct notcurses* ***n***, ncinput* ***ni***);**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
**uint32_t notcurses_getc_blocking(struct notcurses* ***n***, ncinput* ***ni***);**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2020-11-06 21:49:35 +00:00
|
|
|
**int notcurses_mouse_enable(struct notcurses* ***n***);**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2020-11-06 21:49:35 +00:00
|
|
|
**int notcurses_mouse_disable(struct notcurses* ***n***);**
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2020-11-06 21:49:35 +00:00
|
|
|
**int notcurses_inputready_fd(struct notcurses* ***n***);**
|
2020-05-02 16:56:39 +00:00
|
|
|
|
2021-02-12 05:19:17 +00:00
|
|
|
**static inline bool ncinput_equal_p(const ncinput* ***n1***, const ncinput* ***n2***);**
|
2020-10-15 07:14:19 +00:00
|
|
|
|
2020-12-21 01:16:08 +00:00
|
|
|
**int notcurses_linesigs_disable(struct notcurses* ***n***);**
|
|
|
|
|
|
|
|
**int notcurses_linesigs_enable(struct notcurses* ***n***);**
|
|
|
|
|
2020-01-02 02:23:11 +00:00
|
|
|
# DESCRIPTION
|
|
|
|
|
2020-01-02 03:39:16 +00:00
|
|
|
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
|
2020-05-02 16:56:39 +00:00
|
|
|
must be explicitly enabled via **notcurses_mouse_enable**. The full 32-bit
|
2020-01-02 03:39:16 +00:00
|
|
|
range of Unicode is supported (see **unicode(7)**), with synthesized events
|
2020-01-09 10:22:34 +00:00
|
|
|
mapped into the [Supplementary Private Use Area-B](https://unicode.org/charts/PDF/U1.0.10.pdf).
|
2020-01-02 03:39:16 +00:00
|
|
|
Unicode characters are returned directly as UCS-32, one codepoint at a time.
|
|
|
|
|
|
|
|
notcurses takes its keyboard input from **stdin**, which will be placed into
|
2020-12-28 14:44:44 +00:00
|
|
|
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.
|
2020-01-02 03:39:16 +00:00
|
|
|
notcurses maintains its own buffer of input characters, which it will attempt
|
|
|
|
to fill whenever it reads.
|
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
**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
|
2021-10-26 13:59:33 +00:00
|
|
|
is interrupted 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.
|
2020-01-02 03:39:16 +00:00
|
|
|
|
2020-05-02 16:56:39 +00:00
|
|
|
**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
|
2021-07-25 04:38:33 +00:00
|
|
|
be the actual input file descriptor. If it readable, **notcurses_get** can
|
2020-05-02 16:56:39 +00:00
|
|
|
be called without the possibility of blocking.
|
|
|
|
|
2020-10-15 07:14:19 +00:00
|
|
|
**ncinput_equal_p** compares two **ncinput** structs for data equality (i.e.
|
2021-09-20 00:13:02 +00:00
|
|
|
not considering padding), returning **true** if they represent the same
|
|
|
|
input (though not necessarily the same input event).
|
2020-10-15 07:14:19 +00:00
|
|
|
|
2020-12-21 01:16:08 +00:00
|
|
|
**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.
|
|
|
|
|
2020-01-02 03:39:16 +00:00
|
|
|
## Mice
|
|
|
|
|
2021-09-20 01:01:40 +00:00
|
|
|
For mouse events, the additional fields **y** and **x** are set. These
|
|
|
|
fields are not meaningful for keypress events. Mouse events can be
|
|
|
|
distinguished using the **nckey_mouse_p** predicate. Once enabled, mouse
|
|
|
|
button presses and releases are detected, as are mouse motions made while a
|
|
|
|
button is held down. If no button is depressed, mouse movement _does not
|
|
|
|
result in events_. This is known as "button-event tracking" mode in the
|
|
|
|
nomenclature of [Xterm Control Sequences](https://www.xfree86.org/current/ctlseqs.html).
|
2020-01-02 03:39:16 +00:00
|
|
|
|
|
|
|
## 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 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 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 escape 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
|
2020-04-19 22:46:32 +00:00
|
|
|
found in **<notcurses/notcurses.h>**. For more details, consult **terminfo(5)**.
|
2020-01-02 03:39:16 +00:00
|
|
|
|
|
|
|
## **NCKEY_RESIZE**
|
|
|
|
|
2020-05-02 16:56:39 +00:00
|
|
|
Unless the **SIGWINCH** handler has been inhibited (see **notcurses_init**),
|
2020-01-02 03:39:16 +00:00
|
|
|
notcurses will automatically catch screen resizes, and synthesize an
|
|
|
|
**NCKEY_RESIZE** event. Upon receiving this event, the user may call
|
2020-05-02 16:56:39 +00:00
|
|
|
**notcurses_refresh** to force an immediate reflow, or just wait until the
|
|
|
|
next call to **notcurses_render**, when notcurses will pick up the resize
|
2020-01-02 03:39:16 +00:00
|
|
|
itself. If the **SIGWINCH** handler is inhibited, **NCKEY_RESIZE** is never
|
|
|
|
generated.
|
2020-01-02 02:23:11 +00:00
|
|
|
|
2021-09-20 02:16:31 +00:00
|
|
|
## **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.
|
|
|
|
|
2020-01-02 02:23:11 +00:00
|
|
|
# RETURN VALUES
|
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
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 returned.
|
2020-01-02 03:39:16 +00:00
|
|
|
|
2021-09-12 07:25:37 +00:00
|
|
|
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.
|
|
|
|
|
2020-05-02 16:56:39 +00:00
|
|
|
**notcurses_mouse_enable** returns 0 on success, and non-zero on failure, as
|
|
|
|
does **notcurses_mouse_disable**.
|
2020-01-02 03:39:16 +00:00
|
|
|
|
2020-11-05 21:31:07 +00:00
|
|
|
**ncinput_equal_p** returns **true** if the two **ncinput** structs represent
|
|
|
|
the same input (though not necessarily the same input event), and
|
|
|
|
**false** otherwise.
|
2020-10-15 07:14:19 +00:00
|
|
|
|
2020-01-02 03:39:16 +00:00
|
|
|
# NOTES
|
|
|
|
|
2021-07-25 04:38:33 +00:00
|
|
|
Like any other notcurses function, it is an error to call **notcurses_get**
|
2020-05-02 16:56:39 +00:00
|
|
|
during or after a call to **notcurses_stop**. If a thread is always sitting
|
2020-01-02 03:39:16 +00:00
|
|
|
on blocking input, it can be tricky to guarantee that this doesn't happen.
|
|
|
|
|
2020-02-19 01:03:20 +00:00
|
|
|
Only one thread may call into the input stack at once, but unlike almost every
|
2021-07-25 04:38:33 +00:00
|
|
|
other function in notcurses, **notcurses_get** and friends can be called
|
2020-02-19 01:03:20 +00:00
|
|
|
concurrently with **notcurses_render**.
|
|
|
|
|
2021-10-05 09:34:06 +00:00
|
|
|
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).
|
2020-05-02 16:56:39 +00:00
|
|
|
|
2021-08-31 19:47:21 +00:00
|
|
|
When support is detected, the Kitty keyboard disambiguation protocol will be
|
|
|
|
requested. This eliminates most of the **BUGS** mentioned below.
|
|
|
|
|
2020-01-02 03:39:16 +00:00
|
|
|
# BUGS
|
|
|
|
|
|
|
|
Failed escape sequences are not yet played back in their entirety; only an
|
|
|
|
ESC (ASCII 0x1b) will be seen by the application.
|
|
|
|
|
2020-02-12 18:13:03 +00:00
|
|
|
The Shift key is only indicated in conjunction with mouse button presses. If
|
2021-09-20 01:01:40 +00:00
|
|
|
e.g. Shift is used to generate a capital letter 'A', **id** will equal 'A',
|
|
|
|
and **shift** will be **false**. This should be fixed in the future.
|
2020-02-12 18:13:03 +00:00
|
|
|
|
|
|
|
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 indistinguishable from Ctrl and 'a' without Shift. This should be fixed
|
|
|
|
in the future.
|
|
|
|
|
2021-09-20 01:01:40 +00:00
|
|
|
Ctrl pressed along with 'J' or 'M', whether Shift is pressed or not,
|
|
|
|
currently registers as **NCKEY_ENTER**. This will likely change in the
|
|
|
|
future.
|
2020-02-12 03:44:45 +00:00
|
|
|
|
2021-09-20 01:01:40 +00:00
|
|
|
When the Kitty keyboard disambiguation protocol is used, most of these
|
|
|
|
issues are resolved.
|
2021-08-31 19:47:21 +00:00
|
|
|
|
2021-10-05 09:34:06 +00:00
|
|
|
Mouse events in the top and left margins will never be delivered to the
|
|
|
|
application (as is intended), but mouse events in the bottom and right margins
|
|
|
|
sometimes can be if the event occurs prior to a window resize.
|
|
|
|
|
2021-10-26 13:59:33 +00:00
|
|
|
On some operating systems, **CLOCK_REALTIME** is used as the basis for
|
|
|
|
timeouts instead of **CLOCK_MONOTONIC**. This ought be fixed.
|
|
|
|
|
2020-01-02 02:23:11 +00:00
|
|
|
# SEE ALSO
|
|
|
|
|
2021-10-26 13:59:33 +00:00
|
|
|
**clock_gettime(2)**,
|
2020-02-12 03:44:45 +00:00
|
|
|
**poll(2)**,
|
|
|
|
**notcurses(3)**,
|
2020-04-08 09:39:41 +00:00
|
|
|
**notcurses_refresh(3)**,
|
2020-02-19 01:03:20 +00:00
|
|
|
**notcurses_render(3)**,
|
2020-02-12 03:44:45 +00:00
|
|
|
**termios(3)**,
|
|
|
|
**terminfo(5)**,
|
|
|
|
**ascii(7)**,
|
|
|
|
**signal(7)**,
|
|
|
|
**unicode(7)**
|