--- lbbs/src/menu.c 2025/05/19 06:26:07 1.51 +++ lbbs/src/menu.c 2025/05/23 13:32:51 1.55 @@ -951,7 +951,12 @@ int display_menu(MENU_SET *p_menu_set) if (p_menu == NULL) { log_error("get_menu_by_id(%d) return NULL pointer\n", menu_id); - return -1; + if (p_menu_set->choose_step > 0) + { + p_menu_set->choose_step--; + return REDRAW; + } + return EXITBBS; } menu_item_pos = p_menu_set->menu_item_pos[p_menu_set->choose_step]; @@ -960,7 +965,7 @@ int display_menu(MENU_SET *p_menu_set) if (p_menu_item == NULL) { log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); - return -1; + menu_item_pos = 0; } if (menu_item_pos > 0 && @@ -1020,10 +1025,14 @@ int display_menu(MENU_SET *p_menu_set) if (!menu_selectable) { + log_error("No selectable menu item in current menu (%s)\n", p_menu->name); return -1; } - display_menu_current_page(p_menu_set); + if (display_menu_current_page(p_menu_set) != 0) + { + return -1; + } display_menu_cursor(p_menu_set, 1); @@ -1042,7 +1051,8 @@ int menu_control(MENU_SET *p_menu_set, i if (p_menu_set->menu_count == 0) { - return 0; + log_error("Empty menu set\n"); + return EXITBBS; } menu_id = p_menu_set->menu_id_path[p_menu_set->choose_step]; @@ -1050,12 +1060,23 @@ int menu_control(MENU_SET *p_menu_set, i if (p_menu == NULL) { log_error("get_menu_by_id(%d) return NULL pointer\n", menu_id); - return -1; + if (p_menu_set->choose_step > 0) + { + p_menu_set->choose_step--; + return REDRAW; + } + return EXITBBS; } if (p_menu->item_count == 0) { - return 0; + log_error("Empty menu (%s)\n", p_menu->name); + if (p_menu_set->choose_step > 0) + { + p_menu_set->choose_step--; + return REDRAW; + } + return EXITBBS; } menu_item_pos = p_menu_set->menu_item_pos[p_menu_set->choose_step]; @@ -1066,7 +1087,8 @@ int menu_control(MENU_SET *p_menu_set, i if (p_menu_item == NULL) { log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id); - return -1; + p_menu_set->menu_item_pos[p_menu_set->choose_step] = 0; + return REDRAW; } switch (key) @@ -1098,14 +1120,14 @@ int menu_control(MENU_SET *p_menu_set, i if (p_menu_set->choose_step > 0) { p_menu_set->choose_step--; - if (display_menu(p_menu_set) != 0) - { - return menu_control(p_menu_set, KEY_LEFT); - } if (p_menu_set->choose_step == 0) { return REDRAW; } + if (display_menu(p_menu_set) != 0) + { + return menu_control(p_menu_set, KEY_LEFT); + } } else { @@ -1309,33 +1331,17 @@ int unload_menu(MENU_SET *p_menu_set) int load_menu_shm(MENU_SET *p_menu_set) { - // Mount shared memory - if (p_menu_set->p_reserved == NULL) + void *p_shm; + + // Remap shared memory in read-only mode + p_shm = shmat(p_menu_set->shmid, p_menu_set->p_reserved, SHM_RDONLY | SHM_REMAP); + if (p_shm == (void *)-1) { - p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY); - if (p_menu_set->p_reserved == (void *)-1) - { - log_error("shmat() error (%d)\n", errno); - return -1; - } + log_error("shmat() error (%d)\n", errno); + return -1; } - - p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH; - p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS; - p_menu_set->p_menu_screen_pool = p_menu_set->p_menu_item_pool + sizeof(MENU_ITEM) * MAX_MENUITEMS; - p_menu_set->p_menu_screen_buf = p_menu_set->p_menu_screen_pool + sizeof(MENU_SCREEN) * MAX_MENUS; - p_menu_set->p_menu_screen_buf_free = p_menu_set->p_menu_screen_buf; - - // Restore status varaibles into reserved memory area - p_menu_set->menu_count = *((int16_t *)p_menu_set->p_reserved); - p_menu_set->menu_item_count = *(((int16_t *)p_menu_set->p_reserved) + 1); - p_menu_set->menu_screen_count = *(((int16_t *)p_menu_set->p_reserved) + 2); - - p_menu_set->choose_step = 0; - p_menu_set->menu_id_path[0] = 0; - - p_menu_set->p_menu_name_dict = NULL; - p_menu_set->p_menu_screen_dict = NULL; + + p_menu_set->p_reserved = p_shm; return 0; } @@ -1360,5 +1366,17 @@ int unload_menu_shm(MENU_SET *p_menu_set } p_menu_set->p_reserved = NULL; + if (p_menu_set->p_menu_name_dict != NULL) + { + trie_dict_destroy(p_menu_set->p_menu_name_dict); + p_menu_set->p_menu_name_dict = NULL; + } + + if (p_menu_set->p_menu_screen_dict != NULL) + { + trie_dict_destroy(p_menu_set->p_menu_screen_dict); + p_menu_set->p_menu_screen_dict = NULL; + } + return 0; }