X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/a4ada374d6f96b5a7b9fe8df57307fae3fcd3351..72af86bd8cf1812d1fcc8924c4093d692040a664:/src/xfaces.c diff --git a/src/xfaces.c b/src/xfaces.c index 4c7f2d969d..d4d68ebdbc 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -1,6 +1,6 @@ /* xfaces.c -- "Face" primitives. Copyright (C) 1993, 1994, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -510,56 +510,56 @@ int menu_face_changed_default; struct table_entry; struct named_merge_point; -static void map_tty_color P_ ((struct frame *, struct face *, - enum lface_attribute_index, int *)); -static Lisp_Object resolve_face_name P_ ((Lisp_Object, int)); -static int may_use_scalable_font_p P_ ((const char *)); -static void set_font_frame_param P_ ((Lisp_Object, Lisp_Object)); -static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object *, - int, struct named_merge_point *)); -static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned *)); -static struct frame *frame_or_selected_frame P_ ((Lisp_Object, int)); -static void load_face_colors P_ ((struct frame *, struct face *, Lisp_Object *)); -static void free_face_colors P_ ((struct frame *, struct face *)); -static int face_color_gray_p P_ ((struct frame *, char *)); -static struct face *realize_face P_ ((struct face_cache *, Lisp_Object *, - int)); -static struct face *realize_non_ascii_face P_ ((struct frame *, Lisp_Object, - struct face *)); -static struct face *realize_x_face P_ ((struct face_cache *, Lisp_Object *)); -static struct face *realize_tty_face P_ ((struct face_cache *, Lisp_Object *)); -static int realize_basic_faces P_ ((struct frame *)); -static int realize_default_face P_ ((struct frame *)); -static void realize_named_face P_ ((struct frame *, Lisp_Object, int)); -static int lface_fully_specified_p P_ ((Lisp_Object *)); -static int lface_equal_p P_ ((Lisp_Object *, Lisp_Object *)); -static unsigned hash_string_case_insensitive P_ ((Lisp_Object)); -static unsigned lface_hash P_ ((Lisp_Object *)); -static int lface_same_font_attributes_p P_ ((Lisp_Object *, Lisp_Object *)); -static struct face_cache *make_face_cache P_ ((struct frame *)); -static void clear_face_gcs P_ ((struct face_cache *)); -static void free_face_cache P_ ((struct face_cache *)); -static int face_fontset P_ ((Lisp_Object *)); -static void merge_face_vectors P_ ((struct frame *, Lisp_Object *, Lisp_Object*, - struct named_merge_point *)); -static int merge_face_ref P_ ((struct frame *, Lisp_Object, Lisp_Object *, - int, struct named_merge_point *)); -static int set_lface_from_font P_ ((struct frame *, Lisp_Object, Lisp_Object, - int)); -static Lisp_Object lface_from_face_name P_ ((struct frame *, Lisp_Object, int)); -static struct face *make_realized_face P_ ((Lisp_Object *)); -static void cache_face P_ ((struct face_cache *, struct face *, unsigned)); -static void uncache_face P_ ((struct face_cache *, struct face *)); +static void map_tty_color (struct frame *, struct face *, + enum lface_attribute_index, int *); +static Lisp_Object resolve_face_name (Lisp_Object, int); +static int may_use_scalable_font_p (const char *); +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 *); +static int load_pixmap (struct frame *, Lisp_Object, unsigned *, unsigned *); +static struct frame *frame_or_selected_frame (Lisp_Object, int); +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 *, char *); +static struct face *realize_face (struct face_cache *, Lisp_Object *, + int); +static struct face *realize_non_ascii_face (struct frame *, Lisp_Object, + 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 *); +static int realize_default_face (struct frame *); +static void realize_named_face (struct frame *, Lisp_Object, int); +static int lface_fully_specified_p (Lisp_Object *); +static int lface_equal_p (Lisp_Object *, Lisp_Object *); +static unsigned hash_string_case_insensitive (Lisp_Object); +static unsigned lface_hash (Lisp_Object *); +static int lface_same_font_attributes_p (Lisp_Object *, Lisp_Object *); +static struct face_cache *make_face_cache (struct frame *); +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 *); +static int merge_face_ref (struct frame *, Lisp_Object, Lisp_Object *, + int, struct named_merge_point *); +static int set_lface_from_font (struct frame *, Lisp_Object, Lisp_Object, + 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); +static void uncache_face (struct face_cache *, struct face *); #ifdef HAVE_WINDOW_SYSTEM -static GC x_create_gc P_ ((struct frame *, unsigned long, XGCValues *)); -static void x_free_gc P_ ((struct frame *, GC)); +static GC x_create_gc (struct frame *, unsigned long, XGCValues *); +static void x_free_gc (struct frame *, GC); #ifdef USE_X_TOOLKIT -static void x_update_menu_appearance P_ ((struct frame *)); +static void x_update_menu_appearance (struct frame *); -extern void free_frame_menubar P_ ((struct frame *)); +extern void free_frame_menubar (struct frame *); #endif /* USE_X_TOOLKIT */ #endif /* HAVE_WINDOW_SYSTEM */ @@ -656,10 +656,7 @@ DEFUN ("dump-colors", Fdump_colors, Sdump_colors, 0, 0, 0, is called. */ void -x_free_colors (f, pixels, npixels) - struct frame *f; - unsigned long *pixels; - int npixels; +x_free_colors (struct frame *f, long unsigned int *pixels, int npixels) { int class = FRAME_X_DISPLAY_INFO (f)->visual->class; @@ -681,12 +678,7 @@ x_free_colors (f, pixels, npixels) is called. */ void -x_free_dpy_colors (dpy, screen, cmap, pixels, npixels) - Display *dpy; - Screen *screen; - Colormap cmap; - unsigned long *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; @@ -707,10 +699,7 @@ x_free_dpy_colors (dpy, screen, cmap, pixels, npixels) are given by XGCV and MASK. */ static INLINE GC -x_create_gc (f, mask, xgcv) - struct frame *f; - unsigned long mask; - XGCValues *xgcv; +x_create_gc (struct frame *f, long unsigned int mask, XGCValues *xgcv) { GC gc; BLOCK_INPUT; @@ -724,9 +713,7 @@ x_create_gc (f, mask, xgcv) /* Free GC which was used on frame F. */ static INLINE void -x_free_gc (f, gc) - struct frame *f; - GC gc; +x_free_gc (struct frame *f, GC gc) { eassert (interrupt_input_blocked); IF_DEBUG (xassert (--ngcs >= 0)); @@ -777,7 +764,7 @@ x_create_gc (f, mask, xgcv) { GC gc = xmalloc (sizeof (*gc)); if (gc) - bcopy(xgcv, gc, sizeof(XGCValues)); + memcpy (gc, xgcv, sizeof (XGCValues)); return gc; } @@ -794,8 +781,7 @@ x_free_gc (f, gc) are in ISO8859-1. */ int -xstrcasecmp (s1, s2) - const unsigned char *s1, *s2; +xstrcasecmp (const unsigned char *s1, const unsigned char *s2) { while (*s1 && *s2) { @@ -819,9 +805,7 @@ xstrcasecmp (s1, s2) Lisp function definitions. */ static INLINE struct frame * -frame_or_selected_frame (frame, nparam) - Lisp_Object frame; - int nparam; +frame_or_selected_frame (Lisp_Object frame, int nparam) { if (NILP (frame)) frame = selected_frame; @@ -838,8 +822,7 @@ frame_or_selected_frame (frame, nparam) /* Initialize face cache and basic faces for frame F. */ void -init_frame_faces (f) - struct frame *f; +init_frame_faces (struct frame *f) { /* Make a face cache, if F doesn't have one. */ if (FRAME_FACE_CACHE (f) == NULL) @@ -877,8 +860,7 @@ init_frame_faces (f) /* Free face cache of frame F. Called from delete_frame. */ void -free_frame_faces (f) - struct frame *f; +free_frame_faces (struct frame *f) { struct face_cache *face_cache = FRAME_FACE_CACHE (f); @@ -909,8 +891,7 @@ free_frame_faces (f) of named faces. */ void -recompute_basic_faces (f) - struct frame *f; +recompute_basic_faces (struct frame *f) { if (FRAME_FACE_CACHE (f)) { @@ -925,8 +906,7 @@ recompute_basic_faces (f) try to free unused fonts, too. */ void -clear_face_cache (clear_fonts_p) - int clear_fonts_p; +clear_face_cache (int clear_fonts_p) { #ifdef HAVE_WINDOW_SYSTEM Lisp_Object tail, frame; @@ -1045,10 +1025,7 @@ the pixmap. Bits are stored row by row, each row occupies if these pointers are not null. */ static int -load_pixmap (f, name, w_ptr, h_ptr) - FRAME_PTR f; - Lisp_Object name; - unsigned int *w_ptr, *h_ptr; +load_pixmap (FRAME_PTR f, Lisp_Object name, unsigned int *w_ptr, unsigned int *h_ptr) { int bitmap_id; @@ -1117,9 +1094,7 @@ load_pixmap (f, name, w_ptr, h_ptr) Return 0 if there's a problem with RGB_LIST, otherwise return 1. */ static int -parse_rgb_list (rgb_list, color) - Lisp_Object rgb_list; - XColor *color; +parse_rgb_list (Lisp_Object rgb_list, XColor *color) { #define PARSE_RGB_LIST_FIELD(field) \ if (CONSP (rgb_list) && INTEGERP (XCAR (rgb_list))) \ @@ -1144,10 +1119,7 @@ parse_rgb_list (rgb_list, color) returned in it. */ static int -tty_lookup_color (f, color, tty_color, std_color) - struct frame *f; - Lisp_Object color; - XColor *tty_color, *std_color; +tty_lookup_color (struct frame *f, Lisp_Object color, XColor *tty_color, XColor *std_color) { Lisp_Object frame, color_desc; @@ -1207,11 +1179,7 @@ tty_lookup_color (f, color, tty_color, std_color) /* A version of defined_color for non-X frames. */ int -tty_defined_color (f, color_name, color_def, alloc) - struct frame *f; - char *color_name; - XColor *color_def; - int alloc; +tty_defined_color (struct frame *f, char *color_name, XColor *color_def, int alloc) { int status = 1; @@ -1246,11 +1214,7 @@ tty_defined_color (f, color_name, color_def, alloc) This does the right thing for any type of frame. */ int -defined_color (f, color_name, color_def, alloc) - struct frame *f; - char *color_name; - XColor *color_def; - int alloc; +defined_color (struct frame *f, char *color_name, XColor *color_def, int alloc) { if (!FRAME_WINDOW_P (f)) return tty_defined_color (f, color_name, color_def, alloc); @@ -1275,9 +1239,7 @@ defined_color (f, color_name, color_def, alloc) Lisp string. */ Lisp_Object -tty_color_name (f, idx) - struct frame *f; - int idx; +tty_color_name (struct frame *f, int idx) { if (idx >= 0 && !NILP (Ffboundp (Qtty_color_by_index))) { @@ -1312,9 +1274,7 @@ tty_color_name (f, idx) The criterion implemented here is not a terribly sophisticated one. */ static int -face_color_gray_p (f, color_name) - struct frame *f; - char *color_name; +face_color_gray_p (struct frame *f, char *color_name) { XColor color; int gray_p; @@ -1341,10 +1301,7 @@ face_color_gray_p (f, color_name) color. */ static int -face_color_supported_p (f, color_name, background_p) - struct frame *f; - char *color_name; - int background_p; +face_color_supported_p (struct frame *f, char *color_name, int background_p) { Lisp_Object frame; XColor not_used; @@ -1419,11 +1376,7 @@ COLOR must be a valid color name. */) these colors. */ unsigned long -load_color (f, face, name, target_index) - 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; @@ -1494,10 +1447,7 @@ load_color (f, face, name, target_index) try to emulate gray colors with a stipple from Vface_default_stipple. */ static void -load_face_colors (f, face, attrs) - struct frame *f; - struct face *face; - Lisp_Object *attrs; +load_face_colors (struct frame *f, struct face *face, Lisp_Object *attrs) { Lisp_Object fg, bg; @@ -1533,9 +1483,7 @@ load_face_colors (f, face, attrs) /* Free color PIXEL on frame F. */ void -unload_color (f, pixel) - struct frame *f; - unsigned long pixel; +unload_color (struct frame *f, long unsigned int pixel) { #ifdef HAVE_X_WINDOWS if (pixel != -1) @@ -1551,9 +1499,7 @@ unload_color (f, pixel) /* Free colors allocated for FACE. */ static void -free_face_colors (f, face) - struct frame *f; - struct face *face; +free_face_colors (struct frame *f, struct face *face) { /* PENDING(NS): need to do something here? */ #ifdef HAVE_X_WINDOWS @@ -1693,8 +1639,7 @@ static int font_sort_order[4]; static enum font_property_index font_props_for_sorting[FONT_SIZE_INDEX]; static int -compare_fonts_by_sort_order (v1, v2) - const void *v1, *v2; +compare_fonts_by_sort_order (const void *v1, const void *v2) { Lisp_Object font1 = *(Lisp_Object *) v1; Lisp_Object font2 = *(Lisp_Object *) v2; @@ -1745,8 +1690,8 @@ the face font sort order. */) (family, frame) Lisp_Object family, frame; { - Lisp_Object font_spec, vec; - int i, nfonts; + Lisp_Object font_spec, list, *drivers, vec; + int i, nfonts, ndrivers; Lisp_Object result; if (NILP (frame)) @@ -1759,32 +1704,38 @@ the face font sort order. */) CHECK_STRING (family); font_parse_family_registry (family, Qnil, font_spec); } - vec = font_list_entities (frame, font_spec); - nfonts = ASIZE (vec); - if (nfonts == 0) + + list = font_list_entities (frame, font_spec); + if (NILP (list)) return Qnil; - if (nfonts > 1) - { - for (i = 0; i < 4; i++) - switch (font_sort_order[i]) - { - case XLFD_SWIDTH: - font_props_for_sorting[i] = FONT_WIDTH_INDEX; break; - case XLFD_POINT_SIZE: - font_props_for_sorting[i] = FONT_SIZE_INDEX; break; - case XLFD_WEIGHT: - font_props_for_sorting[i] = FONT_WEIGHT_INDEX; break; - default: - font_props_for_sorting[i] = FONT_SLANT_INDEX; break; - } - font_props_for_sorting[i++] = FONT_FAMILY_INDEX; - font_props_for_sorting[i++] = FONT_FOUNDRY_INDEX; - font_props_for_sorting[i++] = FONT_ADSTYLE_INDEX; - font_props_for_sorting[i++] = FONT_REGISTRY_INDEX; - qsort (XVECTOR (vec)->contents, nfonts, sizeof (Lisp_Object), - compare_fonts_by_sort_order); - } + /* Sort the font entities. */ + for (i = 0; i < 4; i++) + switch (font_sort_order[i]) + { + case XLFD_SWIDTH: + font_props_for_sorting[i] = FONT_WIDTH_INDEX; break; + case XLFD_POINT_SIZE: + font_props_for_sorting[i] = FONT_SIZE_INDEX; break; + case XLFD_WEIGHT: + font_props_for_sorting[i] = FONT_WEIGHT_INDEX; break; + default: + font_props_for_sorting[i] = FONT_SLANT_INDEX; break; + } + font_props_for_sorting[i++] = FONT_FAMILY_INDEX; + font_props_for_sorting[i++] = FONT_FOUNDRY_INDEX; + font_props_for_sorting[i++] = FONT_ADSTYLE_INDEX; + font_props_for_sorting[i++] = FONT_REGISTRY_INDEX; + + ndrivers = XINT (Flength (list)); + drivers = alloca (sizeof (Lisp_Object) * ndrivers); + for (i = 0; i < ndrivers; i++, list = XCDR (list)) + drivers[i] = XCAR (list); + vec = Fvconcat (ndrivers, drivers); + nfonts = ASIZE (vec); + + qsort (XVECTOR (vec)->contents, nfonts, sizeof (Lisp_Object), + compare_fonts_by_sort_order); result = Qnil; for (i = nfonts - 1; i >= 0; --i) @@ -2144,9 +2095,7 @@ resolve_face_name_error (ignore) Return default face in case of errors. */ static Lisp_Object -resolve_face_name (face_name, signal_p) - Lisp_Object face_name; - int signal_p; +resolve_face_name (Lisp_Object face_name, int signal_p) { Lisp_Object orig_face; Lisp_Object tortoise, hare; @@ -2192,10 +2141,7 @@ resolve_face_name (face_name, 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 (f, face_name, signal_p) - 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; @@ -2223,10 +2169,7 @@ lface_from_face_name_no_resolve (f, face_name, signal_p) 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 (f, face_name, signal_p) - struct frame *f; - Lisp_Object face_name; - int signal_p; +lface_from_face_name (struct frame *f, Lisp_Object face_name, int signal_p) { face_name = resolve_face_name (face_name, signal_p); return lface_from_face_name_no_resolve (f, face_name, signal_p); @@ -2240,19 +2183,15 @@ lface_from_face_name (f, face_name, signal_p) Otherwise, value is zero if FACE_NAME is not a face. */ static INLINE int -get_lface_attributes_no_remap (f, face_name, attrs, signal_p) - 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; lface = lface_from_face_name_no_resolve (f, face_name, signal_p); if (! NILP (lface)) - bcopy (XVECTOR (lface)->contents, attrs, - LFACE_VECTOR_SIZE * sizeof *attrs); + memcpy (attrs, XVECTOR (lface)->contents, + LFACE_VECTOR_SIZE * sizeof *attrs); return !NILP (lface); } @@ -2265,12 +2204,7 @@ get_lface_attributes_no_remap (f, face_name, attrs, signal_p) Otherwise, value is zero if FACE_NAME is not a face. */ static INLINE int -get_lface_attributes (f, face_name, attrs, signal_p, named_merge_points) - 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; @@ -2306,8 +2240,7 @@ get_lface_attributes (f, face_name, attrs, signal_p, named_merge_points) specified, i.e. are non-nil. */ static int -lface_fully_specified_p (attrs) - Lisp_Object *attrs; +lface_fully_specified_p (Lisp_Object *attrs) { int i; @@ -2327,10 +2260,7 @@ lface_fully_specified_p (attrs) of FORCE_P. */ static int -set_lface_from_font (f, lface, font_object, force_p) - struct frame *f; - Lisp_Object lface, 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); @@ -2391,8 +2321,7 @@ set_lface_from_font (f, lface, font_object, force_p) unless both FROM and TO are relative. */ Lisp_Object -merge_face_heights (from, to, invalid) - Lisp_Object from, to, invalid; +merge_face_heights (Lisp_Object from, Lisp_Object to, Lisp_Object invalid) { Lisp_Object result = invalid; @@ -2441,10 +2370,7 @@ merge_face_heights (from, to, invalid) other places. */ static INLINE void -merge_face_vectors (f, from, to, named_merge_points) - struct frame *f; - Lisp_Object *from, *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; @@ -2511,11 +2437,7 @@ merge_face_vectors (f, from, to, named_merge_points) merging succeeded. */ static int -merge_named_face (f, face_name, to, named_merge_points) - 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; @@ -2565,12 +2487,7 @@ merge_named_face (f, face_name, to, named_merge_points) specifications. */ static int -merge_face_ref (f, face_ref, to, err_msgs, named_merge_points) - 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? */ @@ -2885,6 +2802,7 @@ Value is a vector of face attributes. */) DEFUN ("internal-lisp-face-p", Finternal_lisp_face_p, Sinternal_lisp_face_p, 1, 2, 0, doc: /* Return non-nil if FACE names a face. +FACE should be a symbol or string. If optional second argument FRAME is non-nil, check for the existence of a frame-local face with name FACE on that frame. Otherwise check for the existence of a global face. */) @@ -2943,8 +2861,8 @@ The value is TO. */) copy = Finternal_make_lisp_face (to, new_frame); } - bcopy (XVECTOR (lface)->contents, XVECTOR (copy)->contents, - LFACE_VECTOR_SIZE * sizeof (Lisp_Object)); + memcpy (XVECTOR (copy)->contents, XVECTOR (lface)->contents, + LFACE_VECTOR_SIZE * sizeof (Lisp_Object)); /* Changing a named face means that all realized faces depending on that face are invalid. Since we cannot tell which realized faces @@ -3483,44 +3401,11 @@ FRAME 0 means change the face on all frames, and change the default } -#ifdef HAVE_WINDOW_SYSTEM - -/* Set the `font' frame parameter of FRAME determined from the - font-object set in `default' face attributes LFACE. */ - -static void -set_font_frame_param (frame, lface) - Lisp_Object frame, lface; -{ - struct frame *f = XFRAME (frame); - Lisp_Object font; - - if (FRAME_WINDOW_P (f) - /* Don't do anything if the font is `unspecified'. This can - happen during frame creation. */ - && (font = LFACE_FONT (lface), - ! UNSPECIFIEDP (font))) - { - if (FONT_SPEC_P (font)) - { - font = font_load_for_lface (f, XVECTOR (lface)->contents, font); - if (NILP (font)) - return; - LFACE_FONT (lface) = font; - } - f->default_face_done_p = 0; - Fmodify_frame_parameters (frame, Fcons (Fcons (Qfont, font), Qnil)); - } -} - - /* Update the corresponding face when frame parameter PARAM on frame F has been assigned the value NEW_VALUE. */ void -update_face_from_frame_parameter (f, param, new_value) - struct frame *f; - Lisp_Object param, new_value; +update_face_from_frame_parameter (struct frame *f, Lisp_Object param, Lisp_Object new_value) { Lisp_Object face = Qnil; Lisp_Object lface; @@ -3555,6 +3440,7 @@ update_face_from_frame_parameter (f, param, new_value) ? new_value : Qunspecified); realize_basic_faces (f); } +#ifdef HAVE_WINDOW_SYSTEM else if (EQ (param, Qborder_color)) { face = Qborder; @@ -3576,6 +3462,7 @@ update_face_from_frame_parameter (f, param, new_value) LFACE_BACKGROUND (lface) = (STRINGP (new_value) ? new_value : Qunspecified); } +#endif /* Changing a named face means that all realized faces depending on that face are invalid. Since we cannot tell which realized faces @@ -3591,6 +3478,36 @@ update_face_from_frame_parameter (f, param, new_value) } +#ifdef HAVE_WINDOW_SYSTEM + +/* Set the `font' frame parameter of FRAME determined from the + font-object set in `default' face attributes LFACE. */ + +static void +set_font_frame_param (Lisp_Object frame, Lisp_Object lface) +{ + struct frame *f = XFRAME (frame); + Lisp_Object font; + + if (FRAME_WINDOW_P (f) + /* Don't do anything if the font is `unspecified'. This can + happen during frame creation. */ + && (font = LFACE_FONT (lface), + ! UNSPECIFIEDP (font))) + { + if (FONT_SPEC_P (font)) + { + font = font_load_for_lface (f, XVECTOR (lface)->contents, font); + if (NILP (font)) + return; + LFACE_FONT (lface) = font; + } + f->default_face_done_p = 0; + Fmodify_frame_parameters (frame, Fcons (Fcons (Qfont, font), Qnil)); + } +} + + /* Get the value of X resource RESOURCE, class CLASS for the display of frame FRAME. This is here because ordinary `x-get-resource' doesn't take a frame argument. */ @@ -3618,9 +3535,7 @@ DEFUN ("internal-face-x-get-resource", Finternal_face_x_get_resource, error; if SIGNAL_P is zero, return 0. */ static Lisp_Object -face_boolean_x_resource_value (value, signal_p) - Lisp_Object value; - int signal_p; +face_boolean_x_resource_value (Lisp_Object value, int signal_p) { Lisp_Object result = make_number (0); @@ -3771,7 +3686,7 @@ x_update_menu_appearance (f) { #if defined HAVE_X_I18N extern char *xic_create_fontsetname - P_ ((char *base_fontname, Bool motif)); + (char *base_fontname, Bool motif); char *fontsetname = xic_create_fontsetname (SDATA (xlfd), motif); #else char *fontsetname = (char *) SDATA (xlfd); @@ -3975,9 +3890,9 @@ Default face attributes override any local face attributes. */) { /* Ensure that the face vector is fully specified by merging the previously-cached vector. */ - bcopy (oldface->lface, attrs, sizeof attrs); + memcpy (attrs, oldface->lface, sizeof attrs); merge_face_vectors (f, lvec, attrs, 0); - bcopy (attrs, lvec, sizeof attrs); + memcpy (lvec, attrs, sizeof attrs); newface = realize_face (c, lvec, DEFAULT_FACE_ID); if ((! UNSPECIFIEDP (gvec[LFACE_FAMILY_INDEX]) @@ -4066,8 +3981,7 @@ return the font name used for CHARACTER. */) is called quite often. */ static INLINE int -face_attr_equal_p (v1, v2) - Lisp_Object v1, v2; +face_attr_equal_p (Lisp_Object v1, Lisp_Object v2) { /* Type can differ, e.g. when one attribute is unspecified, i.e. nil, and the other is specified. */ @@ -4083,7 +3997,7 @@ face_attr_equal_p (v1, v2) if (SBYTES (v1) != SBYTES (v2)) return 0; - return bcmp (SDATA (v1), SDATA (v2), SBYTES (v1)) == 0; + return memcmp (SDATA (v1), SDATA (v2), SBYTES (v1)) == 0; case_Lisp_Int: case Lisp_Symbol: @@ -4100,8 +4014,7 @@ face_attr_equal_p (v1, v2) is called quite often. */ static INLINE int -lface_equal_p (v1, v2) - Lisp_Object *v1, *v2; +lface_equal_p (Lisp_Object *v1, Lisp_Object *v2) { int i, equal_p = 1; @@ -4189,8 +4102,7 @@ For internal use only. */) below in computing a hash value for a Lisp face. */ static INLINE unsigned -hash_string_case_insensitive (string) - Lisp_Object string; +hash_string_case_insensitive (Lisp_Object string) { const unsigned char *s; unsigned hash = 0; @@ -4204,8 +4116,7 @@ hash_string_case_insensitive (string) /* Return a hash code for face attribute vector V. */ static INLINE unsigned -lface_hash (v) - Lisp_Object *v; +lface_hash (Lisp_Object *v) { return (hash_string_case_insensitive (v[LFACE_FAMILY_INDEX]) ^ hash_string_case_insensitive (v[LFACE_FOUNDRY_INDEX]) @@ -4224,8 +4135,7 @@ lface_hash (v) LFACE1 and LFACE2 must be fully-specified. */ static INLINE int -lface_same_font_attributes_p (lface1, lface2) - Lisp_Object *lface1, *lface2; +lface_same_font_attributes_p (Lisp_Object *lface1, Lisp_Object *lface2) { xassert (lface_fully_specified_p (lface1) && lface_fully_specified_p (lface2)); @@ -4256,13 +4166,12 @@ lface_same_font_attributes_p (lface1, lface2) vector ATTR. */ static struct face * -make_realized_face (attr) - Lisp_Object *attr; +make_realized_face (Lisp_Object *attr) { struct face *face = (struct face *) xmalloc (sizeof *face); - bzero (face, sizeof *face); + memset (face, 0, sizeof *face); face->ascii_face = face; - bcopy (attr, face->lface, sizeof face->lface); + memcpy (face->lface, attr, sizeof face->lface); return face; } @@ -4271,9 +4180,7 @@ make_realized_face (attr) be null. */ void -free_realized_face (f, face) - struct frame *f; - struct face *face; +free_realized_face (struct frame *f, struct face *face) { if (face) { @@ -4308,9 +4215,7 @@ free_realized_face (f, face) by clearing the face cache. */ void -prepare_face_for_display (f, face) - struct frame *f; - struct face *face; +prepare_face_for_display (struct frame *f, struct face *face) { #ifdef HAVE_WINDOW_SYSTEM xassert (FRAME_WINDOW_P (f)); @@ -4347,8 +4252,7 @@ prepare_face_for_display (f, face) /* Returns the `distance' between the colors X and Y. */ static int -color_distance (x, y) - XColor *x, *y; +color_distance (XColor *x, XColor *y) { /* This formula is from a paper title `Colour metric' by Thiadmer Riemersma. Quoting from that paper: @@ -4406,17 +4310,16 @@ If FRAME is unspecified or nil, the current frame is used. */) /* Return a new face cache for frame F. */ static struct face_cache * -make_face_cache (f) - struct frame *f; +make_face_cache (struct frame *f) { struct face_cache *c; int size; c = (struct face_cache *) xmalloc (sizeof *c); - bzero (c, sizeof *c); + memset (c, 0, sizeof *c); size = FACE_CACHE_BUCKETS_SIZE * sizeof *c->buckets; c->buckets = (struct face **) xmalloc (size); - bzero (c->buckets, size); + memset (c->buckets, 0, size); c->size = 50; c->faces_by_id = (struct face **) xmalloc (c->size * sizeof *c->faces_by_id); c->f = f; @@ -4430,8 +4333,7 @@ make_face_cache (f) keeping too many graphics contexts that are no longer needed. */ static void -clear_face_gcs (c) - struct face_cache *c; +clear_face_gcs (struct face_cache *c) { if (c && FRAME_WINDOW_P (c->f)) { @@ -4461,8 +4363,7 @@ clear_face_gcs (c) event doesn't try to use faces we destroyed. */ static void -free_realized_faces (c) - struct face_cache *c; +free_realized_faces (struct face_cache *c) { if (c && c->used) { @@ -4482,7 +4383,7 @@ free_realized_faces (c) c->used = 0; size = FACE_CACHE_BUCKETS_SIZE * sizeof *c->buckets; - bzero (c->buckets, size); + memset (c->buckets, 0, size); /* Must do a thorough redisplay the next time. Mark current matrices as invalid because they will reference faces freed @@ -4502,9 +4403,7 @@ free_realized_faces (c) /* Free all realized faces that are using FONTSET on frame F. */ void -free_realized_faces_for_fontset (f, fontset) - struct frame *f; - int fontset; +free_realized_faces_for_fontset (struct frame *f, int fontset) { struct face_cache *cache = FRAME_FACE_CACHE (f); struct face *face; @@ -4545,8 +4444,7 @@ free_realized_faces_for_fontset (f, fontset) because we can't tell which realized faces depend on that face. */ void -free_all_realized_faces (frame) - Lisp_Object frame; +free_all_realized_faces (Lisp_Object frame) { if (NILP (frame)) { @@ -4562,8 +4460,7 @@ free_all_realized_faces (frame) /* Free face cache C and faces in it, including their X resources. */ static void -free_face_cache (c) - struct face_cache *c; +free_face_cache (struct face_cache *c) { if (c) { @@ -4583,10 +4480,7 @@ free_face_cache (c) that a requested face is not cached. */ static void -cache_face (c, face, hash) - struct face_cache *c; - struct face *face; - unsigned hash; +cache_face (struct face_cache *c, struct face *face, unsigned int hash) { int i = hash % FACE_CACHE_BUCKETS_SIZE; @@ -4663,9 +4557,7 @@ cache_face (c, face, hash) /* Remove face FACE from cache C. */ static void -uncache_face (c, face) - struct face_cache *c; - struct face *face; +uncache_face (struct face_cache *c, struct face *face) { int i = face->hash % FACE_CACHE_BUCKETS_SIZE; @@ -4689,9 +4581,7 @@ uncache_face (c, face) realize a new one. */ INLINE int -lookup_face (f, attr) - struct frame *f; - Lisp_Object *attr; +lookup_face (struct frame *f, Lisp_Object *attr) { struct face_cache *cache = FRAME_FACE_CACHE (f); unsigned hash; @@ -4737,10 +4627,7 @@ lookup_face (f, attr) suitable face is found, realize a new one. */ int -face_for_font (f, font_object, base_face) - struct frame *f; - Lisp_Object font_object; - struct face *base_face; +face_for_font (struct frame *f, Lisp_Object font_object, struct face *base_face) { struct face_cache *cache = FRAME_FACE_CACHE (f); unsigned hash; @@ -4775,10 +4662,7 @@ face_for_font (f, font_object, base_face) face isn't realized and cannot be realized. */ int -lookup_named_face (f, symbol, signal_p) - struct frame *f; - Lisp_Object symbol; - int signal_p; +lookup_named_face (struct frame *f, Lisp_Object symbol, int signal_p) { Lisp_Object attrs[LFACE_VECTOR_SIZE]; Lisp_Object symbol_attrs[LFACE_VECTOR_SIZE]; @@ -4796,7 +4680,7 @@ lookup_named_face (f, symbol, signal_p) if (! get_lface_attributes (f, symbol, symbol_attrs, signal_p, 0)) return -1; - bcopy (default_face->lface, attrs, sizeof attrs); + memcpy (attrs, default_face->lface, sizeof attrs); merge_face_vectors (f, symbol_attrs, attrs, 0); return lookup_face (f, attrs); @@ -4810,9 +4694,7 @@ lookup_named_face (f, symbol, signal_p) rather than signal an error. */ int -lookup_basic_face (f, face_id) - struct frame *f; - int face_id; +lookup_basic_face (struct frame *f, int face_id) { Lisp_Object name, mapping; int remapped_face_id; @@ -4859,9 +4741,7 @@ lookup_basic_face (f, face_id) LFACE_ID on frame F. Value is -1 if LFACE_ID isn't valid. */ int -ascii_face_of_lisp_face (f, lface_id) - struct frame *f; - int lface_id; +ascii_face_of_lisp_face (struct frame *f, int lface_id) { int face_id; @@ -4882,9 +4762,7 @@ ascii_face_of_lisp_face (f, lface_id) STEPS < 0 means larger. Value is the id of the face. */ int -smaller_face (f, face_id, steps) - struct frame *f; - int face_id, steps; +smaller_face (struct frame *f, int face_id, int steps) { #ifdef HAVE_WINDOW_SYSTEM struct face *face; @@ -4903,7 +4781,7 @@ smaller_face (f, face_id, steps) steps = eabs (steps); face = FACE_FROM_ID (f, face_id); - bcopy (face->lface, attrs, sizeof attrs); + memcpy (attrs, face->lface, sizeof attrs); pt = last_pt = XFASTINT (attrs[LFACE_HEIGHT_INDEX]); new_face_id = face_id; last_height = FONT_HEIGHT (face->font); @@ -4943,10 +4821,7 @@ smaller_face (f, face_id, steps) FACE_ID on frame F, but has height HEIGHT. */ int -face_with_height (f, face_id, height) - struct frame *f; - int face_id; - int height; +face_with_height (struct frame *f, int face_id, int height) { #ifdef HAVE_WINDOW_SYSTEM struct face *face; @@ -4957,7 +4832,7 @@ face_with_height (f, face_id, height) return face_id; face = FACE_FROM_ID (f, face_id); - bcopy (face->lface, attrs, sizeof attrs); + memcpy (attrs, face->lface, sizeof attrs); attrs[LFACE_HEIGHT_INDEX] = make_number (height); font_clear_prop (attrs, FONT_SIZE_INDEX); face_id = lookup_face (f, attrs); @@ -4975,11 +4850,7 @@ face_with_height (f, face_id, height) default face. FACE_ID is assumed to be already realized. */ int -lookup_derived_face (f, symbol, face_id, signal_p) - 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]; @@ -4991,7 +4862,7 @@ lookup_derived_face (f, symbol, face_id, signal_p) if (!get_lface_attributes (f, symbol, symbol_attrs, signal_p, 0)) return -1; - bcopy (default_face->lface, attrs, sizeof attrs); + memcpy (attrs, default_face->lface, sizeof attrs); merge_face_vectors (f, symbol_attrs, attrs, 0); return lookup_face (f, attrs); } @@ -5036,10 +4907,7 @@ 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 (f, attrs, def_face) - 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; @@ -5085,7 +4953,7 @@ x_supports_face_attributes_p (f, attrs, def_face) Lisp_Object merged_attrs[LFACE_VECTOR_SIZE]; int i; - bcopy (def_attrs, merged_attrs, sizeof merged_attrs); + memcpy (merged_attrs, def_attrs, sizeof merged_attrs); merge_face_vectors (f, attrs, merged_attrs, 0); @@ -5140,10 +5008,7 @@ x_supports_face_attributes_p (f, attrs, def_face) substitution of a `dim' face for italic. */ static int -tty_supports_face_attributes_p (f, attrs, def_face) - 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; @@ -5409,7 +5274,7 @@ Value is ORDER. */) int indices[DIM (font_sort_order)]; CHECK_LIST (order); - bzero (indices, sizeof indices); + memset (indices, 0, sizeof indices); i = 0; for (list = order; @@ -5441,9 +5306,9 @@ Value is ORDER. */) if (indices[i] == 0) signal_error ("Invalid font sort order", order); - if (bcmp (indices, font_sort_order, sizeof indices) != 0) + if (memcmp (indices, font_sort_order, sizeof indices) != 0) { - bcopy (indices, font_sort_order, sizeof font_sort_order); + memcpy (font_sort_order, indices, sizeof font_sort_order); free_all_realized_faces (Qnil); } @@ -5523,8 +5388,7 @@ be found. Value is ALIST. */) attribute of ATTRS doesn't name a fontset. */ static int -face_fontset (attrs) - Lisp_Object *attrs; +face_fontset (Lisp_Object *attrs) { Lisp_Object name; @@ -5547,8 +5411,7 @@ face_fontset (attrs) face. */ static int -realize_basic_faces (f) - struct frame *f; +realize_basic_faces (struct frame *f) { int success_p = 0; int count = SPECPDL_INDEX (); @@ -5596,8 +5459,7 @@ realize_basic_faces (f) that are not explicitly specified are taken from frame parameters. */ static int -realize_default_face (f) - struct frame *f; +realize_default_face (struct frame *f) { struct face_cache *c = FRAME_FACE_CACHE (f); Lisp_Object lface; @@ -5691,7 +5553,7 @@ realize_default_face (f) /* Realize the face; it must be fully-specified now. */ xassert (lface_fully_specified_p (XVECTOR (lface)->contents)); check_lface (lface); - bcopy (XVECTOR (lface)->contents, attrs, sizeof attrs); + memcpy (attrs, XVECTOR (lface)->contents, sizeof attrs); face = realize_face (c, attrs, DEFAULT_FACE_ID); #ifdef HAVE_WINDOW_SYSTEM @@ -5720,10 +5582,7 @@ realize_default_face (f) have. The default face must have been realized already. */ static void -realize_named_face (f, symbol, id) - struct frame *f; - Lisp_Object symbol; - int id; +realize_named_face (struct frame *f, Lisp_Object symbol, int id) { struct face_cache *c = FRAME_FACE_CACHE (f); Lisp_Object lface = lface_from_face_name (f, symbol, 0); @@ -5759,10 +5618,7 @@ realize_named_face (f, symbol, id) face. Value is a pointer to the newly created realized face. */ static struct face * -realize_face (cache, attrs, former_face_id) - struct face_cache *cache; - Lisp_Object *attrs; - int former_face_id; +realize_face (struct face_cache *cache, Lisp_Object *attrs, int former_face_id) { struct face *face; @@ -5803,10 +5659,7 @@ realize_face (cache, attrs, former_face_id) no-font. */ static struct face * -realize_non_ascii_face (f, font_object, base_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; @@ -5840,9 +5693,7 @@ realize_non_ascii_face (f, font_object, base_face) created realized face. */ static struct face * -realize_x_face (cache, attrs) - struct face_cache *cache; - Lisp_Object *attrs; +realize_x_face (struct face_cache *cache, Lisp_Object *attrs) { struct face *face = NULL; #ifdef HAVE_WINDOW_SYSTEM @@ -6049,11 +5900,7 @@ realize_x_face (cache, attrs) default foreground/background colors. */ static void -map_tty_color (f, face, idx, defaulted) - 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; @@ -6130,9 +5977,7 @@ map_tty_color (f, face, idx, defaulted) Value is a pointer to the newly created realized face. */ static struct face * -realize_tty_face (cache, attrs) - struct face_cache *cache; - Lisp_Object *attrs; +realize_tty_face (struct face_cache *cache, Lisp_Object *attrs) { struct face *face; int weight, slant; @@ -6213,10 +6058,7 @@ is non-nil. */) property PROP on frame F in current_buffer. */ int -compute_char_face (f, ch, prop) - struct frame *f; - int ch; - Lisp_Object prop; +compute_char_face (struct frame *f, int ch, Lisp_Object prop) { int face_id; @@ -6232,7 +6074,7 @@ compute_char_face (f, ch, prop) { Lisp_Object attrs[LFACE_VECTOR_SIZE]; struct face *default_face = FACE_FROM_ID (f, DEFAULT_FACE_ID); - bcopy (default_face->lface, attrs, sizeof attrs); + memcpy (attrs, default_face->lface, sizeof attrs); merge_face_ref (f, prop, attrs, 1, 0); face_id = lookup_face (f, attrs); } @@ -6321,7 +6163,7 @@ face_at_buffer_position (w, pos, region_beg, region_end, return default_face->id; /* Begin with attributes from the default face. */ - bcopy (default_face->lface, attrs, sizeof attrs); + memcpy (attrs, default_face->lface, sizeof attrs); /* Merge in attributes specified via text properties. */ if (!NILP (prop)) @@ -6415,7 +6257,7 @@ face_for_overlay_string (w, pos, region_beg, region_end, return DEFAULT_FACE_ID; /* Begin with attributes from the default face. */ - bcopy (default_face->lface, attrs, sizeof attrs); + memcpy (attrs, default_face->lface, sizeof attrs); /* Merge in attributes specified via text properties. */ if (!NILP (prop)) @@ -6516,7 +6358,7 @@ face_at_string_position (w, string, pos, bufpos, region_beg, return base_face->id; /* Begin with attributes from the base face. */ - bcopy (base_face->lface, attrs, sizeof attrs); + memcpy (attrs, base_face->lface, sizeof attrs); /* Merge in attributes specified via text properties. */ if (!NILP (prop)) @@ -6550,10 +6392,7 @@ face_at_string_position (w, string, pos, bufpos, region_beg, */ int -merge_faces (f, face_name, face_id, base_face_id) - struct frame *f; - Lisp_Object face_name; - int face_id, base_face_id; +merge_faces (struct frame *f, Lisp_Object face_name, int face_id, int base_face_id) { Lisp_Object attrs[LFACE_VECTOR_SIZE]; struct face *base_face; @@ -6574,7 +6413,7 @@ merge_faces (f, face_name, face_id, base_face_id) } /* Begin with attributes from the base face. */ - bcopy (base_face->lface, attrs, sizeof attrs); + memcpy (attrs, base_face->lface, sizeof attrs); if (!NILP (face_name)) { @@ -6742,7 +6581,7 @@ DEFUN ("show-face-resources", Fshow_face_resources, Sshow_face_resources, ***********************************************************************/ void -syms_of_xfaces () +syms_of_xfaces (void) { Qface = intern_c_string ("face"); staticpro (&Qface);