I am on a roll...
>From the BUGS list we have

  X color names: X color names of the forms #RRRGGGBBB, RGB:RRR/GGG/BBB,
  RGBi:RRR/GGG/BBB, etc., are not parsed and converted to windows colors. 

I hope I didn't duplicate someone else fixing this...
Anyway, here is a patch which fixes this:

*** ChangeLog.orig	Thu May 08 20:39:05 1997
--- Changelog	Thu May 08 20:41:16 1997
***************
*** 1,3 ****
--- 1,8 ----
+ Thu May 08 20:35:58 1997  Michael Welsh Duggan  <md5i@schenley.com>
+ 
+ 	* w32fns.c (x_to_win32_color): Added support for X Windows RGB
+ 	string specifications.
+ 
  Wed May 07 23:52:59 1997  Michael Welsh Duggan  <md5i@schenley.com>
  
  	* w32menu.c (get_frame_menubar_event): Check for the possibility
*** w32fns.c.orig	Thu May 08 20:39:32 1997
--- w32fns.c	Thu May 08 20:41:16 1997
***************
*** 23,28 ****
--- 23,30 ----
  #include <signal.h>
  #include <config.h>
  #include <stdio.h>
+ #include <limits.h>
+ #include <errno.h>
  
  #include "lisp.h"
  #include "w32term.h"
***************
*** 1247,1252 ****
--- 1249,1411 ----
    register Lisp_Object tail, ret = Qnil;
    
    BLOCK_INPUT;
+ 
+   if (colorname[0] == '#')
+     {
+       /* Could be an old-style RGB Device specification.  */
+       char *color;
+       int size;
+       color = colorname + 1;
+       
+       size = strlen(color);
+       if (size == 3 || size == 6 || size == 9 || size == 12)
+ 	{
+ 	  UINT colorval;
+ 	  int i, pos;
+ 	  pos = 0;
+ 	  size /= 3;
+ 	  colorval = 0;
+ 	  
+ 	  for (i = 0; i < 3; i++)
+ 	    {
+ 	      char *end;
+ 	      char t;
+ 	      unsigned long value;
+ 
+ 	      /* The check for 'x' in the following conditional takes into
+ 		 account the fact that strtol allows a "0x" in front of
+ 		 our numbers, and we don't.  */
+ 	      if (!isxdigit(color[0]) || color[1] == 'x')
+ 		break;
+ 	      t = color[size];
+ 	      color[size] = '\0';
+ 	      value = strtoul(color, &end, 16);
+ 	      color[size] = t;
+ 	      if (errno == ERANGE || end - color != size)
+ 		break;
+ 	      switch (size)
+ 		{
+ 		case 1:
+ 		  value = value * 0x10;
+ 		  break;
+ 		case 2:
+ 		  break;
+ 		case 3:
+ 		  value /= 0x10;
+ 		  break;
+ 		case 4:
+ 		  value /= 0x100;
+ 		  break;
+ 		}
+ 	      colorval |= (value << pos);
+ 	      pos += 0x8;
+ 	      if (i == 2)
+ 		{
+ 		  UNBLOCK_INPUT;
+ 		  return (colorval);
+ 		}
+ 	      color = end;
+ 	    }
+ 	}
+     }
+   else if (strnicmp(colorname, "rgb:", 4) == 0)
+     {
+       char *color;
+       UINT colorval;
+       int i, pos;
+       pos = 0;
+ 
+       colorval = 0;
+       color = colorname + 4;
+       for (i = 0; i < 3; i++)
+ 	{
+ 	  char *end;
+ 	  unsigned long value;
+ 	  
+ 	  /* The check for 'x' in the following conditional takes into
+ 	     account the fact that strtol allows a "0x" in front of
+ 	     our numbers, and we don't.  */
+ 	  if (!isxdigit(color[0]) || color[1] == 'x')
+ 	    break;
+ 	  value = strtoul(color, &end, 16);
+ 	  if (errno == ERANGE)
+ 	    break;
+ 	  switch (end - color)
+ 	    {
+ 	    case 1:
+ 	      value = value * 0x10 + value;
+ 	      break;
+ 	    case 2:
+ 	      break;
+ 	    case 3:
+ 	      value /= 0x10;
+ 	      break;
+ 	    case 4:
+ 	      value /= 0x100;
+ 	      break;
+ 	    default:
+ 	      value = ULONG_MAX;
+ 	    }
+ 	  if (value == ULONG_MAX)
+ 	    break;
+ 	  colorval |= (value << pos);
+ 	  pos += 0x8;
+ 	  if (i == 2)
+ 	    {
+ 	      if (*end != '\0')
+ 		break;
+ 	      UNBLOCK_INPUT;
+ 	      return (colorval);
+ 	    }
+ 	  if (*end != '/')
+ 	    break;
+ 	  color = end + 1;
+ 	}
+     }
+   else if (strnicmp(colorname, "rgbi:", 5) == 0)
+     {
+       /* This is an RGB Intensity specification.  */
+       char *color;
+       UINT colorval;
+       int i, pos;
+       pos = 0;
+ 
+       colorval = 0;
+       color = colorname + 5;
+       for (i = 0; i < 3; i++)
+ 	{
+ 	  char *end;
+ 	  double value;
+ 	  UINT val;
+ 
+ 	  value = strtod(color, &end);
+ 	  if (errno == ERANGE)
+ 	    break;
+ 	  if (value < 0.0 || value > 1.0)
+ 	    break;
+ 	  val = (UINT)(0x100 * value);
+ 	  /* We used 0x100 instead of 0xFF to give an continuous
+              range between 0.0 and 1.0 inclusive.  The next statement
+              fixes the 1.0 case.  */
+ 	  if (val == 0x100)
+ 	    val = 0xFF;
+ 	  colorval |= (val << pos);
+ 	  pos += 0x8;
+ 	  if (i == 2)
+ 	    {
+ 	      if (*end != '\0')
+ 		break;
+ 	      UNBLOCK_INPUT;
+ 	      return (colorval);
+ 	    }
+ 	  if (*end != '/')
+ 	    break;
+ 	  color = end + 1;
+ 	}
+     }
+   /* I am not going to attempt to handle any of the CIE color schemes
+      or TekHVC, since I don't know the algorithms for conversion to
+      RGB.  */
    
    for (tail = Vwin32_color_map; !NILP (tail); tail = Fcdr (tail))
      {


-- 
Michael Duggan
(md5i@schenley.com)
