/[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.60 by sysadm, Wed May 28 10:26:21 2025 UTC Revision 1.64 by sysadm, Mon Jun 16 14:30:44 2025 UTC
# Line 14  Line 14 
14   *                                                                         *   *                                                                         *
15   ***************************************************************************/   ***************************************************************************/
16    
17    #define _POSIX_C_SOURCE 200809L
18    
19  #include "bbs.h"  #include "bbs.h"
20  #include "bbs_cmd.h"  #include "bbs_cmd.h"
21  #include "user_priv.h"  #include "user_priv.h"
# Line 161  int load_menu(MENU_SET *p_menu_set, cons Line 163  int load_menu(MENU_SET *p_menu_set, cons
163                                  p_menu->title.show = 0;                                  p_menu->title.show = 0;
164                                  p_menu->screen_show = 0;                                  p_menu->screen_show = 0;
165                                  p_menu->page_item_limit = 0;                                  p_menu->page_item_limit = 0;
166                                    p_menu->use_filter = 0;
167                                    p_menu->filter_handler = NULL;
168    
169                                  q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);                                  q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
170                                  if (q == NULL)                                  if (q == NULL)
# Line 653  int load_menu(MENU_SET *p_menu_set, cons Line 657  int load_menu(MENU_SET *p_menu_set, cons
657                                                          return -1;                                                          return -1;
658                                                  }                                                  }
659                                          }                                          }
660                                            else if (strcmp(p, "use_filter") == 0)
661                                            {
662                                                    p_menu->use_filter = 1;
663    
664                                                    // Check syntax
665                                                    q = strtok_r(NULL, MENU_CONF_DELIM_WITH_SPACE, &saveptr);
666                                                    if (q != NULL)
667                                                    {
668                                                            log_error("Unknown extra content in menu config line %d\n", fin_line);
669                                                            return -1;
670                                                    }
671                                            }
672                                  }                                  }
673                          }                          }
674                          else // BEGIN of menu screen                          else // BEGIN of menu screen
# Line 772  int load_menu(MENU_SET *p_menu_set, cons Line 788  int load_menu(MENU_SET *p_menu_set, cons
788                          log_error("Undefined menu screen [%s]\n", p);                          log_error("Undefined menu screen [%s]\n", p);
789                          return -1;                          return -1;
790                  }                  }
791    
792                    // Set menu->filter_handler of each menu pointing to filter
793                    if (p_menu->use_filter == 1)
794                    {
795                            if ((p_menu->filter_handler = get_cmd_handler(p_menu->name)) == NULL)
796                            {
797                                    log_error("Undefined menu filter handler [%s]\n", p_menu->name);
798                                    return -1;
799                            }
800                    }
801          }          }
802    
803          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++)
# Line 807  int load_menu(MENU_SET *p_menu_set, cons Line 833  int load_menu(MENU_SET *p_menu_set, cons
833          return 0;          return 0;
834  }  }
835    
836  static int display_menu_cursor(MENU_SET *p_menu_set, int show)  int display_menu_cursor(MENU_SET *p_menu_set, int show)
837  {  {
838          MENU_ID menu_id;          MENU_ID menu_id;
839          MENU_ITEM_ID menu_item_id;          MENU_ITEM_ID menu_item_id;
# Line 969  int display_menu(MENU_SET *p_menu_set) Line 995  int display_menu(MENU_SET *p_menu_set)
995          }          }
996    
997          if (menu_item_pos > 0 &&          if (menu_item_pos > 0 &&
998                  checkpriv(&BBS_priv, 0, p_menu_item->priv) != 0 &&                  !(p_menu->use_filter ? (p_menu->filter_handler((void *)p_menu_item) == 0)
999                  checklevel2(&BBS_priv, p_menu_item->level))                                                           : (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 ||
1000                                                                    checklevel2(&BBS_priv, p_menu_item->level) == 0)))
1001          {          {
1002                  menu_selectable = 1;                  menu_selectable = 1;
1003          }          }
# Line 991  int display_menu(MENU_SET *p_menu_set) Line 1018  int display_menu(MENU_SET *p_menu_set)
1018    
1019                  p_menu_set->menu_item_page_id[menu_item_pos] = page_id;                  p_menu_set->menu_item_page_id[menu_item_pos] = page_id;
1020    
1021                  if (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 || checklevel2(&BBS_priv, p_menu_item->level) == 0)                  if (p_menu->use_filter ? (p_menu->filter_handler((void *)p_menu_item) == 0)
1022                                                               : (checkpriv(&BBS_priv, 0, p_menu_item->priv) == 0 ||
1023                                                                      checklevel2(&BBS_priv, p_menu_item->level) == 0))
1024                  {                  {
1025                          p_menu_set->menu_item_display[menu_item_pos] = 0;                          p_menu_set->menu_item_display[menu_item_pos] = 0;
1026                          p_menu_set->menu_item_r_row[menu_item_pos] = 0;                          p_menu_set->menu_item_r_row[menu_item_pos] = 0;
# Line 1025  int display_menu(MENU_SET *p_menu_set) Line 1054  int display_menu(MENU_SET *p_menu_set)
1054    
1055          if (!menu_selectable)          if (!menu_selectable)
1056          {          {
1057                  log_error("No selectable menu item in current menu (%s)\n", p_menu->name);                  moveto(p_menu->screen_row, p_menu->screen_col);
1058                    prints("没有可选项");
1059                    press_any_key();
1060                  return -1;                  return -1;
1061          }          }
1062    
# Line 1350  int set_menu_shm_readonly(MENU_SET *p_me Line 1381  int set_menu_shm_readonly(MENU_SET *p_me
1381                  log_error("shmat(menu_shm shmid = %d) error (%d)\n", p_menu_set->shmid, errno);                  log_error("shmat(menu_shm shmid = %d) error (%d)\n", p_menu_set->shmid, errno);
1382                  return -1;                  return -1;
1383          }          }
1384            
1385          p_menu_set->p_reserved = p_shm;          p_menu_set->p_reserved = p_shm;
1386    
1387          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