WHAT_KEY has better equivalents in other tools.
[apps/madmutt.git] / lib-ui / menu.c
index a99646f..d0b8c54 100644 (file)
@@ -7,9 +7,8 @@
  * please see the file GPL in the top level source directory.
  */
 
-#include <lib-lib/lib-lib.h>
+#include <lib-ui/lib-ui.h>
 
-#include "curses.h"
 #include "enter.h"
 #include "menu.h"
 
@@ -17,9 +16,6 @@
 #include "charset.h"
 
 #include <imap/imap.h>
-#include <lib-ui/sidebar.h>
-
-#define SW              (option(OPTMBOXPANE)?SidebarWidth:0)
 
 extern size_t UngetCount;
 
@@ -34,91 +30,56 @@ static void print_enriched_string (int attr, unsigned char *s, int do_color)
   while (*s) {
     if (*s < M_TREE_MAX) {
       if (do_color)
-        SETCOLOR (MT_COLOR_TREE);
+        SETCOLOR(main_w, MT_COLOR_TREE);
       while (*s && *s < M_TREE_MAX) {
         switch (*s) {
         case M_TREE_LLCORNER:
-          if (option (OPTASCIICHARS))
-            addch ('`');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\224");    /* WACS_LLCORNER */
-          else
-            addch (ACS_LLCORNER);
+          waddch (main_w, ACS_LLCORNER);
           break;
         case M_TREE_ULCORNER:
-          if (option (OPTASCIICHARS))
-            addch (',');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\214");    /* WACS_ULCORNER */
-          else
-            addch (ACS_ULCORNER);
+          waddch (main_w, ACS_ULCORNER);
           break;
         case M_TREE_LTEE:
-          if (option (OPTASCIICHARS))
-            addch ('|');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\234");    /* WACS_LTEE */
-          else
-            addch (ACS_LTEE);
+          waddch (main_w, ACS_LTEE);
           break;
         case M_TREE_HLINE:
-          if (option (OPTASCIICHARS))
-            addch ('-');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\200");    /* WACS_HLINE */
-          else
-            addch (ACS_HLINE);
+          waddch (main_w, ACS_HLINE);
           break;
         case M_TREE_VLINE:
-          if (option (OPTASCIICHARS))
-            addch ('|');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\202");    /* WACS_VLINE */
-          else
-            addch (ACS_VLINE);
+          waddch (main_w, ACS_VLINE);
           break;
         case M_TREE_TTEE:
-          if (option (OPTASCIICHARS))
-            addch ('-');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\254");    /* WACS_TTEE */
-          else
-            addch (ACS_TTEE);
+          waddch (main_w, ACS_TTEE);
           break;
         case M_TREE_BTEE:
-          if (option (OPTASCIICHARS))
-            addch ('-');
-          else if (Charset_is_utf8)
-            addstr ("\342\224\264");    /* WACS_BTEE */
-          else
-            addch (ACS_BTEE);
+          waddch (main_w, ACS_BTEE);
           break;
         case M_TREE_SPACE:
-          addch (' ');
+          waddch (main_w, ' ');
           break;
         case M_TREE_RARROW:
-          addch ('>');
+          waddch (main_w, '>');
           break;
         case M_TREE_STAR:
-          addch ('*');          /* fake thread indicator */
+          waddch (main_w, '*');          /* fake thread indicator */
           break;
         case M_TREE_HIDDEN:
-          addch ('&');
+          waddch (main_w, '&');
           break;
         case M_TREE_EQUALS:
-          addch ('=');
+          waddch (main_w, '=');
           break;
         case M_TREE_MISSING:
-          addch ('?');
+          waddch (main_w, '?');
           break;
         }
         s++, n--;
       }
       if (do_color)
-        attrset (attr);
+        wattrset (main_w, attr);
     }
-    else if ((k = mbrtowc (&wc, (char *) s, n, &mbstate)) > 0) {
-      addnstr ((char *) s, k);
+    else if ((k = mbrtowc (&wc, (char *) s, n, &mbstate)) != (size_t)-1) {
+      waddnstr (main_w, (char *) s, k);
       s += k, n -= k;
     }
     else
@@ -136,16 +97,11 @@ static void menu_make_entry (char *s, int l, MUTTMENU * menu, int i)
     menu->make_entry (s, l, menu, i);
 }
 
-void menu_pad_string (char *s, size_t n)
+static void menu_pad_string (char *s, size_t n)
 {
-  int shift = option (OPTARROWCURSOR) ? 3 : 0;
-  int cols;
+  int cols = getmaxx(main_w);
   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, m_strlen(s), 1);
   tmpbuf[n - 1] = 0;
   snprintf (s, n, "%s", tmpbuf);        /* overkill */
@@ -154,26 +110,13 @@ void menu_pad_string (char *s, size_t n)
 
 void menu_redraw_full (MUTTMENU * menu)
 {
-  SETCOLOR (MT_COLOR_NORMAL);
-  /* clear() doesn't optimize screen redraws */
-  move (0, 0);
-  clrtobot ();
-
-  if (option (OPTHELP)) {
-    SETCOLOR (MT_COLOR_STATUS);
-    move (option (OPTSTATUSONTOP) ? LINES - 2 : 0, SW);
-    mutt_paddstr (COLS-SW, menu->help);
-    SETCOLOR (MT_COLOR_NORMAL);
-    menu->offset = 1;
-    menu->pagelen = LINES - 3;
-  }
-  else {
-    menu->offset = option (OPTSTATUSONTOP) ? 1 : 0;
-    menu->pagelen = LINES - 2;
-  }
-
-  sidebar_draw_frames();
-
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
+  werase(main_w);
+  SETCOLOR(main_w, MT_COLOR_SIDEBAR);
+  mvwhline(main_w, LINES - 2, 0, ACS_HLINE, getmaxx(main_w));
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
+  menu->offset = 1;
+  menu->pagelen = LINES - 3;
   mutt_show_error ();
 
   menu->redraw = REDRAW_INDEX | REDRAW_STATUS;
@@ -184,12 +127,11 @@ void menu_redraw_status (MUTTMENU * menu)
   char buf[STRING];
 
   snprintf (buf, sizeof (buf), M_MODEFMT, menu->title);
-  SETCOLOR (MT_COLOR_STATUS);
-  move (option (OPTSTATUSONTOP) ? 0 : LINES - 2, SW);
-  mutt_paddstr (COLS-SW, buf);
-  SETCOLOR (MT_COLOR_NORMAL);
+  SETCOLOR(main_w, MT_COLOR_STATUS);
+  wmove (main_w, 0, 0);
+  mutt_paddstr (main_w, getmaxx(main_w), buf);
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
   menu->redraw &= ~REDRAW_STATUS;
-  sidebar_draw_frames();
 }
 
 void menu_redraw_index (MUTTMENU * menu)
@@ -202,50 +144,25 @@ void menu_redraw_index (MUTTMENU * menu)
       menu_make_entry (buf, sizeof (buf), menu, i);
       menu_pad_string (buf, sizeof (buf));
 
-      if (option (OPTARROWCURSOR)) {
-        attrset (menu->color (i));
-        CLEARLINE_WIN (i - menu->top + menu->offset);
-
-        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, SW);
-          addstr ("   ");
-        }
+      wattrset (main_w, menu->color (i));
 
-        print_enriched_string (menu->color (i), (unsigned char *) buf, 1);
-        SETCOLOR (MT_COLOR_NORMAL);
-        BKGDSET (MT_COLOR_NORMAL);
+      if (i == menu->current) {
+        ADDCOLOR(main_w, MT_COLOR_INDICATOR);
+        BKGDSET(main_w, MT_COLOR_INDICATOR);
       }
-      else {
-        attrset (menu->color (i));
-
-        if (i == menu->current) {
-          ADDCOLOR (MT_COLOR_INDICATOR);
-          BKGDSET (MT_COLOR_INDICATOR);
-        }
 
-        CLEARLINE_WIN (i - menu->top + menu->offset);
+      CLEARLINE(main_w, 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);
-        BKGDSET (MT_COLOR_NORMAL);
-      }
+      wmove (main_w, i - menu->top + menu->offset, 0);
+      print_enriched_string (menu->color (i), (unsigned char *) buf,
+                             i != menu->current);
+      SETCOLOR(main_w, MT_COLOR_NORMAL);
+      BKGDSET(main_w, MT_COLOR_NORMAL);
+    } else {
+      CLEARLINE(main_w, i - menu->top + menu->offset);
     }
-    else
-      CLEARLINE_WIN (i - menu->top + menu->offset);
   }
-  sidebar_draw (1);
-/*  sidebar_draw_frames(); */
+  sidebar_draw ();
 
   menu->redraw = 0;
 }
@@ -259,54 +176,31 @@ void menu_redraw_motion (MUTTMENU * menu)
     return;
   }
 
-  move (menu->oldcurrent + menu->offset - menu->top, SW);
-  SETCOLOR (MT_COLOR_NORMAL);
-  BKGDSET (MT_COLOR_NORMAL);
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
+  BKGDSET(main_w, MT_COLOR_NORMAL);
 
-  if (option (OPTARROWCURSOR)) {
-    /* clear the pointer */
-    attrset (menu->color (menu->oldcurrent));
-    addstr ("  ");
+  /* erase the current indicator */
+  wattrset(main_w, menu->color(menu->oldcurrent));
+  wmove (main_w, menu->oldcurrent + menu->offset - menu->top, 0);
+  wclrtoeol (main_w);
+  menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
+  menu_pad_string (buf, sizeof (buf));
+  print_enriched_string (menu->color (menu->oldcurrent),
+                         (unsigned char *) buf, 1);
 
-    if (menu->redraw & REDRAW_MOTION_RESYNCH) {
-      clrtoeol ();
-      menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
-      menu_pad_string (buf, sizeof (buf));
-      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 the new one to reflect the change */
+  menu_make_entry (buf, sizeof (buf), menu, menu->current);
+  menu_pad_string (buf, sizeof (buf));
+  wattrset (main_w, menu->color (menu->current));
+  ADDCOLOR(main_w, MT_COLOR_INDICATOR);
+  BKGDSET(main_w, MT_COLOR_INDICATOR);
+  CLEARLINE(main_w, menu->current - menu->top + menu->offset);
+  wmove (main_w, menu->current + menu->offset - menu->top, 0);
+  print_enriched_string (menu->color (menu->current), (unsigned char *) buf,
+                         0);
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
+  BKGDSET(main_w, MT_COLOR_NORMAL);
 
-    /* now draw it in the new location */
-    move (menu->current + menu->offset - menu->top, SW);
-    attrset (menu->color (menu->current));
-    ADDCOLOR (MT_COLOR_INDICATOR);
-    addstr ("->");
-    SETCOLOR (MT_COLOR_NORMAL);
-  }
-  else {
-    /* erase the current indicator */
-    attrset (menu->color (menu->oldcurrent));
-    clrtoeol ();
-    menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
-    menu_pad_string (buf, sizeof (buf));
-    print_enriched_string (menu->color (menu->oldcurrent),
-                           (unsigned char *) buf, 1);
-
-    /* now draw the new one to reflect the change */
-    menu_make_entry (buf, sizeof (buf), menu, menu->current);
-    menu_pad_string (buf, sizeof (buf));
-    attrset (menu->color (menu->current));
-    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);
-    BKGDSET (MT_COLOR_NORMAL);
-  }
   menu->redraw &= REDRAW_STATUS;
 }
 
@@ -314,39 +208,23 @@ void menu_redraw_current (MUTTMENU * menu)
 {
   char buf[STRING];
 
-  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 (OPTARROWCURSOR)) {
-    int attr = menu->color (menu->current);
-
-    attrset (attr);
-    clrtoeol ();
-    attrset (menu->color (menu->current));
-    ADDCOLOR (MT_COLOR_INDICATOR);
-    addstr ("->");
-    attrset (attr);
-    addch (' ');
-    menu_pad_string (buf, sizeof (buf));
-    print_enriched_string (menu->color (menu->current), (unsigned char *) buf,
-                           1);
-    SETCOLOR (MT_COLOR_NORMAL);
-  }
-  else {
-    attrset (menu->color (menu->current));
-    ADDCOLOR (MT_COLOR_INDICATOR);
-    BKGDSET (MT_COLOR_INDICATOR);
-    clrtoeol ();
-    print_enriched_string (menu->color (menu->current), (unsigned char *) buf,
-                           0);
-    SETCOLOR (MT_COLOR_NORMAL);
-    BKGDSET (MT_COLOR_NORMAL);
-  }
+  wattrset (main_w, menu->color (menu->current));
+  ADDCOLOR(main_w, MT_COLOR_INDICATOR);
+  BKGDSET(main_w, MT_COLOR_INDICATOR);
+  wmove (main_w, menu->current + menu->offset - menu->top, 0);
+  wclrtoeol (main_w);
+  print_enriched_string (menu->color (menu->current), (unsigned char *) buf,
+                         0);
+  SETCOLOR(main_w, MT_COLOR_NORMAL);
+  BKGDSET(main_w, MT_COLOR_NORMAL);
+
   menu->redraw &= REDRAW_STATUS;
 }
 
-void menu_redraw_prompt (MUTTMENU * menu)
+static void menu_redraw_prompt (MUTTMENU * menu)
 {
   if (menu->dialog) {
     if (option (OPTMSGERR)) {
@@ -357,9 +235,9 @@ void menu_redraw_prompt (MUTTMENU * menu)
     if (*Errorbuf)
       mutt_clear_error ();
 
-    SETCOLOR (MT_COLOR_NORMAL);
-    mvaddstr (LINES - 1, 0, menu->prompt);
-    clrtoeol ();
+    SETCOLOR(stdscr, MT_COLOR_NORMAL);
+    mvwaddstr(stdscr, LINES - 1, 0, menu->prompt);
+    wclrtoeol(stdscr);
   }
 }
 
@@ -368,27 +246,18 @@ void menu_check_recenter (MUTTMENU * menu)
   int c = MIN (MenuContext, menu->pagelen / 2);
   int old_top = menu->top;
 
-  if (!option (OPTMENUMOVEOFF) && menu->max <= menu->pagelen) { /* less entries than lines */
-    if (menu->top != 0) {
-      menu->top = 0;
-      set_option (OPTNEEDREDRAW);
-    }
+  if ((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 (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 (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 */
-    menu->top = MIN (menu->top, menu->max - menu->pagelen);
   menu->top = MAX (menu->top, 0);
 
   if (menu->top != old_top)
@@ -398,7 +267,7 @@ void menu_check_recenter (MUTTMENU * menu)
 void menu_jump (MUTTMENU * menu)
 {
   int n;
-  char buf[SHORT_STRING];
+  char buf[STRING];
 
   if (menu->max) {
     mutt_ungetch (LastKey, 0);
@@ -422,20 +291,17 @@ void menu_next_line (MUTTMENU * menu)
   if (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))) {
+    if (menu->top + 1 < menu->max - c) {
       menu->top++;
       if (menu->current < menu->top + c && menu->current < menu->max - 1)
         menu->current++;
       menu->redraw = REDRAW_INDEX;
-    }
-    else
+    } else {
       mutt_error _("You cannot scroll down farther.");
-  }
-  else
+    }
+  } else {
     mutt_error _("No entries.");
+  }
 }
 
 void menu_prev_line (MUTTMENU * menu)
@@ -459,7 +325,7 @@ void menu_prev_line (MUTTMENU * menu)
  * halfdown: jumplen == pagelen/2
  */
 #define DIRECTION ((neg * 2) + 1)
-void menu_length_jump (MUTTMENU *menu, int jumplen) {
+static void menu_length_jump (MUTTMENU *menu, int jumplen) {
   int tmp, neg = (jumplen >= 0) ? 0 : -1;
   int c = MIN (MenuContext, menu->pagelen / 2);
 
@@ -470,7 +336,7 @@ void menu_length_jump (MUTTMENU *menu, int jumplen) {
       menu->top += jumplen;
 
       /* jumped too long? */
-      if ((neg || !option (OPTMENUMOVEOFF)) && DIRECTION * menu->top > tmp)
+      if (neg && DIRECTION * menu->top > tmp)
         menu->top = tmp;
 
       /* need to move the cursor? */
@@ -597,7 +463,7 @@ void menu_current_bottom (MUTTMENU * menu)
     mutt_error _("No entries.");
 }
 
-void menu_next_entry (MUTTMENU * menu)
+static void menu_next_entry (MUTTMENU * menu)
 {
   if (menu->current < menu->max - 1) {
     menu->current++;
@@ -607,7 +473,7 @@ void menu_next_entry (MUTTMENU * menu)
     mutt_error _("You are on the last entry.");
 }
 
-void menu_prev_entry (MUTTMENU * menu)
+static void menu_prev_entry (MUTTMENU * menu)
 {
   if (menu->current) {
     menu->current--;
@@ -638,7 +504,7 @@ MUTTMENU *mutt_new_menu (void)
   p->top = 0;
   p->offset = 1;
   p->redraw = REDRAW_FULL;
-  p->pagelen = PAGELEN;
+  p->pagelen = LINES - 3;
   p->color = default_color;
   p->search = menu_search_generic;
   return (p);
@@ -668,7 +534,7 @@ static int menu_search (MUTTMENU * menu, int op)
   int r;
   int searchDir;
   regex_t re;
-  char buf[SHORT_STRING];
+  char buf[STRING];
 
   if (op != OP_SEARCH_NEXT && op != OP_SEARCH_OPPOSITE) {
     m_strcpy(buf, sizeof(buf), NONULL(menu->searchBuf));
@@ -803,17 +669,8 @@ int mutt_menuLoop (MUTTMENU * menu)
       return OP_REDRAW;
 
     menu->oldcurrent = menu->current;
-
-    if (option (OPTARROWCURSOR))
-      move (menu->current - menu->top + menu->offset, SW + 2);
-    else if (option (OPTBRAILLEFRIENDLY))
-      move (menu->current - menu->top + menu->offset, SW);
-    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;
@@ -821,11 +678,11 @@ int mutt_menuLoop (MUTTMENU * menu)
     i = km_dokey (menu->menu);
     if (i == OP_TAG_PREFIX || i == OP_TAG_PREFIX_COND) {
       if (menu->tagged) {
-        mvaddstr (LINES - 1, 0, "Tag-");
-        clrtoeol ();
+        mvwaddstr(stdscr, LINES - 1, 0, "Tag-");
+        wclrtoeol(stdscr);
         i = km_dokey (menu->menu);
         menu->tagprefix = 1;
-        CLEARLINE (LINES - 1);
+        CLEARLINE(stdscr, LINES - 1);
       }
       else if (i == OP_TAG_PREFIX) {
         mutt_error _("No tagged entries.");
@@ -853,14 +710,10 @@ int mutt_menuLoop (MUTTMENU * menu)
 
     mutt_curs_set (1);
 
-#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
     if (SigWinch) {
-      mutt_resize_screen ();
+      ui_layout_resize();
       menu->redraw = REDRAW_FULL;
-      SigWinch = 0;
-      clearok (stdscr, TRUE);   /*force complete redraw */
     }
-#endif
 
     if (i == -1)
       continue;
@@ -984,16 +837,8 @@ int mutt_menuLoop (MUTTMENU * menu)
       MAYBE_REDRAW (menu->redraw);
       break;
 
-    case OP_WHAT_KEY:
-      mutt_what_key ();
-      break;
-
-    case OP_REBUILD_CACHE:
-      mx_rebuild_cache ();
-      break;
-
     case OP_REDRAW:
-      clearok (stdscr, TRUE);
+      clearok (main_w, TRUE);
       menu->redraw = REDRAW_FULL;
       break;