On Sat, Aug 06, 2016 at 04:55:51PM -0700, Kevin J. McCarthy wrote:
> On Sat, Aug 06, 2016 at 03:03:58PM -0700, Kevin J. McCarthy wrote:
> > I would like some feedback on this patch.  Please read the patch summary
> > for details.
> 
> I'll post a revised patch later today after I test for a bit.

Attached is the revised patch.  This version doesn't restrict the
operations where the pager position is saved.  Instead, it just makes
sure the position is cleared when we return to the index menu.  This
still fixes the problem, but is much cleaner.

-- 
Kevin J. McCarthy
GPG Fingerprint: 8975 A9B3 3AA3 7910 385C  5308 ADEF 7684 8031 6BDA
# HG changeset patch
# User Kevin McCarthy <ke...@8t8.us>
# Date 1470531338 25200
#      Sat Aug 06 17:55:38 2016 -0700
# Node ID 18283c7e1e17fecb07c1f1ef6648dd6f4017dd93
# Parent  108ad5dcf19435dd8c1d940e8695afcf301f8ceb
Clear pager position upon returning to the index menu.

This fixes a bug where opening a message sometimes shows it scrolled
down.

The easiest way to trigger this is to open a long message in a mailbox
with no new messages, scroll down, hit <next-new-then-unread> and then
reopen the message.  The pager will "remember" the position and scroll
down.  If you simply exit the message and re-enter it, the position is
not saved.

More annoyingly, once in a very great while I will open a new message
and have the message scrolled down partway.  I believe this is due to
OldHdr happening to point to the same address as the Header of the new
message.

This is somewhat easily triggered on a mailbox with one message, which
you open, scroll down in, hit <next-new-then-unread> to exit, and then
delete/sync.  In another mutt instance, copy the same messsage back to
the mailbox, then open the message in the original mutt instance.  At
least some of the time, the OldHdr pointer matches the new message,
and so it opens scrolled down.

This patch solves the problem by clearing the pager position once all
redirections through the index menu are done.

diff --git a/curs_main.c b/curs_main.c
--- a/curs_main.c
+++ b/curs_main.c
@@ -2366,16 +2366,17 @@
 #endif
       default:
        if (menu->menu == MENU_MAIN)
          km_error_key (MENU_MAIN);
     }
 
     if (menu->menu == MENU_PAGER)
     {
+      mutt_clear_pager_position ();
       menu->menu = MENU_MAIN;
       menu->redraw = REDRAW_FULL;
 #if 0
       set_option (OPTWEED); /* turn header weeding back on. */
 #endif
     }
 
     if (done) break;
diff --git a/pager.c b/pager.c
--- a/pager.c
+++ b/pager.c
@@ -1558,16 +1558,21 @@
 static const struct mapping_t PagerHelpExtra[] = {
   { N_("View Attachm."), OP_VIEW_ATTACHMENTS },
   { N_("Del"), OP_DELETE },
   { N_("Reply"), OP_REPLY },
   { N_("Next"),        OP_MAIN_NEXT_UNDELETED },
   { NULL,      0 }
 };
 
+void mutt_clear_pager_position (void)
+{
+  TopLine = 0;
+  OldHdr = NULL;
+}
 
 
 /* This pager is actually not so simple as it once was.  It now operates in
    two modes: one for viewing messages and the other for viewing help.  These
    can be distinguished by whether or not ``hdr'' is NULL.  The ``hdr'' arg
    is there so that we can do operations on the current message without the
    need to pop back out to the main-menu.  */
 int 
diff --git a/protos.h b/protos.h
--- a/protos.h
+++ b/protos.h
@@ -170,16 +170,17 @@
 int  mutt_bounce_message (FILE *fp, HEADER *, ADDRESS *);
 void mutt_break_thread (HEADER *);
 void mutt_buffy (char *, size_t);
 int  mutt_buffy_list (void);
 void mutt_canonical_charset (char *, size_t, const char *);
 int mutt_count_body_parts (CONTEXT *, HEADER *);
 void mutt_check_rescore (CONTEXT *);
 void mutt_clear_error (void);
+void mutt_clear_pager_position (void);
 void mutt_create_alias (ENVELOPE *, ADDRESS *);
 void mutt_decode_attachment (BODY *, STATE *);
 void mutt_decode_base64 (STATE *s, long len, int istext, iconv_t cd);
 void mutt_default_save (char *, size_t, HEADER *);
 void mutt_display_address (ENVELOPE *);
 void mutt_display_sanitize (char *);
 void mutt_edit_content_type (HEADER *, BODY *, FILE *);
 void mutt_edit_file (const char *, const char *);

Attachment: signature.asc
Description: PGP signature

Reply via email to