[英]Creating a dynamic menu in ncurses
我已经尝试在ncurses中创建动态菜单了一段时间了,终于取得了一些成功。 但是,我担心实现这一目标的方式存在风险。 下面是我的代码:
void ListBox::CreateMenu()
{
my_items = (ITEM **) calloc(2,sizeof(ITEM *));
char * choices[] = {"Search Results", (char *) NULL};
my_items[0] = new_item(choices[0], (char *) NULL);
my_items[1] = new_item((char *) NULL, (char *) NULL);
my_menu = new_menu((ITEM**) my_items);
set_menu_win(my_menu, list_window);
der_window = derwin(list_window, h-2,w-2, 1, 1);
//set_menu_sub(my_menu, derwin(list_window, h-2,w-2, 1, 1));
set_menu_sub(my_menu, der_window);
set_menu_format(my_menu, h-2, 1);
set_menu_mark(my_menu, " > ");
post_menu(my_menu);
n_choices = 2;
}
void ListBox::UpdateRange(std::string search, int after_colon)
{
int start = 0;
int end = 0;
if(search_map.count(search.substr(after_colon)))
{
start = search_map[search.substr(after_colon)][0];
end = search_map[search.substr(after_colon)][1];
}
unpost_menu(my_menu);
for(int i = 0; i < n_choices; i++){free_item(my_items[i]);}
if(start == 0 && end == 0)
{
NoResults();
return;
}
my_items = (ITEM **) calloc(int((end-start)+ 1),sizeof(ITEM *));
int count = 0;
for(int i = start; i < end; i++)
{
my_items[count] = new_item(vec[i].c_str(), (char *) NULL);
count++;
}
my_items[int(vec.size())] = new_item((char *) NULL, (char *) NULL);
set_menu_items(my_menu, my_items);
post_menu(my_menu);
wrefresh(list_window);
n_choices = int(end-start) +1 ;
}
void ListBox::NoResults()
{
my_items = (ITEM **) calloc(2,sizeof(ITEM *));
char * choices[] = {"NO RESULTS", (char *) NULL};
my_items[0] = new_item(choices[0], (char *) NULL);
my_items[1] = new_item((char *) NULL, (char *) NULL);
set_menu_items(my_menu, my_items);
post_menu(my_menu);
wrefresh(list_window);
n_choices = 2;
}
我担心上面的代码的原因是因为当我在m_post.c中查看unpost_menu和post_menu的ncurses方法时,我变得很担心,并且对当前代码的工作方式有些困惑。 在ncurses的unpost_menu.c代码中,看起来像这样,
unpost_menu(MENU * menu)
{
WINDOW *win;
T((T_CALLED("unpost_menu(%p)"), (void *)menu));
if (!menu)
RETURN(E_BAD_ARGUMENT);
if (menu->status & _IN_DRIVER)
RETURN(E_BAD_STATE);
if (!(menu->status & _POSTED))
RETURN(E_NOT_POSTED);
Call_Hook(menu, itemterm);
Call_Hook(menu, menuterm);
win = Get_Menu_Window(menu);
werase(win);
wsyncup(win);
assert(menu->sub);
delwin(menu->sub);
menu->sub = (WINDOW *)0;
assert(menu->win);
delwin(menu->win);
menu->win = (WINDOW *)0;
ClrStatus(menu, _POSTED);
RETURN(E_OK);
}
我注意到在unpost_menu中有一个对delwin的调用。 但是我的代码工作正常,如果没有结果,则正确显示任何结果,如果有结果,则正确显示结果。 我想知道是否有人对实际发生的事情有任何见识。
我的程序的基本描述如下。 CreateMenu()函数仅被调用一次,也就是在调用ListBox构造函数时。 然后,我的程序等待用户输入搜索查询,如果有结果,它将返回结果。 如果没有结果,则不返回任何结果。 一切似乎都能正常运行,但是鉴于unpost_menu方法中对delwin的调用,我对它的运行方式感到困惑。 任何见解将非常感谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.