Patch 7.4.2094
Problem: The color allocation in X11 is overly complicated.
Solution: Remove find_closest_color(), XAllocColor() already does this.
(Kazunobu Kuriyama)
Files: src/gui_x11.c
*** ../vim-7.4.2093/src/gui_x11.c 2016-07-07 16:42:57.318788362 +0200
--- src/gui_x11.c 2016-07-23 14:06:47.970608223 +0200
***************
*** 71,86 ****
# define DFLT_MENU_FG_COLOR "black"
# define DFLT_SCROLL_BG_COLOR "gray60"
# define DFLT_SCROLL_FG_COLOR "gray77"
! # define DFLT_TOOLTIP_BG_COLOR "#ffffffff9191"
! # define DFLT_TOOLTIP_FG_COLOR "#000000000000"
#else
/* use the default (CDE) colors */
# define DFLT_MENU_BG_COLOR ""
# define DFLT_MENU_FG_COLOR ""
# define DFLT_SCROLL_BG_COLOR ""
# define DFLT_SCROLL_FG_COLOR ""
! # define DFLT_TOOLTIP_BG_COLOR "#ffffffff9191"
! # define DFLT_TOOLTIP_FG_COLOR "#000000000000"
#endif
Widget vimShell = (Widget)0;
--- 71,86 ----
# define DFLT_MENU_FG_COLOR "black"
# define DFLT_SCROLL_BG_COLOR "gray60"
# define DFLT_SCROLL_FG_COLOR "gray77"
! # define DFLT_TOOLTIP_BG_COLOR "#ffff91"
! # define DFLT_TOOLTIP_FG_COLOR "#000000"
#else
/* use the default (CDE) colors */
# define DFLT_MENU_BG_COLOR ""
# define DFLT_MENU_FG_COLOR ""
# define DFLT_SCROLL_BG_COLOR ""
# define DFLT_SCROLL_FG_COLOR ""
! # define DFLT_TOOLTIP_BG_COLOR "#ffff91"
! # define DFLT_TOOLTIP_FG_COLOR "#000000"
#endif
Widget vimShell = (Widget)0;
***************
*** 136,142 ****
static XButtonPressedEvent last_mouse_event;
#endif
- static int find_closest_color(Colormap colormap, XColor *colorPtr);
static void gui_x11_timer_cb(XtPointer timed_out, XtIntervalId *interval_id);
static void gui_x11_visibility_cb(Widget w, XtPointer dud, XEvent *event,
Boolean *dum);
static void gui_x11_expose_cb(Widget w, XtPointer dud, XEvent *event, Boolean
*dum);
--- 136,141 ----
***************
*** 2242,2415 ****
* Return INVALCOLOR for error.
*/
guicolor_T
! gui_mch_get_color(char_u *reqname)
{
! int i;
! char_u *name = reqname;
Colormap colormap;
! XColor color;
! static char *(vimnames[][2]) =
! {
! /* A number of colors that some X11 systems don't have */
! {"LightRed", "#FFBBBB"},
! {"LightGreen", "#88FF88"},
! {"LightMagenta","#FFBBFF"},
! {"DarkCyan", "#008888"},
! {"DarkBlue", "#0000BB"},
! {"DarkRed", "#BB0000"},
! {"DarkMagenta", "#BB00BB"},
! {"DarkGrey", "#BBBBBB"},
! {"DarkYellow", "#BBBB00"},
! {"Gray10", "#1A1A1A"},
! {"Grey10", "#1A1A1A"},
! {"Gray20", "#333333"},
! {"Grey20", "#333333"},
! {"Gray30", "#4D4D4D"},
! {"Grey30", "#4D4D4D"},
! {"Gray40", "#666666"},
! {"Grey40", "#666666"},
! {"Gray50", "#7F7F7F"},
! {"Grey50", "#7F7F7F"},
! {"Gray60", "#999999"},
! {"Grey60", "#999999"},
! {"Gray70", "#B3B3B3"},
! {"Grey70", "#B3B3B3"},
! {"Gray80", "#CCCCCC"},
! {"Grey80", "#CCCCCC"},
! {"Gray90", "#E5E5E5"},
! {"Grey90", "#E5E5E5"},
! {NULL, NULL}
! };
/* can't do this when GUI not running */
! if (!gui.in_use || *reqname == NUL)
return INVALCOLOR;
! colormap = DefaultColormap(gui.dpy, XDefaultScreen(gui.dpy));
!
! /* Do this twice if the name isn't recognized. */
! while (name != NULL)
! {
! i = XParseColor(gui.dpy, colormap, (char *)name, &color);
!
! #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
! if (i == 0)
! {
! char *old;
!
! /* The X11 system is trying to resolve named colors only by names
! * corresponding to the current locale language. But Vim scripts
! * usually contain the English color names. Therefore we have to
! * try a second time here with the native "C" locale set.
! * Hopefully, restoring the old locale this way works on all
! * systems...
! */
! old = setlocale(LC_ALL, NULL);
! if (old != NULL && STRCMP(old, "C") != 0)
! {
! old = (char *)vim_strsave((char_u *)old);
! setlocale(LC_ALL, "C");
! i = XParseColor(gui.dpy, colormap, (char *)name, &color);
! setlocale(LC_ALL, old);
! vim_free(old);
! }
! }
! #endif
! if (i != 0 && (XAllocColor(gui.dpy, colormap, &color) != 0
! || find_closest_color(colormap, &color) == OK))
! return (guicolor_T)color.pixel;
! /* check for a few builtin names */
! for (i = 0; ; ++i)
! {
! if (vimnames[i][0] == NULL)
! {
! name = NULL;
! break;
! }
! if (STRICMP(name, vimnames[i][0]) == 0)
! {
! name = (char_u *)vimnames[i][1];
! break;
! }
! }
! }
return INVALCOLOR;
}
/*
- * Find closest color for "colorPtr" in "colormap". set "colorPtr" to the
- * resulting color.
- * Based on a similar function in TCL.
- * Return FAIL if not able to find or allocate a color.
- */
- static int
- find_closest_color(Colormap colormap, XColor *colorPtr)
- {
- double tmp, distance, closestDistance;
- int i, closest, numFound, cmap_size;
- XColor *colortable;
- XVisualInfo template, *visInfoPtr;
-
- template.visualid = XVisualIDFromVisual(DefaultVisual(gui.dpy,
- XDefaultScreen(gui.dpy)));
- visInfoPtr = XGetVisualInfo(gui.dpy, (long)VisualIDMask,
- &template, &numFound);
- if (numFound < 1)
- /* FindClosestColor couldn't lookup visual */
- return FAIL;
-
- cmap_size = visInfoPtr->colormap_size;
- XFree((char *)visInfoPtr);
- colortable = (XColor *)alloc((unsigned)(cmap_size * sizeof(XColor)));
- if (!colortable)
- return FAIL; /* out of memory */
-
- for (i = 0; i < cmap_size; i++)
- colortable[i].pixel = (unsigned long)i;
- XQueryColors(gui.dpy, colormap, colortable, cmap_size);
-
- /*
- * Find the color that best approximates the desired one, then
- * try to allocate that color. If that fails, it must mean that
- * the color was read-write (so we can't use it, since it's owner
- * might change it) or else it was already freed. Try again,
- * over and over again, until something succeeds.
- */
- closestDistance = 1e30;
- closest = 0;
- for (i = 0; i < cmap_size; i++)
- {
- /*
- * Use Euclidean distance in RGB space, weighted by Y (of YIQ)
- * as the objective function; this accounts for differences
- * in the color sensitivity of the eye.
- */
- tmp = .30 * (((int)colorPtr->red) - (int)colortable[i].red);
- distance = tmp * tmp;
- tmp = .61 * (((int)colorPtr->green) - (int)colortable[i].green);
- distance += tmp * tmp;
- tmp = .11 * (((int)colorPtr->blue) - (int)colortable[i].blue);
- distance += tmp * tmp;
- if (distance < closestDistance)
- {
- closest = i;
- closestDistance = distance;
- }
- }
-
- if (XAllocColor(gui.dpy, colormap, &colortable[closest]) != 0)
- {
- gui.color_approx = TRUE;
- *colorPtr = colortable[closest];
- }
-
- vim_free(colortable);
- return OK;
- }
-
- /*
* Set the current text foreground color.
*/
void
--- 2241,2276 ----
* Return INVALCOLOR for error.
*/
guicolor_T
! gui_mch_get_color(char_u *name)
{
! guicolor_T requested;
! XColor available;
Colormap colormap;
! #define COLORSPECBUFSIZE 8 /* space enough to hold "#RRGGBB" */
! char spec[COLORSPECBUFSIZE];
/* can't do this when GUI not running */
! if (!gui.in_use || name == NULL || *name == NUL)
return INVALCOLOR;
! requested = gui_get_color_cmn(name);
! if (requested == INVALCOLOR)
! return INVALCOLOR;
! vim_snprintf(spec, COLORSPECBUFSIZE, "#%.2x%.2x%.2x",
! (requested & 0xff0000) >> 16,
! (requested & 0xff00) >> 8,
! requested & 0xff);
! #undef COLORSPECBUFSIZE
! colormap = DefaultColormap(gui.dpy, DefaultScreen(gui.dpy));
! if (XParseColor(gui.dpy, colormap, (char *)spec, &available) != 0
! && XAllocColor(gui.dpy, colormap, &available) != 0)
! return (guicolor_T)available.pixel;
return INVALCOLOR;
}
/*
* Set the current text foreground color.
*/
void
*** ../vim-7.4.2093/src/version.c 2016-07-23 14:01:11.393652479 +0200
--- src/version.c 2016-07-23 14:34:46.443242019 +0200
***************
*** 760,761 ****
--- 760,763 ----
{ /* Add new patch number below this line */
+ /**/
+ 2094,
/**/
--
Mental Floss prevents moral decay!
/// Bram Moolenaar -- [email protected] -- 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 ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.