⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 mutt-1.5.12 源代码。linux 下邮件接受的工具。
💻 C
📖 第 1 页 / 共 2 页
字号:
void menu_half_up (MUTTMENU *menu){  menu_length_jump (menu, 0 - menu->pagelen / 2);}void menu_top_page (MUTTMENU *menu){  if (menu->current != menu->top)  {    menu->current = menu->top;    menu->redraw = REDRAW_MOTION;  }}void menu_bottom_page (MUTTMENU *menu){  if (menu->max)  {    menu->current = menu->top + menu->pagelen - 1;    if (menu->current > menu->max - 1)      menu->current = menu->max - 1;    menu->redraw = REDRAW_MOTION;  }  else    mutt_error _("No entries.");}void menu_middle_page (MUTTMENU *menu){  int i;  if (menu->max)  {    i = menu->top + menu->pagelen;    if (i > menu->max - 1)      i = menu->max - 1;    menu->current = menu->top + (i - menu->top) / 2;    menu->redraw = REDRAW_MOTION;  }  else    mutt_error _("No entries.");}void menu_first_entry (MUTTMENU *menu){  if (menu->max)  {    menu->current = 0;    menu->redraw = REDRAW_MOTION;  }  else    mutt_error _("No entries.");}void menu_last_entry (MUTTMENU *menu){  if (menu->max)  {    menu->current = menu->max - 1;    menu->redraw = REDRAW_MOTION;  }  else    mutt_error _("No entries.");}void menu_current_top (MUTTMENU *menu){  if (menu->max)  {    menu->top = menu->current;    menu->redraw = REDRAW_INDEX;  }  else    mutt_error _("No entries.");}void menu_current_middle (MUTTMENU *menu){  if (menu->max)  {    menu->top = menu->current - menu->pagelen / 2;    if (menu->top < 0)      menu->top = 0;    menu->redraw = REDRAW_INDEX;  }  else    mutt_error _("No entries.");}void menu_current_bottom (MUTTMENU *menu){  if (menu->max)  {    menu->top = menu->current - menu->pagelen + 1;    if (menu->top < 0)      menu->top = 0;    menu->redraw = REDRAW_INDEX;  }  else    mutt_error _("No entries.");}void menu_next_entry (MUTTMENU *menu){  if (menu->current < menu->max - 1)  {    menu->current++;    menu->redraw = REDRAW_MOTION;  }  else    mutt_error _("You are on the last entry.");}void menu_prev_entry (MUTTMENU *menu){  if (menu->current)  {    menu->current--;    menu->redraw = REDRAW_MOTION;  }  else    mutt_error _("You are on the first entry.");}static int default_color (int i){   return ColorDefs[MT_COLOR_NORMAL];}static int menu_search_generic (MUTTMENU *m, regex_t *re, int n){  char buf[LONG_STRING];  menu_make_entry (buf, sizeof (buf), m, n);  return (regexec (re, buf, 0, NULL, 0));}MUTTMENU *mutt_new_menu (void){  MUTTMENU *p = (MUTTMENU *) safe_calloc (1, sizeof (MUTTMENU));  p->current = 0;  p->top = 0;  p->offset = 1;  p->redraw = REDRAW_FULL;  p->pagelen = PAGELEN;  p->color = default_color;  p->search = menu_search_generic;  return (p);}void mutt_menuDestroy (MUTTMENU **p){  int i;  FREE (&(*p)->searchBuf);  if ((*p)->dialog)   {    for (i=0; i < (*p)->max; i++)      FREE (&(*p)->dialog[i]);    FREE (& (*p)->dialog);  }  FREE (p);		/* __FREE_CHECKED__ */}#define M_SEARCH_UP   1#define M_SEARCH_DOWN 2static int menu_search (MUTTMENU *menu, int op){  int r;  int searchDir;  regex_t re;  char buf[SHORT_STRING];  if (op != OP_SEARCH_NEXT && op != OP_SEARCH_OPPOSITE)  {    strfcpy (buf, menu->searchBuf ? menu->searchBuf : "", sizeof (buf));    if (mutt_get_field ((op == OP_SEARCH) ? _("Search for: ") :                                             _("Reverse search for: "),			 buf, sizeof (buf), M_CLEAR) != 0 || !buf[0])      return (-1);    mutt_str_replace (&menu->searchBuf, buf);    menu->searchDir = (op == OP_SEARCH) ? M_SEARCH_DOWN : M_SEARCH_UP;  }  else   {    if (!menu->searchBuf)    {      mutt_error _("No search pattern.");      return (-1);    }  }  searchDir = (menu->searchDir == M_SEARCH_UP) ? -1 : 1;  if (op == OP_SEARCH_OPPOSITE)    searchDir = -searchDir;  if ((r = REGCOMP (&re, menu->searchBuf, REG_NOSUB | mutt_which_case (menu->searchBuf))) != 0)  {    regerror (r, &re, buf, sizeof (buf));    regfree (&re);    mutt_error ("%s", buf);    return (-1);  }  r = menu->current + searchDir;  while (r >= 0 && r < menu->max)  {    if (menu->search (menu, &re, r) == 0)    {      regfree (&re);      return r;    }    r += searchDir;  }  regfree (&re);  mutt_error _("Not found.");  return (-1);}static int menu_dialog_translate_op (int i){  switch (i)  {    case OP_NEXT_ENTRY:         return OP_NEXT_LINE;    case OP_PREV_ENTRY:	        return OP_PREV_LINE;    case OP_CURRENT_TOP:   case OP_FIRST_ENTRY:        return OP_TOP_PAGE;    case OP_CURRENT_BOTTOM:    case OP_LAST_ENTRY:	        return OP_BOTTOM_PAGE;    case OP_CURRENT_MIDDLE:       return OP_MIDDLE_PAGE;   }    return i;}static int menu_dialog_dokey (MUTTMENU *menu, int *ip){  event_t ch;  char *p;  ch = mutt_getch ();  if (ch.ch == -1)  {    *ip = -1;    return 0;  }  if (ch.ch && (p = strchr (menu->keys, ch.ch)))  {    *ip = OP_MAX + (p - menu->keys + 1);    return 0;  }  else  {    mutt_ungetch (ch.op ? 0 : ch.ch, ch.op ? ch.op : 0);    return -1;  }}int menu_redraw (MUTTMENU *menu){  /* See if all or part of the screen needs to be updated.  */  if (menu->redraw & REDRAW_FULL)  {    menu_redraw_full (menu);    /* allow the caller to do any local configuration */    return (OP_REDRAW);  }    if (!menu->dialog)    menu_check_recenter (menu);    if (menu->redraw & REDRAW_STATUS)    menu_redraw_status (menu);  if (menu->redraw & REDRAW_INDEX)    menu_redraw_index (menu);  else if (menu->redraw & (REDRAW_MOTION | REDRAW_MOTION_RESYNCH))    menu_redraw_motion (menu);  else if (menu->redraw == REDRAW_CURRENT)    menu_redraw_current (menu);    if (menu->dialog)    menu_redraw_prompt (menu);    return OP_NULL;}int mutt_menuLoop (MUTTMENU *menu){  int i = OP_NULL;  FOREVER  {    if (option (OPTMENUCALLER))    {      unset_option (OPTMENUCALLER);      return OP_NULL;    }            mutt_curs_set (0);#ifdef USE_IMAP    imap_keepalive ();#endif    if (menu_redraw (menu) == OP_REDRAW)      return OP_REDRAW;        menu->oldcurrent = menu->current;    /* move the cursor out of the way */            if (option (OPTARROWCURSOR))      move (menu->current - menu->top + menu->offset, 2);    else if (option (OPTBRAILLEFRIENDLY))      move (menu->current - menu->top + menu->offset, 0);    else      move (menu->current - menu->top + menu->offset, COLS - 1);    mutt_refresh ();        /* try to catch dialog keys before ops */    if (menu->dialog && menu_dialog_dokey (menu, &i) == 0)      return i;		        i = km_dokey (menu->menu);    if (i == OP_TAG_PREFIX || i == OP_TAG_PREFIX_COND)    {      if (menu->tagged)      {	mvaddstr (LINES - 1, 0, "Tag-");	clrtoeol ();	i = km_dokey (menu->menu);	menu->tagprefix = 1;	CLEARLINE (LINES - 1);      }      else if (i == OP_TAG_PREFIX)      {	mutt_error _("No tagged entries.");	i = -1;      }      else /* None tagged, OP_TAG_PREFIX_COND */      {	event_t tmp;	while(UngetCount>0)	{	  tmp=mutt_getch();	  if(tmp.op==OP_END_COND)break;	}	mutt_message _("Nothing to do.");	i = -1;      }    }    else if (menu->tagged && option (OPTAUTOTAG))      menu->tagprefix = 1;    else      menu->tagprefix = 0;    mutt_curs_set (1);#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)    if (SigWinch)    {      mutt_resize_screen ();      menu->redraw = REDRAW_FULL;      SigWinch = 0;      clearok(stdscr,TRUE);/*force complete redraw*/    }#endif    if (i == -1)      continue;    if (!menu->dialog)      mutt_clear_error ();    /* Convert menubar movement to scrolling */    if (menu->dialog)       i = menu_dialog_translate_op (i);    switch (i)    {      case OP_NEXT_ENTRY:	menu_next_entry (menu);	break;      case OP_PREV_ENTRY:	menu_prev_entry (menu);	break;      case OP_HALF_DOWN:	menu_half_down (menu);	break;      case OP_HALF_UP:	menu_half_up (menu);	break;      case OP_NEXT_PAGE:	menu_next_page (menu);	break;      case OP_PREV_PAGE:	menu_prev_page (menu);	break;      case OP_NEXT_LINE:	menu_next_line (menu);	break;      case OP_PREV_LINE:	menu_prev_line (menu);	break;      case OP_FIRST_ENTRY:	menu_first_entry (menu);	break;      case OP_LAST_ENTRY:	menu_last_entry (menu);	break;      case OP_TOP_PAGE:	menu_top_page (menu);	break;      case OP_MIDDLE_PAGE:	menu_middle_page (menu);	break;      case OP_BOTTOM_PAGE:	menu_bottom_page (menu);	break;      case OP_CURRENT_TOP:	menu_current_top (menu);	break;      case OP_CURRENT_MIDDLE:	menu_current_middle (menu);	break;      case OP_CURRENT_BOTTOM:	menu_current_bottom (menu);	break;      case OP_SEARCH:      case OP_SEARCH_REVERSE:      case OP_SEARCH_NEXT:      case OP_SEARCH_OPPOSITE:	if (menu->search && !menu->dialog) /* Searching dialogs won't work */	{	  menu->oldcurrent = menu->current;	  if ((menu->current = menu_search (menu, i)) != -1)	    menu->redraw = REDRAW_MOTION;	  else	    menu->current = menu->oldcurrent;	}	else	  mutt_error _("Search is not implemented for this menu.");	break;      case OP_JUMP:	if (menu->dialog)	  mutt_error _("Jumping is not implemented for dialogs.");	else	  menu_jump (menu);	break;      case OP_ENTER_COMMAND:	CurrentMenu = menu->menu;	mutt_enter_command ();	if (option (OPTFORCEREDRAWINDEX))	{	  menu->redraw = REDRAW_FULL;	  unset_option (OPTFORCEREDRAWINDEX);	  unset_option (OPTFORCEREDRAWPAGER);	}	break;      case OP_TAG:	if (menu->tag && !menu->dialog)	{	  if (menu->tagprefix && !option (OPTAUTOTAG))	  {	    for (i = 0; i < menu->max; i++)	      menu->tagged += menu->tag (menu, i, 0);	    menu->redraw = REDRAW_INDEX;	  }	  else if (menu->max)	  {	    int i = menu->tag (menu, menu->current, -1);	    menu->tagged += i;	    if (i && option (OPTRESOLVE) && menu->current < menu->max - 1)	    {	      menu->current++;	      menu->redraw = REDRAW_MOTION_RESYNCH;	    }	    else	      menu->redraw = REDRAW_CURRENT;	  }	  else	    mutt_error _("No entries.");	}	else	  mutt_error _("Tagging is not supported.");	break;      case OP_SHELL_ESCAPE:	mutt_shell_escape ();	MAYBE_REDRAW (menu->redraw);	break;      case OP_WHAT_KEY:	mutt_what_key ();	break;      case OP_REDRAW:	clearok (stdscr, TRUE);	menu->redraw = REDRAW_FULL;	break;      case OP_HELP:	mutt_help (menu->menu);	menu->redraw = REDRAW_FULL;	break;      case OP_NULL:	km_error_key (menu->menu);	break;      case OP_END_COND:	break;      default:	return (i);    }  }  /* not reached */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -