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 *);
signature.asc
Description: PGP signature