1 #ifndef NOTCURSES_NCKEYS
2 #define NOTCURSES_NCKEYS
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 // Synthesized input events, i.e. any input event we can report that isn't
9 // representative of some Unicode. This covers both keyboard and mouse events,
10 // as well as signals and even window events.
11 
12 // Rather than using one of the Private Use Areas of Unicode, we use the area
13 // beyond the 17 65536-entry Planes (1114112). We round up to 5000 so that it's
14 // trivial to identify synthesized characters based on their numeric definition
15 // here. This is safe, since we needn't convert these synthesized characters
16 // into UTF8 (they would otherwise require more than four bytes).
17 #define PRETERUNICODEBASE 1115000
18 #define preterunicode(w) ((w) + PRETERUNICODEBASE)
19 
20 // Special composed key definitions. These values are added to 0x100000.
21 #define NCKEY_INVALID   preterunicode(0)
22 #define NCKEY_RESIZE    preterunicode(1) // we received SIGWINCH
23 #define NCKEY_UP        preterunicode(2)
24 #define NCKEY_RIGHT     preterunicode(3)
25 #define NCKEY_DOWN      preterunicode(4)
26 #define NCKEY_LEFT      preterunicode(5)
27 #define NCKEY_INS       preterunicode(6)
28 #define NCKEY_DEL       preterunicode(7)
29 #define NCKEY_BACKSPACE preterunicode(8) // backspace (sometimes)
30 #define NCKEY_PGDOWN    preterunicode(9)
31 #define NCKEY_PGUP      preterunicode(10)
32 #define NCKEY_HOME      preterunicode(11)
33 #define NCKEY_END       preterunicode(12)
34 #define NCKEY_F00       preterunicode(20)
35 #define NCKEY_F01       preterunicode(21)
36 #define NCKEY_F02       preterunicode(22)
37 #define NCKEY_F03       preterunicode(23)
38 #define NCKEY_F04       preterunicode(24)
39 #define NCKEY_F05       preterunicode(25)
40 #define NCKEY_F06       preterunicode(26)
41 #define NCKEY_F07       preterunicode(27)
42 #define NCKEY_F08       preterunicode(28)
43 #define NCKEY_F09       preterunicode(29)
44 #define NCKEY_F10       preterunicode(30)
45 #define NCKEY_F11       preterunicode(31)
46 #define NCKEY_F12       preterunicode(32)
47 #define NCKEY_F13       preterunicode(33)
48 #define NCKEY_F14       preterunicode(34)
49 #define NCKEY_F15       preterunicode(35)
50 #define NCKEY_F16       preterunicode(36)
51 #define NCKEY_F17       preterunicode(37)
52 #define NCKEY_F18       preterunicode(38)
53 #define NCKEY_F19       preterunicode(39)
54 #define NCKEY_F20       preterunicode(40)
55 #define NCKEY_F21       preterunicode(41)
56 #define NCKEY_F22       preterunicode(42)
57 #define NCKEY_F23       preterunicode(43)
58 #define NCKEY_F24       preterunicode(44)
59 #define NCKEY_F25       preterunicode(45)
60 #define NCKEY_F26       preterunicode(46)
61 #define NCKEY_F27       preterunicode(47)
62 #define NCKEY_F28       preterunicode(48)
63 #define NCKEY_F29       preterunicode(49)
64 #define NCKEY_F30       preterunicode(50)
65 #define NCKEY_F31       preterunicode(51)
66 #define NCKEY_F32       preterunicode(52)
67 #define NCKEY_F33       preterunicode(53)
68 #define NCKEY_F34       preterunicode(54)
69 #define NCKEY_F35       preterunicode(55)
70 #define NCKEY_F36       preterunicode(56)
71 #define NCKEY_F37       preterunicode(57)
72 #define NCKEY_F38       preterunicode(58)
73 #define NCKEY_F39       preterunicode(59)
74 #define NCKEY_F40       preterunicode(60)
75 #define NCKEY_F41       preterunicode(61)
76 #define NCKEY_F42       preterunicode(62)
77 #define NCKEY_F43       preterunicode(63)
78 #define NCKEY_F44       preterunicode(64)
79 #define NCKEY_F45       preterunicode(65)
80 #define NCKEY_F46       preterunicode(66)
81 #define NCKEY_F47       preterunicode(67)
82 #define NCKEY_F48       preterunicode(68)
83 #define NCKEY_F49       preterunicode(69)
84 #define NCKEY_F50       preterunicode(70)
85 #define NCKEY_F51       preterunicode(71)
86 #define NCKEY_F52       preterunicode(72)
87 #define NCKEY_F53       preterunicode(73)
88 #define NCKEY_F54       preterunicode(74)
89 #define NCKEY_F55       preterunicode(75)
90 #define NCKEY_F56       preterunicode(76)
91 #define NCKEY_F57       preterunicode(77)
92 #define NCKEY_F58       preterunicode(78)
93 #define NCKEY_F59       preterunicode(79)
94 #define NCKEY_F60       preterunicode(80)
95 // ... leave room for up to 100 function keys, egads
96 #define NCKEY_ENTER     preterunicode(121)
97 #define NCKEY_CLS       preterunicode(122) // "clear-screen or erase"
98 #define NCKEY_DLEFT     preterunicode(123) // down + left on keypad
99 #define NCKEY_DRIGHT    preterunicode(124)
100 #define NCKEY_ULEFT     preterunicode(125) // up + left on keypad
101 #define NCKEY_URIGHT    preterunicode(126)
102 #define NCKEY_CENTER    preterunicode(127) // the most truly neutral of keypresses
103 #define NCKEY_BEGIN     preterunicode(128)
104 #define NCKEY_CANCEL    preterunicode(129)
105 #define NCKEY_CLOSE     preterunicode(130)
106 #define NCKEY_COMMAND   preterunicode(131)
107 #define NCKEY_COPY      preterunicode(132)
108 #define NCKEY_EXIT      preterunicode(133)
109 #define NCKEY_PRINT     preterunicode(134)
110 #define NCKEY_REFRESH   preterunicode(135)
111 #define NCKEY_SEPARATOR preterunicode(136)
112 // these keys aren't generally available outside of the kitty protocol
113 #define NCKEY_CAPS_LOCK    preterunicode(150)
114 #define NCKEY_SCROLL_LOCK  preterunicode(151)
115 #define NCKEY_NUM_LOCK     preterunicode(152)
116 #define NCKEY_PRINT_SCREEN preterunicode(153)
117 #define NCKEY_PAUSE        preterunicode(154)
118 #define NCKEY_MENU         preterunicode(155)
119 // media keys, similarly only available through kitty's protocol
120 #define NCKEY_MEDIA_PLAY   preterunicode(158)
121 #define NCKEY_MEDIA_PAUSE  preterunicode(159)
122 #define NCKEY_MEDIA_PPAUSE preterunicode(160)
123 #define NCKEY_MEDIA_REV    preterunicode(161)
124 #define NCKEY_MEDIA_STOP   preterunicode(162)
125 #define NCKEY_MEDIA_FF     preterunicode(163)
126 #define NCKEY_MEDIA_REWIND preterunicode(164)
127 #define NCKEY_MEDIA_NEXT   preterunicode(165)
128 #define NCKEY_MEDIA_PREV   preterunicode(166)
129 #define NCKEY_MEDIA_RECORD preterunicode(167)
130 #define NCKEY_MEDIA_LVOL   preterunicode(168)
131 #define NCKEY_MEDIA_RVOL   preterunicode(169)
132 #define NCKEY_MEDIA_MUTE   preterunicode(170)
133 // modifiers when pressed by themselves. this ordering comes from the Kitty
134 // keyboard protocol, and mustn't be changed without updating handlers.
135 #define NCKEY_LSHIFT       preterunicode(171)
136 #define NCKEY_LCTRL        preterunicode(172)
137 #define NCKEY_LALT         preterunicode(173)
138 #define NCKEY_LSUPER       preterunicode(174)
139 #define NCKEY_LHYPER       preterunicode(175)
140 #define NCKEY_LMETA        preterunicode(176)
141 #define NCKEY_RSHIFT       preterunicode(177)
142 #define NCKEY_RCTRL        preterunicode(178)
143 #define NCKEY_RALT         preterunicode(179)
144 #define NCKEY_RSUPER       preterunicode(180)
145 #define NCKEY_RHYPER       preterunicode(181)
146 #define NCKEY_RMETA        preterunicode(182)
147 #define NCKEY_L3SHIFT      preterunicode(183)
148 #define NCKEY_L5SHIFT      preterunicode(184)
149 // mouse events. We encode which button was pressed into the char32_t,
150 // but position information is embedded in the larger ncinput event.
151 #define NCKEY_MOTION    preterunicode(200) // no buttons pressed
152 #define NCKEY_BUTTON1   preterunicode(201)
153 #define NCKEY_BUTTON2   preterunicode(202)
154 #define NCKEY_BUTTON3   preterunicode(203)
155 #define NCKEY_BUTTON4   preterunicode(204) // scrollwheel up
156 #define NCKEY_BUTTON5   preterunicode(205) // scrollwheel down
157 #define NCKEY_BUTTON6   preterunicode(206)
158 #define NCKEY_BUTTON7   preterunicode(207)
159 #define NCKEY_BUTTON8   preterunicode(208)
160 #define NCKEY_BUTTON9   preterunicode(209)
161 #define NCKEY_BUTTON10  preterunicode(210)
162 #define NCKEY_BUTTON11  preterunicode(211)
163 
164 // we received SIGCONT
165 #define NCKEY_SIGNAL    preterunicode(400)
166 
167 // indicates that we have reached the end of input. any further calls
168 // will continute to return this immediately.
169 #define NCKEY_EOF       preterunicode(500)
170 
171 // Is this uint32_t a synthesized event?
172 static inline bool
nckey_synthesized_p(uint32_t w)173 nckey_synthesized_p(uint32_t w){
174   return w >= PRETERUNICODEBASE && w <= NCKEY_EOF;
175 }
176 
177 // Synonyms (so far as we're concerned)
178 #define NCKEY_SCROLL_UP   NCKEY_BUTTON4
179 #define NCKEY_SCROLL_DOWN NCKEY_BUTTON5
180 #define NCKEY_RETURN      NCKEY_ENTER
181 
182 // Just aliases, ma'am, from the 128 characters common to ASCII+UTF8
183 #define NCKEY_TAB      0x09
184 #define NCKEY_ESC      0x1b
185 #define NCKEY_SPACE    0x20
186 
187 // Is this uint32_t from the Private Use Area in the BMP (Plane 0)?
188 static inline bool
nckey_pua_p(uint32_t w)189 nckey_pua_p(uint32_t w){
190   return w >= 0xe000 && w <= 0xf8ff; // 6,400 codepoints
191 }
192 
193 // Is this uint32_t a Supplementary Private Use Area-A codepoint?
194 static inline bool
nckey_supppuaa_p(uint32_t w)195 nckey_supppuaa_p(uint32_t w){
196   return w >= 0xf0000 && w <= 0xffffd; // 65,534 codepoints
197 }
198 
199 // Is this uint32_t a Supplementary Private Use Area-B codepoint?
200 static inline bool
nckey_supppuab_p(uint32_t w)201 nckey_supppuab_p(uint32_t w){
202   return w >= 0x100000 && w <= 0x10fffd; // 65,534 codepoints
203 }
204 
205 #ifdef __cplusplus
206 } // extern "C"
207 #endif
208 
209 #endif
210