MCPcopy Index your code
hub / github.com/NetHack/NetHack / process_menu_window

Function process_menu_window

win/tty/wintty.c:1328–1768  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1326}
1327
1328static void
1329process_menu_window(winid window, struct WinDesc *cw)
1330{
1331 tty_menu_item *page_start, *page_end, *curr;
1332 long count;
1333 int n, attr_n, curr_page, page_lines, resp_len, previous_page_lines;
1334 boolean finished, counting, reset_count, show_obj_syms,
1335 only_if_no_headers = (iflags.menuobjsyms & 4) != 0;
1336 char *cp, *rp, resp[QBUFSZ], gacc[QBUFSZ], *msave, *morestr, really_morc;
1337#define MENU_EXPLICIT_CHOICE 0x7f /* pseudo menu manipulation char */
1338
1339 curr_page = page_lines = 0;
1340 page_start = page_end = 0;
1341 msave = cw->morestr; /* save the morestr */
1342 cw->morestr = morestr = (char *) alloc((unsigned) QBUFSZ);
1343 counting = FALSE;
1344 count = 0L;
1345 reset_count = TRUE;
1346 finished = FALSE;
1347 previous_page_lines = 0;
1348
1349 /* collect group accelerators; for PICK_NONE, they're ignored;
1350 for PICK_ONE, only those which match exactly one entry will be
1351 accepted; for PICK_ANY, those which match any entry are okay */
1352 gacc[0] = '\0';
1353 if (cw->how != PICK_NONE) {
1354 int i, gcnt[128];
1355#define GSELIDX(c) ((c) & 127) /* guard against `signed char' */
1356
1357 for (i = 0; i < SIZE(gcnt); i++)
1358 gcnt[i] = 0;
1359 for (n = 0, curr = cw->mlist; curr; curr = curr->next)
1360 if (curr->gselector && curr->gselector != curr->selector) {
1361 ++n;
1362 ++gcnt[GSELIDX(curr->gselector)];
1363 }
1364
1365 if (n > 0) /* at least one group accelerator found */
1366 for (rp = gacc, curr = cw->mlist; curr; curr = curr->next)
1367 if (curr->gselector
1368 && (curr->gselector != curr->selector
1369 /* '$' is both a selector "letter" and a group
1370 accelerator; including it in gacc allows gold to
1371 be selected via group when not on current page */
1372 || curr->gselector == GOLD_SYM)
1373 && !strchr(gacc, curr->gselector)
1374 && (cw->how == PICK_ANY
1375 || gcnt[GSELIDX(curr->gselector)] == 1)) {
1376 *rp++ = curr->gselector;
1377 *rp = '\0'; /* re-terminate for strchr() */
1378 }
1379#undef GSELIDX
1380 }
1381 resp_len = 0; /* lint suppression */
1382
1383 show_obj_syms = iflags.use_menu_glyphs;
1384 if (only_if_no_headers) {
1385 for (curr = cw->mlist; curr; curr = curr->next)

Callers 1

tty_display_nhwindowFunction · 0.85

Calls 15

tty_cursFunction · 0.85
toggle_menu_attrFunction · 0.85
docornerFunction · 0.85
dmoreFunction · 0.85
xwaitforspaceFunction · 0.85
map_menu_cmdFunction · 0.85
menuitem_invert_testFunction · 0.85
tty_getlinFunction · 0.85
pmatchiFunction · 0.85
toggle_menu_currFunction · 0.85
cl_eosFunction · 0.70
term_clear_screenFunction · 0.70

Tested by

no test coverage detected