--- lbbs/src/menu.c 2005/03/21 13:27:00 1.12 +++ lbbs/src/menu.c 2005/05/07 12:08:28 1.19 @@ -16,6 +16,7 @@ ***************************************************************************/ #include "bbs.h" +#include "bbs_cmd.h" #include "menu.h" #include "io.h" #include "common.h" @@ -40,6 +41,8 @@ load_menu (MENU_SET * p_menu_set, const return -1; } + strcpy (p_menu_set->conf_file, conf_file); + while (fgets (buffer, 255, fin)) { switch (buffer[0]) @@ -75,6 +78,8 @@ load_menu (MENU_SET * p_menu_set, const if (ireg ("^%menu ([A-Za-z0-9_]+)", buffer, 2, pmatch) == 0) { p_menu_set->p_menu[i] = malloc (sizeof (MENU)); + p_menu_set->p_menu[i]->title.show = 0; + p_menu_set->p_menu[i]->screen.show = 0; strncpy (p_menu_set->p_menu[i]->name, buffer + pmatch[1].rm_so, @@ -99,7 +104,7 @@ load_menu (MENU_SET * p_menu_set, const } if (ireg ("^!([A-Za-z0-9_.]+)[[:space:]]*([0-9]+)," "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+)," - "[[:space:]]*([0-9]+),[[:space:]]*\"([A-Za-z0-9_]+)\"," + "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"," "[[:space:]]*\"([^\"]+)\"", buffer, 8, pmatch) == 0) { @@ -149,7 +154,7 @@ load_menu (MENU_SET * p_menu_set, const } if (ireg ("^@([A-Za-z0-9_]+)[[:space:]]*([0-9]+)," "[[:space:]]*([0-9]+),[[:space:]]*([0-9]+)," - "[[:space:]]*([0-9]+),[[:space:]]*\"([A-Za-z0-9_]+)\"," + "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"," "[[:space:]]*\"([^\"]+)\"", buffer, 8, pmatch) == 0) { @@ -201,6 +206,7 @@ load_menu (MENU_SET * p_menu_set, const "[[:space:]]*([0-9]+),[[:space:]]*\"([^\"]+)\"", buffer, 4, pmatch) == 0) { + p_menu_set->p_menu[i]->title.show = 1; strncpy (temp, buffer + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); @@ -223,6 +229,7 @@ load_menu (MENU_SET * p_menu_set, const "[[:space:]]*([0-9]+),[[:space:]]*S_([A-Za-z0-9_]+)", buffer, 4, pmatch) == 0) { + p_menu_set->p_menu[i]->screen.show = 1; strncpy (temp, buffer + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); @@ -272,7 +279,7 @@ get_menu (MENU_SET * p_menu_set, const c return NULL; } -void +static void display_menu_cursor (MENU * p_menu, int show) { moveto ((p_menu->items[p_menu->item_cur_pos])->r_row, @@ -289,11 +296,16 @@ display_menu (MENU * p_menu) if (p_menu == NULL) return -1; - show_top (p_menu->title.text); + if (p_menu->title.show) + show_top (p_menu->title.text); - moveto (p_menu->screen.row, p_menu->screen.col); - if (display_file (p_menu->screen.filename) != 0) - log_error ("Display menu screen <%s> failed!\n", p_menu->screen.filename); + if (p_menu->screen.show) + { + moveto (p_menu->screen.row, p_menu->screen.col); + if (display_file (p_menu->screen.filename) != 0) + log_error ("Display menu screen <%s> failed!\n", + p_menu->screen.filename); + } row = p_menu->items[0]->row; col = p_menu->items[0]->col; @@ -301,7 +313,7 @@ display_menu (MENU * p_menu) for (i = 0; i < p_menu->item_count; i++) { if (checkpriv (&BBS_priv, 0, p_menu->items[i]->priv) == 0 - || checklevel (&BBS_priv, p_menu->items[i]->level) == 0) + || checklevel (&BBS_priv, p_menu->items[i]->level) == 0) { p_menu->items[i]->display = 0; } @@ -343,14 +355,14 @@ display_current_menu (MENU_SET * p_menu_ return display_menu (p_menu); } -const char * +int menu_control (MENU_SET * p_menu_set, int key) { int i; MENU *p_menu; if (p_menu_set->menu_count == 0) - return ""; + return 0; p_menu = p_menu_set->p_menu_select[p_menu_set->menu_select_depth]; @@ -373,7 +385,8 @@ menu_control (MENU_SET * p_menu_set, int } else { - return (p_menu->items[p_menu->item_cur_pos]->action); + return (exec_cmd(p_menu->items[p_menu->item_cur_pos]->action, + p_menu->items[p_menu->item_cur_pos]->name)); } case KEY_LEFT: if (p_menu_set->menu_select_depth > 0) @@ -388,8 +401,8 @@ menu_control (MENU_SET * p_menu_set, int display_menu_cursor (p_menu, 0); p_menu->item_cur_pos = p_menu->item_count - 1; 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) + || p_menu->items[p_menu->item_cur_pos]->priv != 0 + || p_menu->items[p_menu->item_cur_pos]->level != 0) p_menu->item_cur_pos--; display_menu_cursor (p_menu, 1); break; @@ -419,15 +432,64 @@ menu_control (MENU_SET * p_menu_set, int default: for (i = 0; i < p_menu->item_count; i++) { - if (toupper (key) == toupper (p_menu->items[i]->name[0])) + if (key == p_menu->items[i]->name[0] && + p_menu->items[i]->display) { display_menu_cursor (p_menu, 0); p_menu->item_cur_pos = i; display_menu_cursor (p_menu, 1); - break; + return 0; } } + if (isalpha (key)) + { + for (i = 0; i < p_menu->item_count; i++) + { + if (toupper (key) == toupper (p_menu->items[i]->name[0]) && + p_menu->items[i]->display) + { + display_menu_cursor (p_menu, 0); + p_menu->item_cur_pos = i; + display_menu_cursor (p_menu, 1); + return 0; + } + } + } + } + + return 0; +} + +void +unload_menu (MENU_SET * p_menu_set) +{ + MENU *p_menu; + MENU_ITEM *p_menuitem; + int i, j; + + for (i = 0; i < p_menu_set->menu_count; i++) + { + p_menu = p_menu_set->p_menu[i]; + for (j = 0; j < p_menu->item_count; j++) + { + free (p_menu->items[j]); + } + free (p_menu); } - return ""; + p_menu_set->menu_count = 0; + p_menu_set->menu_select_depth = 0; +} + +int +reload_menu (MENU_SET * p_menu_set) +{ + int result; + char conf_file[256]; + + strcpy (conf_file, p_menu_set->conf_file); + unload_menu (p_menu_set); + result = load_menu (p_menu_set, conf_file); + + return result; }