From 3faf8ee3fb1e2eeef6e54bd1329fcfb60a84e5df Mon Sep 17 00:00:00 2001 From: nick black Date: Sun, 19 Sep 2021 22:16:31 -0400 Subject: [PATCH] [input] introduce NCKEY_EOF #2185 --- NEWS.md | 1 + USAGE.md | 74 +++++------ doc/man/man3/notcurses_input.3.md | 6 + include/notcurses/nckeys.h | 202 +++++++++++++++--------------- src/input/input.cpp | 2 +- src/lib/in.c | 6 +- 6 files changed, 153 insertions(+), 138 deletions(-) diff --git a/NEWS.md b/NEWS.md index 4ede43de3..a91d55214 100644 --- a/NEWS.md +++ b/NEWS.md @@ -19,6 +19,7 @@ rearrangements of Notcurses. `NCKEY_RELEASE` definition is no longer returned; instead, the appropriate `NCKEY_BUTTONx` synthesized key is returned, with `EVTYPE_RELEASE` set. + * `NCKEY_EOF` now indicates the end of input. * 2.4.1 (2021-09-12) * `notcurses_check_pixel_support()` still returns 0 if there is no support diff --git a/USAGE.md b/USAGE.md index 2d2d9257c..c0c412a0c 100644 --- a/USAGE.md +++ b/USAGE.md @@ -627,48 +627,48 @@ must be readable without delay for it to be interpreted as such. #define suppuabize(w) ((w) + 0x100000) // Special composed key definitions. These values are added to 0x100000. -#define NCKEY_INVALID suppuabize(0) -#define NCKEY_RESIZE suppuabize(1) // generated internally in response to SIGWINCH -#define NCKEY_UP suppuabize(2) -#define NCKEY_RIGHT suppuabize(3) -#define NCKEY_DOWN suppuabize(4) -#define NCKEY_LEFT suppuabize(5) -#define NCKEY_INS suppuabize(6) -#define NCKEY_DEL suppuabize(7) +#define NCKEY_INVALID suppuabize(0) +#define NCKEY_RESIZE suppuabize(1) // generated internally in response to SIGWINCH +#define NCKEY_UP suppuabize(2) +#define NCKEY_RIGHT suppuabize(3) +#define NCKEY_DOWN suppuabize(4) +#define NCKEY_LEFT suppuabize(5) +#define NCKEY_INS suppuabize(6) +#define NCKEY_DEL suppuabize(7) #define NCKEY_BACKSPACE suppuabize(8) // backspace (sometimes) -#define NCKEY_PGDOWN suppuabize(9) -#define NCKEY_PGUP suppuabize(10) -#define NCKEY_HOME suppuabize(11) -#define NCKEY_END suppuabize(12) -#define NCKEY_F00 suppuabize(20) -#define NCKEY_F01 suppuabize(21) -#define NCKEY_F02 suppuabize(22) -#define NCKEY_F03 suppuabize(23) -#define NCKEY_F04 suppuabize(24) +#define NCKEY_PGDOWN suppuabize(9) +#define NCKEY_PGUP suppuabize(10) +#define NCKEY_HOME suppuabize(11) +#define NCKEY_END suppuabize(12) +#define NCKEY_F00 suppuabize(20) +#define NCKEY_F01 suppuabize(21) +#define NCKEY_F02 suppuabize(22) +#define NCKEY_F03 suppuabize(23) +#define NCKEY_F04 suppuabize(24) // ... up to 100 function keys, egads -#define NCKEY_ENTER suppuabize(121) -#define NCKEY_CLS suppuabize(122) // "clear-screen or erase" -#define NCKEY_DLEFT suppuabize(123) // down + left on keypad -#define NCKEY_DRIGHT suppuabize(124) -#define NCKEY_ULEFT suppuabize(125) // up + left on keypad -#define NCKEY_URIGHT suppuabize(126) -#define NCKEY_CENTER suppuabize(127) // the most truly neutral of keypresses -#define NCKEY_BEGIN suppuabize(128) -#define NCKEY_CANCEL suppuabize(129) -#define NCKEY_CLOSE suppuabize(130) -#define NCKEY_COMMAND suppuabize(131) -#define NCKEY_COPY suppuabize(132) -#define NCKEY_EXIT suppuabize(133) -#define NCKEY_PRINT suppuabize(134) -#define NCKEY_REFRESH suppuabize(135) +#define NCKEY_ENTER suppuabize(121) +#define NCKEY_CLS suppuabize(122) // "clear-screen or erase" +#define NCKEY_DLEFT suppuabize(123) // down + left on keypad +#define NCKEY_DRIGHT suppuabize(124) +#define NCKEY_ULEFT suppuabize(125) // up + left on keypad +#define NCKEY_URIGHT suppuabize(126) +#define NCKEY_CENTER suppuabize(127) // the most truly neutral of keypresses +#define NCKEY_BEGIN suppuabize(128) +#define NCKEY_CANCEL suppuabize(129) +#define NCKEY_CLOSE suppuabize(130) +#define NCKEY_COMMAND suppuabize(131) +#define NCKEY_COPY suppuabize(132) +#define NCKEY_EXIT suppuabize(133) +#define NCKEY_PRINT suppuabize(134) +#define NCKEY_REFRESH suppuabize(135) // Mouse events. We try to encode some details into the uint32_t (i.e. which // button was pressed), but some is embedded in the ncinput event. The release // event is generic across buttons; callers must maintain state, if they care. -#define NCKEY_BUTTON1 suppuabize(201) -#define NCKEY_BUTTON2 suppuabize(202) -#define NCKEY_BUTTON3 suppuabize(203) +#define NCKEY_BUTTON1 suppuabize(201) +#define NCKEY_BUTTON2 suppuabize(202) +#define NCKEY_BUTTON3 suppuabize(203) // ... up to 11 mouse buttons -#define NCKEY_RELEASE suppuabize(212) +#define NCKEY_EOF suppuabize(300) // Is this uint32_t a Supplementary Private Use Area-B codepoint? static inline bool @@ -760,7 +760,7 @@ int notcurses_mouse_disable(struct notcurses* n); // Is the event a synthesized mouse event? static inline bool nckey_mouse_p(uint32_t r){ - return r >= NCKEY_BUTTON1 && r <= NCKEY_RELEASE; + return r >= NCKEY_BUTTON1 && r <= NCKEY_BUTTON11; } ``` diff --git a/doc/man/man3/notcurses_input.3.md b/doc/man/man3/notcurses_input.3.md index 9b257f310..415ceaa58 100644 --- a/doc/man/man3/notcurses_input.3.md +++ b/doc/man/man3/notcurses_input.3.md @@ -126,6 +126,12 @@ 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_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 diff --git a/include/notcurses/nckeys.h b/include/notcurses/nckeys.h index abf3dd8bd..877f8754b 100644 --- a/include/notcurses/nckeys.h +++ b/include/notcurses/nckeys.h @@ -8,110 +8,114 @@ extern "C" { #define suppuabize(w) ((w) + 0x100000) // Special composed key definitions. These values are added to 0x100000. -#define NCKEY_INVALID suppuabize(0) -#define NCKEY_SIGNAL suppuabize(1) // we received either SIGWINCH or SIGCONT -#define NCKEY_UP suppuabize(2) -#define NCKEY_RIGHT suppuabize(3) -#define NCKEY_DOWN suppuabize(4) -#define NCKEY_LEFT suppuabize(5) -#define NCKEY_INS suppuabize(6) -#define NCKEY_DEL suppuabize(7) +#define NCKEY_INVALID suppuabize(0) +#define NCKEY_SIGNAL suppuabize(1) // we received either SIGWINCH or SIGCONT +#define NCKEY_UP suppuabize(2) +#define NCKEY_RIGHT suppuabize(3) +#define NCKEY_DOWN suppuabize(4) +#define NCKEY_LEFT suppuabize(5) +#define NCKEY_INS suppuabize(6) +#define NCKEY_DEL suppuabize(7) #define NCKEY_BACKSPACE suppuabize(8) // backspace (sometimes) -#define NCKEY_PGDOWN suppuabize(9) -#define NCKEY_PGUP suppuabize(10) -#define NCKEY_HOME suppuabize(11) -#define NCKEY_END suppuabize(12) -#define NCKEY_F00 suppuabize(20) -#define NCKEY_F01 suppuabize(21) -#define NCKEY_F02 suppuabize(22) -#define NCKEY_F03 suppuabize(23) -#define NCKEY_F04 suppuabize(24) -#define NCKEY_F05 suppuabize(25) -#define NCKEY_F06 suppuabize(26) -#define NCKEY_F07 suppuabize(27) -#define NCKEY_F08 suppuabize(28) -#define NCKEY_F09 suppuabize(29) -#define NCKEY_F10 suppuabize(30) -#define NCKEY_F11 suppuabize(31) -#define NCKEY_F12 suppuabize(32) -#define NCKEY_F13 suppuabize(33) -#define NCKEY_F14 suppuabize(34) -#define NCKEY_F15 suppuabize(35) -#define NCKEY_F16 suppuabize(36) -#define NCKEY_F17 suppuabize(37) -#define NCKEY_F18 suppuabize(38) -#define NCKEY_F19 suppuabize(39) -#define NCKEY_F20 suppuabize(40) -#define NCKEY_F21 suppuabize(41) -#define NCKEY_F22 suppuabize(42) -#define NCKEY_F23 suppuabize(43) -#define NCKEY_F24 suppuabize(44) -#define NCKEY_F25 suppuabize(45) -#define NCKEY_F26 suppuabize(46) -#define NCKEY_F27 suppuabize(47) -#define NCKEY_F28 suppuabize(48) -#define NCKEY_F29 suppuabize(49) -#define NCKEY_F30 suppuabize(50) -#define NCKEY_F31 suppuabize(51) -#define NCKEY_F32 suppuabize(52) -#define NCKEY_F33 suppuabize(53) -#define NCKEY_F34 suppuabize(54) -#define NCKEY_F35 suppuabize(55) -#define NCKEY_F36 suppuabize(56) -#define NCKEY_F37 suppuabize(57) -#define NCKEY_F38 suppuabize(58) -#define NCKEY_F39 suppuabize(59) -#define NCKEY_F40 suppuabize(60) -#define NCKEY_F41 suppuabize(61) -#define NCKEY_F42 suppuabize(62) -#define NCKEY_F43 suppuabize(63) -#define NCKEY_F44 suppuabize(64) -#define NCKEY_F45 suppuabize(65) -#define NCKEY_F46 suppuabize(66) -#define NCKEY_F47 suppuabize(67) -#define NCKEY_F48 suppuabize(68) -#define NCKEY_F49 suppuabize(69) -#define NCKEY_F50 suppuabize(70) -#define NCKEY_F51 suppuabize(71) -#define NCKEY_F52 suppuabize(72) -#define NCKEY_F53 suppuabize(73) -#define NCKEY_F54 suppuabize(74) -#define NCKEY_F55 suppuabize(75) -#define NCKEY_F56 suppuabize(76) -#define NCKEY_F57 suppuabize(77) -#define NCKEY_F58 suppuabize(78) -#define NCKEY_F59 suppuabize(79) -#define NCKEY_F60 suppuabize(80) +#define NCKEY_PGDOWN suppuabize(9) +#define NCKEY_PGUP suppuabize(10) +#define NCKEY_HOME suppuabize(11) +#define NCKEY_END suppuabize(12) +#define NCKEY_F00 suppuabize(20) +#define NCKEY_F01 suppuabize(21) +#define NCKEY_F02 suppuabize(22) +#define NCKEY_F03 suppuabize(23) +#define NCKEY_F04 suppuabize(24) +#define NCKEY_F05 suppuabize(25) +#define NCKEY_F06 suppuabize(26) +#define NCKEY_F07 suppuabize(27) +#define NCKEY_F08 suppuabize(28) +#define NCKEY_F09 suppuabize(29) +#define NCKEY_F10 suppuabize(30) +#define NCKEY_F11 suppuabize(31) +#define NCKEY_F12 suppuabize(32) +#define NCKEY_F13 suppuabize(33) +#define NCKEY_F14 suppuabize(34) +#define NCKEY_F15 suppuabize(35) +#define NCKEY_F16 suppuabize(36) +#define NCKEY_F17 suppuabize(37) +#define NCKEY_F18 suppuabize(38) +#define NCKEY_F19 suppuabize(39) +#define NCKEY_F20 suppuabize(40) +#define NCKEY_F21 suppuabize(41) +#define NCKEY_F22 suppuabize(42) +#define NCKEY_F23 suppuabize(43) +#define NCKEY_F24 suppuabize(44) +#define NCKEY_F25 suppuabize(45) +#define NCKEY_F26 suppuabize(46) +#define NCKEY_F27 suppuabize(47) +#define NCKEY_F28 suppuabize(48) +#define NCKEY_F29 suppuabize(49) +#define NCKEY_F30 suppuabize(50) +#define NCKEY_F31 suppuabize(51) +#define NCKEY_F32 suppuabize(52) +#define NCKEY_F33 suppuabize(53) +#define NCKEY_F34 suppuabize(54) +#define NCKEY_F35 suppuabize(55) +#define NCKEY_F36 suppuabize(56) +#define NCKEY_F37 suppuabize(57) +#define NCKEY_F38 suppuabize(58) +#define NCKEY_F39 suppuabize(59) +#define NCKEY_F40 suppuabize(60) +#define NCKEY_F41 suppuabize(61) +#define NCKEY_F42 suppuabize(62) +#define NCKEY_F43 suppuabize(63) +#define NCKEY_F44 suppuabize(64) +#define NCKEY_F45 suppuabize(65) +#define NCKEY_F46 suppuabize(66) +#define NCKEY_F47 suppuabize(67) +#define NCKEY_F48 suppuabize(68) +#define NCKEY_F49 suppuabize(69) +#define NCKEY_F50 suppuabize(70) +#define NCKEY_F51 suppuabize(71) +#define NCKEY_F52 suppuabize(72) +#define NCKEY_F53 suppuabize(73) +#define NCKEY_F54 suppuabize(74) +#define NCKEY_F55 suppuabize(75) +#define NCKEY_F56 suppuabize(76) +#define NCKEY_F57 suppuabize(77) +#define NCKEY_F58 suppuabize(78) +#define NCKEY_F59 suppuabize(79) +#define NCKEY_F60 suppuabize(80) // ... leave room for up to 100 function keys, egads -#define NCKEY_ENTER suppuabize(121) -#define NCKEY_CLS suppuabize(122) // "clear-screen or erase" -#define NCKEY_DLEFT suppuabize(123) // down + left on keypad -#define NCKEY_DRIGHT suppuabize(124) -#define NCKEY_ULEFT suppuabize(125) // up + left on keypad -#define NCKEY_URIGHT suppuabize(126) -#define NCKEY_CENTER suppuabize(127) // the most truly neutral of keypresses -#define NCKEY_BEGIN suppuabize(128) -#define NCKEY_CANCEL suppuabize(129) -#define NCKEY_CLOSE suppuabize(130) -#define NCKEY_COMMAND suppuabize(131) -#define NCKEY_COPY suppuabize(132) -#define NCKEY_EXIT suppuabize(133) -#define NCKEY_PRINT suppuabize(134) -#define NCKEY_REFRESH suppuabize(135) +#define NCKEY_ENTER suppuabize(121) +#define NCKEY_CLS suppuabize(122) // "clear-screen or erase" +#define NCKEY_DLEFT suppuabize(123) // down + left on keypad +#define NCKEY_DRIGHT suppuabize(124) +#define NCKEY_ULEFT suppuabize(125) // up + left on keypad +#define NCKEY_URIGHT suppuabize(126) +#define NCKEY_CENTER suppuabize(127) // the most truly neutral of keypresses +#define NCKEY_BEGIN suppuabize(128) +#define NCKEY_CANCEL suppuabize(129) +#define NCKEY_CLOSE suppuabize(130) +#define NCKEY_COMMAND suppuabize(131) +#define NCKEY_COPY suppuabize(132) +#define NCKEY_EXIT suppuabize(133) +#define NCKEY_PRINT suppuabize(134) +#define NCKEY_REFRESH suppuabize(135) // Mouse events. We try to encode some details into the char32_t (i.e. which // button was pressed), but some is embedded in the ncinput event. The release // event is generic across buttons; callers must maintain state, if they care. -#define NCKEY_BUTTON1 suppuabize(201) -#define NCKEY_BUTTON2 suppuabize(202) -#define NCKEY_BUTTON3 suppuabize(203) -#define NCKEY_BUTTON4 suppuabize(204) // scrollwheel up -#define NCKEY_BUTTON5 suppuabize(205) // scrollwheel down -#define NCKEY_BUTTON6 suppuabize(206) -#define NCKEY_BUTTON7 suppuabize(207) -#define NCKEY_BUTTON8 suppuabize(208) -#define NCKEY_BUTTON9 suppuabize(209) -#define NCKEY_BUTTON10 suppuabize(210) -#define NCKEY_BUTTON11 suppuabize(211) +#define NCKEY_BUTTON1 suppuabize(201) +#define NCKEY_BUTTON2 suppuabize(202) +#define NCKEY_BUTTON3 suppuabize(203) +#define NCKEY_BUTTON4 suppuabize(204) // scrollwheel up +#define NCKEY_BUTTON5 suppuabize(205) // scrollwheel down +#define NCKEY_BUTTON6 suppuabize(206) +#define NCKEY_BUTTON7 suppuabize(207) +#define NCKEY_BUTTON8 suppuabize(208) +#define NCKEY_BUTTON9 suppuabize(209) +#define NCKEY_BUTTON10 suppuabize(210) +#define NCKEY_BUTTON11 suppuabize(211) + +// indicates that we have reached the end of input. any further calls +// will continute to return this immediately. +#define NCKEY_EOF suppuabize(300) // Synonyms (so far as we're concerned) #define NCKEY_SCROLL_UP NCKEY_BUTTON4 diff --git a/src/input/input.cpp b/src/input/input.cpp index 2f9d0359b..e664b35af 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -280,7 +280,7 @@ int input_demo(ncpp::NotCurses* nc) { if(r == 0){ // interrupted by signal continue; } - if((r == 'D' || r == 'd') && ni.ctrl){ + if(((r == 'D' || r == 'd') && ni.ctrl) || r == NCKEY_EOF){ done = true; tid.join(); ncuplot_destroy(plot); diff --git a/src/lib/in.c b/src/lib/in.c index d8d4903ef..889045ebb 100644 --- a/src/lib/in.c +++ b/src/lib/in.c @@ -1997,7 +1997,11 @@ internal_get(inputctx* ictx, const struct timespec* ts, ncinput* ni){ if(ictx->stdineof){ pthread_mutex_unlock(&ictx->ilock); logwarn("read eof on stdin\n"); - return -1; + if(ni){ + memset(ni, 0, sizeof(*ni)); + ni->id = NCKEY_EOF; + } + return NCKEY_EOF; } if(ts == NULL){ pthread_cond_wait(&ictx->icond, &ictx->ilock);