comparison src/xfaces.c @ 83401:03335deca80b

Merged from miles@gnu.org--gnu-2005 (patch 655) Patches applied: * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-655 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-441
author Karoly Lorentey <lorentey@elte.hu>
date Fri, 18 Nov 2005 14:53:14 +0000
parents 08b4dd6a6e87 79256abc393d
children 69e184bbba16
comparison
equal deleted inserted replaced
83400:03934708f1e9 83401:03335deca80b
275 275
276 /* Non-zero if face attribute ATTR is unspecified. */ 276 /* Non-zero if face attribute ATTR is unspecified. */
277 277
278 #define UNSPECIFIEDP(ATTR) EQ ((ATTR), Qunspecified) 278 #define UNSPECIFIEDP(ATTR) EQ ((ATTR), Qunspecified)
279 279
280 /* Non-zero if face attribute ATTR is `ignore-defface'. */
281
282 #define IGNORE_DEFFACE_P(ATTR) EQ ((ATTR), Qignore_defface)
283
280 /* Value is the number of elements of VECTOR. */ 284 /* Value is the number of elements of VECTOR. */
281 285
282 #define DIM(VECTOR) (sizeof (VECTOR) / sizeof *(VECTOR)) 286 #define DIM(VECTOR) (sizeof (VECTOR) / sizeof *(VECTOR))
283 287
284 /* Make a copy of string S on the stack using alloca. Value is a pointer 288 /* Make a copy of string S on the stack using alloca. Value is a pointer
313 Lisp_Object Qsemi_condensed, Qsemi_expanded, Qexpanded, Qextra_expanded; 317 Lisp_Object Qsemi_condensed, Qsemi_expanded, Qexpanded, Qextra_expanded;
314 Lisp_Object Qultra_expanded; 318 Lisp_Object Qultra_expanded;
315 Lisp_Object Qreleased_button, Qpressed_button; 319 Lisp_Object Qreleased_button, Qpressed_button;
316 Lisp_Object QCstyle, QCcolor, QCline_width; 320 Lisp_Object QCstyle, QCcolor, QCline_width;
317 Lisp_Object Qunspecified; 321 Lisp_Object Qunspecified;
322 Lisp_Object Qignore_defface;
318 323
319 char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg"; 324 char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg";
320 325
321 /* The name of the function to call when the background of the frame 326 /* The name of the function to call when the background of the frame
322 has changed, frame_set_background_mode. */ 327 has changed, frame_set_background_mode. */
3105 static void 3110 static void
3106 check_lface_attrs (attrs) 3111 check_lface_attrs (attrs)
3107 Lisp_Object *attrs; 3112 Lisp_Object *attrs;
3108 { 3113 {
3109 xassert (UNSPECIFIEDP (attrs[LFACE_FAMILY_INDEX]) 3114 xassert (UNSPECIFIEDP (attrs[LFACE_FAMILY_INDEX])
3115 || IGNORE_DEFFACE_P (attrs[LFACE_FAMILY_INDEX])
3110 || STRINGP (attrs[LFACE_FAMILY_INDEX])); 3116 || STRINGP (attrs[LFACE_FAMILY_INDEX]));
3111 xassert (UNSPECIFIEDP (attrs[LFACE_SWIDTH_INDEX]) 3117 xassert (UNSPECIFIEDP (attrs[LFACE_SWIDTH_INDEX])
3118 || IGNORE_DEFFACE_P (attrs[LFACE_SWIDTH_INDEX])
3112 || SYMBOLP (attrs[LFACE_SWIDTH_INDEX])); 3119 || SYMBOLP (attrs[LFACE_SWIDTH_INDEX]));
3113 xassert (UNSPECIFIEDP (attrs[LFACE_AVGWIDTH_INDEX]) 3120 xassert (UNSPECIFIEDP (attrs[LFACE_AVGWIDTH_INDEX])
3121 || IGNORE_DEFFACE_P (attrs[LFACE_AVGWIDTH_INDEX])
3114 || INTEGERP (attrs[LFACE_AVGWIDTH_INDEX])); 3122 || INTEGERP (attrs[LFACE_AVGWIDTH_INDEX]));
3115 xassert (UNSPECIFIEDP (attrs[LFACE_HEIGHT_INDEX]) 3123 xassert (UNSPECIFIEDP (attrs[LFACE_HEIGHT_INDEX])
3124 || IGNORE_DEFFACE_P (attrs[LFACE_HEIGHT_INDEX])
3116 || INTEGERP (attrs[LFACE_HEIGHT_INDEX]) 3125 || INTEGERP (attrs[LFACE_HEIGHT_INDEX])
3117 || FLOATP (attrs[LFACE_HEIGHT_INDEX]) 3126 || FLOATP (attrs[LFACE_HEIGHT_INDEX])
3118 || FUNCTIONP (attrs[LFACE_HEIGHT_INDEX])); 3127 || FUNCTIONP (attrs[LFACE_HEIGHT_INDEX]));
3119 xassert (UNSPECIFIEDP (attrs[LFACE_WEIGHT_INDEX]) 3128 xassert (UNSPECIFIEDP (attrs[LFACE_WEIGHT_INDEX])
3129 || IGNORE_DEFFACE_P (attrs[LFACE_WEIGHT_INDEX])
3120 || SYMBOLP (attrs[LFACE_WEIGHT_INDEX])); 3130 || SYMBOLP (attrs[LFACE_WEIGHT_INDEX]));
3121 xassert (UNSPECIFIEDP (attrs[LFACE_SLANT_INDEX]) 3131 xassert (UNSPECIFIEDP (attrs[LFACE_SLANT_INDEX])
3132 || IGNORE_DEFFACE_P (attrs[LFACE_SLANT_INDEX])
3122 || SYMBOLP (attrs[LFACE_SLANT_INDEX])); 3133 || SYMBOLP (attrs[LFACE_SLANT_INDEX]));
3123 xassert (UNSPECIFIEDP (attrs[LFACE_UNDERLINE_INDEX]) 3134 xassert (UNSPECIFIEDP (attrs[LFACE_UNDERLINE_INDEX])
3135 || IGNORE_DEFFACE_P (attrs[LFACE_UNDERLINE_INDEX])
3124 || SYMBOLP (attrs[LFACE_UNDERLINE_INDEX]) 3136 || SYMBOLP (attrs[LFACE_UNDERLINE_INDEX])
3125 || STRINGP (attrs[LFACE_UNDERLINE_INDEX])); 3137 || STRINGP (attrs[LFACE_UNDERLINE_INDEX]));
3126 xassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) 3138 xassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX])
3139 || IGNORE_DEFFACE_P (attrs[LFACE_OVERLINE_INDEX])
3127 || SYMBOLP (attrs[LFACE_OVERLINE_INDEX]) 3140 || SYMBOLP (attrs[LFACE_OVERLINE_INDEX])
3128 || STRINGP (attrs[LFACE_OVERLINE_INDEX])); 3141 || STRINGP (attrs[LFACE_OVERLINE_INDEX]));
3129 xassert (UNSPECIFIEDP (attrs[LFACE_STRIKE_THROUGH_INDEX]) 3142 xassert (UNSPECIFIEDP (attrs[LFACE_STRIKE_THROUGH_INDEX])
3143 || IGNORE_DEFFACE_P (attrs[LFACE_STRIKE_THROUGH_INDEX])
3130 || SYMBOLP (attrs[LFACE_STRIKE_THROUGH_INDEX]) 3144 || SYMBOLP (attrs[LFACE_STRIKE_THROUGH_INDEX])
3131 || STRINGP (attrs[LFACE_STRIKE_THROUGH_INDEX])); 3145 || STRINGP (attrs[LFACE_STRIKE_THROUGH_INDEX]));
3132 xassert (UNSPECIFIEDP (attrs[LFACE_BOX_INDEX]) 3146 xassert (UNSPECIFIEDP (attrs[LFACE_BOX_INDEX])
3147 || IGNORE_DEFFACE_P (attrs[LFACE_BOX_INDEX])
3133 || SYMBOLP (attrs[LFACE_BOX_INDEX]) 3148 || SYMBOLP (attrs[LFACE_BOX_INDEX])
3134 || STRINGP (attrs[LFACE_BOX_INDEX]) 3149 || STRINGP (attrs[LFACE_BOX_INDEX])
3135 || INTEGERP (attrs[LFACE_BOX_INDEX]) 3150 || INTEGERP (attrs[LFACE_BOX_INDEX])
3136 || CONSP (attrs[LFACE_BOX_INDEX])); 3151 || CONSP (attrs[LFACE_BOX_INDEX]));
3137 xassert (UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) 3152 xassert (UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX])
3153 || IGNORE_DEFFACE_P (attrs[LFACE_INVERSE_INDEX])
3138 || SYMBOLP (attrs[LFACE_INVERSE_INDEX])); 3154 || SYMBOLP (attrs[LFACE_INVERSE_INDEX]));
3139 xassert (UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) 3155 xassert (UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX])
3156 || IGNORE_DEFFACE_P (attrs[LFACE_FOREGROUND_INDEX])
3140 || STRINGP (attrs[LFACE_FOREGROUND_INDEX])); 3157 || STRINGP (attrs[LFACE_FOREGROUND_INDEX]));
3141 xassert (UNSPECIFIEDP (attrs[LFACE_BACKGROUND_INDEX]) 3158 xassert (UNSPECIFIEDP (attrs[LFACE_BACKGROUND_INDEX])
3159 || IGNORE_DEFFACE_P (attrs[LFACE_BACKGROUND_INDEX])
3142 || STRINGP (attrs[LFACE_BACKGROUND_INDEX])); 3160 || STRINGP (attrs[LFACE_BACKGROUND_INDEX]));
3143 xassert (UNSPECIFIEDP (attrs[LFACE_INHERIT_INDEX]) 3161 xassert (UNSPECIFIEDP (attrs[LFACE_INHERIT_INDEX])
3162 || IGNORE_DEFFACE_P (attrs[LFACE_INHERIT_INDEX])
3144 || NILP (attrs[LFACE_INHERIT_INDEX]) 3163 || NILP (attrs[LFACE_INHERIT_INDEX])
3145 || SYMBOLP (attrs[LFACE_INHERIT_INDEX]) 3164 || SYMBOLP (attrs[LFACE_INHERIT_INDEX])
3146 || CONSP (attrs[LFACE_INHERIT_INDEX])); 3165 || CONSP (attrs[LFACE_INHERIT_INDEX]));
3147 #ifdef HAVE_WINDOW_SYSTEM 3166 #ifdef HAVE_WINDOW_SYSTEM
3148 xassert (UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX]) 3167 xassert (UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX])
3168 || IGNORE_DEFFACE_P (attrs[LFACE_STIPPLE_INDEX])
3149 || SYMBOLP (attrs[LFACE_STIPPLE_INDEX]) 3169 || SYMBOLP (attrs[LFACE_STIPPLE_INDEX])
3150 || !NILP (Fbitmap_spec_p (attrs[LFACE_STIPPLE_INDEX]))); 3170 || !NILP (Fbitmap_spec_p (attrs[LFACE_STIPPLE_INDEX])));
3151 xassert (UNSPECIFIEDP (attrs[LFACE_FONT_INDEX]) 3171 xassert (UNSPECIFIEDP (attrs[LFACE_FONT_INDEX])
3172 || IGNORE_DEFFACE_P (attrs[LFACE_FONT_INDEX])
3152 || NILP (attrs[LFACE_FONT_INDEX]) 3173 || NILP (attrs[LFACE_FONT_INDEX])
3153 || STRINGP (attrs[LFACE_FONT_INDEX])); 3174 || STRINGP (attrs[LFACE_FONT_INDEX]));
3154 #endif 3175 #endif
3155 } 3176 }
3156 3177
3355 int i; 3376 int i;
3356 3377
3357 for (i = 1; i < LFACE_VECTOR_SIZE; ++i) 3378 for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
3358 if (i != LFACE_FONT_INDEX && i != LFACE_INHERIT_INDEX 3379 if (i != LFACE_FONT_INDEX && i != LFACE_INHERIT_INDEX
3359 && i != LFACE_AVGWIDTH_INDEX) 3380 && i != LFACE_AVGWIDTH_INDEX)
3360 if (UNSPECIFIEDP (attrs[i]) 3381 if ((UNSPECIFIEDP (attrs[i]) || IGNORE_DEFFACE_P (attrs[i]))
3361 #ifdef MAC_OS 3382 #ifdef MAC_OS
3362 /* MAC_TODO: No stipple support on Mac OS yet, this index is 3383 /* MAC_TODO: No stipple support on Mac OS yet, this index is
3363 always unspecified. */ 3384 always unspecified. */
3364 && i != LFACE_STIPPLE_INDEX 3385 && i != LFACE_STIPPLE_INDEX
3365 #endif 3386 #endif
3570 for (i = 1; i < LFACE_VECTOR_SIZE; ++i) 3591 for (i = 1; i < LFACE_VECTOR_SIZE; ++i)
3571 if (!UNSPECIFIEDP (from[i])) 3592 if (!UNSPECIFIEDP (from[i]))
3572 { 3593 {
3573 if (i == LFACE_HEIGHT_INDEX && !INTEGERP (from[i])) 3594 if (i == LFACE_HEIGHT_INDEX && !INTEGERP (from[i]))
3574 to[i] = merge_face_heights (from[i], to[i], to[i]); 3595 to[i] = merge_face_heights (from[i], to[i], to[i]);
3596 else if (IGNORE_DEFFACE_P (from[i]))
3597 to[i] = Qunspecified;
3575 else 3598 else
3576 to[i] = from[i]; 3599 to[i] = from[i];
3577 } 3600 }
3578 3601
3579 /* TO is always an absolute face, which should inherit from nothing. 3602 /* TO is always an absolute face, which should inherit from nothing.
4062 lface = Finternal_make_lisp_face (face, frame); 4085 lface = Finternal_make_lisp_face (face, frame);
4063 } 4086 }
4064 4087
4065 if (EQ (attr, QCfamily)) 4088 if (EQ (attr, QCfamily))
4066 { 4089 {
4067 if (!UNSPECIFIEDP (value)) 4090 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4068 { 4091 {
4069 CHECK_STRING (value); 4092 CHECK_STRING (value);
4070 if (SCHARS (value) == 0) 4093 if (SCHARS (value) == 0)
4071 signal_error ("Invalid face family", value); 4094 signal_error ("Invalid face family", value);
4072 } 4095 }
4074 LFACE_FAMILY (lface) = value; 4097 LFACE_FAMILY (lface) = value;
4075 font_related_attr_p = 1; 4098 font_related_attr_p = 1;
4076 } 4099 }
4077 else if (EQ (attr, QCheight)) 4100 else if (EQ (attr, QCheight))
4078 { 4101 {
4079 if (!UNSPECIFIEDP (value)) 4102 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4080 { 4103 {
4081 Lisp_Object test; 4104 Lisp_Object test;
4082 4105
4083 test = (EQ (face, Qdefault) 4106 test = (EQ (face, Qdefault)
4084 ? value 4107 ? value
4095 LFACE_HEIGHT (lface) = value; 4118 LFACE_HEIGHT (lface) = value;
4096 font_related_attr_p = 1; 4119 font_related_attr_p = 1;
4097 } 4120 }
4098 else if (EQ (attr, QCweight)) 4121 else if (EQ (attr, QCweight))
4099 { 4122 {
4100 if (!UNSPECIFIEDP (value)) 4123 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4101 { 4124 {
4102 CHECK_SYMBOL (value); 4125 CHECK_SYMBOL (value);
4103 if (face_numeric_weight (value) < 0) 4126 if (face_numeric_weight (value) < 0)
4104 signal_error ("Invalid face weight", value); 4127 signal_error ("Invalid face weight", value);
4105 } 4128 }
4107 LFACE_WEIGHT (lface) = value; 4130 LFACE_WEIGHT (lface) = value;
4108 font_related_attr_p = 1; 4131 font_related_attr_p = 1;
4109 } 4132 }
4110 else if (EQ (attr, QCslant)) 4133 else if (EQ (attr, QCslant))
4111 { 4134 {
4112 if (!UNSPECIFIEDP (value)) 4135 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4113 { 4136 {
4114 CHECK_SYMBOL (value); 4137 CHECK_SYMBOL (value);
4115 if (face_numeric_slant (value) < 0) 4138 if (face_numeric_slant (value) < 0)
4116 signal_error ("Invalid face slant", value); 4139 signal_error ("Invalid face slant", value);
4117 } 4140 }
4119 LFACE_SLANT (lface) = value; 4142 LFACE_SLANT (lface) = value;
4120 font_related_attr_p = 1; 4143 font_related_attr_p = 1;
4121 } 4144 }
4122 else if (EQ (attr, QCunderline)) 4145 else if (EQ (attr, QCunderline))
4123 { 4146 {
4124 if (!UNSPECIFIEDP (value)) 4147 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4125 if ((SYMBOLP (value) 4148 if ((SYMBOLP (value)
4126 && !EQ (value, Qt) 4149 && !EQ (value, Qt)
4127 && !EQ (value, Qnil)) 4150 && !EQ (value, Qnil))
4128 /* Underline color. */ 4151 /* Underline color. */
4129 || (STRINGP (value) 4152 || (STRINGP (value)
4133 old_value = LFACE_UNDERLINE (lface); 4156 old_value = LFACE_UNDERLINE (lface);
4134 LFACE_UNDERLINE (lface) = value; 4157 LFACE_UNDERLINE (lface) = value;
4135 } 4158 }
4136 else if (EQ (attr, QCoverline)) 4159 else if (EQ (attr, QCoverline))
4137 { 4160 {
4138 if (!UNSPECIFIEDP (value)) 4161 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4139 if ((SYMBOLP (value) 4162 if ((SYMBOLP (value)
4140 && !EQ (value, Qt) 4163 && !EQ (value, Qt)
4141 && !EQ (value, Qnil)) 4164 && !EQ (value, Qnil))
4142 /* Overline color. */ 4165 /* Overline color. */
4143 || (STRINGP (value) 4166 || (STRINGP (value)
4147 old_value = LFACE_OVERLINE (lface); 4170 old_value = LFACE_OVERLINE (lface);
4148 LFACE_OVERLINE (lface) = value; 4171 LFACE_OVERLINE (lface) = value;
4149 } 4172 }
4150 else if (EQ (attr, QCstrike_through)) 4173 else if (EQ (attr, QCstrike_through))
4151 { 4174 {
4152 if (!UNSPECIFIEDP (value)) 4175 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4153 if ((SYMBOLP (value) 4176 if ((SYMBOLP (value)
4154 && !EQ (value, Qt) 4177 && !EQ (value, Qt)
4155 && !EQ (value, Qnil)) 4178 && !EQ (value, Qnil))
4156 /* Strike-through color. */ 4179 /* Strike-through color. */
4157 || (STRINGP (value) 4180 || (STRINGP (value)
4168 /* Allow t meaning a simple box of width 1 in foreground color 4191 /* Allow t meaning a simple box of width 1 in foreground color
4169 of the face. */ 4192 of the face. */
4170 if (EQ (value, Qt)) 4193 if (EQ (value, Qt))
4171 value = make_number (1); 4194 value = make_number (1);
4172 4195
4173 if (UNSPECIFIEDP (value)) 4196 if (UNSPECIFIEDP (value) || IGNORE_DEFFACE_P (value))
4174 valid_p = 1; 4197 valid_p = 1;
4175 else if (NILP (value)) 4198 else if (NILP (value))
4176 valid_p = 1; 4199 valid_p = 1;
4177 else if (INTEGERP (value)) 4200 else if (INTEGERP (value))
4178 valid_p = XINT (value) != 0; 4201 valid_p = XINT (value) != 0;
4225 LFACE_BOX (lface) = value; 4248 LFACE_BOX (lface) = value;
4226 } 4249 }
4227 else if (EQ (attr, QCinverse_video) 4250 else if (EQ (attr, QCinverse_video)
4228 || EQ (attr, QCreverse_video)) 4251 || EQ (attr, QCreverse_video))
4229 { 4252 {
4230 if (!UNSPECIFIEDP (value)) 4253 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4231 { 4254 {
4232 CHECK_SYMBOL (value); 4255 CHECK_SYMBOL (value);
4233 if (!EQ (value, Qt) && !NILP (value)) 4256 if (!EQ (value, Qt) && !NILP (value))
4234 signal_error ("Invalid inverse-video face attribute value", value); 4257 signal_error ("Invalid inverse-video face attribute value", value);
4235 } 4258 }
4236 old_value = LFACE_INVERSE (lface); 4259 old_value = LFACE_INVERSE (lface);
4237 LFACE_INVERSE (lface) = value; 4260 LFACE_INVERSE (lface) = value;
4238 } 4261 }
4239 else if (EQ (attr, QCforeground)) 4262 else if (EQ (attr, QCforeground))
4240 { 4263 {
4241 if (!UNSPECIFIEDP (value)) 4264 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4242 { 4265 {
4243 /* Don't check for valid color names here because it depends 4266 /* Don't check for valid color names here because it depends
4244 on the frame (display) whether the color will be valid 4267 on the frame (display) whether the color will be valid
4245 when the face is realized. */ 4268 when the face is realized. */
4246 CHECK_STRING (value); 4269 CHECK_STRING (value);
4250 old_value = LFACE_FOREGROUND (lface); 4273 old_value = LFACE_FOREGROUND (lface);
4251 LFACE_FOREGROUND (lface) = value; 4274 LFACE_FOREGROUND (lface) = value;
4252 } 4275 }
4253 else if (EQ (attr, QCbackground)) 4276 else if (EQ (attr, QCbackground))
4254 { 4277 {
4255 if (!UNSPECIFIEDP (value)) 4278 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4256 { 4279 {
4257 /* Don't check for valid color names here because it depends 4280 /* Don't check for valid color names here because it depends
4258 on the frame (display) whether the color will be valid 4281 on the frame (display) whether the color will be valid
4259 when the face is realized. */ 4282 when the face is realized. */
4260 CHECK_STRING (value); 4283 CHECK_STRING (value);
4265 LFACE_BACKGROUND (lface) = value; 4288 LFACE_BACKGROUND (lface) = value;
4266 } 4289 }
4267 else if (EQ (attr, QCstipple)) 4290 else if (EQ (attr, QCstipple))
4268 { 4291 {
4269 #ifdef HAVE_X_WINDOWS 4292 #ifdef HAVE_X_WINDOWS
4270 if (!UNSPECIFIEDP (value) 4293 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)
4271 && !NILP (value) 4294 && !NILP (value)
4272 && NILP (Fbitmap_spec_p (value))) 4295 && NILP (Fbitmap_spec_p (value)))
4273 signal_error ("Invalid stipple attribute", value); 4296 signal_error ("Invalid stipple attribute", value);
4274 old_value = LFACE_STIPPLE (lface); 4297 old_value = LFACE_STIPPLE (lface);
4275 LFACE_STIPPLE (lface) = value; 4298 LFACE_STIPPLE (lface) = value;
4276 #endif /* HAVE_X_WINDOWS */ 4299 #endif /* HAVE_X_WINDOWS */
4277 } 4300 }
4278 else if (EQ (attr, QCwidth)) 4301 else if (EQ (attr, QCwidth))
4279 { 4302 {
4280 if (!UNSPECIFIEDP (value)) 4303 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4281 { 4304 {
4282 CHECK_SYMBOL (value); 4305 CHECK_SYMBOL (value);
4283 if (face_numeric_swidth (value) < 0) 4306 if (face_numeric_swidth (value) < 0)
4284 signal_error ("Invalid face width", value); 4307 signal_error ("Invalid face width", value);
4285 } 4308 }
4300 if (EQ (frame, Qt)) 4323 if (EQ (frame, Qt))
4301 f = SELECTED_FRAME (); 4324 f = SELECTED_FRAME ();
4302 else 4325 else
4303 f = check_x_frame (frame); 4326 f = check_x_frame (frame);
4304 4327
4305 if (!UNSPECIFIEDP (value)) 4328 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4306 { 4329 {
4307 CHECK_STRING (value); 4330 CHECK_STRING (value);
4308 4331
4309 /* VALUE may be a fontset name or an alias of fontset. In 4332 /* VALUE may be a fontset name or an alias of fontset. In
4310 such a case, use the base fontset name. */ 4333 such a case, use the base fontset name. */
4348 } 4371 }
4349 else 4372 else
4350 signal_error ("Invalid face attribute name", attr); 4373 signal_error ("Invalid face attribute name", attr);
4351 4374
4352 if (font_related_attr_p 4375 if (font_related_attr_p
4353 && !UNSPECIFIEDP (value)) 4376 && !UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value))
4354 /* If a font-related attribute other than QCfont is specified, the 4377 /* If a font-related attribute other than QCfont is specified, the
4355 original `font' attribute nor that of default face is useless 4378 original `font' attribute nor that of default face is useless
4356 to determine a new font. Thus, we set it to nil so that font 4379 to determine a new font. Thus, we set it to nil so that font
4357 selection mechanism doesn't use it. */ 4380 selection mechanism doesn't use it. */
4358 LFACE_FONT (lface) = Qnil; 4381 LFACE_FONT (lface) = Qnil;
4369 { 4392 {
4370 ++face_change_count; 4393 ++face_change_count;
4371 ++windows_or_buffers_changed; 4394 ++windows_or_buffers_changed;
4372 } 4395 }
4373 4396
4374 if (!UNSPECIFIEDP (value) 4397 if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)
4375 && NILP (Fequal (old_value, value))) 4398 && NILP (Fequal (old_value, value)))
4376 { 4399 {
4377 Lisp_Object param; 4400 Lisp_Object param;
4378 4401
4379 param = Qnil; 4402 param = Qnil;
4786 2, 2, 0, 4809 2, 2, 0,
4787 doc: /* Return non-nil if face ATTRIBUTE VALUE is relative. */) 4810 doc: /* Return non-nil if face ATTRIBUTE VALUE is relative. */)
4788 (attribute, value) 4811 (attribute, value)
4789 Lisp_Object attribute, value; 4812 Lisp_Object attribute, value;
4790 { 4813 {
4791 if (EQ (value, Qunspecified)) 4814 if (EQ (value, Qunspecified) || (EQ (value, Qignore_defface)))
4792 return Qt; 4815 return Qt;
4793 else if (EQ (attribute, QCheight)) 4816 else if (EQ (attribute, QCheight))
4794 return INTEGERP (value) ? Qnil : Qt; 4817 return INTEGERP (value) ? Qnil : Qt;
4795 else 4818 else
4796 return Qnil; 4819 return Qnil;
4802 If VALUE1 or VALUE2 are absolute (see `face-attribute-relative-p'), then 4825 If VALUE1 or VALUE2 are absolute (see `face-attribute-relative-p'), then
4803 the result will be absolute, otherwise it will be relative. */) 4826 the result will be absolute, otherwise it will be relative. */)
4804 (attribute, value1, value2) 4827 (attribute, value1, value2)
4805 Lisp_Object attribute, value1, value2; 4828 Lisp_Object attribute, value1, value2;
4806 { 4829 {
4807 if (EQ (value1, Qunspecified)) 4830 if (EQ (value1, Qunspecified) || EQ (value1, Qignore_defface))
4808 return value2; 4831 return value2;
4809 else if (EQ (attribute, QCheight)) 4832 else if (EQ (attribute, QCheight))
4810 return merge_face_heights (value1, value2, value1); 4833 return merge_face_heights (value1, value2, value1);
4811 else 4834 else
4812 return value1; 4835 return value1;
8033 staticpro (&Qbackground_color); 8056 staticpro (&Qbackground_color);
8034 Qforeground_color = intern ("foreground-color"); 8057 Qforeground_color = intern ("foreground-color");
8035 staticpro (&Qforeground_color); 8058 staticpro (&Qforeground_color);
8036 Qunspecified = intern ("unspecified"); 8059 Qunspecified = intern ("unspecified");
8037 staticpro (&Qunspecified); 8060 staticpro (&Qunspecified);
8061 Qignore_defface = intern (":ignore-defface");
8062 staticpro (&Qignore_defface);
8038 8063
8039 Qface_alias = intern ("face-alias"); 8064 Qface_alias = intern ("face-alias");
8040 staticpro (&Qface_alias); 8065 staticpro (&Qface_alias);
8041 Qdefault = intern ("default"); 8066 Qdefault = intern ("default");
8042 staticpro (&Qdefault); 8067 staticpro (&Qdefault);