To: vim_dev@googlegroups.com Subject: Patch 7.4.1792 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1792 Problem: Color name decoding is implemented several times. Solution: Move it to term.c. (Christian Brabandt) Files: src/gui_mac.c, src/gui_photon.c, src/gui_w32.c, src/proto/term.pro, src/term.c *** ../vim-7.4.1791/src/gui_mac.c 2016-02-27 15:21:28.408383933 +0100 --- src/gui_mac.c 2016-04-26 20:47:26.232802428 +0200 *************** *** 3705,3721 **** */ } - static int - hex_digit(int c) - { - if (isdigit(c)) - return c - '0'; - c = TOLOWER_ASC(c); - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - return -1000; - } - /* * Return the Pixel value (color) for the given color name. This routine was * pretty much taken from example code in the Silicon Graphics OSF/Motif --- 3705,3710 ---- *************** *** 3728,3873 **** /* TODO: Add support for the new named color of MacOS 8 */ RGBColor MacColor; - // guicolor_T color = 0; ! typedef struct guicolor_tTable { ! char *name; ! guicolor_T color; ! } guicolor_tTable; ! ! /* ! * The comment at the end of each line is the source ! * (Mac, Window, Unix) and the number is the unix rgb.txt value ! */ ! static guicolor_tTable table[] = ! { ! {"Black", RGB(0x00, 0x00, 0x00)}, ! {"darkgray", RGB(0x80, 0x80, 0x80)}, /*W*/ ! {"darkgrey", RGB(0x80, 0x80, 0x80)}, /*W*/ ! {"Gray", RGB(0xC0, 0xC0, 0xC0)}, /*W*/ ! {"Grey", RGB(0xC0, 0xC0, 0xC0)}, /*W*/ ! {"lightgray", RGB(0xE0, 0xE0, 0xE0)}, /*W*/ ! {"lightgrey", RGB(0xE0, 0xE0, 0xE0)}, /*W*/ ! {"gray10", RGB(0x1A, 0x1A, 0x1A)}, /*W*/ ! {"grey10", RGB(0x1A, 0x1A, 0x1A)}, /*W*/ ! {"gray20", RGB(0x33, 0x33, 0x33)}, /*W*/ ! {"grey20", RGB(0x33, 0x33, 0x33)}, /*W*/ ! {"gray30", RGB(0x4D, 0x4D, 0x4D)}, /*W*/ ! {"grey30", RGB(0x4D, 0x4D, 0x4D)}, /*W*/ ! {"gray40", RGB(0x66, 0x66, 0x66)}, /*W*/ ! {"grey40", RGB(0x66, 0x66, 0x66)}, /*W*/ ! {"gray50", RGB(0x7F, 0x7F, 0x7F)}, /*W*/ ! {"grey50", RGB(0x7F, 0x7F, 0x7F)}, /*W*/ ! {"gray60", RGB(0x99, 0x99, 0x99)}, /*W*/ ! {"grey60", RGB(0x99, 0x99, 0x99)}, /*W*/ ! {"gray70", RGB(0xB3, 0xB3, 0xB3)}, /*W*/ ! {"grey70", RGB(0xB3, 0xB3, 0xB3)}, /*W*/ ! {"gray80", RGB(0xCC, 0xCC, 0xCC)}, /*W*/ ! {"grey80", RGB(0xCC, 0xCC, 0xCC)}, /*W*/ ! {"gray90", RGB(0xE5, 0xE5, 0xE5)}, /*W*/ ! {"grey90", RGB(0xE5, 0xE5, 0xE5)}, /*W*/ ! {"white", RGB(0xFF, 0xFF, 0xFF)}, ! {"darkred", RGB(0x80, 0x00, 0x00)}, /*W*/ ! {"red", RGB(0xDD, 0x08, 0x06)}, /*M*/ ! {"lightred", RGB(0xFF, 0xA0, 0xA0)}, /*W*/ ! {"DarkBlue", RGB(0x00, 0x00, 0x80)}, /*W*/ ! {"Blue", RGB(0x00, 0x00, 0xD4)}, /*M*/ ! {"lightblue", RGB(0xA0, 0xA0, 0xFF)}, /*W*/ ! {"DarkGreen", RGB(0x00, 0x80, 0x00)}, /*W*/ ! {"Green", RGB(0x00, 0x64, 0x11)}, /*M*/ ! {"lightgreen", RGB(0xA0, 0xFF, 0xA0)}, /*W*/ ! {"DarkCyan", RGB(0x00, 0x80, 0x80)}, /*W ?0x307D7E */ ! {"cyan", RGB(0x02, 0xAB, 0xEA)}, /*M*/ ! {"lightcyan", RGB(0xA0, 0xFF, 0xFF)}, /*W*/ ! {"darkmagenta", RGB(0x80, 0x00, 0x80)}, /*W*/ ! {"magenta", RGB(0xF2, 0x08, 0x84)}, /*M*/ ! {"lightmagenta",RGB(0xF0, 0xA0, 0xF0)}, /*W*/ ! {"brown", RGB(0x80, 0x40, 0x40)}, /*W*/ ! {"yellow", RGB(0xFC, 0xF3, 0x05)}, /*M*/ ! {"lightyellow", RGB(0xFF, 0xFF, 0xA0)}, /*M*/ ! {"darkyellow", RGB(0xBB, 0xBB, 0x00)}, /*U*/ ! {"SeaGreen", RGB(0x2E, 0x8B, 0x57)}, /*W 0x4E8975 */ ! {"orange", RGB(0xFC, 0x80, 0x00)}, /*W 0xF87A17 */ ! {"Purple", RGB(0xA0, 0x20, 0xF0)}, /*W 0x8e35e5 */ ! {"SlateBlue", RGB(0x6A, 0x5A, 0xCD)}, /*W 0x737CA1 */ ! {"Violet", RGB(0x8D, 0x38, 0xC9)}, /*U*/ ! }; ! ! int r, g, b; ! int i; ! ! if (name[0] == '#' && strlen((char *) name) == 7) ! { ! /* Name is in "#rrggbb" format */ ! r = hex_digit(name[1]) * 16 + hex_digit(name[2]); ! g = hex_digit(name[3]) * 16 + hex_digit(name[4]); ! b = hex_digit(name[5]) * 16 + hex_digit(name[6]); ! if (r < 0 || g < 0 || b < 0) ! return INVALCOLOR; ! return RGB(r, g, b); ! } ! else ! { ! if (STRICMP(name, "hilite") == 0) ! { ! LMGetHiliteRGB(&MacColor); ! return (RGB(MacColor.red >> 8, MacColor.green >> 8, MacColor.blue >> 8)); ! } ! /* Check if the name is one of the colors we know */ ! for (i = 0; i < sizeof(table) / sizeof(table[0]); i++) ! if (STRICMP(name, table[i].name) == 0) ! return table[i].color; } ! ! /* ! * Last attempt. Look in the file "$VIM/rgb.txt". ! */ ! { ! #define LINE_LEN 100 ! FILE *fd; ! char line[LINE_LEN]; ! char_u *fname; ! ! fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); ! if (fname == NULL) ! return INVALCOLOR; ! ! fd = fopen((char *)fname, "rt"); ! vim_free(fname); ! if (fd == NULL) ! return INVALCOLOR; ! ! while (!feof(fd)) ! { ! int len; ! int pos; ! char *color; ! ! fgets(line, LINE_LEN, fd); ! len = strlen(line); ! ! if (len <= 1 || line[len-1] != '\n') ! continue; ! ! line[len-1] = '\0'; ! ! i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); ! if (i != 3) ! continue; ! ! color = line + pos; ! ! if (STRICMP(color, name) == 0) ! { ! fclose(fd); ! return (guicolor_T) RGB(r, g, b); ! } ! } ! fclose(fd); ! } ! ! return INVALCOLOR; } /* --- 3717,3729 ---- /* TODO: Add support for the new named color of MacOS 8 */ RGBColor MacColor; ! if (STRICMP(name, "hilite") == 0) { ! LMGetHiliteRGB(&MacColor); ! return (RGB(MacColor.red >> 8, MacColor.green >> 8, MacColor.blue >> 8)); } ! return gui_get_color_cmn(name); } /* *** ../vim-7.4.1791/src/gui_photon.c 2016-01-30 17:24:01.790502532 +0100 --- src/gui_photon.c 2016-04-26 20:47:26.236802383 +0200 *************** *** 1971,1988 **** PtSetResource(gui.vimTextArea, Pt_ARG_FILL_COLOR, gui.back_pixel, 0); } - static int - hex_digit(int c) - { - if (VIM_ISDIGIT(c)) - return c - '0'; - c = TOLOWER_ASC(c); - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - return -1000; - } - - /* * This should be split out into a separate file, * every port does basically the same thing. --- 1971,1976 ---- *************** *** 1994,2129 **** guicolor_T gui_mch_get_color(char_u *name) { ! int i; ! int r, g, b; ! ! ! typedef struct GuiColourTable ! { ! char *name; ! guicolor_T colour; ! } GuiColourTable; ! ! static GuiColourTable table[] = ! { ! {"Black", RGB(0x00, 0x00, 0x00)}, ! {"DarkGray", RGB(0xA9, 0xA9, 0xA9)}, ! {"DarkGrey", RGB(0xA9, 0xA9, 0xA9)}, ! {"Gray", RGB(0xC0, 0xC0, 0xC0)}, ! {"Grey", RGB(0xC0, 0xC0, 0xC0)}, ! {"LightGray", RGB(0xD3, 0xD3, 0xD3)}, ! {"LightGrey", RGB(0xD3, 0xD3, 0xD3)}, ! {"Gray10", RGB(0x1A, 0x1A, 0x1A)}, ! {"Grey10", RGB(0x1A, 0x1A, 0x1A)}, ! {"Gray20", RGB(0x33, 0x33, 0x33)}, ! {"Grey20", RGB(0x33, 0x33, 0x33)}, ! {"Gray30", RGB(0x4D, 0x4D, 0x4D)}, ! {"Grey30", RGB(0x4D, 0x4D, 0x4D)}, ! {"Gray40", RGB(0x66, 0x66, 0x66)}, ! {"Grey40", RGB(0x66, 0x66, 0x66)}, ! {"Gray50", RGB(0x7F, 0x7F, 0x7F)}, ! {"Grey50", RGB(0x7F, 0x7F, 0x7F)}, ! {"Gray60", RGB(0x99, 0x99, 0x99)}, ! {"Grey60", RGB(0x99, 0x99, 0x99)}, ! {"Gray70", RGB(0xB3, 0xB3, 0xB3)}, ! {"Grey70", RGB(0xB3, 0xB3, 0xB3)}, ! {"Gray80", RGB(0xCC, 0xCC, 0xCC)}, ! {"Grey80", RGB(0xCC, 0xCC, 0xCC)}, ! {"Gray90", RGB(0xE5, 0xE5, 0xE5)}, ! {"Grey90", RGB(0xE5, 0xE5, 0xE5)}, ! {"White", RGB(0xFF, 0xFF, 0xFF)}, ! {"DarkRed", RGB(0x80, 0x00, 0x00)}, ! {"Red", RGB(0xFF, 0x00, 0x00)}, ! {"LightRed", RGB(0xFF, 0xA0, 0xA0)}, ! {"DarkBlue", RGB(0x00, 0x00, 0x80)}, ! {"Blue", RGB(0x00, 0x00, 0xFF)}, ! {"LightBlue", RGB(0xAD, 0xD8, 0xE6)}, ! {"DarkGreen", RGB(0x00, 0x80, 0x00)}, ! {"Green", RGB(0x00, 0xFF, 0x00)}, ! {"LightGreen", RGB(0x90, 0xEE, 0x90)}, ! {"DarkCyan", RGB(0x00, 0x80, 0x80)}, ! {"Cyan", RGB(0x00, 0xFF, 0xFF)}, ! {"LightCyan", RGB(0xE0, 0xFF, 0xFF)}, ! {"DarkMagenta", RGB(0x80, 0x00, 0x80)}, ! {"Magenta", RGB(0xFF, 0x00, 0xFF)}, ! {"LightMagenta", RGB(0xFF, 0xA0, 0xFF)}, ! {"Brown", RGB(0x80, 0x40, 0x40)}, ! {"Yellow", RGB(0xFF, 0xFF, 0x00)}, ! {"LightYellow", RGB(0xFF, 0xFF, 0xE0)}, ! {"SeaGreen", RGB(0x2E, 0x8B, 0x57)}, ! {"Orange", RGB(0xFF, 0xA5, 0x00)}, ! {"Purple", RGB(0xA0, 0x20, 0xF0)}, ! {"SlateBlue", RGB(0x6A, 0x5A, 0xCD)}, ! {"Violet", RGB(0xEE, 0x82, 0xEE)}, ! }; ! ! /* is name #rrggbb format? */ ! if (name[0] == '#' && STRLEN(name) == 7) ! { ! r = hex_digit(name[1]) * 16 + hex_digit(name[2]); ! g = hex_digit(name[3]) * 16 + hex_digit(name[4]); ! b = hex_digit(name[5]) * 16 + hex_digit(name[6]); ! if (r < 0 || g < 0 || b < 0) ! return INVALCOLOR; ! return RGB(r, g, b); ! } ! ! for (i = 0; i < ARRAY_LENGTH(table); i++) ! { ! if (STRICMP(name, table[i].name) == 0) ! return table[i].colour; ! } ! ! /* ! * Last attempt. Look in the file "$VIMRUNTIME/rgb.txt". ! */ ! { ! #define LINE_LEN 100 ! FILE *fd; ! char line[LINE_LEN]; ! char_u *fname; ! ! fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); ! if (fname == NULL) ! return INVALCOLOR; ! ! fd = fopen((char *)fname, "rt"); ! vim_free(fname); ! if (fd == NULL) ! return INVALCOLOR; ! ! while (!feof(fd)) ! { ! int len; ! int pos; ! char *color; ! ! fgets(line, LINE_LEN, fd); ! len = STRLEN(line); ! ! if (len <= 1 || line[len-1] != '\n') ! continue; ! ! line[len-1] = '\0'; ! ! i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); ! if (i != 3) ! continue; ! ! color = line + pos; ! ! if (STRICMP(color, name) == 0) ! { ! fclose(fd); ! return (guicolor_T)RGB(r, g, b); ! } ! } ! ! fclose(fd); ! } ! ! ! return INVALCOLOR; } void --- 1982,1988 ---- guicolor_T gui_mch_get_color(char_u *name) { ! return gui_get_color_cmn(name); } void *** ../vim-7.4.1791/src/gui_w32.c 2016-04-03 22:07:35.266508711 +0200 --- src/gui_w32.c 2016-04-26 20:47:26.240802336 +0200 *************** *** 1555,1570 **** DeleteObject((HFONT)font); } - static int - hex_digit(int c) - { - if (VIM_ISDIGIT(c)) - return c - '0'; - c = TOLOWER_ASC(c); - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - return -1000; - } /* * Return the Pixel value (color) for the given color name. * Return INVALCOLOR for error. --- 1555,1560 ---- *************** *** 1572,1636 **** guicolor_T gui_mch_get_color(char_u *name) { - typedef struct guicolor_tTable - { - char *name; - COLORREF color; - } guicolor_tTable; - - static guicolor_tTable table[] = - { - {"Black", RGB(0x00, 0x00, 0x00)}, - {"DarkGray", RGB(0xA9, 0xA9, 0xA9)}, - {"DarkGrey", RGB(0xA9, 0xA9, 0xA9)}, - {"Gray", RGB(0xC0, 0xC0, 0xC0)}, - {"Grey", RGB(0xC0, 0xC0, 0xC0)}, - {"LightGray", RGB(0xD3, 0xD3, 0xD3)}, - {"LightGrey", RGB(0xD3, 0xD3, 0xD3)}, - {"Gray10", RGB(0x1A, 0x1A, 0x1A)}, - {"Grey10", RGB(0x1A, 0x1A, 0x1A)}, - {"Gray20", RGB(0x33, 0x33, 0x33)}, - {"Grey20", RGB(0x33, 0x33, 0x33)}, - {"Gray30", RGB(0x4D, 0x4D, 0x4D)}, - {"Grey30", RGB(0x4D, 0x4D, 0x4D)}, - {"Gray40", RGB(0x66, 0x66, 0x66)}, - {"Grey40", RGB(0x66, 0x66, 0x66)}, - {"Gray50", RGB(0x7F, 0x7F, 0x7F)}, - {"Grey50", RGB(0x7F, 0x7F, 0x7F)}, - {"Gray60", RGB(0x99, 0x99, 0x99)}, - {"Grey60", RGB(0x99, 0x99, 0x99)}, - {"Gray70", RGB(0xB3, 0xB3, 0xB3)}, - {"Grey70", RGB(0xB3, 0xB3, 0xB3)}, - {"Gray80", RGB(0xCC, 0xCC, 0xCC)}, - {"Grey80", RGB(0xCC, 0xCC, 0xCC)}, - {"Gray90", RGB(0xE5, 0xE5, 0xE5)}, - {"Grey90", RGB(0xE5, 0xE5, 0xE5)}, - {"White", RGB(0xFF, 0xFF, 0xFF)}, - {"DarkRed", RGB(0x80, 0x00, 0x00)}, - {"Red", RGB(0xFF, 0x00, 0x00)}, - {"LightRed", RGB(0xFF, 0xA0, 0xA0)}, - {"DarkBlue", RGB(0x00, 0x00, 0x80)}, - {"Blue", RGB(0x00, 0x00, 0xFF)}, - {"LightBlue", RGB(0xAD, 0xD8, 0xE6)}, - {"DarkGreen", RGB(0x00, 0x80, 0x00)}, - {"Green", RGB(0x00, 0xFF, 0x00)}, - {"LightGreen", RGB(0x90, 0xEE, 0x90)}, - {"DarkCyan", RGB(0x00, 0x80, 0x80)}, - {"Cyan", RGB(0x00, 0xFF, 0xFF)}, - {"LightCyan", RGB(0xE0, 0xFF, 0xFF)}, - {"DarkMagenta", RGB(0x80, 0x00, 0x80)}, - {"Magenta", RGB(0xFF, 0x00, 0xFF)}, - {"LightMagenta", RGB(0xFF, 0xA0, 0xFF)}, - {"Brown", RGB(0x80, 0x40, 0x40)}, - {"Yellow", RGB(0xFF, 0xFF, 0x00)}, - {"LightYellow", RGB(0xFF, 0xFF, 0xE0)}, - {"DarkYellow", RGB(0xBB, 0xBB, 0x00)}, - {"SeaGreen", RGB(0x2E, 0x8B, 0x57)}, - {"Orange", RGB(0xFF, 0xA5, 0x00)}, - {"Purple", RGB(0xA0, 0x20, 0xF0)}, - {"SlateBlue", RGB(0x6A, 0x5A, 0xCD)}, - {"Violet", RGB(0xEE, 0x82, 0xEE)}, - }; typedef struct SysColorTable { --- 1562,1567 ---- *************** *** 1677,1703 **** {"SYS_WINDOWTEXT", COLOR_WINDOWTEXT} }; - int r, g, b; - int i; - - if (name[0] == '#' && STRLEN(name) == 7) - { - /* Name is in "#rrggbb" format */ - r = hex_digit(name[1]) * 16 + hex_digit(name[2]); - g = hex_digit(name[3]) * 16 + hex_digit(name[4]); - b = hex_digit(name[5]) * 16 + hex_digit(name[6]); - if (r < 0 || g < 0 || b < 0) - return INVALCOLOR; - return RGB(r, g, b); - } - else - { - /* Check if the name is one of the colors we know */ - for (i = 0; i < sizeof(table) / sizeof(table[0]); i++) - if (STRICMP(name, table[i].name) == 0) - return table[i].color; - } - /* * Try to look up a system colour. */ --- 1608,1613 ---- *************** *** 1705,1759 **** if (STRICMP(name, sys_table[i].name) == 0) return GetSysColor(sys_table[i].color); ! /* ! * Last attempt. Look in the file "$VIMRUNTIME/rgb.txt". ! */ ! { ! #define LINE_LEN 100 ! FILE *fd; ! char line[LINE_LEN]; ! char_u *fname; ! ! fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); ! if (fname == NULL) ! return INVALCOLOR; ! ! fd = mch_fopen((char *)fname, "rt"); ! vim_free(fname); ! if (fd == NULL) ! return INVALCOLOR; ! ! while (!feof(fd)) ! { ! int len; ! int pos; ! char *color; ! ! fgets(line, LINE_LEN, fd); ! len = (int)STRLEN(line); ! ! if (len <= 1 || line[len-1] != '\n') ! continue; ! ! line[len-1] = '\0'; ! ! i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); ! if (i != 3) ! continue; ! ! color = line + pos; ! ! if (STRICMP(color, name) == 0) ! { ! fclose(fd); ! return (guicolor_T) RGB(r, g, b); ! } ! } ! ! fclose(fd); ! } ! ! return INVALCOLOR; } /* * Return OK if the key with the termcap name "name" is supported. --- 1615,1621 ---- if (STRICMP(name, sys_table[i].name) == 0) return GetSysColor(sys_table[i].color); ! return gui_get_color_cmn(name); } /* * Return OK if the key with the termcap name "name" is supported. *** ../vim-7.4.1791/src/proto/term.pro 2016-04-21 21:08:11.793948968 +0200 --- src/proto/term.pro 2016-04-26 20:47:26.240802336 +0200 *************** *** 65,68 **** --- 65,69 ---- int show_one_termcode(char_u *name, char_u *code, int printit); char_u *translate_mapping(char_u *str, int expmap); void update_tcap(int attr); + guicolor_T gui_get_color_cmn(char_u *name); /* vim: set ft=c : */ *** ../vim-7.4.1791/src/term.c 2016-04-24 15:41:29.033170205 +0200 --- src/term.c 2016-04-26 20:55:42.827052476 +0200 *************** *** 1266,1410 **** }; /* end of builtin_termcaps */ #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) - # define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) - struct rgbcolor_table_S { - char_u *color_name; - guicolor_T color; - }; - - static struct rgbcolor_table_S rgb_table[] = { - {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, - {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)}, - {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)}, - {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)}, - {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)}, - {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)}, - {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)}, - {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)}, - {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)}, - {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)}, - {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)}, - {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */ - {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)}, - {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, - {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, - {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, - {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, - {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, - {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, - {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, - {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, - {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, - {(char_u *)"green", RGB(0x00, 0xFF, 0x00)}, - {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)}, - {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, - {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, - {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, - {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, - {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, - {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, - {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, - {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, - {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, - {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)}, - {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)}, - {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)}, - {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)}, - {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)}, - {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */ - {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */ - {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)}, - {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)}, - {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)}, - {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, - {(char_u *)"red", RGB(0xFF, 0x00, 0x00)}, - {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, - {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, - {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)}, - {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, - {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)}, - }; - - static int - hex_digit(int c) - { - if (isdigit(c)) - return c - '0'; - c = TOLOWER_ASC(c); - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - return 0x1ffffff; - } - guicolor_T termtrue_mch_get_color(char_u *name) { ! guicolor_T color; ! int i; ! ! if (*name == '#' && strlen((char *) name) == 7) ! { ! color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])), ! ((hex_digit(name[3])<<4) + hex_digit(name[4])), ! ((hex_digit(name[5])<<4) + hex_digit(name[6]))); ! if (color > 0xffffff) ! return INVALCOLOR; ! return color; ! } ! else ! { ! /* Check if the name is one of the colors we know */ ! for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++) ! if (STRICMP(name, rgb_table[i].color_name) == 0) ! return rgb_table[i].color; ! } ! ! /* ! * Last attempt. Look in the file "$VIM/rgb.txt". ! */ ! { ! #define LINE_LEN 100 ! FILE *fd; ! char line[LINE_LEN]; ! char_u *fname; ! int r, g, b; ! ! fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); ! if (fname == NULL) ! return INVALCOLOR; ! ! fd = fopen((char *)fname, "rt"); ! vim_free(fname); ! if (fd == NULL) ! return INVALCOLOR; ! ! while (!feof(fd)) ! { ! int len; ! int pos; ! ! (void)fgets(line, LINE_LEN, fd); ! len = strlen(line); ! ! if (len <= 1 || line[len-1] != '\n') ! continue; ! ! line[len-1] = '\0'; ! ! i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); ! if (i != 3) ! continue; ! ! if (STRICMP(line + pos, name) == 0) ! { ! fclose(fd); ! return (guicolor_T) RGB(r, g, b); ! } ! } ! fclose(fd); ! } ! ! return INVALCOLOR; } guicolor_T --- 1266,1275 ---- }; /* end of builtin_termcaps */ #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) guicolor_T termtrue_mch_get_color(char_u *name) { ! return gui_get_color_cmn(name); } guicolor_T *************** *** 6187,6189 **** --- 6052,6197 ---- } } #endif + + #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO) + static int + hex_digit(int c) + { + if (isdigit(c)) + return c - '0'; + c = TOLOWER_ASC(c); + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + return 0x1ffffff; + } + + guicolor_T + gui_get_color_cmn(char_u *name) + { + #define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) + #define LINE_LEN 100 + FILE *fd; + char line[LINE_LEN]; + char_u *fname; + int r, g, b, i; + guicolor_T color; + + struct rgbcolor_table_S { + char_u *color_name; + guicolor_T color; + }; + + static struct rgbcolor_table_S rgb_table[] = { + {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, + {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)}, + {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)}, + {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)}, + {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)}, + {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)}, + {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)}, + {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)}, + {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)}, + {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)}, + {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)}, + {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */ + {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)}, + {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, + {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, + {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, + {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, + {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, + {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, + {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, + {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, + {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, + {(char_u *)"green", RGB(0x00, 0xFF, 0x00)}, + {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)}, + {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, + {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, + {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, + {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, + {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, + {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, + {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, + {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, + {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, + {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)}, + {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)}, + {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)}, + {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)}, + {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)}, + {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */ + {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */ + {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)}, + {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)}, + {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)}, + {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, + {(char_u *)"red", RGB(0xFF, 0x00, 0x00)}, + {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, + {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, + {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)}, + {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, + {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)}, + }; + + + if (name[0] == '#' && STRLEN(name) == 7) + { + /* Name is in "#rrggbb" format */ + color = RGB(((hex_digit(name[1]) << 4) + hex_digit(name[2])), + ((hex_digit(name[3]) << 4) + hex_digit(name[4])), + ((hex_digit(name[5]) << 4) + hex_digit(name[6]))); + if (color > 0xffffff) + return INVALCOLOR; + return color; + } + + /* Check if the name is one of the colors we know */ + for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++) + if (STRICMP(name, rgb_table[i].color_name) == 0) + return rgb_table[i].color; + + /* + * Last attempt. Look in the file "$VIM/rgb.txt". + */ + + fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); + if (fname == NULL) + return INVALCOLOR; + + fd = fopen((char *)fname, "rt"); + vim_free(fname); + if (fd == NULL) + { + if (p_verbose > 1) + verb_msg((char_u *)_("Cannot open $VIMRUNTIME/rgb.txt")); + return INVALCOLOR; + } + + while (!feof(fd)) + { + int len; + int pos; + + (void)fgets(line, LINE_LEN, fd); + len = strlen(line); + + if (len <= 1 || line[len - 1] != '\n') + continue; + + line[len - 1] = '\0'; + + i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); + if (i != 3) + continue; + + if (STRICMP(line + pos, name) == 0) + { + fclose(fd); + return (guicolor_T) RGB(r, g, b); + } + } + fclose(fd); + return INVALCOLOR; + } + #endif *** ../vim-7.4.1791/src/version.c 2016-04-26 20:30:03.360916990 +0200 --- src/version.c 2016-04-26 20:49:04.491663839 +0200 *************** *** 755,756 **** --- 755,758 ---- { /* Add new patch number below this line */ + /**/ + 1792, /**/ -- TIM: But follow only if you are men of valour. For the entrance to this cave is guarded by a monster, a creature so foul and cruel that no man yet has fought with it and lived. Bones of full fifty men lie strewn about its lair ... "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///