From xemacs-m  Sat Apr 12 01:17:07 1997
Received: from crystal.WonderWorks.COM (crystal.WonderWorks.com [192.203.206.1])
	by xemacs.org (8.8.5/8.8.5) with ESMTP id BAA15435
	for <xemacs-beta@xemacs.org>; Sat, 12 Apr 1997 01:17:03 -0500 (CDT)
Received: by crystal.WonderWorks.COM 
	id QQckxl05628; Sat, 12 Apr 1997 02:17:01 -0400 (EDT)
Date: Sat, 12 Apr 1997 02:17:01 -0400 (EDT)
Message-Id: <QQckxl05628.199704120617@crystal.WonderWorks.COM>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
From: Kyle Jones <kyle_jones@wonderworks.com>
To: xemacs-beta@xemacs.org
Subject: [PATCH] for 20.1-b14 still crashes at startup on background pixmap
In-Reply-To: <25019.860769657@kocrsw12>
References: <25019.860769657@kocrsw12>
X-Mailer: VM 6.25 under 19.15 XEmacs Lucid
X-Face: /cA45WHG7jWq>(O3&Z57Y<"WsX5ddc,4c#w0F*zrV#=M
        0@~@,s;b,aMtR5Sqs"+nU.z^CSFQ9t`z2>W,S,]:[+2^
        Nbf6v4g>!&,7R4Ot4Wg{&tm=WX7P["9%a)_da48-^tGy
        ,qz]Z,Zz\{E.,]'EO+F)@$KtF&V

Mike Scheidler writes:
 > I reported this yesterday on b12, and it's still present in
 > b14.  This time, however, I can provide better info.  Note
 > that I *can* do set-face-background-pixmap manually after
 > startup without a problem--it only crashes when I specify an
 > attributeBackgroundPixmap resource in my app-defaults file.

After staring at this code for a while I'm beginning to understand
it.  I have a fix for the crash.  And I think it actually get the
correct domain down into extract_xpm_color_names this time.  As an
added benfit passing the domain argument down into the depths of the
image instantiation code might be helpful for doing GIF transparency
later.

Using changelog mode was one (blessedly short but) painful screw.
I'm not even going to bother faking the orgasm.

Sat Apr 12 01:59:14 1997  Kyle Jones  <kyle_jones@WonderWorks.COM>

	* glyphs-x.c, glyphs.c, glyphs.h: Added domain parameter to all
 	  image *_instantiate functions so that the domsin is available to
 	  specifier lookups in the various instantiator functions.  Passed
	  domain argument to extract_xpm_color_names for the
	  Fspecifier_instance call.

===================================================================
RCS file: src/glyphs.c,v
retrieving revision 1.1
diff -u -r1.1 src/glyphs.c
--- 1.1	1997/04/12 02:18:21
+++ src/glyphs.c	1997/04/12 04:38:04
@@ -482,7 +482,8 @@
 }
 
 static Lisp_Object
-instantiate_image_instantiator (Lisp_Object device, Lisp_Object instantiator,
+instantiate_image_instantiator (Lisp_Object device, Lisp_Object domain,
+				Lisp_Object instantiator,
 				Lisp_Object pointer_fg, Lisp_Object pointer_bg,
 				int dest_mask)
 {
@@ -502,7 +503,7 @@
 	("Don't know how to instantiate this image instantiator?",
 	 instantiator);
     IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
-					pointer_bg, dest_mask));
+					pointer_bg, dest_mask, domain));
   }
   UNGCPRO;
 
@@ -985,7 +986,8 @@
   if (VECTORP (data)
 	   && EQ (vector_data (XVECTOR (data))[0], Qinherit))
     signal_simple_error ("inheritance not allowed here", data);
-  ii = instantiate_image_instantiator (device, data, Qnil, Qnil, dest_mask);
+  ii = instantiate_image_instantiator (device, device, data,
+				       Qnil, Qnil, dest_mask);
   RETURN_UNGCPRO (ii);
 }
 
@@ -1330,7 +1332,7 @@
 static void
 nothing_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		     int dest_mask)
+		     int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
 
@@ -1372,7 +1374,7 @@
 static void
 inherit_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		     Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		     int dest_mask)
+		     int dest_mask, Lisp_Object domain)
 {
   /* handled specially in image_instantiate */
   abort ();
@@ -1399,7 +1401,7 @@
 void
 string_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		    int dest_mask)
+		    int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
@@ -1435,7 +1437,7 @@
 formatted_string_instantiate (Lisp_Object image_instance,
 			      Lisp_Object instantiator,
 			      Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			      int dest_mask)
+			      int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
@@ -1599,6 +1601,7 @@
 	  record_unwind_protect (image_instantiate_cache_result,
 				 locative);
 	  instance = instantiate_image_instantiator (device,
+						     domain,
 						     instantiator,
 						     pointer_fg, pointer_bg,
 						     dest_mask);
===================================================================
RCS file: src/glyphs.h,v
retrieving revision 1.1
diff -u -r1.1 src/glyphs.h
--- 1.1	1997/04/12 04:35:13
+++ src/glyphs.h	1997/04/12 04:46:14
@@ -95,7 +95,8 @@
 			      Lisp_Object instantiator,
 			      Lisp_Object pointer_fg,
 			      Lisp_Object pointer_bg,
-			      int dest_mask);
+			      int dest_mask,
+			      Lisp_Object domain);
 };
 
 struct ii_keyword_entry
@@ -496,7 +497,7 @@
 Lisp_Object alist_to_tagged_vector (Lisp_Object tag, Lisp_Object alist);
 void string_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 			 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			 int dest_mask);
+			 int dest_mask, Lisp_Object domain);
 Lisp_Object allocate_glyph (enum glyph_type type,
 			    void (*after_change) (Lisp_Object glyph,
 						  Lisp_Object property,
===================================================================
RCS file: src/glyphs-x.c,v
retrieving revision 1.1
diff -u -r1.1 src/glyphs-x.c
--- 1.1	1997/04/12 02:30:13
+++ src/glyphs-x.c	1997/04/12 05:14:55
@@ -110,7 +110,8 @@
 				     Lisp_Object instantiator,
 				     Lisp_Object pointer_fg,
 				     Lisp_Object pointer_bg,
-				     int dest_mask);
+				     int dest_mask,
+				     Lisp_Object domain);
 
 #include "bitmaps.h"
 
@@ -1034,7 +1035,7 @@
 static void
 xbm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   CONST char *gcc_go_home;
@@ -1270,7 +1271,7 @@
 static void
 jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		  Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		  int dest_mask)
+		  int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -1747,7 +1748,7 @@
 static void
 gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -2032,7 +2033,7 @@
 static void
 png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
@@ -2326,7 +2327,7 @@
 static void
 tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		  Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		  int dest_mask)
+		  int dest_mask, Lisp_Object domain)
 {
   abort ();
 }
@@ -2556,6 +2557,7 @@
 
 static XpmColorSymbol *
 extract_xpm_color_names (XpmAttributes *xpmattrs, Lisp_Object device,
+			 Lisp_Object domain,
 			 Lisp_Object color_symbol_alist)
 {
   /* This function can GC */
@@ -2588,10 +2590,8 @@
 	    (value, device, encode_error_behavior_flag (ERROR_ME_NOT));
       else
         {
-	  Lisp_Object frame = DEVICE_SELECTED_FRAME(XDEVICE(device));
-	  Lisp_Object window = FRAME_SELECTED_WINDOW(XFRAME(frame));
           assert (COLOR_SPECIFIERP (value));
-          value = Fspecifier_instance (value, window, Qnil, Qnil);
+          value = Fspecifier_instance (value, domain, Qnil, Qnil);
         }
       if (NILP (value))
         continue;
@@ -2640,7 +2640,7 @@
 static void
 xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		 int dest_mask)
+		 int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
   struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
@@ -2701,7 +2701,7 @@
       xpmattrs.valuemask |= XpmCloseness;
     }
   
-  color_symbols = extract_xpm_color_names (&xpmattrs, device,
+  color_symbols = extract_xpm_color_names (&xpmattrs, device, domain,
 					   color_symbol_alist);
 
   result = XpmCreatePixmapFromBuffer (dpy,
@@ -3052,7 +3052,7 @@
 static void
 xface_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		   int dest_mask)
+		   int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   int i, stattis;
@@ -3220,7 +3220,7 @@
 				  Lisp_Object instantiator,
 				  Lisp_Object pointer_fg,
 				  Lisp_Object pointer_bg,
-				  int dest_mask)
+				  int dest_mask, Lisp_Object domain)
 {
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
   struct gcpro gcpro1, gcpro2, gcpro3;
@@ -3248,10 +3248,10 @@
 
   if (is_cursor_font)
     cursor_font_instantiate (image_instance, result, pointer_fg,
-			     pointer_bg, dest_mask);
+			     pointer_bg, dest_mask, domain);
   else
     string_instantiate (image_instance, result, pointer_fg,
-			pointer_bg, dest_mask);
+			pointer_bg, dest_mask, domain);
 
   UNGCPRO;
 }
@@ -3317,7 +3317,7 @@
 static void
 font_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 		  Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-		  int dest_mask)
+		  int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
@@ -3415,7 +3415,7 @@
 static void
 cursor_font_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 			 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
-			 int dest_mask)
+			 int dest_mask, Lisp_Object domain)
 {
   /* This function can GC */
   Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);

