diff src/xfns.c @ 28355:11d7a6fdad5f

(x_set_cursor_color): Get color reference counts right.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 27 Mar 2000 14:48:33 +0000
parents ce7dddf6dfb7
children 2812a333e746
line wrap: on
line diff
--- a/src/xfns.c	Mon Mar 27 14:47:42 2000 +0000
+++ b/src/xfns.c	Mon Mar 27 14:48:33 2000 +0000
@@ -1520,26 +1520,49 @@
      Lisp_Object arg, oldval;
 {
   unsigned long fore_pixel, pixel;
-
-  if (!EQ (Vx_cursor_fore_pixel, Qnil))
-    fore_pixel = x_decode_color (f, Vx_cursor_fore_pixel,
-				 WHITE_PIX_DEFAULT (f));
+  int fore_pixel_allocated_p = 0, pixel_allocated_p = 0;
+
+  if (!NILP (Vx_cursor_fore_pixel))
+    {
+      fore_pixel = x_decode_color (f, Vx_cursor_fore_pixel,
+				   WHITE_PIX_DEFAULT (f));
+      fore_pixel_allocated_p = 1;
+    }
   else
     fore_pixel = f->output_data.x->background_pixel;
+  
   pixel = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
+  pixel_allocated_p = 1;
 
   /* Make sure that the cursor color differs from the background color.  */
   if (pixel == f->output_data.x->background_pixel)
     {
+      if (pixel_allocated_p)
+	{
+	  x_free_colors (f, &pixel, 1);
+	  pixel_allocated_p = 0;
+	}
+      
       pixel = f->output_data.x->mouse_pixel;
       if (pixel == fore_pixel)
-	fore_pixel = f->output_data.x->background_pixel;
+	{
+	  if (fore_pixel_allocated_p)
+	    {
+	      x_free_colors (f, &fore_pixel, 1);
+	      fore_pixel_allocated_p = 0;
+	    }
+	  fore_pixel = f->output_data.x->background_pixel;
+	}
     }
 
   unload_color (f, f->output_data.x->cursor_foreground_pixel);
+  if (!fore_pixel_allocated_p)
+    fore_pixel = x_copy_color (f, fore_pixel);
   f->output_data.x->cursor_foreground_pixel = fore_pixel;
 
   unload_color (f, f->output_data.x->cursor_pixel);
+  if (!pixel_allocated_p)
+    pixel = x_copy_color (f, pixel);
   f->output_data.x->cursor_pixel = pixel;
 
   if (FRAME_X_WINDOW (f) != 0)