2
3
4
5
6
7
11#include <notcurses/notcurses.h>
17
18
20static UiKey translate_nckey(uint32_t id,
const ncinput *ni) {
21 if (id == NCKEY_INVALID || id == (uint32_t)NCKEY_EOF)
25 if (nckey_mouse_p(id))
84 if (ni && ni->evtype == NCTYPE_UNKNOWN)
87 if (id >= 0x20 && id < NCKEY_INVALID)
94
95
98
99
100
101
102
103
107 memset(ev, 0,
sizeof(*ev));
112 if (timeout_ms < 0) {
115 notcurses_get_blocking(
ui->nc, &ni);
116 }
while (ni.evtype == NCTYPE_RELEASE ||
117 ni.id == NCKEY_INVALID ||
118 ni.id == NCKEY_MOTION ||
119 ni.id == NCKEY_SIGNAL);
121 struct timespec ts = {
122 .tv_sec = timeout_ms / 1000,
123 .tv_nsec = (
long)(timeout_ms % 1000) * 1000000L,
126 notcurses_get(
ui->nc, &ts, &ni);
127 }
while (ni.evtype == NCTYPE_RELEASE || ni.id == NCKEY_INVALID);
130 ev
->key = translate_nckey(ni.id, &ni);
131 ev
->alt = ncinput_alt_p(&ni);
132 ev
->ctrl = ncinput_ctrl_p(&ni);
133 ev
->shift = ncinput_shift_p(&ni);
139 if (ni.id == NCKEY_BUTTON4)
141 else if (ni.id == NCKEY_BUTTON5)
143 else if (ni.evtype == NCTYPE_PRESS)
145 else if (ni.evtype == NCTYPE_RELEASE)
156 notcurses_get(
ui->nc, NULL, &ni);
157 }
while (ni.evtype == NCTYPE_RELEASE ||
158 ni.id == NCKEY_INVALID ||
159 ni.id == NCKEY_MOTION ||
160 ni.id == NCKEY_SIGNAL);
174 notcurses_get(
ui->nc, NULL, &ni);
175 }
while (ni.evtype == NCTYPE_RELEASE ||
176 ni.id == NCKEY_INVALID ||
177 ni.id == NCKEY_MOTION ||
178 ni.id == NCKEY_SIGNAL);
184 memset(ev, 0,
sizeof(*ev));
188 notcurses_get(
ui->nc, NULL, &ni);
189 }
while (ni.evtype == NCTYPE_RELEASE ||
190 ni.id == NCKEY_INVALID ||
191 ni.id == NCKEY_MOTION ||
192 ni.id == NCKEY_SIGNAL);
194 struct timespec ts = {
195 .tv_sec = timeout_ms / 1000,
196 .tv_nsec = (
long)(timeout_ms % 1000) * 1000000L,
199 notcurses_get(
ui->nc, &ts, &ni);
200 }
while (ni.evtype == NCTYPE_RELEASE || ni.id == NCKEY_INVALID);
203 ev
->key = translate_nckey(ni.id, &ni);
204 ev
->alt = ncinput_alt_p(&ni);
205 ev
->ctrl = ncinput_ctrl_p(&ni);
206 ev
->shift = ncinput_shift_p(&ni);
210 if (ni.id == NCKEY_BUTTON1) {
218 if (ni.id == NCKEY_BUTTON4)
220 else if (ni.id == NCKEY_BUTTON5)
222 else if (ni.evtype == NCTYPE_PRESS)
224 else if (ni.evtype == NCTYPE_RELEASE)
234 memset(ev, 0,
sizeof(*ev));
238 notcurses_get(
ui->nc, NULL, &ni);
239 }
while (ni.id == NCKEY_INVALID);
240 ev
->key = translate_nckey(ni.id, &ni);
241 ev
->alt = ncinput_alt_p(&ni);
242 ev
->ctrl = ncinput_ctrl_p(&ni);
243 ev
->shift = ncinput_shift_p(&ni);
253 if (s->mplane[w] == plane)
260 NcPlane *pile_member = s->mplane[w];
261 struct ncplane *cur = ncpile_top(pile_member);
262 while (cur != NULL) {
263 int y = ni->y, x = ni->x;
264 if (ncplane_translate_abs(cur, &y, &x)) {
269 cur = ncplane_below(cur);
int ui_get_event_no_mouse(UiSurface *surface, uint w, UiEvent *ev)
int ui_get_event(UiSurface *s, uint w, UiEvent *ev, int timeout_ms)
Wait for an input event on target (or stdscr if NULL).
int ui_get_event_multi(UiSurface *s, uint w, UiEvent *ev, int timeout_ms)
NcPlane * ncplane_clicked(NcPlane *pile_member, ncinput *ni)
uint get_plane_idx(UiSurface *s, struct ncplane *plane)
int ui_get_event_multix(UiSurface *s, uint w, UiEvent *ev, int timeout_ms)
UiMouseAction mouse_action