]> git.llucax.com Git - software/mutt-debian.git/blob - debian/patches/not-applied/indexcolor
bug annotations
[software/mutt-debian.git] / debian / patches / not-applied / indexcolor
1 # vim:ft=diff:
2 This is the indexcolor patch by Christian Aichinger <Greek0@gmx.net>.
3
4 This patch enables different colorings for different parts of the index
5 display. For example you can choose one color for the subject, another one for
6 the author, and a third one for the flags.
7
8 * Patch last synced with upstream:
9   - Date: 2007-02-15
10   - File: http://greek0.net/mutt.html
11           http://greek0.net/patches/mutt-1.5.12-indexcolor-3+cb.diff
12
13 * Changes made:
14   - Repatch for 1.5.13.
15   - Remove trailing whitespace.
16
17 == END PATCH
18 Index: mutt/color.c
19 ===================================================================
20 --- mutt.orig/color.c   2007-02-15 21:26:09.140472816 +0100
21 +++ mutt/color.c        2007-02-15 21:26:47.860586464 +0100
22 @@ -35,6 +35,8 @@ int ColorDefs[MT_COLOR_MAX];
23  COLOR_LINE *ColorHdrList = NULL;
24  COLOR_LINE *ColorBodyList = NULL;
25  COLOR_LINE *ColorIndexList = NULL;
26 +COLOR_LINE *ColorIndexSubjectList = NULL;
27 +COLOR_LINE *ColorIndexAuthorList = NULL;
28  
29  /* local to this file */
30  static int ColorQuoteSize;
31 @@ -93,6 +95,14 @@ static struct mapping_t Fields[] =
32    { "bold",            MT_COLOR_BOLD },
33    { "underline",       MT_COLOR_UNDERLINE },
34    { "index",           MT_COLOR_INDEX },
35 +  { "index_subject",   MT_COLOR_INDEX_SUBJECT },
36 +  { "index_author",    MT_COLOR_INDEX_AUTHOR },
37 +  { "index_collapsed", MT_COLOR_INDEX_COLLAPSED },
38 +  { "index_date",      MT_COLOR_INDEX_DATE },
39 +  { "index_flags",     MT_COLOR_INDEX_FLAGS },
40 +  { "index_label",     MT_COLOR_INDEX_LABEL },
41 +  { "index_number",    MT_COLOR_INDEX_NUMBER },
42 +  { "index_size",      MT_COLOR_INDEX_SIZE },
43    { NULL,              0 }
44  };
45  
46 @@ -364,12 +374,55 @@ int mutt_parse_unmono (BUFFER *buf, BUFF
47    return _mutt_parse_uncolor(buf, s, data, err, 0);
48  }
49  
50 +static void
51 +mutt_do_uncolor (BUFFER *buf, BUFFER *s, COLOR_LINE **ColorList,
52 +                       int *do_cache, int parse_uncolor)
53 +{
54 +  COLOR_LINE *tmp, *last = NULL;
55 +
56 +  do
57 +  {
58 +    mutt_extract_token (buf, s, 0);
59 +    if (!mutt_strcmp ("*", buf->data))
60 +    {
61 +      for (tmp = *ColorList; tmp; )
62 +      {
63 +        if (!*do_cache)
64 +         *do_cache = 1;
65 +       last = tmp;
66 +       tmp = tmp->next;
67 +       mutt_free_color_line(&last, parse_uncolor);
68 +      }
69 +      *ColorList = NULL;
70 +    }
71 +    else
72 +    {
73 +      for (last = NULL, tmp = *ColorList; tmp; last = tmp, tmp = tmp->next)
74 +      {
75 +       if (!mutt_strcmp (buf->data, tmp->pattern))
76 +       {
77 +          if (!*do_cache)
78 +           *do_cache = 1;
79 +         dprint(1,(debugfile,"Freeing pattern \"%s\" from ColorList\n",
80 +                              tmp->pattern));
81 +         if (last)
82 +           last->next = tmp->next;
83 +         else
84 +           *ColorList = tmp->next;
85 +         mutt_free_color_line(&tmp, parse_uncolor);
86 +         break;
87 +       }
88 +      }
89 +    }
90 +  }
91 +  while (MoreArgs (s));
92 +}
93 +
94  static int 
95  _mutt_parse_uncolor (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err, 
96                          short parse_uncolor)
97  {
98    int object = 0, do_cache = 0;
99 -  COLOR_LINE *tmp, *last = NULL;
100  
101    mutt_extract_token (buf, s, 0);
102  
103 @@ -379,6 +432,13 @@ _mutt_parse_uncolor (BUFFER *buf, BUFFER
104      return (-1);
105    }
106  
107 +  if (object > MT_COLOR_INDEX_AUTHOR) /* uncolor index column */
108 +  {
109 +    ColorDefs[object] = 0;
110 +    set_option (OPTFORCEREDRAWINDEX);
111 +    return (0);
112 +  }
113 +
114    if (mutt_strncmp (buf->data, "index", 5) != 0)
115    {
116      snprintf (err->data, err->dsize,
117 @@ -416,44 +476,12 @@ _mutt_parse_uncolor (BUFFER *buf, BUFFER
118      return 0;
119    }
120       
121 -  
122 -  do
123 -  {
124 -    mutt_extract_token (buf, s, 0);
125 -    if (!mutt_strcmp ("*", buf->data))
126 -    {
127 -      for (tmp = ColorIndexList; tmp; )
128 -      {
129 -        if (!do_cache)
130 -         do_cache = 1;
131 -       last = tmp;
132 -       tmp = tmp->next;
133 -       mutt_free_color_line(&last, parse_uncolor);
134 -      }
135 -      ColorIndexList = NULL;
136 -    }
137 -    else
138 -    {
139 -      for (last = NULL, tmp = ColorIndexList; tmp; last = tmp, tmp = tmp->next)
140 -      {
141 -       if (!mutt_strcmp (buf->data, tmp->pattern))
142 -       {
143 -          if (!do_cache)
144 -           do_cache = 1;
145 -         dprint(1,(debugfile,"Freeing pattern \"%s\" from ColorIndexList\n",
146 -                              tmp->pattern));
147 -         if (last)
148 -           last->next = tmp->next;
149 -         else
150 -           ColorIndexList = tmp->next;
151 -         mutt_free_color_line(&tmp, parse_uncolor);
152 -         break;
153 -       }
154 -      }
155 -    }
156 -  }
157 -  while (MoreArgs (s));
158 -
159 +  if (object == MT_COLOR_INDEX)
160 +    mutt_do_uncolor(buf, s, &ColorIndexList, &do_cache, parse_uncolor);
161 +  if (object == MT_COLOR_INDEX_SUBJECT)
162 +    mutt_do_uncolor(buf, s, &ColorIndexSubjectList, &do_cache, parse_uncolor);
163 +  if (object == MT_COLOR_INDEX_AUTHOR)
164 +    mutt_do_uncolor(buf, s, &ColorIndexAuthorList, &do_cache, parse_uncolor);
165  
166    if (do_cache && !option (OPTNOCURSES))
167    {
168 @@ -693,7 +721,7 @@ _mutt_parse_color (BUFFER *buf, BUFFER *
169  
170    /* extract a regular expression if needed */
171    
172 -  if (object == MT_COLOR_HEADER || object == MT_COLOR_BODY || object == MT_COLOR_INDEX)
173 +  if (object == MT_COLOR_HEADER || object == MT_COLOR_BODY || object == MT_COLOR_INDEX || object == MT_COLOR_INDEX_SUBJECT || object == MT_COLOR_INDEX_AUTHOR)
174    {
175      if (!MoreArgs (s))
176      {
177 @@ -737,6 +765,18 @@ _mutt_parse_color (BUFFER *buf, BUFFER *
178      r = add_pattern (&ColorIndexList, buf->data, 1, fg, bg, attr, err, 1);
179      set_option (OPTFORCEREDRAWINDEX);
180    }
181 +  else if (object == MT_COLOR_INDEX_SUBJECT)
182 +  {
183 +    r = add_pattern (&ColorIndexSubjectList, buf->data,
184 +                    1, fg, bg, attr, err, 1);
185 +    set_option (OPTFORCEREDRAWINDEX);
186 +  }
187 +  else if (object == MT_COLOR_INDEX_AUTHOR)
188 +  {
189 +    r = add_pattern (&ColorIndexAuthorList, buf->data,
190 +                    1, fg, bg, attr, err, 1);
191 +    set_option (OPTFORCEREDRAWINDEX);
192 +  }
193    else if (object == MT_COLOR_QUOTED)
194    {
195      if (q_level >= ColorQuoteSize)
196 @@ -762,7 +802,11 @@ _mutt_parse_color (BUFFER *buf, BUFFER *
197        ColorQuote[q_level] = fgbgattr_to_color(fg, bg, attr);
198    }
199    else
200 +  {
201      ColorDefs[object] = fgbgattr_to_color(fg, bg, attr);
202 +    if (object > MT_COLOR_INDEX_AUTHOR)
203 +      set_option (OPTFORCEREDRAWINDEX);
204 +  }
205  
206  #ifdef HAVE_COLOR
207  # ifdef HAVE_BKGDSET
208 Index: mutt/curs_lib.c
209 ===================================================================
210 --- mutt.orig/curs_lib.c        2007-02-15 21:26:09.183466280 +0100
211 +++ mutt/curs_lib.c     2007-02-15 21:26:15.898445448 +0100
212 @@ -648,6 +648,7 @@ void mutt_format_string (char *dest, siz
213    size_t k, k2;
214    char scratch[MB_LEN_MAX];
215    mbstate_t mbstate1, mbstate2;
216 +  int escaped = 0;
217  
218    memset(&mbstate1, 0, sizeof (mbstate1));
219    memset(&mbstate2, 0, sizeof (mbstate2));
220 @@ -663,7 +664,15 @@ void mutt_format_string (char *dest, siz
221        k = (k == (size_t)(-1)) ? 1 : n;
222        wc = replacement_char ();
223      }
224 -    if (arboreal && wc < M_TREE_MAX)
225 +    if (escaped) {
226 +      escaped = 0;
227 +      w = 0;
228 +    }
229 +    else if (arboreal && wc == M_SPECIAL_INDEX) {
230 +      escaped = 1;
231 +      w = 0;
232 +    }
233 +    else if (arboreal && wc < M_TREE_MAX)
234        w = 1; /* hack */
235      else
236      {
237 Index: mutt/hdrline.c
238 ===================================================================
239 --- mutt.orig/hdrline.c 2007-02-15 21:26:09.226459744 +0100
240 +++ mutt/hdrline.c      2007-02-15 21:26:15.899445296 +0100
241 @@ -99,6 +99,34 @@ static int first_mailing_list (char *buf
242    return 0;
243  }
244  
245 +/* Takes the color to embed, the buffer to manipulate and the buffer length as
246 + * arguments.
247 + * Returns the number of chars written. */
248 +static size_t add_index_color(char *buf, size_t buflen,
249 +                          format_flag flags, char color)
250 +{
251 +  int len;
252 +
253 +  /* only add color markers if we are operating on main index entries. */
254 +  if (!(flags & M_FORMAT_INDEX))
255 +    return 0;
256 +
257 +  if (color == MT_COLOR_INDEX) { /* buf might be uninitialized other cases */
258 +    len = mutt_strlen(buf);
259 +    buf += len;
260 +    buflen -= len;
261 +  }
262 +
263 +  if (buflen < 2)
264 +    return 0;
265 +
266 +  buf[0] = M_SPECIAL_INDEX;
267 +  buf[1] = color;
268 +  buf[2] = '\0';
269 +
270 +  return 2;
271 +}
272 +
273  static void make_from (ENVELOPE *hdr, char *buf, size_t len, int do_lists)
274  {
275    int me;
276 @@ -251,6 +279,7 @@ hdr_format_str (char *dest,
277  #define THREAD_NEW (threads && hdr->collapsed && hdr->num_hidden > 1 && mutt_thread_contains_unread (ctx, hdr) == 1)
278  #define THREAD_OLD (threads && hdr->collapsed && hdr->num_hidden > 1 && mutt_thread_contains_unread (ctx, hdr) == 2)
279    size_t len;
280 +  size_t colorlen;
281  
282    hdr = hfi->hdr;
283    ctx = hfi->ctx;
284 @@ -302,12 +331,17 @@ hdr_format_str (char *dest,
285        break;
286      
287      case 'c':
288 +      colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_SIZE);
289        mutt_pretty_size (buf2, sizeof (buf2), (long) hdr->content->length);
290 -      mutt_format_s (dest, destlen, prefix, buf2);
291 +      mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
292 +      add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
293        break;
294  
295      case 'C':
296 -      snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
297 +      colorlen = add_index_color(fmt, sizeof(fmt), flags, MT_COLOR_INDEX_NUMBER);
298 +      snprintf (fmt+colorlen, sizeof(fmt)-colorlen, "%%%sd", prefix);
299 +      add_index_color(fmt+colorlen, sizeof(fmt)-colorlen, flags, MT_COLOR_INDEX);
300 +
301        snprintf (dest, destlen, fmt, hdr->msgno + 1);
302        break;
303  
304 @@ -406,7 +440,10 @@ hdr_format_str (char *dest,
305         if (do_locales)
306           setlocale (LC_TIME, "C");
307  
308 -       mutt_format_s (dest, destlen, prefix, buf2);
309 +       colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_DATE);
310 +       mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
311 +       add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
312 +
313         if (len > 0 && op != 'd' && op != 'D') /* Skip ending op */
314           src = cp + 1;
315        }
316 @@ -436,8 +473,10 @@ hdr_format_str (char *dest,
317      case 'F':
318        if (!optional)
319        {
320 +       colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_AUTHOR);
321          make_from (hdr->env, buf2, sizeof (buf2), 0);
322 -       mutt_format_s (dest, destlen, prefix, buf2);
323 +       mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
324 +       add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
325        }
326        else if (mutt_addr_is_user (hdr->env->from))
327          optional = 0;
328 @@ -463,7 +502,9 @@ hdr_format_str (char *dest,
329        if (!optional)
330        {
331         snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
332 -       snprintf (dest, destlen, fmt, (int) hdr->lines);
333 +       colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_SIZE);
334 +       snprintf (dest+colorlen, destlen-colorlen, fmt, (int) hdr->lines);
335 +       add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
336        }
337        else if (hdr->lines <= 0)
338          optional = 0;
339 @@ -472,8 +513,10 @@ hdr_format_str (char *dest,
340      case 'L':
341        if (!optional)
342        {
343 +       colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_AUTHOR);
344         make_from (hdr->env, buf2, sizeof (buf2), 1);
345 -       mutt_format_s (dest, destlen, prefix, buf2);
346 +       mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
347 +       add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
348        }
349        else if (!check_for_mailing_list (hdr->env->to, NULL, NULL, 0) &&
350                !check_for_mailing_list (hdr->env->cc, NULL, NULL, 0))
351 @@ -528,10 +571,16 @@ hdr_format_str (char *dest,
352        snprintf (fmt, sizeof (fmt), "%%%sd", prefix);
353        if (!optional)
354        {
355 -       if (threads && is_index && hdr->collapsed && hdr->num_hidden > 1)
356 -         snprintf (dest, destlen, fmt, hdr->num_hidden);
357 -       else if (is_index && threads)
358 -         mutt_format_s (dest, destlen, prefix, " ");
359 +       colorlen = add_index_color(dest, destlen, flags,
360 +                                  MT_COLOR_INDEX_COLLAPSED);
361 +       if (threads && is_index && hdr->collapsed && hdr->num_hidden > 1) {
362 +         snprintf (dest+colorlen, destlen-colorlen, fmt, hdr->num_hidden);
363 +         add_index_color(dest, destlen-colorlen, flags, MT_COLOR_INDEX);
364 +       }
365 +       else if (is_index && threads) {
366 +         mutt_format_s (dest+colorlen, destlen-colorlen, prefix, " ");
367 +         add_index_color(dest, destlen-colorlen, flags, MT_COLOR_INDEX);
368 +       }
369         else
370           *dest = '\0';
371        }
372 @@ -548,15 +597,23 @@ hdr_format_str (char *dest,
373        {
374         if (flags & M_FORMAT_FORCESUBJ)
375         {
376 -         mutt_format_s (dest, destlen, "", NONULL (hdr->env->subject));
377 +         colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_SUBJECT);
378 +         mutt_format_s (dest+colorlen, destlen-colorlen, "",
379 +             NONULL (hdr->env->subject));
380 +         add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
381 +
382           snprintf (buf2, sizeof (buf2), "%s%s", hdr->tree, dest);
383           mutt_format_s_tree (dest, destlen, prefix, buf2);
384         }
385         else
386           mutt_format_s_tree (dest, destlen, prefix, hdr->tree);
387        }
388 -      else
389 -       mutt_format_s (dest, destlen, prefix, NONULL (hdr->env->subject));
390 +      else {
391 +       colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_SUBJECT);
392 +       mutt_format_s (dest+colorlen, destlen-colorlen, prefix,
393 +           NONULL (hdr->env->subject));
394 +       add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
395 +      }
396        break;
397  
398      case 'S':
399 @@ -652,7 +709,9 @@ hdr_format_str (char *dest,
400                 hdr->tagged ? '*' :
401                 (hdr->flagged ? '!' :
402                  (Tochars && ((i = mutt_user_is_recipient (hdr)) < mutt_strlen (Tochars)) ? Tochars[i] : ' ')));
403 -      mutt_format_s (dest, destlen, prefix, buf2);
404 +      colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_FLAGS);
405 +      mutt_format_s (dest+colorlen, destlen-colorlen, prefix, buf2);
406 +      add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
407        break;
408  
409      case 'X':
410 @@ -672,7 +731,9 @@ hdr_format_str (char *dest,
411         if (optional)
412          optional = hdr->env->x_label ? 1 : 0;
413  
414 -       mutt_format_s (dest, destlen, prefix, NONULL (hdr->env->x_label));
415 +       colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_LABEL);
416 +       mutt_format_s (dest+colorlen, destlen-colorlen, prefix, NONULL (hdr->env->x_label));
417 +       add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
418         break;
419   
420      case 'Y':
421 @@ -698,10 +759,12 @@ hdr_format_str (char *dest,
422        if (optional)
423         optional = i;
424  
425 +      colorlen = add_index_color(dest, destlen, flags, MT_COLOR_INDEX_LABEL);
426        if (i)
427 -        mutt_format_s (dest, destlen, prefix, NONULL (hdr->env->x_label));
428 +        mutt_format_s (dest+colorlen, destlen-colorlen, prefix, NONULL (hdr->env->x_label));
429        else
430 -        mutt_format_s (dest, destlen, prefix, "");
431 +        mutt_format_s (dest+colorlen, destlen-colorlen, prefix, "");
432 +      add_index_color(dest+colorlen, destlen-colorlen, flags, MT_COLOR_INDEX);
433  
434        break;
435  
436 Index: mutt/menu.c
437 ===================================================================
438 --- mutt.orig/menu.c    2007-02-15 21:26:09.270453056 +0100
439 +++ mutt/menu.c 2007-02-15 21:26:15.900445144 +0100
440 @@ -36,7 +36,30 @@ extern int Charset_is_utf8; /* FIXME: ba
441  
442  extern size_t UngetCount;
443  
444 -static void print_enriched_string (int attr, unsigned char *s, int do_color)
445 +static int get_color(int index, int type) {
446 +  COLOR_LINE *color;
447 +  HEADER *hdr = Context->hdrs[index];
448 +
449 +  switch (type) {
450 +    case MT_COLOR_INDEX_SUBJECT:
451 +      color = ColorIndexSubjectList;
452 +      break;
453 +    case MT_COLOR_INDEX_AUTHOR:
454 +      color = ColorIndexAuthorList;
455 +      break;
456 +    default:
457 +      return ColorDefs[type];
458 +  }
459 +
460 +  for (; color; color = color->next)
461 +    if (mutt_pattern_exec (color->color_pattern, M_MATCH_FULL_ADDRESS,
462 +       Context, hdr))
463 +      return color->pair;
464 +
465 +  return 0;
466 +}
467 +
468 +static void print_enriched_string (int index, int attr, unsigned char *s, int do_color)
469  {
470    wchar_t wc;
471    size_t k;
472 @@ -133,6 +156,18 @@ static void print_enriched_string (int a
473        }
474        if (do_color) attrset(attr);
475      }
476 +    else if(*s == M_SPECIAL_INDEX)
477 +    {
478 +      s++;
479 +      if (do_color) {
480 +       if (*s == MT_COLOR_INDEX)
481 +         attrset(attr);
482 +       else
483 +         attron(get_color(index, *s));
484 +      }
485 +      s++;
486 +      n -= 2;
487 +    }
488      else if ((k = mbrtowc (&wc, (char *)s, n, &mbstate)) > 0)
489      {
490        addnstr ((char *)s, k);
491 @@ -235,7 +270,7 @@ void menu_redraw_index (MUTTMENU *menu)
492           addstr ("   ");
493         }
494  
495 -        print_enriched_string (menu->color(i), (unsigned char *) buf, 1);
496 +        print_enriched_string (i, menu->color(i), (unsigned char *) buf, 1);
497          SETCOLOR (MT_COLOR_NORMAL);          
498        }
499        else
500 @@ -249,7 +284,7 @@ void menu_redraw_index (MUTTMENU *menu)
501         }
502  
503         CLEARLINE (i - menu->top + menu->offset);
504 -       print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current);
505 +       print_enriched_string (i, menu->color(i), (unsigned char *) buf, i != menu->current);
506          SETCOLOR (MT_COLOR_NORMAL);
507          BKGDSET (MT_COLOR_NORMAL);
508        }
509 @@ -286,7 +321,7 @@ void menu_redraw_motion (MUTTMENU *menu)
510        menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
511        menu_pad_string (buf, sizeof (buf));
512        move (menu->oldcurrent + menu->offset - menu->top, 3);
513 -      print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
514 +      print_enriched_string (menu->oldcurrent, menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
515        SETCOLOR (MT_COLOR_NORMAL);
516      }
517  
518 @@ -304,7 +339,7 @@ void menu_redraw_motion (MUTTMENU *menu)
519      clrtoeol ();
520      menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
521      menu_pad_string (buf, sizeof (buf));
522 -    print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
523 +    print_enriched_string (menu->oldcurrent, menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
524  
525      /* now draw the new one to reflect the change */
526      menu_make_entry (buf, sizeof (buf), menu, menu->current);
527 @@ -313,7 +348,7 @@ void menu_redraw_motion (MUTTMENU *menu)
528      ADDCOLOR (MT_COLOR_INDICATOR);
529      BKGDSET (MT_COLOR_INDICATOR);
530      CLEARLINE (menu->current - menu->top + menu->offset);
531 -    print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
532 +    print_enriched_string (menu->current, menu->color(menu->current), (unsigned char *) buf, 0);
533      SETCOLOR (MT_COLOR_NORMAL);
534      BKGDSET (MT_COLOR_NORMAL);
535    }
536 @@ -339,7 +374,7 @@ void menu_redraw_current (MUTTMENU *menu
537      attrset (attr);
538      addch (' ');
539      menu_pad_string (buf, sizeof (buf));
540 -    print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 1);
541 +    print_enriched_string (menu->current, menu->color(menu->current), (unsigned char *) buf, 1);
542      SETCOLOR (MT_COLOR_NORMAL);
543    }
544    else
545 @@ -348,7 +383,7 @@ void menu_redraw_current (MUTTMENU *menu
546      ADDCOLOR (MT_COLOR_INDICATOR);
547      BKGDSET (MT_COLOR_INDICATOR);
548      clrtoeol ();
549 -    print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
550 +    print_enriched_string (menu->current, menu->color(menu->current), (unsigned char *) buf, 0);
551      SETCOLOR (MT_COLOR_NORMAL);
552      BKGDSET (MT_COLOR_NORMAL);
553    }
554 Index: mutt/mutt_curses.h
555 ===================================================================
556 --- mutt.orig/mutt_curses.h     2007-02-15 21:26:09.314446368 +0100
557 +++ mutt/mutt_curses.h  2007-02-15 21:26:15.900445144 +0100
558 @@ -126,6 +126,16 @@ enum
559    MT_COLOR_BOLD,
560    MT_COLOR_UNDERLINE,
561    MT_COLOR_INDEX,
562 +  /* please no non-MT_COLOR_INDEX objects after this point */
563 +  MT_COLOR_INDEX_SUBJECT,
564 +  MT_COLOR_INDEX_AUTHOR,
565 +  /* below only index coloring stuff that doesn't have a colorline! */
566 +  MT_COLOR_INDEX_COLLAPSED,
567 +  MT_COLOR_INDEX_DATE,
568 +  MT_COLOR_INDEX_FLAGS,
569 +  MT_COLOR_INDEX_LABEL,
570 +  MT_COLOR_INDEX_NUMBER,
571 +  MT_COLOR_INDEX_SIZE,
572    MT_COLOR_MAX
573  };
574  
575 @@ -165,6 +175,8 @@ extern int ColorDefs[];
576  extern COLOR_LINE *ColorHdrList;
577  extern COLOR_LINE *ColorBodyList;
578  extern COLOR_LINE *ColorIndexList;
579 +extern COLOR_LINE *ColorIndexSubjectList;
580 +extern COLOR_LINE *ColorIndexAuthorList;
581  
582  void ci_init_color (void);
583  void ci_start_color (void);
584 Index: mutt/mutt.h
585 ===================================================================
586 --- mutt.orig/mutt.h    2007-02-15 21:26:09.358439680 +0100
587 +++ mutt/mutt.h 2007-02-15 21:26:15.901444992 +0100
588 @@ -176,6 +176,8 @@ typedef enum
589  #define M_TREE_MISSING         13
590  #define M_TREE_MAX             14
591  
592 +#define M_SPECIAL_INDEX                M_TREE_MAX
593 +
594  #define M_THREAD_COLLAPSE      (1<<0)
595  #define M_THREAD_UNCOLLAPSE    (1<<1)
596  #define M_THREAD_GET_HIDDEN    (1<<2)
597 Index: mutt/doc/manual.xml.head
598 ===================================================================
599 --- mutt.orig/doc/manual.xml.head       2007-02-15 21:26:09.446426304 +0100
600 +++ mutt/doc/manual.xml.head    2007-02-15 21:26:15.903444688 +0100
601 @@ -1837,8 +1837,8 @@ silently truncated at the screen width, 
602  <para>
603  <literallayout>
604  Usage: <literal>color</literal> <emphasis>object</emphasis> <emphasis>foreground</emphasis> <emphasis>background</emphasis> &lsqb; <emphasis>regexp</emphasis> &rsqb;
605 -Usage: <literal>color</literal> index <emphasis>foreground</emphasis> <emphasis>background</emphasis> <emphasis>pattern</emphasis>
606 -Usage: <literal>uncolor</literal> index <emphasis>pattern</emphasis> &lsqb; <emphasis>pattern</emphasis> ...  &rsqb;
607 +Usage: <literal>color</literal> <emphasis>index-object</emphasis> <emphasis>foreground</emphasis> <emphasis>background</emphasis> <emphasis>pattern</emphasis>
608 +  Usage: <literal>uncolor</literal> <emphasis>index-object</emphasis> <emphasis>pattern</emphasis> &lsqb; <emphasis>pattern</emphasis> ...  &rsqb;
609  </literallayout>
610  </para>
611  
612 @@ -1901,6 +1901,54 @@ index (match <emphasis>pattern</emphasis
613  <listitem>
614  
615  <para>
616 +index_author (color of the author name in the index, uses <emphasis>pattern</emphasis>)
617 +</para>
618 +</listitem>
619 +<listitem>
620 +
621 +<para>
622 +index_collapsed (the number of messages in a collapsed thread in the index)
623 +</para>
624 +</listitem>
625 +<listitem>
626 +
627 +<para>
628 +index_date (color of the date field in the index)
629 +</para>
630 +</listitem>
631 +<listitem>
632 +
633 +<para>
634 +index_flags (color of the message flags in the index)
635 +</para>
636 +</listitem>
637 +<listitem>
638 +
639 +<para>
640 +index_label (color of the message label in the index)
641 +</para>
642 +</listitem>
643 +<listitem>
644 +
645 +<para>
646 +index_number (color of the message number in the index)
647 +</para>
648 +</listitem>
649 +<listitem>
650 +
651 +<para>
652 +index_size (color of the message size and line number in the index)
653 +</para>
654 +</listitem>
655 +<listitem>
656 +
657 +<para>
658 +index_subject (color of the subject in the index, uses <emphasis>pattern</emphasis>)
659 +</para>
660 +</listitem>
661 +<listitem>
662 +
663 +<para>
664  indicator (arrow or bar used to indicate the current item in a menu)
665  </para>
666  </listitem>
667 --- a/PATCHES
668 +++ b/PATCHES
669 @@ -0,0 +1 @@
670 +patch-1.5.13.greek0.indexcolor-3+cb