changeset 27984:574e0b398168

(x_free_colors): Access colormap of frame using FRAME_X_COLORMAP. Be paranoid about freeing black and white when default colormap is used.
author Gerd Moellmann <gerd@gnu.org>
date Sat, 04 Mar 2000 15:58:49 +0000
parents 9094f9408d8d
children 4ba445af210b
files src/xfaces.c
diffstat 1 files changed, 24 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Sat Mar 04 14:56:00 2000 +0000
+++ b/src/xfaces.c	Sat Mar 04 15:58:49 2000 +0000
@@ -548,20 +548,30 @@
   if (class != StaticColor && class != StaticGray && class != TrueColor)
     {
       Display *dpy = FRAME_X_DISPLAY (f);
-      Colormap cmap = DefaultColormapOfScreen (FRAME_X_SCREEN (f));
-      int screen_no = XScreenNumberOfScreen (FRAME_X_SCREEN (f));
-      unsigned long black = BlackPixel (dpy, screen_no);
-      unsigned long white = WhitePixel (dpy, screen_no);
-      unsigned long *px;
-      int i, j;
-
-      px = (unsigned long *) alloca (npixels * sizeof *px);
-      for (i = j = 0; i < npixels; ++i)
-	if (pixels[i] != black && pixels[i] != white)
-	  px[j++] = pixels[i];
-
-      if (j)
-	XFreeColors (dpy, cmap, px, j, 0);
+      Colormap cmap = FRAME_X_COLORMAP (f);
+      Screen *screen = FRAME_X_SCREEN (f);
+      int default_cmap_p = cmap == DefaultColormapOfScreen (screen);
+
+      if (default_cmap_p)
+	{
+	  /* Be paranoid.  If using the default color map, don't ever
+	     try to free the default black and white colors.  */
+	  int screen_no = XScreenNumberOfScreen (screen);
+	  unsigned long black = BlackPixel (dpy, screen_no);
+	  unsigned long white = WhitePixel (dpy, screen_no);
+	  unsigned long *px;
+	  int i, j;
+	  
+	  px = (unsigned long *) alloca (npixels * sizeof *px);
+	  for (i = j = 0; i < npixels; ++i)
+	    if (pixels[i] != black && pixels[i] != white)
+	      px[j++] = pixels[i];
+
+	  if (j)
+	    XFreeColors (dpy, cmap, px, j, 0);
+	}
+      else
+	XFreeColors (dpy, cmap, pixels, npixels, 0);
     }
 }