diff options
Diffstat (limited to 'color/command.c')
-rw-r--r-- | color/command.c | 757 |
1 files changed, 11 insertions, 746 deletions
diff --git a/color/command.c b/color/command.c index e7e36c9d4..85765183d 100644 --- a/color/command.c +++ b/color/command.c @@ -28,32 +28,23 @@ #include "config.h" #include <stddef.h> -#include <assert.h> #include <stdbool.h> #include <stdint.h> -#include <stdlib.h> #include "mutt/lib.h" -#include "config/lib.h" #include "core/lib.h" #include "gui/lib.h" +#include "mutt.h" #include "parse/lib.h" #include "color.h" #include "command2.h" +#include "curses2.h" #include "debug.h" #include "globals.h" #include "notify2.h" +#include "parse_color.h" #include "quoted.h" #include "regex4.h" #include "simple2.h" -#ifdef USE_DEBUG_COLOR -#include <stdio.h> -#include "mutt.h" -#include "pager/lib.h" -#include "attr.h" -#include "curses2.h" -#include "merged.h" -#include "pager/private_data.h" // IWYU pragma: keep -#endif /** * ColorFields - Mapping of colour names to their IDs @@ -127,549 +118,6 @@ const struct Mapping ComposeColorFields[] = { }; /** - * ColorPrefix - Constants for colour prefixes of named colours - */ -enum ColorPrefix -{ - COLOR_PREFIX_NONE, ///< no prefix - COLOR_PREFIX_ALERT, ///< "alert" colour prefix - COLOR_PREFIX_BRIGHT, ///< "bright" colour prefix - COLOR_PREFIX_LIGHT, ///< "light" colour prefix -}; - -#ifdef NEOMUTT_DIRECT_COLORS -/** - * color_xterm256_to_24bit - Convert a xterm color to its RGB value - * @param[in] color xterm color number to be converted - * @retval num The color's RGB value as number with value 0xRRGGBB - * - * There are 256 xterm colors numbered 0 to 255. - * - * Caller contract: color must be between 0 and 255. - * - * ## Xterm Color Codes - * - * ### Basic and Bright Colors - * - * - 0-7 correspond to the 8 terminal colours - * - 8-15 are the bright variants of 0-7 - * - * | | | | | | | | | | | | | | | | | - * | :-- | :-------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :- | :------- | :- | :-------- | - * | 0 | `#000000` | 1 | `#800000` | 2 | `#008000` | 3 | `#808000` | 4 | `#000080` | 5 | `#800080` | 6 | `#008080` | 7 | `#c0c0c0` | - * | 8 | `#808080` | 9 | `#ff0000` | 10 | `#00ff00` | 11 | `#ffff00` | 12 | `#0000ff` | 13 | `#ff00ff` | 14 | `#00ffff` | 15 | `#ffffff` | - * - * ### Color palette - * - * | | | | | | | | | | | | | - * | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | - * | 16 | `#000000` | 17 | `#00005f` | 18 | `#000087` | 19 | `#0000af` | 20 | `#0000d7` | 21 | `#0000ff` | - * | 22 | `#005f00` | 23 | `#005f5f` | 24 | `#005f87` | 25 | `#005faf` | 26 | `#005fd7` | 27 | `#005fff` | - * | 28 | `#008700` | 29 | `#00875f` | 30 | `#008787` | 31 | `#0087af` | 32 | `#0087d7` | 33 | `#0087ff` | - * | 34 | `#00af00` | 35 | `#00af5f` | 36 | `#00af87` | 37 | `#00afaf` | 38 | `#00afd7` | 39 | `#00afff` | - * | 40 | `#00d700` | 41 | `#00d75f` | 42 | `#00d787` | 43 | `#00d7af` | 44 | `#00d7d7` | 45 | `#00d7ff` | - * | 46 | `#00ff00` | 47 | `#00ff5f` | 48 | `#00ff87` | 49 | `#00ffaf` | 50 | `#00ffd7` | 51 | `#00ffff` | - * | 52 | `#5f0000` | 53 | `#5f005f` | 54 | `#5f0087` | 55 | `#5f00af` | 56 | `#5f00d7` | 57 | `#5f00ff` | - * | 58 | `#5f5f00` | 59 | `#5f5f5f` | 60 | `#5f5f87` | 61 | `#5f5faf` | 62 | `#5f5fd7` | 63 | `#5f5fff` | - * | 64 | `#5f8700` | 65 | `#5f875f` | 66 | `#5f8787` | 67 | `#5f87af` | 68 | `#5f87d7` | 69 | `#5f87ff` | - * | 70 | `#5faf00` | 71 | `#5faf5f` | 72 | `#5faf87` | 73 | `#5fafaf` | 74 | `#5fafd7` | 75 | `#5fafff` | - * | 76 | `#5fd700` | 77 | `#5fd75f` | 78 | `#5fd787` | 79 | `#5fd7af` | 80 | `#5fd7d7` | 81 | `#5fd7ff` | - * | 82 | `#5fff00` | 83 | `#5fff5f` | 84 | `#5fff87` | 85 | `#5fffaf` | 86 | `#5fffd7` | 87 | `#5fffff` | - * | 88 | `#870000` | 89 | `#87005f` | 90 | `#870087` | 91 | `#8700af` | 92 | `#8700d7` | 93 | `#8700ff` | - * | 94 | `#875f00` | 95 | `#875f5f` | 96 | `#875f87` | 97 | `#875faf` | 98 | `#875fd7` | 99 | `#875fff` | - * | 100 | `#878700` | 101 | `#87875f` | 102 | `#878787` | 103 | `#8787af` | 104 | `#8787d7` | 105 | `#8787ff` | - * | 106 | `#87af00` | 107 | `#87af5f` | 108 | `#87af87` | 109 | `#87afaf` | 110 | `#87afd7` | 111 | `#87afff` | - * | 112 | `#87d700` | 113 | `#87d75f` | 114 | `#87d787` | 115 | `#87d7af` | 116 | `#87d7d7` | 117 | `#87d7ff` | - * | 118 | `#87ff00` | 119 | `#87ff5f` | 120 | `#87ff87` | 121 | `#87ffaf` | 122 | `#87ffd7` | 123 | `#87ffff` | - * | 124 | `#af0000` | 125 | `#af005f` | 126 | `#af0087` | 127 | `#af00af` | 128 | `#af00d7` | 129 | `#af00ff` | - * | 130 | `#af5f00` | 131 | `#af5f5f` | 132 | `#af5f87` | 133 | `#af5faf` | 134 | `#af5fd7` | 135 | `#af5fff` | - * | 136 | `#af8700` | 137 | `#af875f` | 138 | `#af8787` | 139 | `#af87af` | 140 | `#af87d7` | 141 | `#af87ff` | - * | 142 | `#afaf00` | 143 | `#afaf5f` | 144 | `#afaf87` | 145 | `#afafaf` | 146 | `#afafd7` | 147 | `#afafff` | - * | 148 | `#afd700` | 149 | `#afd75f` | 150 | `#afd787` | 151 | `#afd7af` | 152 | `#afd7d7` | 153 | `#afd7ff` | - * | 154 | `#afff00` | 155 | `#afff5f` | 156 | `#afff87` | 157 | `#afffaf` | 158 | `#afffd7` | 159 | `#afffff` | - * | 160 | `#d70000` | 161 | `#d7005f` | 162 | `#d70087` | 163 | `#d700af` | 164 | `#d700d7` | 165 | `#d700ff` | - * | 166 | `#d75f00` | 167 | `#d75f5f` | 168 | `#d75f87` | 169 | `#d75faf` | 170 | `#d75fd7` | 171 | `#d75fff` | - * | 172 | `#d78700` | 173 | `#d7875f` | 174 | `#d78787` | 175 | `#d787af` | 176 | `#d787d7` | 177 | `#d787ff` | - * | 178 | `#d7af00` | 179 | `#d7af5f` | 180 | `#d7af87` | 181 | `#d7afaf` | 182 | `#d7afd7` | 183 | `#d7afff` | - * | 184 | `#d7d700` | 185 | `#d7d75f` | 186 | `#d7d787` | 187 | `#d7d7af` | 188 | `#d7d7d7` | 189 | `#d7d7ff` | - * | 190 | `#d7ff00` | 191 | `#d7ff5f` | 192 | `#d7ff87` | 193 | `#d7ffaf` | 194 | `#d7ffd7` | 195 | `#d7ffff` | - * | 196 | `#ff0000` | 197 | `#ff005f` | 198 | `#ff0087` | 199 | `#ff00af` | 200 | `#ff00d7` | 201 | `#ff00ff` | - * | 202 | `#ff5f00` | 203 | `#ff5f5f` | 204 | `#ff5f87` | 205 | `#ff5faf` | 206 | `#ff5fd7` | 207 | `#ff5fff` | - * | 208 | `#ff8700` | 209 | `#ff875f` | 210 | `#ff8787` | 211 | `#ff87af` | 212 | `#ff87d7` | 213 | `#ff87ff` | - * | 214 | `#ffaf00` | 215 | `#ffaf5f` | 216 | `#ffaf87` | 217 | `#ffafaf` | 218 | `#ffafd7` | 219 | `#ffafff` | - * | 220 | `#ffd700` | 221 | `#ffd75f` | 222 | `#ffd787` | 223 | `#ffd7af` | 224 | `#ffd7d7` | 225 | `#ffd7ff` | - * | 226 | `#ffff00` | 227 | `#ffff5f` | 228 | `#ffff87` | 229 | `#ffffaf` | 230 | `#ffffd7` | 231 | `#ffffff` | - * - * ### Grey Scale Ramp - * - * | | | | | | | | | | | | | | | | | - * | :-- | :-------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :------- | :-- | :-------- | - * | 232 | `#080808` | 233 | `#121212` | 234 | `#1c1c1c` | 235 | `#262626` | 236 | `#303030` | 237 | `#3a3a3a` | 238 | `#444444` | 239 | `#4e4e4e` | - * | 240 | `#585858` | 241 | `#606060` | 242 | `#666666` | 243 | `#767676` | 244 | `#808080` | 245 | `#8a8a8a` | 246 | `#949494` | 247 | `#9e9e9e` | - * | 248 | `#a8a8a8` | 249 | `#b2b2b2` | 250 | `#bcbcbc` | 251 | `#c6c6c6` | 252 | `#d0d0d0` | 253 | `#dadada` | 254 | `#e4e4e4` | 255 | `#eeeeee` | - */ -static uint32_t color_xterm256_to_24bit(const uint32_t color) -{ - static const uint32_t basic[] = { - 0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, - 0x008080, 0xc0c0c0, 0x808080, 0xff0000, 0x00ff00, 0xffff00, - 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff, - }; - - assert(color < 256); - - if (color < 16) - { - color_debug(LL_DEBUG5, "Converted color 0-15: %d\n", color); - /* The first 16 colours are the "usual" terminal colours */ - return basic[color]; - } - - if (color < 232) - { - /* The Color palette is divided in 6x6x6 colours, i.e. each R, G, B channel - * has six values: - * - * value: 1 2 3 4 5 6 - * color: 0x00 0x5f 0x87 0xaf 0xd7 0xff - * - * The steps between the values is 0x28 = 40, the EXCEPT for the first one - * where it is 0x5f = 95. - * - * If we express the xterm color number minus 16 to base 6, i.e. - * - * color - 16 = (vr * 36) + (vg * 6) + (vb * 1) - * - * with vr, vg, vb integers between 0 and 5, then vr, vg, vb is the channel - * value for red, green, and blue, respectively. - */ - - uint32_t normalised_color = color - 16; - uint32_t vr = (normalised_color % 216) / 36; /* 216 = 6*6*6 */ - uint32_t vg = (normalised_color % 36) / 6; - uint32_t vb = (normalised_color % 6) / 1; - - /* First step is wider than the other ones, so add the difference if needed */ - uint32_t r = vr * 0x28 + ((vr > 0) ? (0x5f - 0x40) : 0); - uint32_t g = vg * 0x28 + ((vg > 0) ? (0x5f - 0x40) : 0); - uint32_t b = vb * 0x28 + ((vb > 0) ? (0x5f - 0x40) : 0); - - uint32_t rgb = (r << 16) + (g << 8) + (b << 0); - color_debug(LL_DEBUG5, "Converted xterm color %d to RGB #%x:\n", color, rgb); - return rgb; - } - - /* Grey scale starts at 0x08 and adds 0xa = 10 in very step ending in 0xee. - * There are a total of 6*4 = 24 grey colors in total. */ - uint32_t steps = color - 232; - uint32_t grey = (steps * 0x0a) + 0x08; - uint32_t rgb = (grey << 16) + (grey << 8) + (grey << 0); - color_debug(LL_DEBUG5, "Converted xterm color %d to RGB #%x:\n", color, rgb); - return rgb; -} -#endif - -/** - * modify_color_by_prefix - Modify a colour/attributes based on a prefix, e.g. "bright" - * @param[in] prefix prefix to apply - * @param[in] is_fg true if a foreground colour should be modified - * @param[in,out] col colour to modify - * @param[in,out] attrs attributes to modify - */ -static void modify_color_by_prefix(enum ColorPrefix prefix, bool is_fg, - uint32_t *col, int *attrs) -{ - if (prefix == COLOR_PREFIX_NONE) - return; // nothing to do here - - if (prefix == COLOR_PREFIX_ALERT) - { - *attrs |= A_BOLD; - *attrs |= A_BLINK; - } - else if (is_fg) - { - if ((COLORS >= 16) && (prefix == COLOR_PREFIX_LIGHT)) - { - if (*col <= 7) - { - /* Advance the color 0-7 by 8 to get the light version */ - *col += 8; - } - } - else - { - *attrs |= A_BOLD; - } - } - else - { - if (COLORS >= 16) - { - if (*col <= 7) - { - /* Advance the color 0-7 by 8 to get the light version */ - *col += 8; - } - } - } -} - -/** - * parse_color_prefix - Parse a colour prefix, e.g. "bright" - * @param[in] s String to parse - * @param[out] prefix parsed prefix, see #ColorPrefix - * @retval num Length of the matched prefix - * @retval 0 No prefix matched - * - * If prefixes should be parsed, but their value is irrelevant, NULL can be - * passed as 'prefix'. - */ -static int parse_color_prefix(const char *s, enum ColorPrefix *prefix) -{ - int clen = 0; - - if ((clen = mutt_istr_startswith(s, "bright"))) - { - color_debug(LL_DEBUG5, "bright\n"); - if (prefix) - *prefix = COLOR_PREFIX_BRIGHT; - } - else if ((clen = mutt_istr_startswith(s, "alert"))) - { - color_debug(LL_DEBUG5, "alert\n"); - if (prefix) - *prefix = COLOR_PREFIX_ALERT; - } - else if ((clen = mutt_istr_startswith(s, "light"))) - { - color_debug(LL_DEBUG5, "light\n"); - if (prefix) - *prefix = COLOR_PREFIX_LIGHT; - } - - return clen; -} - -/** - * parse_color_namedcolor - Parse a named colour, e.g. "brightred" - * @param[in] s String to parse - * @param[out] col Number for 'colorNNN' colours - * @param[out] attrs Attributes, e.g. A_UNDERLINE - * @param[in] is_fg true if this is a foreground colour - * @param[out] err Buffer for error messages - * @retval #MUTT_CMD_SUCCESS Colour parsed successfully - * @retval #MUTT_CMD_WARNING Unknown colour, try other parsers - */ -static enum CommandResult parse_color_namedcolor(const char *s, uint32_t *col, int *attrs, - bool is_fg, struct Buffer *err) -{ - enum ColorPrefix prefix = COLOR_PREFIX_NONE; - s += parse_color_prefix(s, &prefix); - - if ((*col = mutt_map_get_value(s, ColorNames)) == -1) - return MUTT_CMD_WARNING; - - const char *name = mutt_map_get_name(*col, ColorNames); - if (name) - color_debug(LL_DEBUG5, "color: %s\n", name); - - modify_color_by_prefix(prefix, is_fg, col, attrs); - -#ifdef NEOMUTT_DIRECT_COLORS - /* If we are running in direct color mode, we must convert the color - * number 0-15 to an RGB value. - * The first 16 colours of the xterm palette correspond to the terminal - * colours. Note that this replace the colour with a predefined RGB value - * and not the RGB value the terminal configured to use. - * - * Note that some colors are "special" e.g. "default" and do not fall in - * the range from 0 to 15. These must not be converted. - */ - const bool c_color_directcolor = cs_subset_bool(NeoMutt->sub, "color_directcolor"); - if (c_color_directcolor && (*col < 16)) - { - *col = color_xterm256_to_24bit(*col); - } -#endif - return MUTT_CMD_SUCCESS; -} - -/** - * parse_color_colornnn - Parse a colorNNN, e.g. "color123". - * @param[in] s String to parse - * @param[out] col Number for 'colorNNN' colours - * @param[out] attrs Attributes, e.g. A_UNDERLINE - * @param[in] is_fg true if this is a foreground colour - * @param[out] err Buffer for error messages - * @retval #MUTT_CMD_SUCCESS Colour parsed successfully - * @retval #MUTT_CMD_WARNING Unknown colour, try other parsers - * @retval #MUTT_CMD_ERROR Error, colour could not be parsed - * - * On #MUTT_CMD_ERROR, an error message will be written to err. - */ -static enum CommandResult parse_color_colornnn(const char *s, uint32_t *col, int *attrs, - bool is_fg, struct Buffer *err) -{ - /* prefixes bright, alert, light are only allowed for named colours and - * colorNNN for backwards compatibility. */ - enum ColorPrefix prefix = COLOR_PREFIX_NONE; - s += parse_color_prefix(s, &prefix); - - int clen = 0; - /* allow aliases for xterm color resources */ - if ((clen = mutt_istr_startswith(s, "color")) == 0) - return MUTT_CMD_WARNING; - - s += clen; - char *eptr = NULL; - *col = strtoul(s, &eptr, 10); - /* There are only 256 xterm colors. Do not confuse with COLORS which is - * the number of colours the terminal supports (usually one of 16, 256, - * 16777216 (=24bit)). */ - if ((*s == '\0') || (*eptr != '\0') || (*col >= 256) || ((*col >= COLORS) && !OptNoCurses)) - { - buf_printf(err, _("%s: color not supported by term"), s); - return MUTT_CMD_ERROR; - } - - modify_color_by_prefix(prefix, is_fg, col, attrs); - -#ifdef NEOMUTT_DIRECT_COLORS - const bool c_color_directcolor = cs_subset_bool(NeoMutt->sub, "color_directcolor"); - if (c_color_directcolor) - { - /* If we are running in direct color mode, we must convert the xterm - * color numbers 0-255 to an RGB value. */ - *col = color_xterm256_to_24bit(*col); - /* FIXME: The color values 0 to 7 (both inclusive) are still occupied by - * the default terminal colours. As a workaround we round them up to - * #000008 which is the blackest black we can produce. */ - if (*col < 8) - *col = 8; - } -#endif - color_debug(LL_DEBUG5, "colorNNN %d\n", *col); - return MUTT_CMD_SUCCESS; -} - -/** - * parse_color_rrggbb - Parse an RGB colour, e.g. "#12FE45" - * @param[in] s String to parse - * @param[out] col Number for 'colorNNN' colours - * @param[out] attrs Attributes, e.g. A_UNDERLINE - * @param[in] is_fg true if this is a foreground colour - * @param[out] err Buffer for error messages - * @retval #MUTT_CMD_SUCCESS Colour parsed successfully - * @retval #MUTT_CMD_WARNING Unknown colour, try other parsers - * @retval #MUTT_CMD_ERROR Error, colour could not be parsed - * - * On #MUTT_CMD_ERROR, an error message will be written to err. - */ -static enum CommandResult parse_color_rrggbb(const char *s, uint32_t *col, int *attrs, - bool is_fg, struct Buffer *err) -{ - /* parse #RRGGBB colours */ - if (s[0] != '#') - return MUTT_CMD_WARNING; - -#ifndef NEOMUTT_DIRECT_COLORS - buf_printf(err, _("Direct colors support not compiled in: %s"), s); - return MUTT_CMD_ERROR; -#endif - const bool c_color_directcolor = cs_subset_bool(NeoMutt->sub, "color_directcolor"); - if (!c_color_directcolor) - { - buf_printf(err, _("Direct colors support disabled: %s"), s); - return MUTT_CMD_ERROR; - } - s++; - char *eptr = NULL; - *col = strtoul(s, &eptr, 16); - if ((*s == '\0') || (*eptr != '\0') || ((*col >= COLORS) && !OptNoCurses)) - { - buf_printf(err, _("%s: color not supported by term"), s); - return MUTT_CMD_ERROR; - } - /* FIXME: The color values 0 to 7 (both inclusive) are still occupied by - * the default terminal colours. As a workaround we round them up to - * #000008 which is the blackest black we can produce. */ - if (*col < 8) - *col = 8; - - color_debug(LL_DEBUG5, "#RRGGBB: %d\n", *col); - return MUTT_CMD_SUCCESS; -} - -/** - * parse_color_name - Parse a colour name - * @param[in] s String to parse - * @param[out] col Number for 'colorNNN' colours - * @param[out] attrs Attributes, e.g. A_UNDERLINE - * @param[in] is_fg true if this is a foreground colour - * @param[out] err Buffer for error messages - * @retval #CommandResult Result e.g. #MUTT_CMD_SUCCESS - * - * Parse a colour name, such as "red", "brightgreen", "color123", "#12FE45" - */ -static enum CommandResult parse_color_name(const char *s, uint32_t *col, int *attrs, - bool is_fg, struct Buffer *err) -{ - mutt_debug(LL_DEBUG5, "Parsing color name: %s\n", s); - - /* Try the different colour syntaxes. A return value of MUTT_CMD_WARNING - * means, we should try the next syntax. */ - enum CommandResult cr; - - /* #RRGGBB */ - cr = parse_color_rrggbb(s, col, attrs, is_fg, err); - if (cr != MUTT_CMD_WARNING) - return cr; - /* color123 */ - cr = parse_color_colornnn(s, col, attrs, is_fg, err); - if (cr != MUTT_CMD_WARNING) - return cr; - /* named color, e.g. "brightred" */ - cr = parse_color_namedcolor(s, col, attrs, is_fg, err); - if (cr != MUTT_CMD_WARNING) - return cr; - - buf_printf(err, _("%s: no such color"), s); - return MUTT_CMD_WARNING; -} - -/** - * parse_attr_spec - Parse an attribute description - Implements ::parser_callback_t - @ingroup parser_callback_api - */ -static enum CommandResult parse_attr_spec(struct Buffer *buf, struct Buffer *s, - uint32_t *fg, uint32_t *bg, - int *attrs, struct Buffer *err) -{ - if (fg) - *fg = COLOR_UNSET; - if (bg) - *bg = COLOR_UNSET; - - if (!MoreArgs(s)) - { - buf_printf(err, _("%s: too few arguments"), "mono"); - return MUTT_CMD_WARNING; - } - - parse_extract_token(buf, s, TOKEN_NO_FLAGS); - - if (mutt_istr_equal("bold", buf->data)) - { - *attrs |= A_BOLD; - } - else if (mutt_istr_equal("italic", buf->data)) - { - *attrs |= A_ITALIC; - } - else if (mutt_istr_equal("none", buf->data)) - { - *attrs = A_NORMAL; // Use '=' to clear other bits - } - else if (mutt_istr_equal("normal", buf->data)) - { - *attrs = A_NORMAL; // Use '=' to clear other bits - } - else if (mutt_istr_equal("reverse", buf->data)) - { - *attrs |= A_REVERSE; - } - else if (mutt_istr_equal("standout", buf->data)) - { - *attrs |= A_STANDOUT; - } - else if (mutt_istr_equal("underline", buf->data)) - { - *attrs |= A_UNDERLINE; - } - else - { - buf_printf(err, _("%s: no such attribute"), buf->data); - return MUTT_CMD_WARNING; - } - - return MUTT_CMD_SUCCESS; -} - -/** - * parse_color_pair - Parse a pair of colours - Implements ::parser_callback_t - @ingroup parser_callback_api - * - * Parse a pair of colours, e.g. "red default" - */ -static enum CommandResult parse_color_pair(struct Buffer *buf, struct Buffer *s, - uint32_t *fg, uint32_t *bg, - int *attrs, struct Buffer *err) -{ - while (true) - { - if (!MoreArgsF(s, TOKEN_COMMENT)) - { - buf_printf(err, _("%s: too few arguments"), "color"); - return MUTT_CMD_WARNING; - } - - parse_extract_token(buf, s, TOKEN_COMMENT); - - if (mutt_istr_equal("bold", buf->data)) - { - *attrs |= A_BOLD; - color_debug(LL_DEBUG5, "bold\n"); - } - else if (mutt_istr_equal("italic", buf->data)) - { - *attrs |= A_ITALIC; - color_debug(LL_DEBUG5, "italic\n"); - } - else if (mutt_istr_equal("none", buf->data)) - { - *attrs = A_NORMAL; // Use '=' to clear other bits - color_debug(LL_DEBUG5, "none\n"); - } - else if (mutt_istr_equal("normal", buf->data)) - { - *attrs = A_NORMAL; // Use '=' to clear other bits - color_debug(LL_DEBUG5, "normal\n"); - } - else if (mutt_istr_equal("reverse", buf->data)) - { - *attrs |= A_REVERSE; - color_debug(LL_DEBUG5, "reverse\n"); - } - else if (mutt_istr_equal("standout", buf->data)) - { - *attrs |= A_STANDOUT; - color_debug(LL_DEBUG5, "standout\n"); - } - else if (mutt_istr_equal("underline", buf->data)) - { - *attrs |= A_UNDERLINE; - color_debug(LL_DEBUG5, "underline\n"); - } - else - { - enum CommandResult rc = parse_color_name(buf->data, fg, attrs, true, err); - if (rc != MUTT_CMD_SUCCESS) - return rc; - break; - } - } - - if (!MoreArgsF(s, TOKEN_COMMENT)) - { - buf_printf(err, _("%s: too few arguments"), "color"); - return MUTT_CMD_WARNING; - } - - parse_extract_token(buf, s, TOKEN_COMMENT); - - return parse_color_name(buf->data, bg, attrs, false, err); -} - -/** * get_colorid_name - Get the name of a color id * @param cid Colour, e.g. #MT_COLOR_HEADER * @param buf Buffer for result @@ -862,191 +310,6 @@ static enum CommandResult parse_uncolor(struct Buffer *buf, struct Buffer *s, return MUTT_CMD_SUCCESS; } -#ifdef USE_DEBUG_COLOR -/** - * color_dump - Parse 'color' command to display colours - Implements Command::parse() - @ingroup command_parse - */ -static enum CommandResult color_dump(struct Buffer *buf, struct Buffer *s, - intptr_t data, struct Buffer *err) -{ - if (MoreArgs(s)) - return MUTT_CMD_ERROR; - - FILE *fp_out = NULL; - struct Buffer *tempfile = buf_pool_get(); - struct Buffer filebuf = buf_make(4096); - char color_fg[32] = { 0 }; - char color_bg[32] = { 0 }; - - buf_mktemp(tempfile); - fp_out = mutt_file_fopen(buf_string(tempfile), "w"); - if (!fp_out) - { - // L10N: '%s' is the file name of the temporary file - buf_printf(err, _("Could not create temporary file %s"), buf_string(tempfile)); - buf_dealloc(&filebuf); - buf_pool_release(&tempfile); - return MUTT_CMD_ERROR; - } - - buf_addstr(&filebuf, "# All Colours\n\n"); - buf_addstr(&filebuf, "# Simple Colours\n"); - for (enum ColorId cid = MT_COLOR_NONE + 1; cid < MT_COLOR_MAX; cid++) - { - struct AttrColor *ac = simple_color_get(cid); - if (!ac) - continue; - - struct CursesColor *cc = ac->curses_color; - if (!cc) - continue; - - const char *name = mutt_map_get_name(cid, ColorFields); - if (!name) - continue; - - const char *swatch = color_debug_log_color_attrs(cc->fg, cc->bg, ac->attrs); - buf_add_printf(&filebuf, "color %-18s %-30s %-8s %-8s # %s\n", name, - color_debug_log_attrs_list(ac->attrs), - color_debug_log_name(color_fg, sizeof(color_fg), cc->fg), - color_debug_log_name(color_bg, sizeof(color_bg), cc->bg), swatch); - } - - if (NumQuotedColors > 0) - { - buf_addstr(&filebuf, "\n# Quoted Colours\n"); - for (int i = 0; i < NumQuotedColors; i++) - { - struct AttrColor *ac = quoted_colors_get(i); - if (!ac) - continue; - - struct CursesColor *cc = ac->curses_color; - if (!cc) - continue; - - const char *swatch = color_debug_log_color_attrs(cc->fg, cc->bg, ac->attrs); - buf_add_printf(&filebuf, "color quoted%d %-30s %-8s %-8s # %s\n", i, - color_debug_log_attrs_list(ac->attrs), - color_debug_log_name(color_fg, sizeof(color_fg), cc->fg), - color_debug_log_name(color_bg, sizeof(color_bg), cc->bg), swatch); - } - } - - int rl_count = 0; - for (enum ColorId id = MT_COLOR_NONE; id != MT_COLOR_MAX; ++id) - { - if (!mutt_color_has_pattern(id)) - { - continue; - } - - struct RegexColorList *rcl = regex_colors_get_list(id); - if (!STAILQ_EMPTY(rcl)) - rl_count++; - } - - if (rl_count > 0) - { - for (enum ColorId id = MT_COLOR_NONE; id != MT_COLOR_MAX; ++id) - { - if (!mutt_color_has_pattern(id)) - { - continue; - } - - struct RegexColorList *rcl = regex_colors_get_list(id); - if (STAILQ_EMPTY(rcl)) - continue; - - const char *name = mutt_map_get_name(id, ColorFields); - if (!name) - continue; - - buf_add_printf(&filebuf, "\n# Regex Colour %s\n", name); - - struct RegexColor *rc = NULL; - STAILQ_FOREACH(rc, rcl, entries) - { - struct AttrColor *ac = &rc->attr_color; - struct CursesColor *cc = ac->curses_color; - if (!cc) - continue; - - const char *swatch = color_debug_log_color_attrs(cc->fg, cc->bg, ac->attrs); - buf_add_printf(&filebuf, "color %-14s %-30s %-8s %-8s %-30s # %s\n", - name, color_debug_log_attrs_list(ac->attrs), - color_debug_log_name(color_fg, sizeof(color_fg), cc->fg), - color_debug_log_name(color_bg, sizeof(color_bg), cc->bg), - rc->pattern, swatch); - } - } - } - -#ifdef USE_DEBUG_COLOR - if (!TAILQ_EMPTY(&MergedColors)) - { - buf_addstr(&filebuf, "\n# Merged Colours\n"); - struct AttrColor *ac = NULL; - TAILQ_FOREACH(ac, &MergedColors, entries) - { - struct CursesColor *cc = ac->curses_color; - if (!cc) - continue; - - const char *swatch = color_debug_log_color_attrs(cc->fg, cc->bg, ac->attrs); - buf_add_printf(&filebuf, "# %-30s %-8s %-8s # %s\n", - color_debug_log_attrs_list(ac->attrs), - color_debug_log_name(color_fg, sizeof(color_fg), cc->fg), - color_debug_log_name(color_bg, sizeof(color_bg), cc->bg), swatch); - } - } - - struct MuttWindow *win = window_get_focus(); - if (win && (win->type == WT_CUSTOM) && win->parent && (win->parent->type == WT_PAGER)) - { - struct PagerPrivateData *priv = win->parent->wdata; - if (priv && !TAILQ_EMPTY(&priv->ansi_list)) - { - buf_addstr(&filebuf, "\n# Ansi Colours\n"); - struct AttrColor *ac = NULL; - TAILQ_FOREACH(ac, &priv->ansi_list, entries) - { - struct CursesColor *cc = ac->curses_color; - if (!cc) - continue; - - const char *swatch = color_debug_log_color_attrs(cc->fg, cc->bg, ac->attrs); - buf_add_printf(&filebuf, "# %-30s %-8s %-8s # %s\n", - color_debug_log_attrs_list(ac->attrs), - color_debug_log_name(color_fg, sizeof(color_fg), cc->fg), - color_debug_log_name(color_bg, sizeof(color_bg), cc->bg), swatch); - } - } - } -#endif - - fputs(filebuf.data, fp_out); - - mutt_file_fclose(&fp_out); - buf_dealloc(&filebuf); - - struct PagerData pdata = { 0 }; - struct PagerView pview = { &pdata }; - - pdata.fname = buf_string(tempfile); - - pview.banner = "color"; - pview.flags = MUTT_SHOWCOLOR; - pview.mode = PAGER_MODE_OTHER; - - mutt_do_pager(&pview, NULL); - buf_pool_release(&tempfile); - - return MUTT_CMD_SUCCESS; -} -#endif - /** * parse_color - Parse a 'color' command * @param buf Temporary Buffer space @@ -1066,16 +329,18 @@ static enum CommandResult parse_color(struct Buffer *buf, struct Buffer *s, bool dry_run, bool color) { int attrs = 0, q_level = 0; - uint32_t fg = 0, bg = 0, match = 0; + color_t fg = 0, bg = 0; + unsigned int match = 0; enum ColorId cid = MT_COLOR_NONE; enum CommandResult rc; if (!MoreArgs(s)) { -#ifdef USE_DEBUG_COLOR if (StartupComplete) - return color_dump(buf, s, 0, err); -#endif + { + color_dump(); + return MUTT_CMD_SUCCESS; + } buf_printf(err, _("%s: too few arguments"), "color"); return MUTT_CMD_WARNING; @@ -1094,7 +359,7 @@ static enum CommandResult parse_color(struct Buffer *buf, struct Buffer *s, /* extract a regular expression if needed */ - if (mutt_color_has_pattern(cid) && cid != MT_COLOR_STATUS) + if (mutt_color_has_pattern(cid) && (cid != MT_COLOR_STATUS)) { color_debug(LL_DEBUG5, "regex needed\n"); if (MoreArgs(s)) @@ -1241,5 +506,5 @@ enum CommandResult mutt_parse_color(struct Buffer *buf, struct Buffer *s, enum CommandResult mutt_parse_mono(struct Buffer *buf, struct Buffer *s, intptr_t data, struct Buffer *err) { - return parse_color(buf, s, err, parse_attr_spec, true, false); + return parse_color(buf, s, err, parse_attr_spec, false, false); } |