274 |
|
|
275 |
#define UNSPECIFIEDP(ATTR) EQ ((ATTR), Qunspecified) |
#define UNSPECIFIEDP(ATTR) EQ ((ATTR), Qunspecified) |
276 |
|
|
277 |
|
/* Non-zero if face attribute ATTR is `ignore-defface'. */ |
278 |
|
|
279 |
|
#define IGNORE_DEFFACE_P(ATTR) EQ ((ATTR), Qignore_defface) |
280 |
|
|
281 |
/* Value is the number of elements of VECTOR. */ |
/* Value is the number of elements of VECTOR. */ |
282 |
|
|
283 |
#define DIM(VECTOR) (sizeof (VECTOR) / sizeof *(VECTOR)) |
#define DIM(VECTOR) (sizeof (VECTOR) / sizeof *(VECTOR)) |
316 |
Lisp_Object Qreleased_button, Qpressed_button; |
Lisp_Object Qreleased_button, Qpressed_button; |
317 |
Lisp_Object QCstyle, QCcolor, QCline_width; |
Lisp_Object QCstyle, QCcolor, QCline_width; |
318 |
Lisp_Object Qunspecified; |
Lisp_Object Qunspecified; |
319 |
|
Lisp_Object Qignore_defface; |
320 |
|
|
321 |
char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg"; |
char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg"; |
322 |
|
|
3109 |
Lisp_Object *attrs; |
Lisp_Object *attrs; |
3110 |
{ |
{ |
3111 |
xassert (UNSPECIFIEDP (attrs[LFACE_FAMILY_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_FAMILY_INDEX]) |
3112 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_FAMILY_INDEX]) |
3113 |
|| STRINGP (attrs[LFACE_FAMILY_INDEX])); |
|| STRINGP (attrs[LFACE_FAMILY_INDEX])); |
3114 |
xassert (UNSPECIFIEDP (attrs[LFACE_SWIDTH_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_SWIDTH_INDEX]) |
3115 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_SWIDTH_INDEX]) |
3116 |
|| SYMBOLP (attrs[LFACE_SWIDTH_INDEX])); |
|| SYMBOLP (attrs[LFACE_SWIDTH_INDEX])); |
3117 |
xassert (UNSPECIFIEDP (attrs[LFACE_AVGWIDTH_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_AVGWIDTH_INDEX]) |
3118 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_AVGWIDTH_INDEX]) |
3119 |
|| INTEGERP (attrs[LFACE_AVGWIDTH_INDEX])); |
|| INTEGERP (attrs[LFACE_AVGWIDTH_INDEX])); |
3120 |
xassert (UNSPECIFIEDP (attrs[LFACE_HEIGHT_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_HEIGHT_INDEX]) |
3121 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_HEIGHT_INDEX]) |
3122 |
|| INTEGERP (attrs[LFACE_HEIGHT_INDEX]) |
|| INTEGERP (attrs[LFACE_HEIGHT_INDEX]) |
3123 |
|| FLOATP (attrs[LFACE_HEIGHT_INDEX]) |
|| FLOATP (attrs[LFACE_HEIGHT_INDEX]) |
3124 |
|| FUNCTIONP (attrs[LFACE_HEIGHT_INDEX])); |
|| FUNCTIONP (attrs[LFACE_HEIGHT_INDEX])); |
3125 |
xassert (UNSPECIFIEDP (attrs[LFACE_WEIGHT_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_WEIGHT_INDEX]) |
3126 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_WEIGHT_INDEX]) |
3127 |
|| SYMBOLP (attrs[LFACE_WEIGHT_INDEX])); |
|| SYMBOLP (attrs[LFACE_WEIGHT_INDEX])); |
3128 |
xassert (UNSPECIFIEDP (attrs[LFACE_SLANT_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_SLANT_INDEX]) |
3129 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_SLANT_INDEX]) |
3130 |
|| SYMBOLP (attrs[LFACE_SLANT_INDEX])); |
|| SYMBOLP (attrs[LFACE_SLANT_INDEX])); |
3131 |
xassert (UNSPECIFIEDP (attrs[LFACE_UNDERLINE_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_UNDERLINE_INDEX]) |
3132 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_UNDERLINE_INDEX]) |
3133 |
|| SYMBOLP (attrs[LFACE_UNDERLINE_INDEX]) |
|| SYMBOLP (attrs[LFACE_UNDERLINE_INDEX]) |
3134 |
|| STRINGP (attrs[LFACE_UNDERLINE_INDEX])); |
|| STRINGP (attrs[LFACE_UNDERLINE_INDEX])); |
3135 |
xassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) |
3136 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_OVERLINE_INDEX]) |
3137 |
|| SYMBOLP (attrs[LFACE_OVERLINE_INDEX]) |
|| SYMBOLP (attrs[LFACE_OVERLINE_INDEX]) |
3138 |
|| STRINGP (attrs[LFACE_OVERLINE_INDEX])); |
|| STRINGP (attrs[LFACE_OVERLINE_INDEX])); |
3139 |
xassert (UNSPECIFIEDP (attrs[LFACE_STRIKE_THROUGH_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_STRIKE_THROUGH_INDEX]) |
3140 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_STRIKE_THROUGH_INDEX]) |
3141 |
|| SYMBOLP (attrs[LFACE_STRIKE_THROUGH_INDEX]) |
|| SYMBOLP (attrs[LFACE_STRIKE_THROUGH_INDEX]) |
3142 |
|| STRINGP (attrs[LFACE_STRIKE_THROUGH_INDEX])); |
|| STRINGP (attrs[LFACE_STRIKE_THROUGH_INDEX])); |
3143 |
xassert (UNSPECIFIEDP (attrs[LFACE_BOX_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_BOX_INDEX]) |
3144 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_BOX_INDEX]) |
3145 |
|| SYMBOLP (attrs[LFACE_BOX_INDEX]) |
|| SYMBOLP (attrs[LFACE_BOX_INDEX]) |
3146 |
|| STRINGP (attrs[LFACE_BOX_INDEX]) |
|| STRINGP (attrs[LFACE_BOX_INDEX]) |
3147 |
|| INTEGERP (attrs[LFACE_BOX_INDEX]) |
|| INTEGERP (attrs[LFACE_BOX_INDEX]) |
3148 |
|| CONSP (attrs[LFACE_BOX_INDEX])); |
|| CONSP (attrs[LFACE_BOX_INDEX])); |
3149 |
xassert (UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) |
3150 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_INVERSE_INDEX]) |
3151 |
|| SYMBOLP (attrs[LFACE_INVERSE_INDEX])); |
|| SYMBOLP (attrs[LFACE_INVERSE_INDEX])); |
3152 |
xassert (UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) |
3153 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_FOREGROUND_INDEX]) |
3154 |
|| STRINGP (attrs[LFACE_FOREGROUND_INDEX])); |
|| STRINGP (attrs[LFACE_FOREGROUND_INDEX])); |
3155 |
xassert (UNSPECIFIEDP (attrs[LFACE_BACKGROUND_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_BACKGROUND_INDEX]) |
3156 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_BACKGROUND_INDEX]) |
3157 |
|| STRINGP (attrs[LFACE_BACKGROUND_INDEX])); |
|| STRINGP (attrs[LFACE_BACKGROUND_INDEX])); |
3158 |
xassert (UNSPECIFIEDP (attrs[LFACE_INHERIT_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_INHERIT_INDEX]) |
3159 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_INHERIT_INDEX]) |
3160 |
|| NILP (attrs[LFACE_INHERIT_INDEX]) |
|| NILP (attrs[LFACE_INHERIT_INDEX]) |
3161 |
|| SYMBOLP (attrs[LFACE_INHERIT_INDEX]) |
|| SYMBOLP (attrs[LFACE_INHERIT_INDEX]) |
3162 |
|| CONSP (attrs[LFACE_INHERIT_INDEX])); |
|| CONSP (attrs[LFACE_INHERIT_INDEX])); |
3163 |
#ifdef HAVE_WINDOW_SYSTEM |
#ifdef HAVE_WINDOW_SYSTEM |
3164 |
xassert (UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX]) |
3165 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_STIPPLE_INDEX]) |
3166 |
|| SYMBOLP (attrs[LFACE_STIPPLE_INDEX]) |
|| SYMBOLP (attrs[LFACE_STIPPLE_INDEX]) |
3167 |
|| !NILP (Fbitmap_spec_p (attrs[LFACE_STIPPLE_INDEX]))); |
|| !NILP (Fbitmap_spec_p (attrs[LFACE_STIPPLE_INDEX]))); |
3168 |
xassert (UNSPECIFIEDP (attrs[LFACE_FONT_INDEX]) |
xassert (UNSPECIFIEDP (attrs[LFACE_FONT_INDEX]) |
3169 |
|
|| IGNORE_DEFFACE_P (attrs[LFACE_FONT_INDEX]) |
3170 |
|| NILP (attrs[LFACE_FONT_INDEX]) |
|| NILP (attrs[LFACE_FONT_INDEX]) |
3171 |
|| STRINGP (attrs[LFACE_FONT_INDEX])); |
|| STRINGP (attrs[LFACE_FONT_INDEX])); |
3172 |
#endif |
#endif |
3361 |
for (i = 1; i < LFACE_VECTOR_SIZE; ++i) |
for (i = 1; i < LFACE_VECTOR_SIZE; ++i) |
3362 |
if (i != LFACE_FONT_INDEX && i != LFACE_INHERIT_INDEX |
if (i != LFACE_FONT_INDEX && i != LFACE_INHERIT_INDEX |
3363 |
&& i != LFACE_AVGWIDTH_INDEX) |
&& i != LFACE_AVGWIDTH_INDEX) |
3364 |
if (UNSPECIFIEDP (attrs[i]) |
if ((UNSPECIFIEDP (attrs[i]) || IGNORE_DEFFACE_P (attrs[i])) |
3365 |
#ifdef MAC_OS |
#ifdef MAC_OS |
3366 |
/* MAC_TODO: No stipple support on Mac OS yet, this index is |
/* MAC_TODO: No stipple support on Mac OS yet, this index is |
3367 |
always unspecified. */ |
always unspecified. */ |
3576 |
{ |
{ |
3577 |
if (i == LFACE_HEIGHT_INDEX && !INTEGERP (from[i])) |
if (i == LFACE_HEIGHT_INDEX && !INTEGERP (from[i])) |
3578 |
to[i] = merge_face_heights (from[i], to[i], to[i]); |
to[i] = merge_face_heights (from[i], to[i], to[i]); |
3579 |
|
else if (IGNORE_DEFFACE_P (from[i])) |
3580 |
|
to[i] = Qunspecified; |
3581 |
else |
else |
3582 |
to[i] = from[i]; |
to[i] = from[i]; |
3583 |
} |
} |
4070 |
|
|
4071 |
if (EQ (attr, QCfamily)) |
if (EQ (attr, QCfamily)) |
4072 |
{ |
{ |
4073 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4074 |
{ |
{ |
4075 |
CHECK_STRING (value); |
CHECK_STRING (value); |
4076 |
if (SCHARS (value) == 0) |
if (SCHARS (value) == 0) |
4082 |
} |
} |
4083 |
else if (EQ (attr, QCheight)) |
else if (EQ (attr, QCheight)) |
4084 |
{ |
{ |
4085 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4086 |
{ |
{ |
4087 |
Lisp_Object test; |
Lisp_Object test; |
4088 |
|
|
4103 |
} |
} |
4104 |
else if (EQ (attr, QCweight)) |
else if (EQ (attr, QCweight)) |
4105 |
{ |
{ |
4106 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4107 |
{ |
{ |
4108 |
CHECK_SYMBOL (value); |
CHECK_SYMBOL (value); |
4109 |
if (face_numeric_weight (value) < 0) |
if (face_numeric_weight (value) < 0) |
4115 |
} |
} |
4116 |
else if (EQ (attr, QCslant)) |
else if (EQ (attr, QCslant)) |
4117 |
{ |
{ |
4118 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4119 |
{ |
{ |
4120 |
CHECK_SYMBOL (value); |
CHECK_SYMBOL (value); |
4121 |
if (face_numeric_slant (value) < 0) |
if (face_numeric_slant (value) < 0) |
4127 |
} |
} |
4128 |
else if (EQ (attr, QCunderline)) |
else if (EQ (attr, QCunderline)) |
4129 |
{ |
{ |
4130 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4131 |
if ((SYMBOLP (value) |
if ((SYMBOLP (value) |
4132 |
&& !EQ (value, Qt) |
&& !EQ (value, Qt) |
4133 |
&& !EQ (value, Qnil)) |
&& !EQ (value, Qnil)) |
4141 |
} |
} |
4142 |
else if (EQ (attr, QCoverline)) |
else if (EQ (attr, QCoverline)) |
4143 |
{ |
{ |
4144 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4145 |
if ((SYMBOLP (value) |
if ((SYMBOLP (value) |
4146 |
&& !EQ (value, Qt) |
&& !EQ (value, Qt) |
4147 |
&& !EQ (value, Qnil)) |
&& !EQ (value, Qnil)) |
4155 |
} |
} |
4156 |
else if (EQ (attr, QCstrike_through)) |
else if (EQ (attr, QCstrike_through)) |
4157 |
{ |
{ |
4158 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4159 |
if ((SYMBOLP (value) |
if ((SYMBOLP (value) |
4160 |
&& !EQ (value, Qt) |
&& !EQ (value, Qt) |
4161 |
&& !EQ (value, Qnil)) |
&& !EQ (value, Qnil)) |
4176 |
if (EQ (value, Qt)) |
if (EQ (value, Qt)) |
4177 |
value = make_number (1); |
value = make_number (1); |
4178 |
|
|
4179 |
if (UNSPECIFIEDP (value)) |
if (UNSPECIFIEDP (value) || IGNORE_DEFFACE_P (value)) |
4180 |
valid_p = 1; |
valid_p = 1; |
4181 |
else if (NILP (value)) |
else if (NILP (value)) |
4182 |
valid_p = 1; |
valid_p = 1; |
4233 |
else if (EQ (attr, QCinverse_video) |
else if (EQ (attr, QCinverse_video) |
4234 |
|| EQ (attr, QCreverse_video)) |
|| EQ (attr, QCreverse_video)) |
4235 |
{ |
{ |
4236 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4237 |
{ |
{ |
4238 |
CHECK_SYMBOL (value); |
CHECK_SYMBOL (value); |
4239 |
if (!EQ (value, Qt) && !NILP (value)) |
if (!EQ (value, Qt) && !NILP (value)) |
4244 |
} |
} |
4245 |
else if (EQ (attr, QCforeground)) |
else if (EQ (attr, QCforeground)) |
4246 |
{ |
{ |
4247 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4248 |
{ |
{ |
4249 |
/* Don't check for valid color names here because it depends |
/* Don't check for valid color names here because it depends |
4250 |
on the frame (display) whether the color will be valid |
on the frame (display) whether the color will be valid |
4258 |
} |
} |
4259 |
else if (EQ (attr, QCbackground)) |
else if (EQ (attr, QCbackground)) |
4260 |
{ |
{ |
4261 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4262 |
{ |
{ |
4263 |
/* Don't check for valid color names here because it depends |
/* Don't check for valid color names here because it depends |
4264 |
on the frame (display) whether the color will be valid |
on the frame (display) whether the color will be valid |
4273 |
else if (EQ (attr, QCstipple)) |
else if (EQ (attr, QCstipple)) |
4274 |
{ |
{ |
4275 |
#ifdef HAVE_X_WINDOWS |
#ifdef HAVE_X_WINDOWS |
4276 |
if (!UNSPECIFIEDP (value) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value) |
4277 |
&& !NILP (value) |
&& !NILP (value) |
4278 |
&& NILP (Fbitmap_spec_p (value))) |
&& NILP (Fbitmap_spec_p (value))) |
4279 |
signal_error ("Invalid stipple attribute", value); |
signal_error ("Invalid stipple attribute", value); |
4283 |
} |
} |
4284 |
else if (EQ (attr, QCwidth)) |
else if (EQ (attr, QCwidth)) |
4285 |
{ |
{ |
4286 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4287 |
{ |
{ |
4288 |
CHECK_SYMBOL (value); |
CHECK_SYMBOL (value); |
4289 |
if (face_numeric_swidth (value) < 0) |
if (face_numeric_swidth (value) < 0) |
4308 |
else |
else |
4309 |
f = check_x_frame (frame); |
f = check_x_frame (frame); |
4310 |
|
|
4311 |
if (!UNSPECIFIEDP (value)) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4312 |
{ |
{ |
4313 |
CHECK_STRING (value); |
CHECK_STRING (value); |
4314 |
|
|
4356 |
signal_error ("Invalid face attribute name", attr); |
signal_error ("Invalid face attribute name", attr); |
4357 |
|
|
4358 |
if (font_related_attr_p |
if (font_related_attr_p |
4359 |
&& !UNSPECIFIEDP (value)) |
&& !UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value)) |
4360 |
/* If a font-related attribute other than QCfont is specified, the |
/* If a font-related attribute other than QCfont is specified, the |
4361 |
original `font' attribute nor that of default face is useless |
original `font' attribute nor that of default face is useless |
4362 |
to determine a new font. Thus, we set it to nil so that font |
to determine a new font. Thus, we set it to nil so that font |
4377 |
++windows_or_buffers_changed; |
++windows_or_buffers_changed; |
4378 |
} |
} |
4379 |
|
|
4380 |
if (!UNSPECIFIEDP (value) |
if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value) |
4381 |
&& NILP (Fequal (old_value, value))) |
&& NILP (Fequal (old_value, value))) |
4382 |
{ |
{ |
4383 |
Lisp_Object param; |
Lisp_Object param; |
8035 |
staticpro (&Qforeground_color); |
staticpro (&Qforeground_color); |
8036 |
Qunspecified = intern ("unspecified"); |
Qunspecified = intern ("unspecified"); |
8037 |
staticpro (&Qunspecified); |
staticpro (&Qunspecified); |
8038 |
|
Qignore_defface = intern (":ignore-defface"); |
8039 |
|
staticpro (&Qignore_defface); |
8040 |
|
|
8041 |
Qface_alias = intern ("face-alias"); |
Qface_alias = intern ("face-alias"); |
8042 |
staticpro (&Qface_alias); |
staticpro (&Qface_alias); |