/[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.40 by sysadm, Thu May 15 05:14:57 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 711  static int display_menu_cursor(MENU_SET Line 721  static int display_menu_cursor(MENU_SET
721                  return -1;                  return -1;
722          }          }
723    
724          moveto(p_menu_item->r_row, p_menu_item->r_col - 2);          moveto(p_menu_set->menu_item_r_row[menu_item_pos], p_menu_set->menu_item_r_col[menu_item_pos] - 2);
725          outc(show ? '>' : ' ');          outc(show ? '>' : ' ');
726          iflush();          iflush();
727    
# Line 773  int display_menu(MENU_SET *p_menu_set) Line 783  int display_menu(MENU_SET *p_menu_set)
783                  iflush();                  iflush();
784          }          }
785    
786          for (int16_t i = 0; i < p_menu->item_count; i++)          for (menu_item_pos = 0; menu_item_pos < p_menu->item_count; menu_item_pos++)
787          {          {
788                  menu_item_id = p_menu->items[i];                  menu_item_id = p_menu->items[menu_item_pos];
789                  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);
790    
791                  if (p_menu_item->row != 0)                  if (p_menu_item->row != 0)
# Line 789  int display_menu(MENU_SET *p_menu_set) Line 799  int display_menu(MENU_SET *p_menu_set)
799    
800                  if (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 || checklevel(&BBS_priv, p_menu_item->level) == 0)                  if (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 || checklevel(&BBS_priv, p_menu_item->level) == 0)
801                  {                  {
802                          p_menu_item->display = 0;                          p_menu_set->menu_item_display[menu_item_pos] = 0;
803                          p_menu_item->r_row = 0;                          p_menu_set->menu_item_r_row[menu_item_pos] = 0;
804                          p_menu_item->r_col = 0;                          p_menu_set->menu_item_r_col[menu_item_pos] = 0;
805                  }                  }
806                  else                  else
807                  {                  {
808                          p_menu_item->display = 1;                          p_menu_set->menu_item_display[menu_item_pos] = 1;
809    
810                          if (!menu_selectable)                          if (!menu_selectable)
811                          {                          {
812                                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = i;                                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
813                                  menu_selectable = 1;                                  menu_selectable = 1;
814                          }                          }
815    
816                          p_menu_item->r_row = row;                          p_menu_set->menu_item_r_row[menu_item_pos] = row;
817                          p_menu_item->r_col = col;                          p_menu_set->menu_item_r_col[menu_item_pos] = col;
818    
819                          moveto(row, col);                          moveto(row, col);
820                          prints("%s", p_menu_item->text);                          prints("%s", p_menu_item->text);
# 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 906  int menu_control(MENU_SET *p_menu_set, i Line 916  int menu_control(MENU_SET *p_menu_set, i
916                                          return -1;                                          return -1;
917                                  }                                  }
918    
919                                  if (!p_menu_item->display || p_menu_item->priv != 0 || p_menu_item->level != 0)                                  if (!p_menu_set->menu_item_display[menu_item_pos] || p_menu_item->priv != 0 || p_menu_item->level != 0)
920                                  {                                  {
921                                          menu_item_pos--;                                          menu_item_pos--;
922                                  }                                  }
# Line 935  int menu_control(MENU_SET *p_menu_set, i Line 945  int menu_control(MENU_SET *p_menu_set, i
945                                  log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);                                  log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
946                                  return -1;                                  return -1;
947                          }                          }
948                  } while (!p_menu_item->display);                  } while (!p_menu_set->menu_item_display[menu_item_pos]);
949                  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;
950                  display_menu_cursor(p_menu_set, 1);                  display_menu_cursor(p_menu_set, 1);
951                  break;                  break;
# Line 955  int menu_control(MENU_SET *p_menu_set, i Line 965  int menu_control(MENU_SET *p_menu_set, i
965                                  log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);                                  log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
966                                  return -1;                                  return -1;
967                          }                          }
968                  } while (!p_menu_item->display);                  } while (!p_menu_set->menu_item_display[menu_item_pos]);
969                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
970                    display_menu_cursor(p_menu_set, 1);
971                    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;                  p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1018                  display_menu_cursor(p_menu_set, 1);                  display_menu_cursor(p_menu_set, 1);
1019                  break;                  break;
1020          default:          default:
1021                  if (isalnum(key))                  if (isalnum(key))
1022                  {                  {
1023                          for (int16_t i = 0; i < p_menu->item_count; i++)                          for (menu_item_pos = 0; menu_item_pos < p_menu->item_count; menu_item_pos++)
1024                          {                          {
1025                                  menu_item_id = p_menu->items[i];                                  menu_item_id = p_menu->items[menu_item_pos];
1026                                  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);
1027                                  if (p_menu_item == NULL)                                  if (p_menu_item == NULL)
1028                                  {                                  {
# Line 972  int menu_control(MENU_SET *p_menu_set, i Line 1030  int menu_control(MENU_SET *p_menu_set, i
1030                                          return -1;                                          return -1;
1031                                  }                                  }
1032    
1033                                  if (toupper(key) == toupper(p_menu_item->name[0]) && p_menu_item->display)                                  if (toupper(key) == toupper(p_menu_item->name[0]) && p_menu_set->menu_item_display[menu_item_pos])
1034                                  {                                  {
1035                                          display_menu_cursor(p_menu_set, 0);                                          display_menu_cursor(p_menu_set, 0);
1036                                          p_menu_set->menu_item_pos[p_menu_set->choose_step] = i;                                          p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1037                                          display_menu_cursor(p_menu_set, 1);                                          display_menu_cursor(p_menu_set, 1);
1038                                          return 0;                                          return 0;
1039                                  }                                  }
# 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          p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY);          if (p_menu_set->p_reserved == NULL)
         if (p_menu_set->p_reserved == (void *)-1)  
1075          {          {
1076                  log_error("shmat() error (%d)\n", errno);                  p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY);
1077                  return -3;                  if (p_menu_set->p_reserved == (void *)-1)
1078                    {
1079                            log_error("shmat() error (%d)\n", errno);
1080                            return -1;
1081                    }
1082          }          }
1083    
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;
# Line 1054  int unload_menu_shm(MENU_SET *p_menu_set Line 1114  int unload_menu_shm(MENU_SET *p_menu_set
1114          p_menu_set->p_menu_screen_buf = NULL;          p_menu_set->p_menu_screen_buf = NULL;
1115          p_menu_set->p_menu_screen_buf_free = NULL;          p_menu_set->p_menu_screen_buf_free = NULL;
1116    
1117          if (shmdt(p_menu_set->p_reserved) == -1)          if (p_menu_set->p_reserved != NULL && shmdt(p_menu_set->p_reserved) == -1)
1118          {          {
1119                  log_error("shmdt() error (%d)\n", errno);                  log_error("shmdt() error (%d)\n", errno);
1120                  return -1;                  return -1;
1121          }          }
   
1122          p_menu_set->p_reserved = NULL;          p_menu_set->p_reserved = NULL;
1123    
1124          return 0;          return 0;


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

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