diff options
| author | Chong Yidong | 2008-06-30 02:09:21 +0000 |
|---|---|---|
| committer | Chong Yidong | 2008-06-30 02:09:21 +0000 |
| commit | 8d3810fd985abe6eb918e05457d6de28894b085a (patch) | |
| tree | 7c55264a412c0c5eda96266fe6fcda66fad1d2b0 /src | |
| parent | 44b754c7c9125e63e0969b50778654547a9c9097 (diff) | |
| download | emacs-8d3810fd985abe6eb918e05457d6de28894b085a.tar.gz emacs-8d3810fd985abe6eb918e05457d6de28894b085a.zip | |
(Finternal_merge_in_global_face): If default face was modified,
realize it again. Update the font face attribute.
Diffstat (limited to 'src')
| -rw-r--r-- | src/xfaces.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/src/xfaces.c b/src/xfaces.c index 787891ab2c1..4992ee4f7de 100644 --- a/src/xfaces.c +++ b/src/xfaces.c | |||
| @@ -3942,10 +3942,11 @@ Default face attributes override any local face attributes. */) | |||
| 3942 | { | 3942 | { |
| 3943 | int i; | 3943 | int i; |
| 3944 | Lisp_Object global_lface, local_lface, *gvec, *lvec; | 3944 | Lisp_Object global_lface, local_lface, *gvec, *lvec; |
| 3945 | struct frame *f = XFRAME (frame); | ||
| 3945 | 3946 | ||
| 3946 | CHECK_LIVE_FRAME (frame); | 3947 | CHECK_LIVE_FRAME (frame); |
| 3947 | global_lface = lface_from_face_name (NULL, face, 1); | 3948 | global_lface = lface_from_face_name (NULL, face, 1); |
| 3948 | local_lface = lface_from_face_name (XFRAME (frame), face, 0); | 3949 | local_lface = lface_from_face_name (f, face, 0); |
| 3949 | if (NILP (local_lface)) | 3950 | if (NILP (local_lface)) |
| 3950 | local_lface = Finternal_make_lisp_face (face, frame); | 3951 | local_lface = Finternal_make_lisp_face (face, frame); |
| 3951 | 3952 | ||
| @@ -3957,13 +3958,37 @@ Default face attributes override any local face attributes. */) | |||
| 3957 | lvec = XVECTOR (local_lface)->contents; | 3958 | lvec = XVECTOR (local_lface)->contents; |
| 3958 | gvec = XVECTOR (global_lface)->contents; | 3959 | gvec = XVECTOR (global_lface)->contents; |
| 3959 | for (i = 1; i < LFACE_VECTOR_SIZE; ++i) | 3960 | for (i = 1; i < LFACE_VECTOR_SIZE; ++i) |
| 3960 | if (! UNSPECIFIEDP (gvec[i])) | 3961 | if (IGNORE_DEFFACE_P (gvec[i])) |
| 3961 | { | 3962 | lvec[i] = Qunspecified; |
| 3962 | if (IGNORE_DEFFACE_P (gvec[i])) | 3963 | else if (! UNSPECIFIEDP (gvec[i])) |
| 3963 | lvec[i] = Qunspecified; | 3964 | lvec[i] = gvec[i]; |
| 3964 | else | 3965 | |
| 3965 | lvec[i] = gvec[i]; | 3966 | /* If the default face was changed, realize it again, and update the |
| 3966 | } | 3967 | `font' face parameter. */ |
| 3968 | if (EQ (face, Qdefault)) | ||
| 3969 | { | ||
| 3970 | struct face_cache *c = FRAME_FACE_CACHE (f); | ||
| 3971 | struct face *newface, *oldface = FACE_FROM_ID (f, DEFAULT_FACE_ID); | ||
| 3972 | Lisp_Object attrs[LFACE_VECTOR_SIZE]; | ||
| 3973 | |||
| 3974 | bcopy (oldface->lface, attrs, sizeof attrs); | ||
| 3975 | merge_face_vectors (f, lvec, attrs, 0); | ||
| 3976 | newface = realize_face (c, attrs, DEFAULT_FACE_ID); | ||
| 3977 | |||
| 3978 | if ((! UNSPECIFIEDP (gvec[LFACE_FAMILY_INDEX]) | ||
| 3979 | || ! UNSPECIFIEDP (gvec[LFACE_FOUNDRY_INDEX]) | ||
| 3980 | || ! UNSPECIFIEDP (gvec[LFACE_HEIGHT_INDEX]) | ||
| 3981 | || ! UNSPECIFIEDP (gvec[LFACE_WEIGHT_INDEX]) | ||
| 3982 | || ! UNSPECIFIEDP (gvec[LFACE_SLANT_INDEX]) | ||
| 3983 | || ! UNSPECIFIEDP (gvec[LFACE_SWIDTH_INDEX]) | ||
| 3984 | || ! UNSPECIFIEDP (gvec[LFACE_FONT_INDEX])) | ||
| 3985 | && newface->font) | ||
| 3986 | { | ||
| 3987 | Lisp_Object name = newface->font->props[FONT_NAME_INDEX]; | ||
| 3988 | Fmodify_frame_parameters (frame, Fcons (Fcons (Qfont, name), | ||
| 3989 | Qnil)); | ||
| 3990 | } | ||
| 3991 | } | ||
| 3967 | 3992 | ||
| 3968 | return Qnil; | 3993 | return Qnil; |
| 3969 | } | 3994 | } |