Mercurial > vim
comparison src/term.c @ 9013:22c29a515b53 v7.4.1792
commit https://github.com/vim/vim/commit/ab3022196ea4f1496e79b8ee85996e31c45d02f1
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Apr 26 20:59:29 2016 +0200
patch 7.4.1792
Problem: Color name decoding is implemented several times.
Solution: Move it to term.c. (Christian Brabandt)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 26 Apr 2016 21:00:07 +0200 |
parents | 57b791947796 |
children | 2e3c6071db97 |
comparison
equal
deleted
inserted
replaced
9012:3390e71380fa | 9013:22c29a515b53 |
---|---|
1264 {(int)KS_NAME, NULL} | 1264 {(int)KS_NAME, NULL} |
1265 | 1265 |
1266 }; /* end of builtin_termcaps */ | 1266 }; /* end of builtin_termcaps */ |
1267 | 1267 |
1268 #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) | 1268 #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) |
1269 # define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) | |
1270 struct rgbcolor_table_S { | |
1271 char_u *color_name; | |
1272 guicolor_T color; | |
1273 }; | |
1274 | |
1275 static struct rgbcolor_table_S rgb_table[] = { | |
1276 {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, | |
1277 {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)}, | |
1278 {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)}, | |
1279 {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)}, | |
1280 {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)}, | |
1281 {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)}, | |
1282 {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)}, | |
1283 {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)}, | |
1284 {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)}, | |
1285 {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)}, | |
1286 {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)}, | |
1287 {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */ | |
1288 {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)}, | |
1289 {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, | |
1290 {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, | |
1291 {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, | |
1292 {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, | |
1293 {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, | |
1294 {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, | |
1295 {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, | |
1296 {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, | |
1297 {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, | |
1298 {(char_u *)"green", RGB(0x00, 0xFF, 0x00)}, | |
1299 {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)}, | |
1300 {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, | |
1301 {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, | |
1302 {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, | |
1303 {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, | |
1304 {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, | |
1305 {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, | |
1306 {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, | |
1307 {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, | |
1308 {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, | |
1309 {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)}, | |
1310 {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)}, | |
1311 {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)}, | |
1312 {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)}, | |
1313 {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)}, | |
1314 {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */ | |
1315 {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */ | |
1316 {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)}, | |
1317 {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)}, | |
1318 {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)}, | |
1319 {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, | |
1320 {(char_u *)"red", RGB(0xFF, 0x00, 0x00)}, | |
1321 {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, | |
1322 {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, | |
1323 {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)}, | |
1324 {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, | |
1325 {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)}, | |
1326 }; | |
1327 | |
1328 static int | |
1329 hex_digit(int c) | |
1330 { | |
1331 if (isdigit(c)) | |
1332 return c - '0'; | |
1333 c = TOLOWER_ASC(c); | |
1334 if (c >= 'a' && c <= 'f') | |
1335 return c - 'a' + 10; | |
1336 return 0x1ffffff; | |
1337 } | |
1338 | |
1339 guicolor_T | 1269 guicolor_T |
1340 termtrue_mch_get_color(char_u *name) | 1270 termtrue_mch_get_color(char_u *name) |
1341 { | 1271 { |
1342 guicolor_T color; | 1272 return gui_get_color_cmn(name); |
1343 int i; | |
1344 | |
1345 if (*name == '#' && strlen((char *) name) == 7) | |
1346 { | |
1347 color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])), | |
1348 ((hex_digit(name[3])<<4) + hex_digit(name[4])), | |
1349 ((hex_digit(name[5])<<4) + hex_digit(name[6]))); | |
1350 if (color > 0xffffff) | |
1351 return INVALCOLOR; | |
1352 return color; | |
1353 } | |
1354 else | |
1355 { | |
1356 /* Check if the name is one of the colors we know */ | |
1357 for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++) | |
1358 if (STRICMP(name, rgb_table[i].color_name) == 0) | |
1359 return rgb_table[i].color; | |
1360 } | |
1361 | |
1362 /* | |
1363 * Last attempt. Look in the file "$VIM/rgb.txt". | |
1364 */ | |
1365 { | |
1366 #define LINE_LEN 100 | |
1367 FILE *fd; | |
1368 char line[LINE_LEN]; | |
1369 char_u *fname; | |
1370 int r, g, b; | |
1371 | |
1372 fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); | |
1373 if (fname == NULL) | |
1374 return INVALCOLOR; | |
1375 | |
1376 fd = fopen((char *)fname, "rt"); | |
1377 vim_free(fname); | |
1378 if (fd == NULL) | |
1379 return INVALCOLOR; | |
1380 | |
1381 while (!feof(fd)) | |
1382 { | |
1383 int len; | |
1384 int pos; | |
1385 | |
1386 (void)fgets(line, LINE_LEN, fd); | |
1387 len = strlen(line); | |
1388 | |
1389 if (len <= 1 || line[len-1] != '\n') | |
1390 continue; | |
1391 | |
1392 line[len-1] = '\0'; | |
1393 | |
1394 i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); | |
1395 if (i != 3) | |
1396 continue; | |
1397 | |
1398 if (STRICMP(line + pos, name) == 0) | |
1399 { | |
1400 fclose(fd); | |
1401 return (guicolor_T) RGB(r, g, b); | |
1402 } | |
1403 } | |
1404 fclose(fd); | |
1405 } | |
1406 | |
1407 return INVALCOLOR; | |
1408 } | 1273 } |
1409 | 1274 |
1410 guicolor_T | 1275 guicolor_T |
1411 termtrue_get_color(char_u *name) | 1276 termtrue_get_color(char_u *name) |
1412 { | 1277 { |
6185 p->bt_string = &ksmd_str[0]; | 6050 p->bt_string = &ksmd_str[0]; |
6186 ++p; | 6051 ++p; |
6187 } | 6052 } |
6188 } | 6053 } |
6189 #endif | 6054 #endif |
6055 | |
6056 #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO) | |
6057 static int | |
6058 hex_digit(int c) | |
6059 { | |
6060 if (isdigit(c)) | |
6061 return c - '0'; | |
6062 c = TOLOWER_ASC(c); | |
6063 if (c >= 'a' && c <= 'f') | |
6064 return c - 'a' + 10; | |
6065 return 0x1ffffff; | |
6066 } | |
6067 | |
6068 guicolor_T | |
6069 gui_get_color_cmn(char_u *name) | |
6070 { | |
6071 #define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) | |
6072 #define LINE_LEN 100 | |
6073 FILE *fd; | |
6074 char line[LINE_LEN]; | |
6075 char_u *fname; | |
6076 int r, g, b, i; | |
6077 guicolor_T color; | |
6078 | |
6079 struct rgbcolor_table_S { | |
6080 char_u *color_name; | |
6081 guicolor_T color; | |
6082 }; | |
6083 | |
6084 static struct rgbcolor_table_S rgb_table[] = { | |
6085 {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, | |
6086 {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)}, | |
6087 {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)}, | |
6088 {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)}, | |
6089 {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)}, | |
6090 {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)}, | |
6091 {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)}, | |
6092 {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)}, | |
6093 {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)}, | |
6094 {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)}, | |
6095 {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)}, | |
6096 {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */ | |
6097 {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)}, | |
6098 {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, | |
6099 {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, | |
6100 {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, | |
6101 {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, | |
6102 {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, | |
6103 {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, | |
6104 {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, | |
6105 {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, | |
6106 {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, | |
6107 {(char_u *)"green", RGB(0x00, 0xFF, 0x00)}, | |
6108 {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)}, | |
6109 {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, | |
6110 {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, | |
6111 {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, | |
6112 {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, | |
6113 {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, | |
6114 {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, | |
6115 {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, | |
6116 {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, | |
6117 {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, | |
6118 {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)}, | |
6119 {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)}, | |
6120 {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)}, | |
6121 {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)}, | |
6122 {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)}, | |
6123 {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */ | |
6124 {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */ | |
6125 {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)}, | |
6126 {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)}, | |
6127 {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)}, | |
6128 {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, | |
6129 {(char_u *)"red", RGB(0xFF, 0x00, 0x00)}, | |
6130 {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, | |
6131 {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, | |
6132 {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)}, | |
6133 {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, | |
6134 {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)}, | |
6135 }; | |
6136 | |
6137 | |
6138 if (name[0] == '#' && STRLEN(name) == 7) | |
6139 { | |
6140 /* Name is in "#rrggbb" format */ | |
6141 color = RGB(((hex_digit(name[1]) << 4) + hex_digit(name[2])), | |
6142 ((hex_digit(name[3]) << 4) + hex_digit(name[4])), | |
6143 ((hex_digit(name[5]) << 4) + hex_digit(name[6]))); | |
6144 if (color > 0xffffff) | |
6145 return INVALCOLOR; | |
6146 return color; | |
6147 } | |
6148 | |
6149 /* Check if the name is one of the colors we know */ | |
6150 for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++) | |
6151 if (STRICMP(name, rgb_table[i].color_name) == 0) | |
6152 return rgb_table[i].color; | |
6153 | |
6154 /* | |
6155 * Last attempt. Look in the file "$VIM/rgb.txt". | |
6156 */ | |
6157 | |
6158 fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); | |
6159 if (fname == NULL) | |
6160 return INVALCOLOR; | |
6161 | |
6162 fd = fopen((char *)fname, "rt"); | |
6163 vim_free(fname); | |
6164 if (fd == NULL) | |
6165 { | |
6166 if (p_verbose > 1) | |
6167 verb_msg((char_u *)_("Cannot open $VIMRUNTIME/rgb.txt")); | |
6168 return INVALCOLOR; | |
6169 } | |
6170 | |
6171 while (!feof(fd)) | |
6172 { | |
6173 int len; | |
6174 int pos; | |
6175 | |
6176 (void)fgets(line, LINE_LEN, fd); | |
6177 len = strlen(line); | |
6178 | |
6179 if (len <= 1 || line[len - 1] != '\n') | |
6180 continue; | |
6181 | |
6182 line[len - 1] = '\0'; | |
6183 | |
6184 i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); | |
6185 if (i != 3) | |
6186 continue; | |
6187 | |
6188 if (STRICMP(line + pos, name) == 0) | |
6189 { | |
6190 fclose(fd); | |
6191 return (guicolor_T) RGB(r, g, b); | |
6192 } | |
6193 } | |
6194 fclose(fd); | |
6195 return INVALCOLOR; | |
6196 } | |
6197 #endif |