X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f25e39b45a5960f8f2bff6c43f88833bc04540a9..94f0aa3464955865f5abdac6b335a86aca3e180a:/src/xfaces.c diff --git a/src/xfaces.c b/src/xfaces.c index 32729ce6f8..476fb1e036 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -1,6 +1,6 @@ /* xfaces.c -- "Face" primitives. -Copyright (C) 1993-1994, 1998-2011 Free Software Foundation, Inc. +Copyright (C) 1993-1994, 1998-2012 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -27,7 +27,7 @@ along with GNU Emacs. If not, see . */ 1. Font family name. - 2. Font foundary name. + 2. Font foundry name. 3. Relative proportionate width, aka character set width or set width (swidth), e.g. `semi-compressed'. @@ -66,7 +66,7 @@ along with GNU Emacs. If not, see . */ attributes (1st thru 5th) are updated from the spec. On the other hand, if one of the other font-related attributes are - specified, the correspoinding specs in this attribute is set to nil. + specified, the corresponding specs in this attribute is set to nil. 15. A face name or list of face names from which to inherit attributes. @@ -293,7 +293,7 @@ along with GNU Emacs. If not, see . */ /* Non-zero if face attribute ATTR is `ignore-defface'. */ -#define IGNORE_DEFFACE_P(ATTR) EQ ((ATTR), Qignore_defface) +#define IGNORE_DEFFACE_P(ATTR) EQ ((ATTR), QCignore_defface) /* Value is the number of elements of VECTOR. */ @@ -332,14 +332,14 @@ static Lisp_Object Qultra_expanded; static Lisp_Object Qreleased_button, Qpressed_button; static Lisp_Object QCstyle, QCcolor, QCline_width; Lisp_Object Qunspecified; /* used in dosfns.c */ -static Lisp_Object Qignore_defface; +static Lisp_Object QCignore_defface; char unspecified_fg[] = "unspecified-fg", unspecified_bg[] = "unspecified-bg"; /* The name of the function to call when the background of the frame has changed, frame_set_background_mode. */ -Lisp_Object Qframe_set_background_mode; +static Lisp_Object Qframe_set_background_mode; /* Names of basic faces. */ @@ -403,7 +403,7 @@ static int next_lface_id; /* A vector mapping Lisp face Id's to face names. */ static Lisp_Object *lface_id_to_name; -static int lface_id_to_name_size; +static ptrdiff_t lface_id_to_name_size; /* TTY color-related functions (defined in tty-colors.el). */ @@ -458,11 +458,11 @@ struct table_entry; struct named_merge_point; static void map_tty_color (struct frame *, struct face *, - enum lface_attribute_index, int *); + enum lface_attribute_index, int *); static Lisp_Object resolve_face_name (Lisp_Object, int); static void set_font_frame_param (Lisp_Object, Lisp_Object); static int get_lface_attributes (struct frame *, Lisp_Object, Lisp_Object *, - int, struct named_merge_point *); + int, struct named_merge_point *); static ptrdiff_t load_pixmap (struct frame *, Lisp_Object, unsigned *, unsigned *); static struct frame *frame_or_selected_frame (Lisp_Object, int); @@ -470,9 +470,9 @@ static void load_face_colors (struct frame *, struct face *, Lisp_Object *); static void free_face_colors (struct frame *, struct face *); static int face_color_gray_p (struct frame *, const char *); static struct face *realize_face (struct face_cache *, Lisp_Object *, - int); + int); static struct face *realize_non_ascii_face (struct frame *, Lisp_Object, - struct face *); + struct face *); static struct face *realize_x_face (struct face_cache *, Lisp_Object *); static struct face *realize_tty_face (struct face_cache *, Lisp_Object *); static int realize_basic_faces (struct frame *); @@ -488,11 +488,11 @@ static void clear_face_gcs (struct face_cache *); static void free_face_cache (struct face_cache *); static int face_fontset (Lisp_Object *); static void merge_face_vectors (struct frame *, Lisp_Object *, Lisp_Object*, - struct named_merge_point *); + struct named_merge_point *); static int merge_face_ref (struct frame *, Lisp_Object, Lisp_Object *, - int, struct named_merge_point *); + int, struct named_merge_point *); static int set_lface_from_font (struct frame *, Lisp_Object, Lisp_Object, - int); + int); static Lisp_Object lface_from_face_name (struct frame *, Lisp_Object, int); static struct face *make_realized_face (Lisp_Object *); static void cache_face (struct face_cache *, struct face *, unsigned); @@ -623,7 +623,8 @@ x_free_colors (struct frame *f, long unsigned int *pixels, int npixels) is called. */ void -x_free_dpy_colors (Display *dpy, Screen *screen, Colormap cmap, long unsigned int *pixels, int npixels) +x_free_dpy_colors (Display *dpy, Screen *screen, Colormap cmap, + long unsigned int *pixels, int npixels) { struct x_display_info *dpyinfo = x_display_info_for_display (dpy); int class = dpyinfo->visual->class; @@ -698,8 +699,8 @@ x_free_gc (struct frame *f, GC gc) static inline GC x_create_gc (struct frame *f, - unsigned long mask, - XGCValues *xgcv) + unsigned long mask, + XGCValues *xgcv) { GC gc = xmalloc (sizeof (*gc)); if (gc) @@ -792,7 +793,7 @@ init_frame_faces (struct frame *f) if (!FRAME_NS_P (f) || FRAME_NS_WINDOW (f)) #endif if (!realize_basic_faces (f)) - abort (); + abort (); } @@ -940,11 +941,13 @@ the pixmap. Bits are stored row by row, each row occupies } } - if (NATNUMP (width) && NATNUMP (height) && STRINGP (data)) + if (STRINGP (data) + && INTEGERP (width) && 0 < XINT (width) + && INTEGERP (height) && 0 < XINT (height)) { - int bytes_per_row = ((XFASTINT (width) + BITS_PER_CHAR - 1) - / BITS_PER_CHAR); - if (SBYTES (data) >= bytes_per_row * XINT (height)) + EMACS_INT bytes_per_row = ((XINT (width) + BITS_PER_CHAR - 1) + / BITS_PER_CHAR); + if (XINT (height) <= SBYTES (data) / bytes_per_row) pixmap_p = 1; } } @@ -961,7 +964,8 @@ the pixmap. Bits are stored row by row, each row occupies if these pointers are not null. */ static ptrdiff_t -load_pixmap (FRAME_PTR f, Lisp_Object name, unsigned int *w_ptr, unsigned int *h_ptr) +load_pixmap (FRAME_PTR f, Lisp_Object name, unsigned int *w_ptr, + unsigned int *h_ptr) { ptrdiff_t bitmap_id; @@ -1055,7 +1059,8 @@ parse_rgb_list (Lisp_Object rgb_list, XColor *color) returned in it. */ static int -tty_lookup_color (struct frame *f, Lisp_Object color, XColor *tty_color, XColor *std_color) +tty_lookup_color (struct frame *f, Lisp_Object color, XColor *tty_color, + XColor *std_color) { Lisp_Object frame, color_desc; @@ -1151,7 +1156,8 @@ tty_defined_color (struct frame *f, const char *color_name, This does the right thing for any type of frame. */ static int -defined_color (struct frame *f, const char *color_name, XColor *color_def, int alloc) +defined_color (struct frame *f, const char *color_name, XColor *color_def, + int alloc) { if (!FRAME_WINDOW_P (f)) return tty_defined_color (f, color_name, color_def, alloc); @@ -1217,7 +1223,7 @@ face_color_gray_p (struct frame *f, const char *color_name) int gray_p; if (defined_color (f, color_name, &color, 0)) - gray_p = (/* Any color sufficiently close to black counts as grey. */ + gray_p = (/* Any color sufficiently close to black counts as gray. */ (color.red < 5000 && color.green < 5000 && color.blue < 5000) || ((eabs (color.red - color.green) @@ -1238,7 +1244,8 @@ face_color_gray_p (struct frame *f, const char *color_name) color. */ static int -face_color_supported_p (struct frame *f, const char *color_name, int background_p) +face_color_supported_p (struct frame *f, const char *color_name, + int background_p) { Lisp_Object frame; XColor not_used; @@ -1311,7 +1318,8 @@ COLOR must be a valid color name. */) these colors. */ unsigned long -load_color (struct frame *f, struct face *face, Lisp_Object name, enum lface_attribute_index target_index) +load_color (struct frame *f, struct face *face, Lisp_Object name, + enum lface_attribute_index target_index) { XColor color; @@ -1719,7 +1727,8 @@ fonts to match. The first MAXIMUM fonts are reported. The optional fifth argument WIDTH, if specified, is a number of columns occupied by a character of a font. In that case, return only fonts the WIDTH times as wide as FACE on FRAME. */) - (Lisp_Object pattern, Lisp_Object face, Lisp_Object frame, Lisp_Object maximum, Lisp_Object width) + (Lisp_Object pattern, Lisp_Object face, Lisp_Object frame, + Lisp_Object maximum, Lisp_Object width) { struct frame *f; int size, avgwidth IF_LINT (= 0); @@ -2057,7 +2066,8 @@ resolve_face_name (Lisp_Object face_name, int signal_p) signal an error if FACE_NAME is not a valid face name. If SIGNAL_P is zero, value is nil if FACE_NAME is not a valid face name. */ static inline Lisp_Object -lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name, int signal_p) +lface_from_face_name_no_resolve (struct frame *f, Lisp_Object face_name, + int signal_p) { Lisp_Object lface; @@ -2099,7 +2109,8 @@ lface_from_face_name (struct frame *f, Lisp_Object face_name, int signal_p) Otherwise, value is zero if FACE_NAME is not a face. */ static inline int -get_lface_attributes_no_remap (struct frame *f, Lisp_Object face_name, Lisp_Object *attrs, int signal_p) +get_lface_attributes_no_remap (struct frame *f, Lisp_Object face_name, + Lisp_Object *attrs, int signal_p) { Lisp_Object lface; @@ -2120,7 +2131,9 @@ get_lface_attributes_no_remap (struct frame *f, Lisp_Object face_name, Lisp_Obje Otherwise, value is zero if FACE_NAME is not a face. */ static inline int -get_lface_attributes (struct frame *f, Lisp_Object face_name, Lisp_Object *attrs, int signal_p, struct named_merge_point *named_merge_points) +get_lface_attributes (struct frame *f, Lisp_Object face_name, + Lisp_Object *attrs, int signal_p, + struct named_merge_point *named_merge_points) { Lisp_Object face_remapping; @@ -2163,7 +2176,7 @@ lface_fully_specified_p (Lisp_Object *attrs) for (i = 1; i < LFACE_VECTOR_SIZE; ++i) if (i != LFACE_FONT_INDEX && i != LFACE_INHERIT_INDEX) if ((UNSPECIFIEDP (attrs[i]) || IGNORE_DEFFACE_P (attrs[i]))) - break; + break; return i == LFACE_VECTOR_SIZE; } @@ -2176,7 +2189,8 @@ lface_fully_specified_p (Lisp_Object *attrs) of FORCE_P. */ static int -set_lface_from_font (struct frame *f, Lisp_Object lface, Lisp_Object font_object, int force_p) +set_lface_from_font (struct frame *f, Lisp_Object lface, + Lisp_Object font_object, int force_p) { Lisp_Object val; struct font *font = XFONT_OBJECT (font_object); @@ -2286,7 +2300,8 @@ merge_face_heights (Lisp_Object from, Lisp_Object to, Lisp_Object invalid) other places. */ static inline void -merge_face_vectors (struct frame *f, Lisp_Object *from, Lisp_Object *to, struct named_merge_point *named_merge_points) +merge_face_vectors (struct frame *f, Lisp_Object *from, Lisp_Object *to, + struct named_merge_point *named_merge_points) { int i; @@ -2353,7 +2368,8 @@ merge_face_vectors (struct frame *f, Lisp_Object *from, Lisp_Object *to, struct merging succeeded. */ static int -merge_named_face (struct frame *f, Lisp_Object face_name, Lisp_Object *to, struct named_merge_point *named_merge_points) +merge_named_face (struct frame *f, Lisp_Object face_name, Lisp_Object *to, + struct named_merge_point *named_merge_points) { struct named_merge_point named_merge_point; @@ -2403,7 +2419,8 @@ merge_named_face (struct frame *f, Lisp_Object face_name, Lisp_Object *to, struc specifications. */ static int -merge_face_ref (struct frame *f, Lisp_Object face_ref, Lisp_Object *to, int err_msgs, struct named_merge_point *named_merge_points) +merge_face_ref (struct frame *f, Lisp_Object face_ref, Lisp_Object *to, + int err_msgs, struct named_merge_point *named_merge_points) { int ok = 1; /* Succeed without an error? */ @@ -2562,7 +2579,7 @@ merge_face_ref (struct frame *f, Lisp_Object face_ref, Lisp_Object *to, int err_ } else if (EQ (keyword, QCstipple)) { -#if defined(HAVE_X_WINDOWS) || defined(HAVE_NS) +#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS) Lisp_Object pixmap_p = Fbitmap_spec_p (value); if (!NILP (pixmap_p)) to[LFACE_STIPPLE_INDEX] = value; @@ -2665,12 +2682,10 @@ Value is a vector of face attributes. */) The mapping from Lisp face to Lisp face id is given by the property `face' of the Lisp face name. */ if (next_lface_id == lface_id_to_name_size) - { - int new_size = max (50, 2 * lface_id_to_name_size); - int sz = new_size * sizeof *lface_id_to_name; - lface_id_to_name = (Lisp_Object *) xrealloc (lface_id_to_name, sz); - lface_id_to_name_size = new_size; - } + lface_id_to_name = + xpalloc (lface_id_to_name, &lface_id_to_name_size, 1, + min (INT_MAX, MOST_POSITIVE_FIXNUM), + sizeof *lface_id_to_name); lface_id_to_name[next_lface_id] = face; Fput (face, Qface, make_number (next_lface_id)); @@ -2836,7 +2851,7 @@ FRAME 0 means change the face on all frames, and change the default The value of that attribute will be inherited from some other face during face merging. See internal_merge_in_global_face. */ if (UNSPECIFIEDP (value)) - value = Qignore_defface; + value = QCignore_defface; } else { @@ -2883,7 +2898,8 @@ FRAME 0 means change the face on all frames, and change the default { /* The default face must have an absolute size. */ if (!INTEGERP (value) || XINT (value) <= 0) - signal_error ("Default face height not absolute and positive", value); + signal_error ("Default face height not absolute and positive", + value); } else { @@ -2893,7 +2909,8 @@ FRAME 0 means change the face on all frames, and change the default make_number (10), Qnil); if (!INTEGERP (test) || XINT (test) <= 0) - signal_error ("Face height does not produce a positive integer", value); + signal_error ("Face height does not produce a positive integer", + value); } } @@ -2972,7 +2989,7 @@ FRAME 0 means change the face on all frames, and change the default int valid_p; /* Allow t meaning a simple box of width 1 in foreground color - of the face. */ + of the face. */ if (EQ (value, Qt)) value = make_number (1); @@ -3078,7 +3095,7 @@ FRAME 0 means change the face on all frames, and change the default } else if (EQ (attr, QCstipple)) { -#if defined(HAVE_X_WINDOWS) || defined(HAVE_NS) +#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS) if (!UNSPECIFIEDP (value) && !IGNORE_DEFFACE_P (value) && !NILP (value) && NILP (Fbitmap_spec_p (value))) @@ -3317,7 +3334,8 @@ FRAME 0 means change the face on all frames, and change the default has been assigned the value NEW_VALUE. */ void -update_face_from_frame_parameter (struct frame *f, Lisp_Object param, Lisp_Object new_value) +update_face_from_frame_parameter (struct frame *f, Lisp_Object param, + Lisp_Object new_value) { Lisp_Object face = Qnil; Lisp_Object lface; @@ -3342,7 +3360,7 @@ update_face_from_frame_parameter (struct frame *f, Lisp_Object param, Lisp_Objec /* Changing the background color might change the background mode, so that we have to load new defface specs. - Call frame-update-face-colors to do that. */ + Call frame-set-background-mode to do that. */ XSETFRAME (frame, f); call1 (Qframe_set_background_mode, frame); @@ -3531,6 +3549,8 @@ x_update_menu_appearance (struct frame *f) rdb != NULL)) { char line[512]; + char *buf = line; + ptrdiff_t bufsize = sizeof line; Lisp_Object lface = lface_from_face_name (f, Qmenu, 1); struct face *face = FACE_FROM_ID (f, MENU_FACE_ID); const char *myname = SSDATA (Vx_resource_name); @@ -3543,24 +3563,25 @@ x_update_menu_appearance (struct frame *f) if (STRINGP (LFACE_FOREGROUND (lface))) { - sprintf (line, "%s.%s*foreground: %s", - myname, popup_path, - SDATA (LFACE_FOREGROUND (lface))); + exprintf (&buf, &bufsize, line, -1, "%s.%s*foreground: %s", + myname, popup_path, + SDATA (LFACE_FOREGROUND (lface))); XrmPutLineResource (&rdb, line); - sprintf (line, "%s.pane.menubar*foreground: %s", - myname, SDATA (LFACE_FOREGROUND (lface))); + exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*foreground: %s", + myname, SDATA (LFACE_FOREGROUND (lface))); XrmPutLineResource (&rdb, line); changed_p = 1; } if (STRINGP (LFACE_BACKGROUND (lface))) { - sprintf (line, "%s.%s*background: %s", - myname, popup_path, - SDATA (LFACE_BACKGROUND (lface))); + exprintf (&buf, &bufsize, line, -1, "%s.%s*background: %s", + myname, popup_path, + SDATA (LFACE_BACKGROUND (lface))); XrmPutLineResource (&rdb, line); - sprintf (line, "%s.pane.menubar*background: %s", - myname, SDATA (LFACE_BACKGROUND (lface))); + + exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*background: %s", + myname, SDATA (LFACE_BACKGROUND (lface))); XrmPutLineResource (&rdb, line); changed_p = 1; } @@ -3598,11 +3619,12 @@ x_update_menu_appearance (struct frame *f) #else char *fontsetname = SSDATA (xlfd); #endif - sprintf (line, "%s.pane.menubar*font%s: %s", - myname, suffix, fontsetname); + exprintf (&buf, &bufsize, line, -1, "%s.pane.menubar*font%s: %s", + myname, suffix, fontsetname); XrmPutLineResource (&rdb, line); - sprintf (line, "%s.%s*font%s: %s", - myname, popup_path, suffix, fontsetname); + + exprintf (&buf, &bufsize, line, -1, "%s.%s*font%s: %s", + myname, popup_path, suffix, fontsetname); XrmPutLineResource (&rdb, line); changed_p = 1; if (fontsetname != SSDATA (xlfd)) @@ -3612,6 +3634,9 @@ x_update_menu_appearance (struct frame *f) if (changed_p && f->output_data.x->menubar_widget) free_frame_menubar (f); + + if (buf != line) + xfree (buf); } } @@ -3631,7 +3656,7 @@ the only relative value that users see is `unspecified'. However, for :height, floating point values are also relative. */) (Lisp_Object attribute, Lisp_Object value) { - if (EQ (value, Qunspecified) || (EQ (value, Qignore_defface))) + if (EQ (value, Qunspecified) || (EQ (value, QCignore_defface))) return Qt; else if (EQ (attribute, QCheight)) return INTEGERP (value) ? Qnil : Qt; @@ -3646,7 +3671,7 @@ If VALUE1 or VALUE2 are absolute (see `face-attribute-relative-p'), then the result will be absolute, otherwise it will be relative. */) (Lisp_Object attribute, Lisp_Object value1, Lisp_Object value2) { - if (EQ (value1, Qunspecified) || EQ (value1, Qignore_defface)) + if (EQ (value1, Qunspecified) || EQ (value1, QCignore_defface)) return value2; else if (EQ (attribute, QCheight)) return merge_face_heights (value1, value2, value1); @@ -4050,7 +4075,7 @@ lface_same_font_attributes_p (Lisp_Object *lface1, Lisp_Object *lface2) xassert (lface_fully_specified_p (lface1) && lface_fully_specified_p (lface2)); return (xstrcasecmp (SSDATA (lface1[LFACE_FAMILY_INDEX]), - SSDATA (lface2[LFACE_FAMILY_INDEX])) == 0 + SSDATA (lface2[LFACE_FAMILY_INDEX])) == 0 && xstrcasecmp (SSDATA (lface1[LFACE_FOUNDRY_INDEX]), SSDATA (lface2[LFACE_FOUNDRY_INDEX])) == 0 && EQ (lface1[LFACE_HEIGHT_INDEX], lface2[LFACE_HEIGHT_INDEX]) @@ -4062,7 +4087,7 @@ lface_same_font_attributes_p (Lisp_Object *lface1, Lisp_Object *lface2) || (STRINGP (lface1[LFACE_FONTSET_INDEX]) && STRINGP (lface2[LFACE_FONTSET_INDEX]) && ! xstrcasecmp (SSDATA (lface1[LFACE_FONTSET_INDEX]), - SSDATA (lface2[LFACE_FONTSET_INDEX])))) + SSDATA (lface2[LFACE_FONTSET_INDEX])))) ); } @@ -4164,13 +4189,13 @@ prepare_face_for_display (struct frame *f, struct face *face) static int color_distance (XColor *x, XColor *y) { - /* This formula is from a paper title `Colour metric' by Thiadmer Riemersma. + /* This formula is from a paper titled `Colour metric' by Thiadmer Riemersma. Quoting from that paper: - This formula has results that are very close to L*u*v* (with the - modified lightness curve) and, more importantly, it is a more even - algorithm: it does not have a range of colours where it suddenly - gives far from optimal results. + This formula has results that are very close to L*u*v* (with the + modified lightness curve) and, more importantly, it is a more even + algorithm: it does not have a range of colors where it suddenly + gives far from optimal results. See for more info. */ @@ -4408,15 +4433,8 @@ cache_face (struct face_cache *c, struct face *face, unsigned int hash) if (i == c->used) { if (c->used == c->size) - { - int new_size, sz; - new_size = min (2 * c->size, MAX_FACE_ID); - if (new_size == c->size) - abort (); /* Alternatives? ++kfs */ - sz = new_size * sizeof *c->faces_by_id; - c->faces_by_id = (struct face **) xrealloc (c->faces_by_id, sz); - c->size = new_size; - } + c->faces_by_id = xpalloc (c->faces_by_id, &c->size, 1, MAX_FACE_ID, + sizeof *c->faces_by_id); c->used++; } @@ -4700,7 +4718,8 @@ face_with_height (struct frame *f, int face_id, int height) default face. FACE_ID is assumed to be already realized. */ int -lookup_derived_face (struct frame *f, Lisp_Object symbol, int face_id, int signal_p) +lookup_derived_face (struct frame *f, Lisp_Object symbol, int face_id, + int signal_p) { Lisp_Object attrs[LFACE_VECTOR_SIZE]; Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; @@ -4756,7 +4775,8 @@ DEFUN ("face-attributes-as-vector", Fface_attributes_as_vector, \(2) `close in spirit' to what the attributes specify, if not exact. */ static int -x_supports_face_attributes_p (struct frame *f, Lisp_Object *attrs, struct face *def_face) +x_supports_face_attributes_p (struct frame *f, Lisp_Object *attrs, + struct face *def_face) { Lisp_Object *def_attrs = def_face->lface; @@ -4857,7 +4877,8 @@ x_supports_face_attributes_p (struct frame *f, Lisp_Object *attrs, struct face * substitution of a `dim' face for italic. */ static int -tty_supports_face_attributes_p (struct frame *f, Lisp_Object *attrs, struct face *def_face) +tty_supports_face_attributes_p (struct frame *f, Lisp_Object *attrs, + struct face *def_face) { int weight; Lisp_Object val, fg, bg; @@ -5009,7 +5030,8 @@ tty_supports_face_attributes_p (struct frame *f, Lisp_Object *attrs, struct face /* See if the capabilities we selected above are supported, with the given colors. */ if (test_caps != 0 && - ! tty_capable_p (FRAME_TTY (f), test_caps, fg_tty_color.pixel, bg_tty_color.pixel)) + ! tty_capable_p (FRAME_TTY (f), test_caps, fg_tty_color.pixel, + bg_tty_color.pixel)) return 0; @@ -5281,8 +5303,8 @@ realize_basic_faces (struct frame *f) { FRAME_FACE_CACHE (f)->menu_face_changed_p = 0; #ifdef USE_X_TOOLKIT - if (FRAME_WINDOW_P (f)) - x_update_menu_appearance (f); + if (FRAME_WINDOW_P (f)) + x_update_menu_appearance (f); #endif } @@ -5402,14 +5424,14 @@ realize_default_face (struct frame *f) if (FRAME_X_P (f) && face->font != FRAME_FONT (f)) { /* This can happen when making a frame on a display that does - not support the default font. */ + not support the default font. */ if (!face->font) - return 0; + return 0; /* Otherwise, the font specified for the frame was not - acceptable as a font for the default face (perhaps because - auto-scaled fonts are rejected), so we must adjust the frame - font. */ + acceptable as a font for the default face (perhaps because + auto-scaled fonts are rejected), so we must adjust the frame + font. */ x_set_font (f, LFACE_FONT (lface), Qnil); } #endif /* HAVE_X_WINDOWS */ @@ -5500,7 +5522,8 @@ realize_face (struct face_cache *cache, Lisp_Object *attrs, int former_face_id) no-font. */ static struct face * -realize_non_ascii_face (struct frame *f, Lisp_Object font_object, struct face *base_face) +realize_non_ascii_face (struct frame *f, Lisp_Object font_object, + struct face *base_face) { struct face_cache *cache = FRAME_FACE_CACHE (f); struct face *face; @@ -5619,7 +5642,7 @@ realize_x_face (struct face_cache *cache, Lisp_Object *attrs) else if (INTEGERP (box)) { /* Simple box of specified line width in foreground color of the - face. */ + face. */ xassert (XINT (box) != 0); face->box = FACE_SIMPLE_BOX; face->box_line_width = XINT (box); @@ -5741,7 +5764,8 @@ realize_x_face (struct face_cache *cache, Lisp_Object *attrs) default foreground/background colors. */ static void -map_tty_color (struct frame *f, struct face *face, enum lface_attribute_index idx, int *defaulted) +map_tty_color (struct frame *f, struct face *face, + enum lface_attribute_index idx, int *defaulted) { Lisp_Object frame, color, def; int foreground_p = idx == LFACE_FOREGROUND_INDEX; @@ -5797,7 +5821,7 @@ map_tty_color (struct frame *f, struct face *face, enum lface_attribute_index id face->lface[idx] = tty_color_name (f, pixel); *defaulted = 1; } - } + } #endif /* MSDOS */ } @@ -5982,9 +6006,18 @@ face_at_buffer_position (struct window *w, EMACS_INT pos, *endptr = endpos; - default_face = FACE_FROM_ID (f, base_face_id >= 0 ? base_face_id - : NILP (Vface_remapping_alist) ? DEFAULT_FACE_ID - : lookup_basic_face (f, DEFAULT_FACE_ID)); + { + int face_id; + + if (base_face_id >= 0) + face_id = base_face_id; + else if (NILP (Vface_remapping_alist)) + face_id = DEFAULT_FACE_ID; + else + face_id = lookup_basic_face (f, DEFAULT_FACE_ID); + + default_face = FACE_FROM_ID (f, face_id); + } /* Optimize common cases where we can use the default face. */ if (noverlays == 0 @@ -6458,7 +6491,7 @@ syms_of_xfaces (void) DEFSYM (Qbackground_color, "background-color"); DEFSYM (Qforeground_color, "foreground-color"); DEFSYM (Qunspecified, "unspecified"); - DEFSYM (Qignore_defface, ":ignore-defface"); + DEFSYM (QCignore_defface, ":ignore-defface"); DEFSYM (Qface_alias, "face-alias"); DEFSYM (Qdefault, "default"); @@ -6566,20 +6599,22 @@ ignore. */); doc: /* Alist of face remappings. Each element is of the form: - (FACE REPLACEMENT...), + (FACE . REPLACEMENT), + +which causes display of the face FACE to use REPLACEMENT instead. +REPLACEMENT is a face specification, i.e. one of the following: -which causes display of the face FACE to use REPLACEMENT... instead. -REPLACEMENT... is interpreted the same way as the value of a `face' -text property: it may be (1) A face name, (2) A list of face names, -(3) A property-list of face attribute/value pairs, or (4) A list of -face names or lists containing face attribute/value pairs. + (1) a face name + (2) a property list of attribute/value pairs, or + (3) a list in which each element has the form of (1) or (2). -Multiple entries in REPLACEMENT... are merged together to form the final -result, with faces or attributes earlier in the list taking precedence -over those that are later. +List values for REPLACEMENT are merged to form the final face +specification, with earlier entries taking precedence, in the same as +as in the `face' text property. -Face-name remapping cycles are suppressed; recursive references use the -underlying face instead of the remapped face. So a remapping of the form: +Face-name remapping cycles are suppressed; recursive references use +the underlying face instead of the remapped face. So a remapping of +the form: (FACE EXTRA-FACE... FACE) @@ -6587,16 +6622,16 @@ or: (FACE (FACE-ATTR VAL ...) FACE) -will cause EXTRA-FACE... or (FACE-ATTR VAL ...) to be _merged_ with the -existing definition of FACE. Note that for the default face, this isn't -necessary, as every face inherits from the default face. +causes EXTRA-FACE... or (FACE-ATTR VAL ...) to be _merged_ with the +existing definition of FACE. Note that this isn't necessary for the +default face, since every face inherits from the default face. -Making this variable buffer-local is a good way to allow buffer-specific -face definitions. For instance, the mode my-mode could define a face -`my-mode-default', and then in the mode setup function, do: +If this variable is made buffer-local, the face remapping takes effect +only in that buffer. For instance, the mode my-mode could define a +face `my-mode-default', and then in the mode setup function, do: (set (make-local-variable 'face-remapping-alist) - '((default my-mode-default)))). + '((default my-mode-default)))). Because Emacs normally only redraws screen areas when the underlying buffer contents change, you may need to call `redraw-display' after