/[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.47 by sysadm, Sun May 18 08:53:21 2025 UTC
# Line 546  int load_menu(MENU_SET *p_menu_set, cons Line 546  int load_menu(MENU_SET *p_menu_set, cons
546                                                          log_error("Error menu screen name in menu config line %d\n", fin_line);                                                          log_error("Error menu screen name in menu config line %d\n", fin_line);
547                                                          return -1;                                                          return -1;
548                                                  }                                                  }
549                                                  if (trie_dict_get(p_menu_set->p_menu_screen_dict, p, (int64_t *)&screen_id) != 1)                                                  strncpy(p_menu->screen_name, p, sizeof(p_menu->screen_name) - 1);
550                                                  {                                                  p_menu->screen_name[sizeof(p_menu->screen_name) - 1] = '\0';
                                                         log_error("Undefined menu screen [%s]\n", p);  
                                                         return -1;  
                                                 }  
                                                 p_menu->screen_id = screen_id;  
551    
552                                                  // Check syntax                                                  // Check syntax
553                                                  q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);                                                  q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
# Line 628  int load_menu(MENU_SET *p_menu_set, cons Line 624  int load_menu(MENU_SET *p_menu_set, cons
624                                                  break;                                                  break;
625                                          }                                          }
626    
627                                            // Clear line
628                                            if (p_menu_set->p_menu_screen_buf_free + strlen(CTRL_SEQ_CLR_LINE) > q)
629                                            {
630                                                    log_error("Menu screen buffer depleted (%p + %d > %p)\n", p_menu_set->p_menu_screen_buf_free, q, strlen(CTRL_SEQ_CLR_LINE));
631                                                    return -3;
632                                            }
633                                            p_menu_set->p_menu_screen_buf_free = stpcpy(p_menu_set->p_menu_screen_buf_free, CTRL_SEQ_CLR_LINE);
634    
635                                          p = buffer;                                          p = buffer;
636                                          while (*p != '\0')                                          while (*p != '\0')
637                                          {                                          {
# Line 663  int load_menu(MENU_SET *p_menu_set, cons Line 667  int load_menu(MENU_SET *p_menu_set, cons
667          }          }
668          fclose(fin);          fclose(fin);
669    
670          // Set menu_item->action_menu_id of each menu item pointing to a submenu to the menu_id of the corresponding submenu          for (menu_id = 0; menu_id < p_menu_set->menu_count; menu_id++)
671            {
672                    p_menu = get_menu_by_id(p_menu_set, menu_id);
673    
674                    if (trie_dict_get(p_menu_set->p_menu_screen_dict, p_menu->screen_name, (int64_t *)(&(p_menu->screen_id))) != 1)
675                    {
676                            log_error("Undefined menu screen [%s]\n", p);
677                            return -1;
678                    }
679            }
680    
681          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++)
682          {          {
683                  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);
684                  if (p_menu_item->submenu == 1 && strcmp(p_menu_item->action, "..") != 0)  
685                    // Set menu_item->action_cmd_handler of each menu item pointing to bbs_cmd
686                    if (p_menu_item->submenu == 0)
687                    {
688                            if ((p_menu_item->action_cmd_handler = get_cmd_handler(p_menu_item->action)) == NULL)
689                            {
690                                    log_error("Undefined menu action cmd handler [%s]\n", p_menu_item->action);
691                                    return -1;
692                            }
693                    }
694                    // Set menu_item->action_menu_id of each menu item pointing to a submenu to the menu_id of the corresponding submenu
695                    else if (strcmp(p_menu_item->action, "..") != 0)
696                  {                  {
697                          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)
698                          {                          {
# Line 711  static int display_menu_cursor(MENU_SET Line 736  static int display_menu_cursor(MENU_SET
736                  return -1;                  return -1;
737          }          }
738    
739          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);
740          outc(show ? '>' : ' ');          outc(show ? '>' : ' ');
741          iflush();          iflush();
742    
# Line 773  int display_menu(MENU_SET *p_menu_set) Line 798  int display_menu(MENU_SET *p_menu_set)
798                  iflush();                  iflush();
799          }          }
800    
801          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++)
802          {          {
803                  menu_item_id = p_menu->items[i];                  menu_item_id = p_menu->items[menu_item_pos];
804                  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);
805    
806                  if (p_menu_item->row != 0)                  if (p_menu_item->row != 0)
# Line 789  int display_menu(MENU_SET *p_menu_set) Line 814  int display_menu(MENU_SET *p_menu_set)
814    
815                  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)
816                  {                  {
817                          p_menu_item->display = 0;                          p_menu_set->menu_item_display[menu_item_pos] = 0;
818                          p_menu_item->r_row = 0;                          p_menu_set->menu_item_r_row[menu_item_pos] = 0;
819                          p_menu_item->r_col = 0;                          p_menu_set->menu_item_r_col[menu_item_pos] = 0;
820                  }                  }
821                  else                  else
822                  {                  {
823                          p_menu_item->display = 1;                          p_menu_set->menu_item_display[menu_item_pos] = 1;
824    
825                          if (!menu_selectable)                          if (!menu_selectable)
826                          {                          {
827                                  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;
828                                  menu_selectable = 1;                                  menu_selectable = 1;
829                          }                          }
830    
831                          p_menu_item->r_row = row;                          p_menu_set->menu_item_r_row[menu_item_pos] = row;
832                          p_menu_item->r_col = col;                          p_menu_set->menu_item_r_col[menu_item_pos] = col;
833    
834                          moveto(row, col);                          moveto(row, col);
835                          prints("%s", p_menu_item->text);                          prints("%s", p_menu_item->text);
# Line 880  int menu_control(MENU_SET *p_menu_set, i Line 905  int menu_control(MENU_SET *p_menu_set, i
905                  }                  }
906                  else                  else
907                  {                  {
908                          return (exec_cmd(p_menu_item->action, p_menu_item->name));                          return ((*(p_menu_item->action_cmd_handler))((void *)(p_menu_item->name)));
909                  }                  }
910                  break;                  break;
911          case KEY_LEFT:          case KEY_LEFT:
# Line 906  int menu_control(MENU_SET *p_menu_set, i Line 931  int menu_control(MENU_SET *p_menu_set, i
931                                          return -1;                                          return -1;
932                                  }                                  }
933    
934                                  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)
935                                  {                                  {
936                                          menu_item_pos--;                                          menu_item_pos--;
937                                  }                                  }
# Line 935  int menu_control(MENU_SET *p_menu_set, i Line 960  int menu_control(MENU_SET *p_menu_set, i
960                                  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);
961                                  return -1;                                  return -1;
962                          }                          }
963                  } while (!p_menu_item->display);                  } while (!p_menu_set->menu_item_display[menu_item_pos]);
964                  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;
965                  display_menu_cursor(p_menu_set, 1);                  display_menu_cursor(p_menu_set, 1);
966                  break;                  break;
# Line 955  int menu_control(MENU_SET *p_menu_set, i Line 980  int menu_control(MENU_SET *p_menu_set, i
980                                  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);
981                                  return -1;                                  return -1;
982                          }                          }
983                  } while (!p_menu_item->display);                  } while (!p_menu_set->menu_item_display[menu_item_pos]);
984                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
985                    display_menu_cursor(p_menu_set, 1);
986                    break;
987            case KEY_HOME:
988            case KEY_PGUP:
989                    display_menu_cursor(p_menu_set, 0);
990                    menu_item_pos = 0;
991                    while (menu_item_pos < p_menu->item_count - 1)
992                    {
993                            menu_item_id = p_menu->items[menu_item_pos];
994                            p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
995                            if (p_menu_item == NULL)
996                            {
997                                    log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
998                                    return -1;
999                            }
1000    
1001                            if (p_menu_set->menu_item_display[menu_item_pos])
1002                            {
1003                                    break;
1004                            }
1005    
1006                            menu_item_pos++;
1007                    }
1008                    p_menu_set->menu_item_pos[p_menu_set->choose_step] = menu_item_pos;
1009                    display_menu_cursor(p_menu_set, 1);
1010                    break;
1011            case KEY_END:
1012            case KEY_PGDN:
1013                    display_menu_cursor(p_menu_set, 0);
1014                    menu_item_pos = p_menu->item_count - 1;
1015                    while (menu_item_pos > 0)
1016                    {
1017                            menu_item_id = p_menu->items[menu_item_pos];
1018                            p_menu_item = get_menu_item_by_id(p_menu_set, menu_item_id);
1019                            if (p_menu_item == NULL)
1020                            {
1021                                    log_error("get_menu_item_by_id(%d) return NULL pointer\n", menu_item_id);
1022                                    return -1;
1023                            }
1024    
1025                            if (p_menu_set->menu_item_display[menu_item_pos])
1026                            {
1027                                    break;
1028                            }
1029    
1030                            menu_item_pos--;
1031                    }
1032                  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;
1033                  display_menu_cursor(p_menu_set, 1);                  display_menu_cursor(p_menu_set, 1);
1034                  break;                  break;
1035          default:          default:
1036                  if (isalnum(key))                  if (isalnum(key))
1037                  {                  {
1038                          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++)
1039                          {                          {
1040                                  menu_item_id = p_menu->items[i];                                  menu_item_id = p_menu->items[menu_item_pos];
1041                                  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);
1042                                  if (p_menu_item == NULL)                                  if (p_menu_item == NULL)
1043                                  {                                  {
# Line 972  int menu_control(MENU_SET *p_menu_set, i Line 1045  int menu_control(MENU_SET *p_menu_set, i
1045                                          return -1;                                          return -1;
1046                                  }                                  }
1047    
1048                                  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])
1049                                  {                                  {
1050                                          display_menu_cursor(p_menu_set, 0);                                          display_menu_cursor(p_menu_set, 0);
1051                                          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;
1052                                          display_menu_cursor(p_menu_set, 1);                                          display_menu_cursor(p_menu_set, 1);
1053                                          return 0;                                          return 0;
1054                                  }                                  }
# Line 1015  int unload_menu(MENU_SET *p_menu_set) Line 1088  int unload_menu(MENU_SET *p_menu_set)
1088  int load_menu_shm(MENU_SET *p_menu_set)  int load_menu_shm(MENU_SET *p_menu_set)
1089  {  {
1090          // Mount shared memory          // Mount shared memory
1091          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)  
1092          {          {
1093                  log_error("shmat() error (%d)\n", errno);                  p_menu_set->p_reserved = shmat(p_menu_set->shmid, NULL, SHM_RDONLY);
1094                  return -3;                  if (p_menu_set->p_reserved == (void *)-1)
1095                    {
1096                            log_error("shmat() error (%d)\n", errno);
1097                            return -1;
1098                    }
1099          }          }
1100    
1101          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;
1102          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;
1103          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 1131  int unload_menu_shm(MENU_SET *p_menu_set
1131          p_menu_set->p_menu_screen_buf = NULL;          p_menu_set->p_menu_screen_buf = NULL;
1132          p_menu_set->p_menu_screen_buf_free = NULL;          p_menu_set->p_menu_screen_buf_free = NULL;
1133    
1134          if (shmdt(p_menu_set->p_reserved) == -1)          if (p_menu_set->p_reserved != NULL && shmdt(p_menu_set->p_reserved) == -1)
1135          {          {
1136                  log_error("shmdt() error (%d)\n", errno);                  log_error("shmdt() error (%d)\n", errno);
1137                  return -1;                  return -1;
1138          }          }
   
1139          p_menu_set->p_reserved = NULL;          p_menu_set->p_reserved = NULL;
1140    
1141          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