X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pager.c;h=9cc94a11b161117e38b2c69f3503dc3d4853b0f8;hp=ecb430d0c069e4c70cacc8f71c7896c101575a9e;hb=1f2995420ee1612199ab8af9909159a2a8afbdab;hpb=ba5e3af4ea19e1d20c80941c077039871ec84258 diff --git a/pager.c b/pager.c index ecb430d..9cc94a1 100644 --- a/pager.c +++ b/pager.c @@ -16,6 +16,7 @@ #endif #include "mutt.h" +#include "enter.h" #include "mutt_curses.h" #include "keymap.h" #include "mutt_menu.h" @@ -23,6 +24,7 @@ #include "sort.h" #include "pager.h" #include "attach.h" +#include "recvattach.h" #include "mbyte.h" #include "sidebar.h" #include "buffy.h" @@ -55,6 +57,7 @@ #define IsSendAttach(x) (x && (x)->bdy && !(x)->fp) #define IsMsgAttach(x) (x && (x)->fp && (x)->bdy && (x)->bdy->hdr) #define IsHeader(x) (x && (x)->hdr && !(x)->bdy) +#define SW (option(OPTMBOXPANE)?SidebarWidth:0) static const char *Not_available_in_this_menu = N_("Not available in this menu."); @@ -62,6 +65,10 @@ static const char *Mailbox_is_read_only = N_("Mailbox is read-only."); static const char *Function_not_permitted_in_attach_message_mode = N_("Function not permitted in attach-message mode."); +/* hack to return to position when returning from index to same message */ +static int TopLine = 0; +static HEADER *OldHdr = NULL; + #define CHECK_MODE(x) if (!(x)) \ { \ mutt_flushinp (); \ @@ -99,7 +106,7 @@ struct syntax_t { }; struct line_t { - long offset; + LOFF_T offset; short type; short continuation; short chunks; @@ -641,6 +648,9 @@ static struct q_class_t *classify_quote (struct q_class_t **QuoteList, return class; } +static int brailleLine = -1; +static int brailleCol = -1; + static int check_attachment_marker (char *); static void @@ -653,8 +663,10 @@ resolve_types (char *buf, char *raw, struct line_t *lineInfo, int n, int last, int found, offset, null_rx, i; if (n == 0 || ISHEADER (lineInfo[n - 1].type)) { - if (buf[0] == '\n') + if (buf[0] == '\n') { lineInfo[n].type = MT_COLOR_NORMAL; + getyx(stdscr, brailleLine, brailleCol); + } else if (n > 0 && (buf[0] == ' ' || buf[0] == '\t')) { lineInfo[n].type = lineInfo[n - 1].type; /* wrapped line */ (lineInfo[n].syntax)[0].color = (lineInfo[n - 1].syntax)[0].color; @@ -821,6 +833,8 @@ static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a) a->attr = ANSI_OFF; a->pair = -1; } + a->bg = -2; + a->fg = -2; while (pos < x) { if (buf[pos] == '1' && (pos + 1 == x || buf[pos + 1] == ';')) { a->attr |= ANSI_BOLD; @@ -854,7 +868,8 @@ static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a) #endif a->pair = -1; a->attr |= ANSI_COLOR; - a->fg = buf[pos + 1] - '0'; + if (buf[pos + 1] != '9') + a->fg = buf[pos + 1] - '0'; pos += 3; } else if (buf[pos] == '4' && isdigit (buf[pos + 1])) { @@ -864,7 +879,8 @@ static int grok_ansi (unsigned char *buf, int pos, ansi_attr * a) #endif a->pair = -1; a->attr |= ANSI_COLOR; - a->bg = buf[pos + 1] - '0'; + if (buf[pos + 1] != '9') + a->bg = buf[pos + 1] - '0'; pos += 3; } else { @@ -897,7 +913,7 @@ static int trim_incomplete_mbyte(unsigned char *buf, size_t len) { } static int -fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, +fill_buffer (FILE * f, LOFF_T *last_pos, LOFF_T offset, unsigned char *buf, unsigned char *fmt, size_t blen, int *buf_ready) { unsigned char *p; @@ -906,12 +922,12 @@ fill_buffer (FILE * f, long *last_pos, long offset, unsigned char *buf, if (*buf_ready == 0) { buf[blen - 1] = 0; if (offset != *last_pos) - fseek (f, offset, 0); + fseeko (f, offset, 0); if (fgets ((char *) buf, blen - 1, f) == NULL) { fmt[0] = 0; return (-1); } - *last_pos = ftell (f); + *last_pos = ftello (f); b_read = (int) (*last_pos - offset); *buf_ready = 1; @@ -971,7 +987,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf, if (!(flags & (M_SHOWFLAT))) wrap_cols -= WrapMargin; - wrap_cols -= SidebarWidth; + wrap_cols -= SW; if (wrap_cols <= 0) wrap_cols = COLS; @@ -1119,7 +1135,7 @@ static int format_line (struct line_t **lineInfo, int n, unsigned char *buf, */ static int -display_line (FILE * f, long *last_pos, struct line_t **lineInfo, int n, +display_line (FILE * f, LOFF_T *last_pos, struct line_t **lineInfo, int n, int *last, int *max, int flags, struct q_class_t **QuoteList, int *q_level, int *force_redraw, regex_t * SearchRE) { @@ -1412,7 +1428,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) int r = -1; int redraw = REDRAW_FULL; FILE *fp = NULL; - long last_pos = 0, last_offset = 0; + LOFF_T last_pos = 0, last_offset = 0; int old_smart_wrap, old_markers; struct stat sb; regex_t SearchRE; @@ -1524,8 +1540,8 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) if (option (OPTHELP)) { SETCOLOR (MT_COLOR_STATUS); - move (helpoffset, 0); - mutt_paddstr (COLS, helpstr); + move (helpoffset, SW); + mutt_paddstr (COLS-SW, helpstr); SETCOLOR (MT_COLOR_NORMAL); } @@ -1593,7 +1609,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) if ((redraw & REDRAW_BODY) || topline != oldtopline) { do { - move (bodyoffset, SidebarWidth); + move (bodyoffset, SW); curline = oldtopline = topline; lines = 0; force_redraw = 0; @@ -1606,7 +1622,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) &SearchRE) > 0) lines++; curline++; - move (lines + bodyoffset, SidebarWidth); + move (lines + bodyoffset, SW); redraw |= REDRAW_SIDEBAR; } last_offset = lineInfo[curline].offset; @@ -1620,7 +1636,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) addch ('~'); addch ('\n'); lines++; - move (lines + bodyoffset, SidebarWidth); + move (lines + bodyoffset, SW); } /* We are going to update the pager status bar, so it isn't * necessary to reset to normal color now. */ @@ -1647,13 +1663,9 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) _mutt_make_string (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), Context, extra->bdy->hdr, M_FORMAT_MAKEPRINT); } - if (option(OPTSTATUSONTOP)) { - move(0,0); - } - /*move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (InHelp?(LINES-2):(indexlen - 1))), - option (OPTSTATUSONTOP) ? 0 : SidebarWidth);*/ - mutt_paddstr (COLS - 10 - (option(OPTSTATUSONTOP)?0:SidebarWidth), IsHeader (extra) - || IsMsgAttach (extra) ? buffer : banner); + move(statusoffset,SW); + mutt_paddstr (COLS - 10 - SW, IsHeader (extra) || + IsMsgAttach (extra) ? buffer : banner); addstr (" -- ("); if (last_pos < sb.st_size - 1) @@ -1674,12 +1686,10 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) sidebar_draw (MENU_PAGER); /* print out the index status bar */ menu_status_line (buffer, sizeof (buffer), index, NONULL (Status)); - move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), - option (OPTSTATUSONTOP) ? 0 : SidebarWidth); + move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), SW); SETCOLOR (MT_COLOR_STATUS); BKGDSET (MT_COLOR_STATUS); - mutt_paddstr (COLS - (option (OPTSTATUSONTOP) ? 0 : SidebarWidth), - buffer); + mutt_paddstr (COLS-SW, buffer); SETCOLOR (MT_COLOR_NORMAL); BKGDSET (MT_COLOR_NORMAL); } @@ -1689,8 +1699,26 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) redraw = 0; - move (statusoffset, COLS - 1); + if (option(OPTBRAILLEFRIENDLY)) { + if (brailleLine!=-1) { + move(brailleLine+1, 0); + brailleLine = -1; + } + } else + move (statusoffset, COLS-1); mutt_refresh (); + + if (IsHeader (extra) && OldHdr == extra->hdr && TopLine != topline + && lineInfo[curline].offset < sb.st_size-1) { + if (TopLine - topline > lines) + topline += lines; + else + topline = TopLine; + continue; + } + else + OldHdr = NULL; + ch = km_dokey (MENU_PAGER); if (ch != -1) mutt_clear_error (); @@ -2528,6 +2556,8 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) break; case OP_BUFFY_LIST: + if (option (OPTFORCEBUFFYCHECK)) + buffy_check (1); buffy_list (); redraw |= REDRAW_SIDEBAR; break; @@ -2587,8 +2617,15 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t * extra) } fclose (fp); - if (IsHeader (extra)) + if (IsHeader (extra)) { Context->msgnotreadyet = -1; + if (rc == -1) + OldHdr = NULL; + else { + TopLine = topline; + OldHdr = extra->hdr; + } + } cleanup_quote (&QuoteList);