/[LeafOK_CVS]/lbbs/src/menu.c
ViewVC logotype

Diff of /lbbs/src/menu.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.41 by sysadm, Thu May 15 06:24:11 2025 UTC Revision 1.45 by sysadm, Sun May 18 03:23:57 2025 UTC
# Line 663  int load_menu(MENU_SET *p_menu_set, cons Line 663  int load_menu(MENU_SET *p_menu_set, cons
663          }          }
664          fclose(fin);          fclose(fin);
665    
         // Set menu_item->action_menu_id of each menu item pointing to a submenu to the menu_id of the corresponding submenu  
666          for (menu_item_id = 0; menu_item_id < p_menu_set->menu_item_count; menu_item_id++)          for (menu_item_id = 0; menu_item_id < p_menu_set->menu_item_count; menu_item_id++)
667          {          {
668                  p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);                  p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
669                  if (p_menu_item->submenu == 1 && strcmp(p_menu_item->action, "..") != 0)  
670                    // Set menu_item->action_cmd_handler of each menu item pointing to bbs_cmd
671                    if (p_menu_item->submenu == 0)
672                    {
673                            if ((p_menu_item->action_cmd_handler = get_cmd_handler(p_menu_item->action)) == NULL)
674                            {
675                                    log_error("Undefined menu action cmd handler [%s]\n", p_menu_item->action);
676                                    return -1;
677                            }
678                    }
679                    // Set menu_item->action_menu_id of each menu item pointing to a submenu to the menu_id of the corresponding submenu
680                    else if (strcmp(p_menu_item->action, "..") != 0)
681                  {                  {
682                          if (trie_dict_get(p_menu_set->p_menu_name_dict, p_menu_item->action, (int64_t *)&menu_id) != 1)                          if (trie_dict_get(p_menu_set->p_menu_name_dict, p_menu_item->action, (int64_t *)&menu_id) != 1)
683                          {                          {
# Line 880  int menu_control(MENU_SET *p_menu_set, i Line 890  int menu_control(MENU_SET *p_menu_set, i
890                  }                  }
891                  else                  else
892                  {                  {
893                          return (exec_cmd(p_menu_item->action, p_menu_item->name));                          return ((*(p_menu_item->action_cmd_handler))((void *)(p_menu_item->name)));
894                  }                  }
895                  break;                  break;
896          case KEY_LEFT:          case KEY_LEFT:
# Line 959  int menu_control(MENU_SET *p_menu_set, i Line 969  int menu_control(MENU_SET *p_menu_set, i
969                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
970                  display_menu_cursor(p_menu_set, 1);                  display_menu_cursor(p_menu_set, 1);
971                  break;                  break;
972            case KEY_HOME:
973            case KEY_PGUP:
974                    display_menu_cursor(p_menu_set, 0);
975                    menu_item_pos = 0;
976                    while (menu_item_pos < p_menu->item_count - 1)
977                    {
978                            menu_item_id = p_menu->items[menu_item_pos];
979                            p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
980                            if (p_menu_item == NULL)
981                            {
982                                    log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
983                                    return -1;
984                            }
985    
986                            if (p_menu_set->menu_item_display[menu_item_pos])
987                            {
988                                    break;
989                            }
990    
991                            menu_item_pos++;
992                    }
993                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
994                    display_menu_cursor(p_menu_set, 1);
995                    break;
996            case KEY_END:
997            case KEY_PGDN:
998                    display_menu_cursor(p_menu_set, 0);
999                    menu_item_pos = p_menu->item_count - 1;
1000                    while (menu_item_pos > 0)
1001                    {
1002                            menu_item_id = p_menu->items[menu_item_pos];
1003                            p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
1004                            if (p_menu_item == NULL)
1005                            {
1006                                    log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
1007                                    return -1;
1008                            }
1009    
1010                            if (p_menu_set->menu_item_display[menu_item_pos])
1011                            {
1012                                    break;
1013                            }
1014    
1015                            menu_item_pos--;
1016                    }
1017                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1018                    display_menu_cursor(p_menu_set, 1);
1019                    break;
1020          default:          default:
1021                  if (isalnum(key))                  if (isalnum(key))
1022                  {                  {
# Line 992  int unload_menu(MENU_SET *p_menu_set) Line 1050  int unload_menu(MENU_SET *p_menu_set)
1050          if (p_menu_set->p_menu_name_dict != NULL)          if (p_menu_set->p_menu_name_dict != NULL)
1051          {          {
1052                  trie_dict_destroy(p_menu_set->p_menu_name_dict);                  trie_dict_destroy(p_menu_set->p_menu_name_dict);
                 p_menu_set->p_menu_name_dict = NULL;  
1053          }          }
1054    
1055          if (p_menu_set->p_menu_screen_dict != NULL)          if (p_menu_set->p_menu_screen_dict != NULL)
1056          {          {
1057                  trie_dict_destroy(p_menu_set->p_menu_screen_dict);                  trie_dict_destroy(p_menu_set->p_menu_screen_dict);
                 p_menu_set->p_menu_screen_dict = NULL;  
1058          }          }
1059    
1060          unload_menu_shm(p_menu_set);          unload_menu_shm(p_menu_set);
# Line 1015  int unload_menu(MENU_SET *p_menu_set) Line 1071  int unload_menu(MENU_SET *p_menu_set)
1071  int load_menu_shm(MENU_SET *p_menu_set)  int load_menu_shm(MENU_SET *p_menu_set)
1072  {  {
1073          // Mount shared memory          // Mount shared memory
1074          if (p_menu_set->p_reserved != NULL)          if (p_menu_set->p_reserved == NULL)
1075          {          {
1076                  log_error("Menu is already loaded\n");                  p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY);
1077                  return -1;                  if (p_menu_set->p_reserved == (void *)-1)
1078                    {
1079                            log_error("shmat() error (%d)\n", errno);
1080                            return -1;
1081                    }
1082          }          }
1083    
         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 -2;  
         }  
1084          p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH;          p_menu_set->p_menu_pool = p_menu_set->p_reserved + MENU_SET_RESERVED_LENGTH;
1085          p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS;          p_menu_set->p_menu_item_pool = p_menu_set->p_menu_pool + sizeof(MENU) * MAX_MENUS;
1086          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_pool = p_menu_set->p_menu_item_pool + sizeof(MENU_ITEM) * MAX_MENUITEMS;


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1