diff -Nru a/PATCHES b/PATCHES --- a/PATCHES +++ b/PATCHES @@ -0,0 +1 @@ +patch-HEAD.tg.cstatus.3 diff -Nru a/color.c b/color.c --- a/color.c 2004-07-24 12:27:18 +02:00 +++ b/color.c 2004-08-25 21:14:31 +02:00 @@ -30,6 +30,7 @@ int ColorDefs[MT_COLOR_MAX]; COLOR_LINE *ColorHdrList = NULL; COLOR_LINE *ColorBodyList = NULL; +COLOR_LINE *ColorStatusList = NULL; COLOR_LINE *ColorIndexList = NULL; /* local to this file */ @@ -137,7 +138,7 @@ ColorQuoteUsed = 0; /* set some defaults */ - ColorDefs[MT_COLOR_STATUS] = A_REVERSE; + ColorDefs[MT_COLOR_STDEFAULT] = A_REVERSE; ColorDefs[MT_COLOR_INDICATOR] = A_REVERSE; ColorDefs[MT_COLOR_SEARCH] = A_REVERSE; ColorDefs[MT_COLOR_MARKERS] = A_REVERSE; @@ -466,7 +467,7 @@ static int add_pattern (COLOR_LINE **top, const char *s, int sensitive, int fg, int bg, int attr, BUFFER *err, - int is_index) + int is_index, int match) { /* is_index used to store compiled pattern @@ -537,6 +538,7 @@ } tmp->next = *top; tmp->pattern = safe_strdup (s); + tmp->match = match; #ifdef HAVE_COLOR if(fg != -1 && bg != -1) { @@ -679,7 +681,7 @@ parser_callback_t callback, short dry_run) { int object = 0, attr = 0, fg = 0, bg = 0, q_level = 0; - int r = 0; + int r = 0, match = 0; if(parse_object(buf, s, &object, &q_level, err) == -1) return -1; @@ -688,6 +690,28 @@ return -1; /* extract a regular expression if needed */ + + + /* 'color status fg bg' can have upto 2 arguments: + * 0 arguments: sets the default status color + * 1 argument : colorize pattern on match + * 2 arguments: colorize nth submatch of pattern + */ + if (object == MT_COLOR_STATUS) { + if (! MoreArgs (s)) { + object = MT_COLOR_STDEFAULT; + } else { + mutt_extract_token (buf, s, 0); + } + + if (MoreArgs(s)) { + BUFFER temporary; + memset(&temporary, 0, sizeof(BUFFER)); + mutt_extract_token(&temporary, s, 0); + match = atoi(temporary.data); + FREE(&temporary.data); + } + } if (object == MT_COLOR_HEADER || object == MT_COLOR_BODY || object == MT_COLOR_INDEX) { @@ -725,12 +749,14 @@ #endif if (object == MT_COLOR_HEADER) - r = add_pattern (&ColorHdrList, buf->data, 0, fg, bg, attr, err,0); + r = add_pattern (&ColorHdrList, buf->data, 0, fg, bg, attr, err, 0, match); else if (object == MT_COLOR_BODY) - r = add_pattern (&ColorBodyList, buf->data, 1, fg, bg, attr, err, 0); + r = add_pattern (&ColorBodyList, buf->data, 1, fg, bg, attr, err, 0, match); + else if (object == MT_COLOR_STATUS) + r = add_pattern (&ColorStatusList, buf->data, 1, fg, bg, attr, err, 0, match); else if (object == MT_COLOR_INDEX) { - r = add_pattern (&ColorIndexList, buf->data, 1, fg, bg, attr, err, 1); + r = add_pattern (&ColorIndexList, buf->data, 1, fg, bg, attr, err, 1, match); set_option (OPTFORCEREDRAWINDEX); } else if (object == MT_COLOR_QUOTED) diff -Nru a/compose.c b/compose.c --- a/compose.c 2004-08-17 01:34:22 +02:00 +++ b/compose.c 2004-08-23 10:05:46 +02:00 @@ -263,9 +263,9 @@ redraw_mix_line (msg->chain); #endif - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); - BKGDSET (MT_COLOR_STATUS); + BKGDSET (MT_COLOR_STDEFAULT); clrtoeol (); BKGDSET (MT_COLOR_NORMAL); @@ -1232,7 +1232,7 @@ { compose_status_line (buf, sizeof (buf), menu, NONULL(ComposeFormat)); CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); printw ("%-*.*s", COLS, COLS, buf); SETCOLOR (MT_COLOR_NORMAL); menu->redraw &= ~REDRAW_STATUS; diff -Nru a/curs_main.c b/curs_main.c --- a/curs_main.c 2004-07-24 12:27:19 +02:00 +++ b/curs_main.c 2004-08-25 22:12:55 +02:00 @@ -393,6 +393,117 @@ menu->redraw = REDRAW_INDEX | REDRAW_STATUS; } +void +mutt_draw_statusline(int cols, char *inbuf) +{ + int i = 0; + int cnt = 0; + int last_color = 0; + int color = 0; + int offset = 0; + int found = 0; + int null_rx = 0; + unsigned char buf[2048]; + + struct line_t { + short chunks; + struct syntax_t { + int color; + int first; + int last; + } *syntax; + } lineInfo = { 0, 0 }; + + mutt_format_string(buf, sizeof(buf), cols, cols, 0, ' ', inbuf, + mutt_strlen(inbuf), 0); + + lineInfo.syntax = safe_malloc(sizeof(struct syntax_t)); + lineInfo.syntax[0].first = -1; + lineInfo.syntax[0].last = -1; + lineInfo.syntax[0].color = ColorDefs[MT_COLOR_STDEFAULT]; + lineInfo.chunks = 1; + + do + { + found = 0; + null_rx = 0; + COLOR_LINE *color_line = ColorStatusList; + + if (!buf[offset]) + break; + + while (color_line) + { + regmatch_t pmatch[color_line->match + 1]; + + if (regexec (&color_line->rx, buf + offset, color_line->match + 1, pmatch, + (offset ? REG_NOTBOL : 0)) == 0) + { + if (pmatch[color_line->match].rm_eo != pmatch[color_line->match].rm_so) + { + if (!found) + { + if (++(lineInfo.chunks) > 1) + safe_realloc (&(lineInfo.syntax), + (lineInfo.chunks) * sizeof (struct syntax_t)); + } + i = lineInfo.chunks - 1; + pmatch[color_line->match].rm_so += offset; + pmatch[color_line->match].rm_eo += offset; + if (!found || + pmatch[color_line->match].rm_so < (lineInfo.syntax)[i].first || + (pmatch[color_line->match].rm_so == (lineInfo.syntax)[i].first && + pmatch[color_line->match].rm_eo > (lineInfo.syntax)[i].last)) + { + (lineInfo.syntax)[i].color = color_line->pair; + (lineInfo.syntax)[i].first = pmatch[color_line->match].rm_so; + (lineInfo.syntax)[i].last = pmatch[color_line->match].rm_eo; + } + found = 1; + null_rx = 0; + } + else + null_rx = 1; /* empty regexp; don't add it, but keep looking */ + } + color_line = color_line->next; + } + + if (null_rx) + offset++; /* avoid degenerate cases */ + else + offset = (lineInfo.syntax)[i].last; + } while (found || null_rx); + + for (cnt = 0; cnt < mutt_strlen(buf); cnt++) { + color = lineInfo.syntax[0].color; + for (i = 0; i < lineInfo.chunks; i++) { + /* we assume the chunks are sorted */ + if (cnt > (lineInfo.syntax)[i].last) + continue; + if (cnt < (lineInfo.syntax)[i].first) + break; + if (cnt != (lineInfo.syntax)[i].last) { + color = (lineInfo.syntax)[i].color; + break; + } + /* don't break here, as cnt might be + * in the next chunk as well */ + } + if (color != last_color) { + attrset (color); + last_color = color; + } + addch (buf[cnt]); /* XXX more than one char at a time? */ +#if 0 + waddnstr(stdscr, tgbuf, 10); + SETCOLOR (MT_COLOR_NORMAL); + waddnstr(stdscr, tgbuf + 10, -1); +#endif + } + + safe_free(&lineInfo.syntax); +} + struct mapping_t IndexHelp[] = { { N_("Quit"), OP_QUIT }, { N_("Del"), OP_DELETE }, @@ -558,8 +669,8 @@ { menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); - SETCOLOR (MT_COLOR_STATUS); - mutt_paddstr (COLS, buf); + SETCOLOR (MT_COLOR_STDEFAULT); + mutt_draw_statusline(COLS, buf); SETCOLOR (MT_COLOR_NORMAL); menu->redraw &= ~REDRAW_STATUS; } diff -Nru a/menu.c b/menu.c --- a/menu.c 2004-08-11 16:29:56 +02:00 +++ b/menu.c 2004-08-23 10:06:11 +02:00 @@ -168,7 +168,7 @@ if (option (OPTHELP)) { - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); move (option (OPTSTATUSONTOP) ? LINES-2 : 0, 0); mutt_paddstr (COLS, menu->help); SETCOLOR (MT_COLOR_NORMAL); @@ -191,7 +191,7 @@ char buf[STRING]; snprintf (buf, sizeof (buf), M_MODEFMT, menu->title); - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); move (option (OPTSTATUSONTOP) ? 0 : LINES - 2, 0); mutt_paddstr (COLS, buf); SETCOLOR (MT_COLOR_NORMAL); diff -Nru a/mutt_curses.h b/mutt_curses.h --- a/mutt_curses.h 2004-07-24 12:27:21 +02:00 +++ b/mutt_curses.h 2004-08-25 18:23:59 +02:00 @@ -107,7 +107,7 @@ MT_COLOR_QUOTED, MT_COLOR_SIGNATURE, MT_COLOR_INDICATOR, - MT_COLOR_STATUS, + MT_COLOR_STDEFAULT, MT_COLOR_TREE, MT_COLOR_NORMAL, MT_COLOR_ERROR, @@ -121,12 +121,14 @@ MT_COLOR_BOLD, MT_COLOR_UNDERLINE, MT_COLOR_INDEX, + MT_COLOR_STATUS, MT_COLOR_MAX }; typedef struct color_line { regex_t rx; + int match; /* which substringmap 0 for old behaviour */ char *pattern; pattern_t *color_pattern; /* compiled pattern to speed up index color calculation */ @@ -141,6 +143,7 @@ extern int ColorDefs[]; extern COLOR_LINE *ColorHdrList; extern COLOR_LINE *ColorBodyList; +extern COLOR_LINE *ColorStatusList; extern COLOR_LINE *ColorIndexList; void ci_init_color (void); diff -Nru a/mutt_ssl_nss.c b/mutt_ssl_nss.c --- a/mutt_ssl_nss.c 2004-07-24 12:27:21 +02:00 +++ b/mutt_ssl_nss.c 2004-08-23 10:06:30 +02:00 @@ -178,7 +178,7 @@ addstr ("BAD"); move (LINES - 2, 0); - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); memset (status, ' ', sizeof (status) - 1); if (COLS < sizeof (status)) status[COLS - 1] = 0; diff -Nru a/pager.c b/pager.c --- a/pager.c 2004-07-24 12:27:21 +02:00 +++ b/pager.c 2004-08-26 01:07:21 +02:00 @@ -1590,7 +1590,7 @@ if (option (OPTHELP)) { - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); move (helpoffset, 0); mutt_paddstr (COLS, helpstr); SETCOLOR (MT_COLOR_NORMAL); @@ -1700,10 +1700,11 @@ if (redraw & REDRAW_STATUS) { + char temporary[2048]; /* XXX --tg 01:06 04-08-26 */ + /* print out the pager status bar */ - SETCOLOR (MT_COLOR_STATUS); - BKGDSET (MT_COLOR_STATUS); - CLEARLINE (statusoffset); + SETCOLOR (MT_COLOR_STDEFAULT); + BKGDSET (MT_COLOR_STDEFAULT); if (IsHeader (extra)) { _mutt_make_string (buffer, @@ -1716,13 +1717,24 @@ COLS - 9 < sizeof (buffer) ? COLS - 9: sizeof (buffer), NONULL (PagerFmt), Context, extra->bdy->hdr, M_FORMAT_MAKEPRINT); } - mutt_paddstr (COLS-10, IsHeader (extra) || IsMsgAttach (extra) ? - buffer : banner); - addstr (" -- ("); + + if (IsHeader (extra) || IsMsgAttach (extra)) + strcpy(temporary, buffer); + else + strcpy(temporary, banner); + + while (strlen(temporary) < (COLS - 10)) + strcat(temporary, " "); + + strcat(temporary, " -- ("); + if (last_pos < sb.st_size - 1) - printw ("%d%%)", (int) (100 * last_offset / sb.st_size)); + sprintf(temporary + strlen(temporary), "%d%%) ", (int) (100 * last_offset / sb.st_size)); else - addstr (topline == 0 ? "all)" : "end)"); + strcat(temporary, (topline == 0 ? "all) " : "end) ")); + + mutt_draw_statusline (COLS, temporary); + BKGDSET (MT_COLOR_NORMAL); SETCOLOR (MT_COLOR_NORMAL); } @@ -1737,8 +1749,8 @@ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); - SETCOLOR (MT_COLOR_STATUS); - mutt_paddstr (COLS, buffer); + SETCOLOR (MT_COLOR_STDEFAULT); + mutt_draw_statusline(COLS, buffer); SETCOLOR (MT_COLOR_NORMAL); } diff -Nru a/protos.h b/protos.h --- a/protos.h 2004-08-08 20:20:37 +02:00 +++ b/protos.h 2004-08-25 12:44:55 +02:00 @@ -163,6 +163,7 @@ void mutt_default_save (char *, size_t, HEADER *); void mutt_display_address (ENVELOPE *); void mutt_display_sanitize (char *); +void mutt_draw_statusline(int n, char *); void mutt_edit_content_type (HEADER *, BODY *, FILE *); void mutt_edit_file (const char *, const char *); void mutt_edit_headers (const char *, const char *, HEADER *, char *, size_t); diff -Nru a/remailer.c b/remailer.c --- a/remailer.c 2004-07-24 12:27:23 +02:00 +++ b/remailer.c 2004-08-23 10:07:18 +02:00 @@ -313,10 +313,10 @@ static void mix_redraw_head (MIXCHAIN *chain) { - SETCOLOR (MT_COLOR_STATUS); + SETCOLOR (MT_COLOR_STDEFAULT); mvprintw (MIX_VOFFSET - 1, 0, "-- Remailer chain [Length: %d]", chain ? chain->cl : 0); - BKGDSET (MT_COLOR_STATUS); + BKGDSET (MT_COLOR_STDEFAULT); clrtoeol (); BKGDSET (MT_COLOR_NORMAL);