| 978 | /* Determine which entries go on which page, and total number of pages */ |
| 979 | |
| 980 | static void |
| 981 | menu_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 */ |
no test coverage detected