/*
* Copyright notice from original mutt:
* Copyright (C) 1996-2000 Michael R. Elkins <me@mutt.org>
- * * Parts of it were written/modified by:
- * Nico Golde <nico@ngolde.de>
- *
+ *
* 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.
# include "config.h"
#endif
+#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
+#include <lib-lib/macros.h>
+
#include "mutt.h"
+#include "enter.h"
#include "mutt_curses.h"
#include "mutt_menu.h"
#include "mbyte.h"
#include "imap.h"
#endif
-#include "lib/mem.h"
-#include "lib/intl.h"
-#include "lib/str.h"
#include <string.h>
#include <stdlib.h>
-extern int Charset_is_utf8; /* FIXME: bad modularisation */
+#define SW (option(OPTMBOXPANE)?SidebarWidth:0)
extern size_t UngetCount;
{
wchar_t wc;
size_t k;
- size_t n = safe_strlen ((char *) s);
+ size_t n = m_strlen((char *) s);
mbstate_t mbstate;
memset (&mbstate, 0, sizeof (mbstate));
{
int shift = option (OPTARROWCURSOR) ? 3 : 0;
int cols;
- char *tmpbuf = safe_malloc (n);
+ char *tmpbuf = p_new(char, n);
if (option (OPTMBOXPANE))
cols = COLS - shift - SidebarWidth;
else
cols = COLS - shift;
- mutt_format_string (tmpbuf, n, cols, cols, 0, ' ', s, safe_strlen (s), 1);
+ mutt_format_string (tmpbuf, n, cols, cols, 0, ' ', s, m_strlen(s), 1);
tmpbuf[n - 1] = 0;
snprintf (s, n, "%s", tmpbuf); /* overkill */
- FREE (&tmpbuf);
+ p_delete(&tmpbuf);
}
void menu_redraw_full (MUTTMENU * menu)
/* clear() doesn't optimize screen redraws */
move (0, 0);
clrtobot ();
-
- if (!option(OPTMBOXPANE)) SidebarWidth=0;
if (option (OPTHELP)) {
SETCOLOR (MT_COLOR_STATUS);
- move (option (OPTSTATUSONTOP) ? LINES - 2 : 0, 0);
- mutt_paddstr (COLS, menu->help);
+ move (option (OPTSTATUSONTOP) ? LINES - 2 : 0, SW);
+ mutt_paddstr (COLS-SW, menu->help);
SETCOLOR (MT_COLOR_NORMAL);
menu->offset = 1;
menu->pagelen = LINES - 3;
menu->pagelen = LINES - 2;
}
+ sidebar_draw_frames();
+
mutt_show_error ();
menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
snprintf (buf, sizeof (buf), M_MODEFMT, menu->title);
SETCOLOR (MT_COLOR_STATUS);
- move (option (OPTSTATUSONTOP) ? 0 : LINES - 2, 0);
- mutt_paddstr (COLS, buf);
+ move (option (OPTSTATUSONTOP) ? 0 : LINES - 2, SW);
+ mutt_paddstr (COLS-SW, buf);
SETCOLOR (MT_COLOR_NORMAL);
menu->redraw &= ~REDRAW_STATUS;
+ sidebar_draw_frames();
}
void menu_redraw_index (MUTTMENU * menu)
char buf[STRING];
int i;
- if (!option(OPTMBOXPANE)) SidebarWidth=0;
- 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);
if (i == menu->current) {
attrset (menu->color (i));
ADDCOLOR (MT_COLOR_INDICATOR);
+ BKGDSET (MT_COLOR_INDICATOR);
addstr ("->");
attrset (menu->color (i));
addch (' ');
}
else {
attrset (menu->color (i));
- move (i - menu->top + menu->offset, SidebarWidth);
+ move (i - menu->top + menu->offset, SW);
addstr (" ");
}
print_enriched_string (menu->color (i), (unsigned char *) buf, 1);
SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
}
else {
attrset (menu->color (i));
}
CLEARLINE_WIN (i - menu->top + menu->offset);
+
+ move (i - menu->top + menu->offset, SW);
print_enriched_string (menu->color (i), (unsigned char *) buf,
i != menu->current);
SETCOLOR (MT_COLOR_NORMAL);
else
CLEARLINE_WIN (i - menu->top + menu->offset);
}
+ sidebar_draw (1);
+/* sidebar_draw_frames(); */
+
menu->redraw = 0;
}
return;
}
- move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth);
+ move (menu->oldcurrent + menu->offset - menu->top, SW);
SETCOLOR (MT_COLOR_NORMAL);
BKGDSET (MT_COLOR_NORMAL);
clrtoeol ();
menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
menu_pad_string (buf, sizeof (buf));
- move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3);
+ move (menu->oldcurrent + menu->offset - menu->top, SW + 3);
print_enriched_string (menu->color (menu->oldcurrent),
(unsigned char *) buf, 1);
SETCOLOR (MT_COLOR_NORMAL);
}
/* now draw it in the new location */
- move (menu->current + menu->offset - menu->top, SidebarWidth);
+ move (menu->current + menu->offset - menu->top, SW);
attrset (menu->color (menu->current));
ADDCOLOR (MT_COLOR_INDICATOR);
addstr ("->");
ADDCOLOR (MT_COLOR_INDICATOR);
BKGDSET (MT_COLOR_INDICATOR);
CLEARLINE_WIN (menu->current - menu->top + menu->offset);
+ move (menu->current + menu->offset - menu->top, SW);
print_enriched_string (menu->color (menu->current), (unsigned char *) buf,
0);
SETCOLOR (MT_COLOR_NORMAL);
{
char buf[STRING];
- move (menu->current + menu->offset - menu->top, SidebarWidth);
+ move (menu->current + menu->offset - menu->top, SW);
menu_make_entry (buf, sizeof (buf), menu, menu->current);
menu_pad_string (buf, sizeof (buf));
- if (!option(OPTMBOXPANE)) SidebarWidth=0;
-
if (option (OPTARROWCURSOR)) {
int attr = menu->color (menu->current);
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 */
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)
mutt_error _("No entries.");
}
-void menu_middle_page (MUTTMENU * menu)
-{
+void menu_middle_page (MUTTMENU *menu) {
int i;
if (menu->max) {
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;
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;
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) {
MUTTMENU *mutt_new_menu (void)
{
- MUTTMENU *p = (MUTTMENU *) safe_calloc (1, sizeof (MUTTMENU));
+ MUTTMENU *p = p_new(MUTTMENU, 1);
p->current = 0;
p->top = 0;
{
int i;
- FREE (&(*p)->searchBuf);
+ p_delete(&(*p)->searchBuf);
if ((*p)->dialog) {
for (i = 0; i < (*p)->max; i++)
- FREE (&(*p)->dialog[i]);
+ p_delete(&(*p)->dialog[i]);
- FREE (&(*p)->dialog);
+ p_delete(&(*p)->dialog);
}
- FREE (p);
+ p_delete(p);
}
#define M_SEARCH_UP 1
menu->oldcurrent = menu->current;
if (option (OPTARROWCURSOR))
- move (menu->current - menu->top + menu->offset, 2);
+ move (menu->current - menu->top + menu->offset, SW + 2);
else if (option (OPTBRAILLEFRIENDLY))
- move (menu->current - menu->top + menu->offset, 0);
+ move (menu->current - menu->top + menu->offset, SW);
else
move (menu->current - menu->top + menu->offset, COLS - 1);
mutt_what_key ();
break;
+ case OP_REBUILD_CACHE:
+ mx_rebuild_cache ();
+ break;
+
case OP_REDRAW:
clearok (stdscr, TRUE);
menu->redraw = REDRAW_FULL;