[neomutt-devel] Header::collapsed and single message; [PATCH] WIP: Fix <jump> function, v2

Floyd Anderson f.a at 31c0.net
Thu Mar 15 02:50:05 CET 2018


Previous version fails in limited views of collapsed threads where the
(real) thread root message is invisible, i.e. top message is a child.

Also mutt_parent_message() is too gabby on errors, so it is replaced by
the complete silent mutt_messages_in_thread() method. This helps not to
overlay own error messages.
---
 curs_main.c | 62 ++++++++++++++++++-------------------------------------------
 1 file changed, 18 insertions(+), 44 deletions(-)

diff --git a/curs_main.c b/curs_main.c
index 87c4ce33..4efa0769 100644
--- a/curs_main.c
+++ b/curs_main.c
@@ -1413,58 +1413,32 @@ int mutt_index_menu(void)
           mutt_unget_event(LastKey, 0);
         buf[0] = 0;
         if (mutt_get_field(_("Jump to message: "), buf, sizeof(buf), 0) != 0 || !buf[0])
-        {
-          if (menu->menu == MENU_PAGER)
-          {
-            op = OP_DISPLAY_MESSAGE;
-            continue;
-          }
-          break;
-        }
-
-        if (mutt_str_atoi(buf, &i) < 0)
-        {
+          mutt_error(_("Nothing to do."));
+        else if (mutt_str_atoi(buf, &i) < 0)
           mutt_error(_("Argument must be a message number."));
-          break;
-        }
-
-        if (i > 0 && i <= Context->msgcount)
+        else if (i < 1 || Context->msgcount < i)
+          mutt_error(_("Invalid message number."));
+        else if (!message_is_visible(Context, i - 1))
+          mutt_error(_("That message is not visible."));
+        else
         {
-          int msg = mutt_parent_message(Context, Context->hdrs[i], 1);
-          msg = Context->v2r[msg];
-          mutt_uncollapse_thread(Context, Context->hdrs[msg]);
-          mutt_set_virtual(Context);
+          struct Header *hdr = Context->hdrs[i - 1];

-          for (j = i - 1; j < Context->msgcount; j++)
+          if (mutt_messages_in_thread(Context, hdr, 1) != 1)
           {
-            if (Context->hdrs[j]->virtual != -1)
-              break;
-          }
-          if (j >= Context->msgcount)
-          {
-            for (j = i - 2; j >= 0; j--)
-            {
-              if (Context->hdrs[j]->virtual != -1)
-                break;
-            }
+            mutt_uncollapse_thread(Context, hdr);
+            mutt_set_virtual(Context);
           }
+          menu->current = hdr->virtual;
+        }

-          if (j >= 0)
-          {
-            menu->current = Context->hdrs[j]->virtual;
-            if (menu->menu == MENU_PAGER)
-            {
-              op = OP_DISPLAY_MESSAGE;
-              continue;
-            }
-            else
-              menu->redraw = REDRAW_FULL;
-          }
-          else
-            mutt_error(_("That message is not visible."));
+        if (menu->menu == MENU_PAGER)
+        {
+          op = OP_DISPLAY_MESSAGE;
+          continue;
         }
         else
-          mutt_error(_("Invalid message number."));
+          menu->redraw = REDRAW_FULL;

         break;

-- 
2.16.2



More information about the neomutt-devel mailing list