📄 menu.c
字号:
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 + -