Rocco Rutte:
[apps/madmutt.git] / menu.c
diff --git a/menu.c b/menu.c
index 15eccce..a097c48 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -159,13 +159,12 @@ void menu_pad_string (char *s, size_t n)
 {
   int shift = option (OPTARROWCURSOR) ? 3 : 0;
   int cols = COLS - shift - SidebarWidth;
-
-  char tmpbuf[n];
+  char* tmpbuf = safe_malloc (n);
 
   mutt_format_string (tmpbuf, n, cols, cols, 0, ' ', s, strlen (s), 1);
   tmpbuf[n - 1] = 0;
-
   snprintf(s,n,"%s",tmpbuf); /* overkill */
+  FREE(&tmpbuf);
 }
 
 void menu_redraw_full (MUTTMENU *menu)
@@ -380,7 +379,7 @@ void menu_check_recenter (MUTTMENU *menu)
   int c = MIN (MenuContext, menu->pagelen / 2);
   int old_top = menu->top;
 
-  if (menu->max <= menu->pagelen) /* less entries than lines */
+  if (!option (OPTMENUMOVEOFF) && menu->max <= menu->pagelen) /* less entries than lines */
   {
     if (menu->top != 0) {
       menu->top = 0;
@@ -402,8 +401,8 @@ void menu_check_recenter (MUTTMENU *menu)
       menu->top -= (menu->pagelen - c) * ((menu->top + menu->pagelen - 1 - menu->current) / (menu->pagelen - c)) - c;
   }
 
-  /* make entries stick to bottom */
-  menu->top = MIN (menu->top, menu->max - menu->pagelen);
+  if (!option (OPTMENUMOVEOFF)) /* make entries stick to bottom */
+    menu->top = MIN (menu->top, menu->max - menu->pagelen);
   menu->top = MAX (menu->top, 0);
 
   if (menu->top != old_top)
@@ -439,10 +438,13 @@ void menu_next_line (MUTTMENU *menu)
 {
   if (menu->max)
   {
-    if (menu->top + 1 < menu->max)
+    int c = MIN (MenuContext, menu->pagelen / 2);
+
+    if (menu->top + 1 < menu->max - c
+      && (option(OPTMENUMOVEOFF) || (menu->max > menu->pagelen && menu->top < menu->max - menu->pagelen)))
     {
       menu->top++;
-      if (menu->current < menu->top)
+      if (menu->current < menu->top + c && menu->current < menu->max - 1)
         menu->current++;
       menu->redraw = REDRAW_INDEX;
     }
@@ -457,8 +459,10 @@ void menu_prev_line (MUTTMENU *menu)
 {
   if (menu->top > 0)
   {
+    int c = MIN (MenuContext, menu->pagelen / 2);
+
     menu->top--;
-    if (menu->current >= menu->top + menu->pagelen)
+    if (menu->current >= menu->top + menu->pagelen - c && menu->current > 1)
       menu->current--;
     menu->redraw = REDRAW_INDEX;
   }