MCPcopy Create free account
hub / github.com/NetHack/NetHack / menu_determine_pages

Function menu_determine_pages

win/curses/cursdial.c:980–1026  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

978/* Determine which entries go on which page, and total number of pages */
979
980static void
981menu_determine_pages(nhmenu *menu)
982{
983 int tmpline, num_lines, accel_per_page;
984 int curline = 0;
985 int page_num = 1;
986 nhmenu_item *menu_item_ptr;
987 int width = menu->width;
988 int height = menu->height;
989 int page_end = height;
990
991 if (menu->prompt && *menu->prompt) {
992 curline += curses_num_lines(menu->prompt, width) + 1;
993 }
994 tmpline = curline;
995
996 if (menu_is_multipage(menu, width, height)) {
997 page_end -= 2; /* Room to display current page number */
998 }
999 accel_per_page = 0;
1000
1001 /* Determine what entries belong on which page */
1002 for (menu_item_ptr = menu->entries; menu_item_ptr != NULL;
1003 menu_item_ptr = menu_item_ptr->next_item) {
1004 menu_item_ptr->page_num = page_num;
1005 menu_item_ptr->line_num = curline;
1006 if (menu_item_ptr->identifier.a_void == NULL) {
1007 num_lines = curses_num_lines(menu_item_ptr->str, width);
1008 } else {
1009 if (menu_item_ptr->accelerator != GOLD_SYM)
1010 ++accel_per_page;
1011 /* Add space for accelerator */
1012 num_lines = curses_num_lines(menu_item_ptr->str, width - 4);
1013 }
1014 menu_item_ptr->num_lines = num_lines;
1015 curline += num_lines;
1016 if (curline > page_end || accel_per_page > MAX_ACCEL_PER_PAGE) {
1017 ++page_num;
1018 accel_per_page = 0; /* reset */
1019 curline = tmpline;
1020 /* Move ptr back so entry will be reprocessed on new page */
1021 menu_item_ptr = menu_item_ptr->prev_item;
1022 }
1023 }
1024
1025 menu->num_pages = page_num;
1026}
1027
1028
1029/* Determine dimensions of menu window based on term size and entries */

Callers 2

curs_pad_menuFunction · 0.85
curses_display_nhmenuFunction · 0.85

Calls 2

curses_num_linesFunction · 0.85
menu_is_multipageFunction · 0.85

Tested by

no test coverage detected