X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3cc0c06094c8731c9e15536fefd3382d8ca1eba0..d20f82e6f1ab902469723ebd530ca21bea9cc41b:/src/xfaces.c diff --git a/src/xfaces.c b/src/xfaces.c index 34895123db..0600f53ba1 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -1,6 +1,6 @@ /* xfaces.c -- "Face" primitives. -Copyright (C) 1993-1994, 1998-2014 Free Software Foundation, Inc. +Copyright (C) 1993-1994, 1998-2015 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -732,7 +732,7 @@ recompute_basic_faces (struct frame *f) try to free unused fonts, too. */ void -clear_face_cache (int clear_fonts_p) +clear_face_cache (bool clear_fonts_p) { #ifdef HAVE_WINDOW_SYSTEM Lisp_Object tail, frame; @@ -1068,7 +1068,7 @@ tty_color_name (struct frame *f, int idx) return XCAR (coldesc); } #ifdef MSDOS - /* We can have an MSDOG frame under -nw for a short window of + /* We can have an MS-DOS frame under -nw for a short window of opportunity before internal_terminal_init is called. DTRT. */ if (FRAME_MSDOS_P (f) && !inhibit_window_system) return msdos_stdcolor_name (idx); @@ -3112,17 +3112,26 @@ FRAME 0 means change the face on all frames, and change the default f = XFRAME (selected_frame); else f = XFRAME (frame); - if (! FONT_OBJECT_P (value)) - { - Lisp_Object *attrs = XVECTOR (lface)->contents; - Lisp_Object font_object; - font_object = font_load_for_lface (f, attrs, value); - if (NILP (font_object)) - signal_error ("Font not available", value); - value = font_object; - } - set_lface_from_font (f, lface, value, 1); + /* FIXME: + If frame is t, and selected frame is a tty frame, the font + can't be realized. An improvement would be to loop over frames + for a non-tty frame and use that. See discussion in Bug#18573. + For a daemon, frame may be an initial frame (Bug#18869). */ + if (FRAME_WINDOW_P (f)) + { + if (! FONT_OBJECT_P (value)) + { + Lisp_Object *attrs = XVECTOR (lface)->contents; + Lisp_Object font_object; + + font_object = font_load_for_lface (f, attrs, value); + if (NILP (font_object)) + signal_error ("Font not available", value); + value = font_object; + } + set_lface_from_font (f, lface, value, 1); + } } else ASET (lface, LFACE_FONT_INDEX, value); @@ -3398,7 +3407,8 @@ set_font_frame_param (Lisp_Object frame, Lisp_Object lface) ASET (lface, LFACE_FONT_INDEX, font); } f->default_face_done_p = 0; - Fmodify_frame_parameters (frame, list1 (Fcons (Qfont, font))); + AUTO_FRAME_ARG (arg, Qfont, font); + Fmodify_frame_parameters (frame, arg); } } @@ -3787,18 +3797,23 @@ Default face attributes override any local face attributes. */) && newface->font) { Lisp_Object name = newface->font->props[FONT_NAME_INDEX]; - Fmodify_frame_parameters (frame, list1 (Fcons (Qfont, name))); + AUTO_FRAME_ARG (arg, Qfont, name); + Fmodify_frame_parameters (frame, arg); } if (STRINGP (gvec[LFACE_FOREGROUND_INDEX])) - Fmodify_frame_parameters (frame, - list1 (Fcons (Qforeground_color, - gvec[LFACE_FOREGROUND_INDEX]))); + { + AUTO_FRAME_ARG (arg, Qforeground_color, + gvec[LFACE_FOREGROUND_INDEX]); + Fmodify_frame_parameters (frame, arg); + } if (STRINGP (gvec[LFACE_BACKGROUND_INDEX])) - Fmodify_frame_parameters (frame, - list1 (Fcons (Qbackground_color, - gvec[LFACE_BACKGROUND_INDEX]))); + { + AUTO_FRAME_ARG (arg, Qbackground_color, + gvec[LFACE_BACKGROUND_INDEX]); + Fmodify_frame_parameters (frame, arg); + } } } @@ -5980,6 +5995,7 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, endpos = XINT (end); /* Look at properties from overlays. */ + USE_SAFE_ALLOCA; { ptrdiff_t next_overlay; @@ -6006,7 +6022,10 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, /* Optimize common cases where we can use the default face. */ if (noverlays == 0 && NILP (prop)) - return default_face->id; + { + SAFE_FREE (); + return default_face->id; + } /* Begin with attributes from the default face. */ memcpy (attrs, default_face->lface, sizeof attrs); @@ -6034,6 +6053,8 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, *endptr = endpos; + SAFE_FREE (); + /* Look up a realized face with the given face attributes, or realize a new one for ASCII characters. */ return lookup_face (f, attrs);