diff options
| author | Eli Zaretskii | 2022-07-03 15:37:50 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2022-07-03 15:37:50 +0300 |
| commit | e9bb92940e895c73c802d8c4c79e45de20ebbf83 (patch) | |
| tree | 4bdafcaa7f0d1fe0c03b68a15f1b40ed22e85a03 | |
| parent | 6e2f9dd3dd8b3c65608366039ce69666905d80cb (diff) | |
| download | emacs-e9bb92940e895c73c802d8c4c79e45de20ebbf83.tar.gz emacs-e9bb92940e895c73c802d8c4c79e45de20ebbf83.zip | |
Fix implementation of 'reset' face values
* src/xfaces.c (Finternal_merge_in_global_face)
(gui_supports_face_attributes_p): Only modify local copy of face
attributes when replacing 'reset' pseudo-values with real values.
(Bug#38771)
| -rw-r--r-- | src/xfaces.c | 67 |
1 files changed, 33 insertions, 34 deletions
diff --git a/src/xfaces.c b/src/xfaces.c index 6142fe1ab17..8ae922578ec 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -4190,12 +4190,6 @@ Default face attributes override any local face attributes. */) | |||
| 4190 | the previously-cached vector. */ | 4190 | the previously-cached vector. */ |
| 4191 | memcpy (attrs, oldface->lface, sizeof attrs); | 4191 | memcpy (attrs, oldface->lface, sizeof attrs); |
| 4192 | 4192 | ||
| 4193 | /* Make explicit any attributes whose value is 'reset'. */ | ||
| 4194 | int i; | ||
| 4195 | for (i = 1; i < LFACE_VECTOR_SIZE; i++) | ||
| 4196 | if (EQ (lvec[i], Qreset)) | ||
| 4197 | lvec[i] = attrs[i]; | ||
| 4198 | |||
| 4199 | merge_face_vectors (NULL, f, lvec, attrs, 0); | 4193 | merge_face_vectors (NULL, f, lvec, attrs, 0); |
| 4200 | vcopy (local_lface, 0, attrs, LFACE_VECTOR_SIZE); | 4194 | vcopy (local_lface, 0, attrs, LFACE_VECTOR_SIZE); |
| 4201 | newface = realize_face (c, lvec, DEFAULT_FACE_ID); | 4195 | newface = realize_face (c, lvec, DEFAULT_FACE_ID); |
| @@ -5193,55 +5187,60 @@ gui_supports_face_attributes_p (struct frame *f, | |||
| 5193 | struct face *def_face) | 5187 | struct face *def_face) |
| 5194 | { | 5188 | { |
| 5195 | Lisp_Object *def_attrs = def_face->lface; | 5189 | Lisp_Object *def_attrs = def_face->lface; |
| 5190 | Lisp_Object lattrs[LFACE_VECTOR_SIZE]; | ||
| 5196 | 5191 | ||
| 5197 | /* Make explicit any attributes whose value is 'reset'. */ | 5192 | /* Make explicit any attributes whose value is 'reset'. */ |
| 5198 | int i; | 5193 | int i; |
| 5199 | for (i = 1; i < LFACE_VECTOR_SIZE; i++) | 5194 | for (i = 1; i < LFACE_VECTOR_SIZE; i++) |
| 5200 | if (EQ (attrs[i], Qreset)) | 5195 | { |
| 5201 | attrs[i] = def_attrs[i]; | 5196 | if (EQ (attrs[i], Qreset)) |
| 5197 | lattrs[i] = def_attrs[i]; | ||
| 5198 | else | ||
| 5199 | lattrs[i] = attrs[i]; | ||
| 5200 | } | ||
| 5202 | 5201 | ||
| 5203 | /* Check that other specified attributes are different from the | 5202 | /* Check that other specified attributes are different from the |
| 5204 | default face. */ | 5203 | default face. */ |
| 5205 | if ((!UNSPECIFIEDP (attrs[LFACE_UNDERLINE_INDEX]) | 5204 | if ((!UNSPECIFIEDP (lattrs[LFACE_UNDERLINE_INDEX]) |
| 5206 | && face_attr_equal_p (attrs[LFACE_UNDERLINE_INDEX], | 5205 | && face_attr_equal_p (lattrs[LFACE_UNDERLINE_INDEX], |
| 5207 | def_attrs[LFACE_UNDERLINE_INDEX])) | 5206 | def_attrs[LFACE_UNDERLINE_INDEX])) |
| 5208 | || (!UNSPECIFIEDP (attrs[LFACE_INVERSE_INDEX]) | 5207 | || (!UNSPECIFIEDP (lattrs[LFACE_INVERSE_INDEX]) |
| 5209 | && face_attr_equal_p (attrs[LFACE_INVERSE_INDEX], | 5208 | && face_attr_equal_p (lattrs[LFACE_INVERSE_INDEX], |
| 5210 | def_attrs[LFACE_INVERSE_INDEX])) | 5209 | def_attrs[LFACE_INVERSE_INDEX])) |
| 5211 | || (!UNSPECIFIEDP (attrs[LFACE_EXTEND_INDEX]) | 5210 | || (!UNSPECIFIEDP (lattrs[LFACE_EXTEND_INDEX]) |
| 5212 | && face_attr_equal_p (attrs[LFACE_EXTEND_INDEX], | 5211 | && face_attr_equal_p (lattrs[LFACE_EXTEND_INDEX], |
| 5213 | def_attrs[LFACE_EXTEND_INDEX])) | 5212 | def_attrs[LFACE_EXTEND_INDEX])) |
| 5214 | || (!UNSPECIFIEDP (attrs[LFACE_FOREGROUND_INDEX]) | 5213 | || (!UNSPECIFIEDP (lattrs[LFACE_FOREGROUND_INDEX]) |
| 5215 | && face_attr_equal_p (attrs[LFACE_FOREGROUND_INDEX], | 5214 | && face_attr_equal_p (lattrs[LFACE_FOREGROUND_INDEX], |
| 5216 | def_attrs[LFACE_FOREGROUND_INDEX])) | 5215 | def_attrs[LFACE_FOREGROUND_INDEX])) |
| 5217 | || (!UNSPECIFIEDP (attrs[LFACE_DISTANT_FOREGROUND_INDEX]) | 5216 | || (!UNSPECIFIEDP (lattrs[LFACE_DISTANT_FOREGROUND_INDEX]) |
| 5218 | && face_attr_equal_p (attrs[LFACE_DISTANT_FOREGROUND_INDEX], | 5217 | && face_attr_equal_p (lattrs[LFACE_DISTANT_FOREGROUND_INDEX], |
| 5219 | def_attrs[LFACE_DISTANT_FOREGROUND_INDEX])) | 5218 | def_attrs[LFACE_DISTANT_FOREGROUND_INDEX])) |
| 5220 | || (!UNSPECIFIEDP (attrs[LFACE_BACKGROUND_INDEX]) | 5219 | || (!UNSPECIFIEDP (lattrs[LFACE_BACKGROUND_INDEX]) |
| 5221 | && face_attr_equal_p (attrs[LFACE_BACKGROUND_INDEX], | 5220 | && face_attr_equal_p (lattrs[LFACE_BACKGROUND_INDEX], |
| 5222 | def_attrs[LFACE_BACKGROUND_INDEX])) | 5221 | def_attrs[LFACE_BACKGROUND_INDEX])) |
| 5223 | || (!UNSPECIFIEDP (attrs[LFACE_STIPPLE_INDEX]) | 5222 | || (!UNSPECIFIEDP (lattrs[LFACE_STIPPLE_INDEX]) |
| 5224 | && face_attr_equal_p (attrs[LFACE_STIPPLE_INDEX], | 5223 | && face_attr_equal_p (lattrs[LFACE_STIPPLE_INDEX], |
| 5225 | def_attrs[LFACE_STIPPLE_INDEX])) | 5224 | def_attrs[LFACE_STIPPLE_INDEX])) |
| 5226 | || (!UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX]) | 5225 | || (!UNSPECIFIEDP (lattrs[LFACE_OVERLINE_INDEX]) |
| 5227 | && face_attr_equal_p (attrs[LFACE_OVERLINE_INDEX], | 5226 | && face_attr_equal_p (lattrs[LFACE_OVERLINE_INDEX], |
| 5228 | def_attrs[LFACE_OVERLINE_INDEX])) | 5227 | def_attrs[LFACE_OVERLINE_INDEX])) |
| 5229 | || (!UNSPECIFIEDP (attrs[LFACE_STRIKE_THROUGH_INDEX]) | 5228 | || (!UNSPECIFIEDP (lattrs[LFACE_STRIKE_THROUGH_INDEX]) |
| 5230 | && face_attr_equal_p (attrs[LFACE_STRIKE_THROUGH_INDEX], | 5229 | && face_attr_equal_p (lattrs[LFACE_STRIKE_THROUGH_INDEX], |
| 5231 | def_attrs[LFACE_STRIKE_THROUGH_INDEX])) | 5230 | def_attrs[LFACE_STRIKE_THROUGH_INDEX])) |
| 5232 | || (!UNSPECIFIEDP (attrs[LFACE_BOX_INDEX]) | 5231 | || (!UNSPECIFIEDP (lattrs[LFACE_BOX_INDEX]) |
| 5233 | && face_attr_equal_p (attrs[LFACE_BOX_INDEX], | 5232 | && face_attr_equal_p (lattrs[LFACE_BOX_INDEX], |
| 5234 | def_attrs[LFACE_BOX_INDEX]))) | 5233 | def_attrs[LFACE_BOX_INDEX]))) |
| 5235 | return false; | 5234 | return false; |
| 5236 | 5235 | ||
| 5237 | /* Check font-related attributes, as those are the most commonly | 5236 | /* Check font-related attributes, as those are the most commonly |
| 5238 | "unsupported" on a window-system (because of missing fonts). */ | 5237 | "unsupported" on a window-system (because of missing fonts). */ |
| 5239 | if (!UNSPECIFIEDP (attrs[LFACE_FAMILY_INDEX]) | 5238 | if (!UNSPECIFIEDP (lattrs[LFACE_FAMILY_INDEX]) |
| 5240 | || !UNSPECIFIEDP (attrs[LFACE_FOUNDRY_INDEX]) | 5239 | || !UNSPECIFIEDP (lattrs[LFACE_FOUNDRY_INDEX]) |
| 5241 | || !UNSPECIFIEDP (attrs[LFACE_HEIGHT_INDEX]) | 5240 | || !UNSPECIFIEDP (lattrs[LFACE_HEIGHT_INDEX]) |
| 5242 | || !UNSPECIFIEDP (attrs[LFACE_WEIGHT_INDEX]) | 5241 | || !UNSPECIFIEDP (lattrs[LFACE_WEIGHT_INDEX]) |
| 5243 | || !UNSPECIFIEDP (attrs[LFACE_SLANT_INDEX]) | 5242 | || !UNSPECIFIEDP (lattrs[LFACE_SLANT_INDEX]) |
| 5244 | || !UNSPECIFIEDP (attrs[LFACE_SWIDTH_INDEX])) | 5243 | || !UNSPECIFIEDP (lattrs[LFACE_SWIDTH_INDEX])) |
| 5245 | { | 5244 | { |
| 5246 | int face_id; | 5245 | int face_id; |
| 5247 | struct face *face; | 5246 | struct face *face; |