X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=menu.c;h=7370b129db9d5f50da700ab41ad0ac46289c5ced;hp=0a35299a9c23957885a95d004e780d66eb661187;hb=13b3b36c8f696aea26b7c60444f2baa4858b004d;hpb=df70e07e24add1869bcc9b7af2277d9d0c09a281 diff --git a/menu.c b/menu.c index 0a35299..7370b12 100644 --- a/menu.c +++ b/menu.c @@ -1,19 +1,10 @@ /* + * Copyright notice from original mutt: * Copyright (C) 1996-2000 Michael R. Elkins * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. */ #if HAVE_CONFIG_H @@ -21,6 +12,7 @@ #endif #include "mutt.h" +#include "enter.h" #include "mutt_curses.h" #include "mutt_menu.h" #include "mbyte.h" @@ -30,6 +22,10 @@ #include "imap.h" #endif +#include "lib/mem.h" +#include "lib/intl.h" +#include "lib/str.h" + #include #include @@ -41,7 +37,7 @@ static void print_enriched_string (int attr, unsigned char *s, int do_color) { wchar_t wc; size_t k; - size_t n = mutt_strlen ((char *) s); + size_t n = str_len ((char *) s); mbstate_t mbstate; memset (&mbstate, 0, sizeof (mbstate)); @@ -154,16 +150,16 @@ void menu_pad_string (char *s, size_t n) { int shift = option (OPTARROWCURSOR) ? 3 : 0; int cols; - char *tmpbuf = safe_malloc (n); + char *tmpbuf = mem_malloc (n); if (option (OPTMBOXPANE)) cols = COLS - shift - SidebarWidth; else cols = COLS - shift; - mutt_format_string (tmpbuf, n, cols, cols, 0, ' ', s, strlen (s), 1); + mutt_format_string (tmpbuf, n, cols, cols, 0, ' ', s, str_len (s), 1); tmpbuf[n - 1] = 0; snprintf (s, n, "%s", tmpbuf); /* overkill */ - FREE (&tmpbuf); + mem_free (&tmpbuf); } void menu_redraw_full (MUTTMENU * menu) @@ -208,7 +204,7 @@ void menu_redraw_index (MUTTMENU * menu) char buf[STRING]; int i; - draw_sidebar (1); + sidebar_draw (1); for (i = menu->top; i < menu->top + menu->pagelen; i++) { if (i < menu->max) { menu_make_entry (buf, sizeof (buf), menu, i); @@ -225,8 +221,11 @@ void menu_redraw_index (MUTTMENU * menu) attrset (menu->color (i)); addch (' '); } - else - move (i - menu->top + menu->offset, SidebarWidth + 3); + else { + attrset (menu->color (i)); + move (i - menu->top + menu->offset, SidebarWidth); + addstr (" "); + } print_enriched_string (menu->color (i), (unsigned char *) buf, 1); SETCOLOR (MT_COLOR_NORMAL); @@ -374,23 +373,18 @@ void menu_check_recenter (MUTTMENU * menu) menu->top = 0; set_option (OPTNEEDREDRAW); } - } - else if (menu->current >= menu->top + menu->pagelen - c) { /* indicator below bottom threshold */ - if (option (OPTMENUSCROLL) || (menu->pagelen <= 0)) - menu->top = menu->current - menu->pagelen + c + 1; - else - menu->top += - (menu->pagelen - - c) * ((menu->current - menu->top) / (menu->pagelen - c)) - c; - } - else if (menu->current < menu->top + c) { /* indicator above top threshold */ - if (option (OPTMENUSCROLL) || (menu->pagelen <= 0)) - menu->top = menu->current - c; - else - menu->top -= - (menu->pagelen - - c) * ((menu->top + menu->pagelen - 1 - - menu->current) / (menu->pagelen - c)) - c; + } else { + if (option (OPTMENUSCROLL) || (menu->pagelen <= 0) || (c <= MenuContext)) { + if (menu->current < menu->top + c) + menu->top = menu->current - c; + else if (menu->current >= menu->top + menu->pagelen - c) + menu->top = menu->current - menu->pagelen + c + 1; + } else { + if (menu->current < menu->top + c) + menu->top -= (menu->pagelen - c) * ((menu->top + menu->pagelen - 1 - menu->current) / (menu->pagelen - c)) - c; + else if ((menu->current >= menu->top + menu->pagelen - c)) + menu->top += (menu->pagelen - c) * ((menu->current - menu->top) / (menu->pagelen - c)) - c; + } } if (!option (OPTMENUMOVEOFF)) /* make entries stick to bottom */ @@ -458,55 +452,75 @@ void menu_prev_line (MUTTMENU * menu) mutt_error _("You cannot scroll up farther."); } -void menu_next_page (MUTTMENU * menu) -{ +/* + * pageup: jumplen == -pagelen + * pagedown: jumplen == pagelen + * halfup: jumplen == -pagelen/2 + * halfdown: jumplen == pagelen/2 + */ +#define DIRECTION ((neg * 2) + 1) +void menu_length_jump (MUTTMENU *menu, int jumplen) { + int tmp, neg = (jumplen >= 0) ? 0 : -1; + int c = MIN (MenuContext, menu->pagelen / 2); + if (menu->max) { - if (menu->top + menu->pagelen < menu->max) { - menu->top += menu->pagelen; - if (menu->current < menu->top) - menu->current = menu->top; + /* possible to scroll? */ + if (DIRECTION * menu->top < + (tmp = (neg ? 0 : (menu->max /*-1*/) - (menu->pagelen /*-1*/)))) { + menu->top += jumplen; + + /* jumped too long? */ + if ((neg || !option (OPTMENUMOVEOFF)) && DIRECTION * menu->top > tmp) + menu->top = tmp; + + /* need to move the cursor? */ + if ((DIRECTION * + (tmp = (menu->current - (menu->top + + (neg ? (menu->pagelen - 1) - c : c))))) < 0) + menu->current -= tmp; + menu->redraw = REDRAW_INDEX; } - else if (menu->current != menu->max - 1 && !menu->dialog) { - menu->current = menu->max - 1; + else if (menu->current != (neg ? 0 : menu->max - 1) && !menu->dialog) { + menu->current += jumplen; menu->redraw = REDRAW_MOTION; } else - mutt_error _("You are on the last page."); + mutt_error (neg ? _("You are on the first page.") + : _("You are on the last page.")); + + menu->current = MIN (menu->current, menu->max - 1); + menu->current = MAX (menu->current, 0); } else mutt_error _("No entries."); } +#undef DIRECTION -void menu_prev_page (MUTTMENU * menu) -{ - int c = MIN (MenuContext, menu->pagelen / 2); +void menu_next_page (MUTTMENU *menu) { + menu_length_jump (menu, MAX (menu->pagelen /* - MenuOverlap */, 0)); +} - if (menu->top > c) { - if ((menu->top -= menu->pagelen) < 0) - menu->top = 0; - if (menu->current >= menu->top + menu->pagelen) - menu->current = menu->top + menu->pagelen - 1; - menu->redraw = REDRAW_INDEX; - } - else if (menu->current && !menu->dialog) { - menu->current = 0; - menu->redraw = REDRAW_MOTION; - } - else - mutt_error _("You are on the first page."); +void menu_prev_page (MUTTMENU *menu) { + menu_length_jump (menu, 0 - MAX (menu->pagelen /* - MenuOverlap */, 0)); } -void menu_top_page (MUTTMENU * menu) -{ +void menu_half_down (MUTTMENU *menu) { + menu_length_jump (menu, menu->pagelen / 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) -{ +void menu_bottom_page (MUTTMENU *menu) { if (menu->max) { menu->current = menu->top + menu->pagelen - 1; if (menu->current > menu->max - 1) @@ -517,8 +531,7 @@ void menu_bottom_page (MUTTMENU * menu) mutt_error _("No entries."); } -void menu_middle_page (MUTTMENU * menu) -{ +void menu_middle_page (MUTTMENU *menu) { int i; if (menu->max) { @@ -532,8 +545,7 @@ void menu_middle_page (MUTTMENU * menu) mutt_error _("No entries."); } -void menu_first_entry (MUTTMENU * menu) -{ +void menu_first_entry (MUTTMENU *menu) { if (menu->max) { menu->current = 0; menu->redraw = REDRAW_MOTION; @@ -542,8 +554,7 @@ void menu_first_entry (MUTTMENU * menu) mutt_error _("No entries."); } -void menu_last_entry (MUTTMENU * menu) -{ +void menu_last_entry (MUTTMENU *menu) { if (menu->max) { menu->current = menu->max - 1; menu->redraw = REDRAW_MOTION; @@ -552,43 +563,6 @@ void menu_last_entry (MUTTMENU * menu) mutt_error _("No entries."); } -void menu_half_up (MUTTMENU * menu) -{ - if (menu->top > 0) { - if ((menu->top -= menu->pagelen / 2) < 0) - menu->top = 0; - if (menu->current >= menu->top + menu->pagelen) - menu->current = menu->top + menu->pagelen - 1; - menu->redraw = REDRAW_INDEX; - } - else if (menu->current && !menu->dialog) { - menu->current = 0; - menu->redraw = REDRAW_MOTION; - } - else - mutt_error _("First entry is shown."); -} - -void menu_half_down (MUTTMENU * menu) -{ - if (menu->max) { - if (menu->top + menu->pagelen < menu->max) { - menu->top += menu->pagelen / 2; - if (menu->current < menu->top) - menu->current = menu->top; - menu->redraw = REDRAW_INDEX; - } - else if (menu->current != menu->max - 1 && !menu->dialog) { - menu->current = menu->max - 1; - menu->redraw = REDRAW_INDEX; - } - else - mutt_error _("Last entry is shown."); - } - else - mutt_error _("No entries."); -} - void menu_current_top (MUTTMENU * menu) { if (menu->max) { @@ -658,7 +632,7 @@ static int menu_search_generic (MUTTMENU * m, regex_t * re, int n) MUTTMENU *mutt_new_menu (void) { - MUTTMENU *p = (MUTTMENU *) safe_calloc (1, sizeof (MUTTMENU)); + MUTTMENU *p = (MUTTMENU *) mem_calloc (1, sizeof (MUTTMENU)); p->current = 0; p->top = 0; @@ -674,16 +648,16 @@ void mutt_menuDestroy (MUTTMENU ** p) { int i; - FREE (&(*p)->searchBuf); + mem_free (&(*p)->searchBuf); if ((*p)->dialog) { for (i = 0; i < (*p)->max; i++) - FREE (&(*p)->dialog[i]); + mem_free (&(*p)->dialog[i]); - FREE (&(*p)->dialog); + mem_free (&(*p)->dialog); } - FREE (p); + mem_free (p); } #define M_SEARCH_UP 1 @@ -702,7 +676,7 @@ static int menu_search (MUTTMENU * menu, int op) _("Reverse search for: "), buf, sizeof (buf), M_CLEAR) != 0 || !buf[0]) return (-1); - mutt_str_replace (&menu->searchBuf, buf); + str_replace (&menu->searchBuf, buf); menu->searchDir = (op == OP_SEARCH) ? M_SEARCH_DOWN : M_SEARCH_UP; } else { @@ -833,13 +807,16 @@ int mutt_menuLoop (MUTTMENU * menu) menu->oldcurrent = menu->current; - - /* move the cursor out of the way */ - move (menu->current - menu->top + menu->offset, - (option (OPTARROWCURSOR) ? 2 : COLS - 1)); + 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; @@ -1014,6 +991,10 @@ int mutt_menuLoop (MUTTMENU * menu) mutt_what_key (); break; + case OP_REBUILD_CACHE: + mx_rebuild_cache (); + break; + case OP_REDRAW: clearok (stdscr, TRUE); menu->redraw = REDRAW_FULL;