Mercurial > emacs
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); |