繁体   English   中英

在ncurses中创建动态菜单

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM