Mercurial > emacs
changeset 91531:24d3fbc119ce
Revert 2008-02-01 change to src/xfaces.c by cyd@stupidchicken.com
Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1051
author | Miles Bader <miles@gnu.org> |
---|---|
date | Tue, 05 Feb 2008 02:36:40 +0000 |
parents | 678a84aa5ccd |
children | c4baafae1dc1 |
files | src/ChangeLog src/xfaces.c |
diffstat | 2 files changed, 71 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Tue Feb 05 02:21:43 2008 +0000 +++ b/src/ChangeLog Tue Feb 05 02:36:40 2008 +0000 @@ -1,3 +1,9 @@ +2008-02-05 Miles Bader <miles@gnu.org> + + * xfaces.c (get_lface_attributes, merge_named_face) + (lookup_named_face, lookup_derived_face, realize_named_face): + Revert 2008-02-01 change by cyd@stupidchicken.com. + 2008-02-04 Kenichi Handa <handa@ni.aist.go.jp> * fontset.c (Ffontset_info): Handle the case of inhibitting the
--- a/src/xfaces.c Tue Feb 05 02:21:43 2008 +0000 +++ b/src/xfaces.c Tue Feb 05 02:36:40 2008 +0000 @@ -492,6 +492,7 @@ static int x_face_list_fonts P_ ((struct frame *, char *, struct font_name **, int, int)); static int font_scalable_p P_ ((struct font_name *)); +static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object *, int)); static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned *)); static unsigned char *xstrlwr P_ ((unsigned char *)); static struct frame *frame_or_selected_frame P_ ((Lisp_Object, int)); @@ -3438,6 +3439,36 @@ } +/* Get face attributes of face FACE_NAME from frame-local faces on + frame F. Store the resulting attributes in ATTRS which must point + to a vector of Lisp_Objects of size LFACE_VECTOR_SIZE. If SIGNAL_P + is non-zero, signal an error if FACE_NAME does not name a face. + Otherwise, value is zero if FACE_NAME is not a face. */ + +static INLINE int +get_lface_attributes (f, face_name, attrs, signal_p) + struct frame *f; + Lisp_Object face_name; + Lisp_Object *attrs; + int signal_p; +{ + Lisp_Object lface; + int success_p; + + lface = lface_from_face_name (f, face_name, signal_p); + if (!NILP (lface)) + { + bcopy (XVECTOR (lface)->contents, attrs, + LFACE_VECTOR_SIZE * sizeof *attrs); + success_p = 1; + } + else + success_p = 0; + + return success_p; +} + + /* Non-zero if all attributes in face attribute vector ATTRS are specified, i.e. are non-nil. */ @@ -3723,14 +3754,12 @@ /* Merge two Lisp face attribute vectors on frame F, FROM and TO, and store the resulting attributes in TO, which must be already be - completely specified and contain only absolute attributes. The - contents of FROM are not altered. - - Every specified attribute of FROM overrides the corresponding - attribute of TO; relative attributes in FROM are merged with the - absolute value in TO and replace it. NAMED_MERGE_POINTS is used - internally to detect loops in face inheritance; it should be 0 when - called from other places. */ + completely specified and contain only absolute attributes. Every + specified attribute of FROM overrides the corresponding attribute of + TO; relative attributes in FROM are merged with the absolute value in + TO and replace it. NAMED_MERGE_POINTS is used internally to detect + loops in face inheritance; it should be 0 when called from other + places. */ static INLINE void merge_face_vectors (f, from, to, named_merge_points) @@ -3794,15 +3823,17 @@ face_name, &named_merge_points)) { struct gcpro gcpro1; - Lisp_Object lface = lface_from_face_name (f, face_name, 0); - if (NILP (lface)) - return 0; - - GCPRO1 (named_merge_point.face_name); - merge_face_vectors (f, XVECTOR (lface)->contents, to, - named_merge_points); - UNGCPRO; - return 1; + Lisp_Object from[LFACE_VECTOR_SIZE]; + int ok = get_lface_attributes (f, face_name, from, 0); + + if (ok) + { + GCPRO1 (named_merge_point.face_name); + merge_face_vectors (f, from, to, named_merge_points); + UNGCPRO; + } + + return ok; } else return 0; @@ -3829,8 +3860,6 @@ (BACKGROUND-COLOR . COLOR) where COLOR is a color name. This is for compatibility with 20.2. - The contents of FACE_REF is not altered by this function. - Face specifications earlier in lists take precedence over later specifications. */ @@ -6088,7 +6117,8 @@ Lisp_Object symbol; int signal_p; { - Lisp_Object lface, attrs[LFACE_VECTOR_SIZE]; + Lisp_Object attrs[LFACE_VECTOR_SIZE]; + Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); if (default_face == NULL) @@ -6100,12 +6130,11 @@ abort (); /* realize_basic_faces must have set it up */ } - lface = lface_from_face_name (f, symbol, signal_p); - if (NILP (lface)) + if (!get_lface_attributes (f, symbol, symbol_attrs, signal_p)) return -1; bcopy (default_face->lface, attrs, sizeof attrs); - merge_face_vectors (f, XVECTOR (lface)->contents, attrs, 0); + merge_face_vectors (f, symbol_attrs, attrs, 0); return lookup_face (f, attrs); } @@ -6236,16 +6265,16 @@ int face_id; int signal_p; { - Lisp_Object lface, attrs[LFACE_VECTOR_SIZE]; + Lisp_Object attrs[LFACE_VECTOR_SIZE]; Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; struct face *default_face = FACE_FROM_ID (f, face_id); if (!default_face) abort (); - lface = lface_from_face_name (f, symbol, signal_p); + get_lface_attributes (f, symbol, symbol_attrs, signal_p); bcopy (default_face->lface, attrs, sizeof attrs); - merge_face_vectors (f, XVECTOR (lface)->contents, attrs, 0); + merge_face_vectors (f, symbol_attrs, attrs, 0); return lookup_face (f, attrs); } @@ -7536,16 +7565,18 @@ Lisp_Object symbol; int id; { + struct face_cache *c = FRAME_FACE_CACHE (f); Lisp_Object lface = lface_from_face_name (f, symbol, 0); Lisp_Object attrs[LFACE_VECTOR_SIZE]; - struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); + Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; + struct face *new_face; /* The default face must exist and be fully specified. */ - bcopy (default_face->lface, attrs, LFACE_VECTOR_SIZE * sizeof *attrs); + get_lface_attributes (f, Qdefault, attrs, 1); check_lface_attrs (attrs); xassert (lface_fully_specified_p (attrs)); - /* If SYMBOL isn't known as a face, create it. */ + /* If SYMBOL isn't know as a face, create it. */ if (NILP (lface)) { Lisp_Object frame; @@ -7554,8 +7585,11 @@ } /* Merge SYMBOL's face with the default face. */ - merge_face_vectors (f, XVECTOR (lface)->contents, attrs, 0); - realize_face (FRAME_FACE_CACHE (f), attrs, id); + get_lface_attributes (f, symbol, symbol_attrs, 1); + merge_face_vectors (f, symbol_attrs, attrs, 0); + + /* Realize the face. */ + new_face = realize_face (c, attrs, id); }