/[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.24 by sysadm, Sat May 3 13:41:21 2025 UTC Revision 1.26 by sysadm, Mon May 5 02:54:27 2025 UTC
# Line 31  Line 31 
31  #include <regex.h>  #include <regex.h>
32  #include <stdlib.h>  #include <stdlib.h>
33    
34    #define MENU_TEMP_DIR "var"
35    
36  MENU_SET bbs_menu;  MENU_SET bbs_menu;
37    
38  int load_menu(MENU_SET *p_menu_set, const char *conf_file)  int load_menu(MENU_SET *p_menu_set, const char *conf_file)
# Line 38  int load_menu(MENU_SET *p_menu_set, cons Line 40  int load_menu(MENU_SET *p_menu_set, cons
40          FILE *fin, *fout;          FILE *fin, *fout;
41          int i = 0, j;          int i = 0, j;
42          char buffer[LINE_BUFFER_LEN];          char buffer[LINE_BUFFER_LEN];
43          char screen_filename[LINE_BUFFER_LEN];          char screen_filename[FILE_PATH_LEN];
44          char temp[LINE_BUFFER_LEN];          char temp[LINE_BUFFER_LEN];
45          regmatch_t pmatch[10];          regmatch_t pmatch[10];
46    
# Line 62  int load_menu(MENU_SET *p_menu_set, cons Line 64  int load_menu(MENU_SET *p_menu_set, cons
64                                  strncpy(temp, buffer + pmatch[1].rm_so,                                  strncpy(temp, buffer + pmatch[1].rm_so,
65                                                  pmatch[1].rm_eo - pmatch[1].rm_so);                                                  pmatch[1].rm_eo - pmatch[1].rm_so);
66                                  temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';                                  temp[pmatch[1].rm_eo - pmatch[1].rm_so] = '\0';
67                                  sprintf(screen_filename, "%sMENU_SCR_%s", app_temp_dir, temp);                                  sprintf(screen_filename, "%s/MENU_SCR_%s", MENU_TEMP_DIR, temp);
68    
69                                  if ((fout = fopen(screen_filename, "w")) == NULL)                                  if ((fout = fopen(screen_filename, "w")) == NULL)
70                                  {                                  {
# Line 248  int load_menu(MENU_SET *p_menu_set, cons Line 250  int load_menu(MENU_SET *p_menu_set, cons
250                                                                  pmatch[3].rm_eo - pmatch[3].rm_so);                                                                  pmatch[3].rm_eo - pmatch[3].rm_so);
251                                                  temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';                                                  temp[pmatch[3].rm_eo - pmatch[3].rm_so] = '\0';
252                                                  sprintf(p_menu_set->p_menu[i]->screen.filename,                                                  sprintf(p_menu_set->p_menu[i]->screen.filename,
253                                                                  "%sMENU_SCR_%s", app_temp_dir, temp);                                                                  "%s/MENU_SCR_%s", MENU_TEMP_DIR, temp);
254                                                  continue;                                                  continue;
255                                          }                                          }
256                                  }                                  }
# Line 285  static void display_menu_cursor(MENU *p_ Line 287  static void display_menu_cursor(MENU *p_
287  {  {
288          moveto((p_menu->items[p_menu->item_cur_pos])->r_row,          moveto((p_menu->items[p_menu->item_cur_pos])->r_row,
289                     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);                     (p_menu->items[p_menu->item_cur_pos])->r_col - 2);
290          prints(show ? ">" : " ");          outc(show ? '>' : ' ');
291          iflush();          iflush();
292  }  }
293    
294  int display_menu(MENU *p_menu)  int display_menu(MENU *p_menu)
295  {  {
296          int i, row, col, menu_selectable = 0;          int row = 0;
297            int col = 0;
298            int menu_selectable = 0;
299    
300          if (p_menu == NULL)          if (p_menu == NULL)
301            {
302                  return -1;                  return -1;
303            }
304    
305          if (p_menu->title.show)          if (p_menu->title.show)
306            {
307                  show_top(p_menu->title.text);                  show_top(p_menu->title.text);
308            }
309    
310          if (p_menu->screen.show)          if (p_menu->screen.show)
311          {          {
312                  moveto(p_menu->screen.row, p_menu->screen.col);                  moveto(p_menu->screen.row, p_menu->screen.col);
313                  if (display_file(p_menu->screen.filename) != 0)                  if (display_file(p_menu->screen.filename) != 0)
314                    {
315                          log_error("Display menu screen <%s> failed!\n",                          log_error("Display menu screen <%s> failed!\n",
316                                            p_menu->screen.filename);                                            p_menu->screen.filename);
317                    }
318          }          }
319    
320          row = p_menu->items[0]->row;          for (int i = 0; i < p_menu->item_count; i++)
         col = p_menu->items[0]->col;  
   
         for (i = 0; i < p_menu->item_count; i++)  
321          {          {
322                    if (p_menu->items[i]->row != 0)
323                    {
324                            row = p_menu->items[i]->row;
325                    }
326                    if (p_menu->items[i]->col != 0)
327                    {
328                            col = p_menu->items[i]->col;
329                    }
330    
331                  if (checkpriv(&BBS_priv, 0, p_menu->items[i]->priv) == 0 || checklevel(&BBS_priv, p_menu->items[i]->level) == 0)                  if (checkpriv(&BBS_priv, 0, p_menu->items[i]->priv) == 0 || checklevel(&BBS_priv, p_menu->items[i]->level) == 0)
332                  {                  {
333                          p_menu->items[i]->display = 0;                          p_menu->items[i]->display = 0;
334                            p_menu->items[i]->r_row = 0;
335                            p_menu->items[i]->r_col = 0;
336                  }                  }
337                  else                  else
338                  {                  {
339                          p_menu->items[i]->display = 1;                          p_menu->items[i]->display = 1;
340    
341                          menu_selectable = 1;                          if (!menu_selectable)
342                            {
343                                    p_menu->item_cur_pos = i;
344                                    menu_selectable = 1;
345                            }
346    
                         if (p_menu->items[i]->row != 0)  
                                 row = p_menu->items[i]->row;  
                         else  
                                 row++;  
347                          p_menu->items[i]->r_row = row;                          p_menu->items[i]->r_row = row;
                         if (p_menu->items[i]->col != 0)  
                                 col = p_menu->items[i]->col;  
348                          p_menu->items[i]->r_col = col;                          p_menu->items[i]->r_col = col;
349    
350                          moveto(row, col);                          moveto(row, col);
351                          prints(p_menu->items[i]->text);                          prints("%s", p_menu->items[i]->text);
352                          iflush();  
353                            row++;
354                  }                  }
355          }          }
356    
357          if (!menu_selectable)          if (!menu_selectable)
358            {
359                  return -1;                  return -1;
360            }
361    
362          display_menu_cursor(p_menu, 1);          display_menu_cursor(p_menu, 1);
363    
# Line 359  int menu_control(MENU_SET *p_menu_set, i Line 379  int menu_control(MENU_SET *p_menu_set, i
379          MENU *p_menu;          MENU *p_menu;
380    
381          if (p_menu_set->menu_count == 0)          if (p_menu_set->menu_count == 0)
382            {
383                  return 0;                  return 0;
384            }
385    
386          p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];          p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth];
387    
# Line 371  int menu_control(MENU_SET *p_menu_set, i Line 393  int menu_control(MENU_SET *p_menu_set, i
393                  if (p_menu->items[p_menu->item_cur_pos]->submenu)                  if (p_menu->items[p_menu->item_cur_pos]->submenu)
394                  {                  {
395                          if (strcmp(p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)                          if (strcmp(p_menu->items[p_menu->item_cur_pos]->action, "..") == 0)
396                            {
397                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
398                            }
399                          p_menu_set->menu_select_depth++;                          p_menu_set->menu_select_depth++;
400                          p_menu =                          p_menu = get_menu(p_menu_set, p_menu->items[p_menu->item_cur_pos]->action);
401                                  p_menu_set->p_menu_select[p_menu_set->menu_select_depth] =                          p_menu_set->p_menu_select[p_menu_set->menu_select_depth] = p_menu;
402                                          get_menu(p_menu_set,  
                                                          p_menu->items[p_menu->item_cur_pos]->action);  
403                          if (display_menu(p_menu) != 0)                          if (display_menu(p_menu) != 0)
404                            {
405                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
406                            }
407                          break;                          break;
408                  }                  }
409                  else                  else
# Line 391  int menu_control(MENU_SET *p_menu_set, i Line 416  int menu_control(MENU_SET *p_menu_set, i
416                  {                  {
417                          p_menu_set->menu_select_depth--;                          p_menu_set->menu_select_depth--;
418                          if (display_current_menu(p_menu_set) != 0)                          if (display_current_menu(p_menu_set) != 0)
419                            {
420                                  return menu_control(p_menu_set, KEY_LEFT);                                  return menu_control(p_menu_set, KEY_LEFT);
421                            }
422                          break;                          break;
423                  }                  }
424                  else                  else
425                  {                  {
426                          display_menu_cursor(p_menu, 0);                          display_menu_cursor(p_menu, 0);
427                          p_menu->item_cur_pos = p_menu->item_count - 1;                          p_menu->item_cur_pos = p_menu->item_count - 1;
428                          while (!p_menu->items[p_menu->item_cur_pos]->display || p_menu->items[p_menu->item_cur_pos]->priv != 0 || p_menu->items[p_menu->item_cur_pos]->level != 0)                          while (!p_menu->items[p_menu->item_cur_pos]->display ||
429                                       p_menu->items[p_menu->item_cur_pos]->priv != 0 ||
430                                       p_menu->items[p_menu->item_cur_pos]->level != 0)
431                            {
432                                  p_menu->item_cur_pos--;                                  p_menu->item_cur_pos--;
433                            }
434                          display_menu_cursor(p_menu, 1);                          display_menu_cursor(p_menu, 1);
435                          break;                          break;
436                  }                  }
# Line 409  int menu_control(MENU_SET *p_menu_set, i Line 440  int menu_control(MENU_SET *p_menu_set, i
440                  {                  {
441                          p_menu->item_cur_pos--;                          p_menu->item_cur_pos--;
442                          if (p_menu->item_cur_pos < 0)                          if (p_menu->item_cur_pos < 0)
443                            {
444                                  p_menu->item_cur_pos = p_menu->item_count - 1;                                  p_menu->item_cur_pos = p_menu->item_count - 1;
445                            }
446                  } while (!p_menu->items[p_menu->item_cur_pos]->display);                  } while (!p_menu->items[p_menu->item_cur_pos]->display);
447                  display_menu_cursor(p_menu, 1);                  display_menu_cursor(p_menu, 1);
448                  break;                  break;
# Line 419  int menu_control(MENU_SET *p_menu_set, i Line 452  int menu_control(MENU_SET *p_menu_set, i
452                  {                  {
453                          p_menu->item_cur_pos++;                          p_menu->item_cur_pos++;
454                          if (p_menu->item_cur_pos >= p_menu->item_count)                          if (p_menu->item_cur_pos >= p_menu->item_count)
455                            {
456                                  p_menu->item_cur_pos = 0;                                  p_menu->item_cur_pos = 0;
457                            }
458                  } while (!p_menu->items[p_menu->item_cur_pos]->display);                  } while (!p_menu->items[p_menu->item_cur_pos]->display);
459                  display_menu_cursor(p_menu, 1);                  display_menu_cursor(p_menu, 1);
460                  break;                  break;
# Line 457  int menu_control(MENU_SET *p_menu_set, i Line 492  int menu_control(MENU_SET *p_menu_set, i
492  void unload_menu(MENU_SET *p_menu_set)  void unload_menu(MENU_SET *p_menu_set)
493  {  {
494          MENU *p_menu;          MENU *p_menu;
         MENU_ITEM *p_menuitem;  
495          int i, j;          int i, j;
496    
497          for (i = 0; i < p_menu_set->menu_count; i++)          for (i = 0; i < p_menu_set->menu_count; i++)


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

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