X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/8d3655be5a5c41b1f0a9985bcdb614693fce67e5..b7e0ef72d0ac61b5d3ef06a3f565695c75ec2540:/src/fontset.c diff --git a/src/fontset.c b/src/fontset.c index 3578bc9403..15fdf9f41a 100644 --- a/src/fontset.c +++ b/src/fontset.c @@ -39,17 +39,10 @@ along with GNU Emacs. If not, see . */ #include "intervals.h" #include "fontset.h" #include "window.h" -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif -#ifdef HAVE_NTGUI -#include "w32term.h" -#endif -#ifdef HAVE_NS -#include "nsterm.h" -#endif +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ #include "termhooks.h" - #include "font.h" /* FONTSET @@ -179,10 +172,6 @@ static int next_fontset_id; font for each character. */ static Lisp_Object Vdefault_fontset; -/* Check if any window system is used now. */ -void (*check_window_system_func) (void); - - /* Prototype declarations for static functions. */ static Lisp_Object make_fontset (Lisp_Object, Lisp_Object, Lisp_Object); @@ -464,7 +453,7 @@ reorder_font_vector (Lisp_Object font_group, struct font *font) } if (score_changed) - qsort (XVECTOR (vec)->contents, size, word_size, + qsort (XVECTOR (vec)->u.contents, size, word_size, fontset_compare_rfontdef); XSETCAR (font_group, make_number (charset_ordered_list_tick)); } @@ -543,8 +532,9 @@ fontset_find_font (Lisp_Object fontset, int c, struct face *face, int id, { Lisp_Object vec, font_group; int i, charset_matched = 0, found_index; - FRAME_PTR f = (FRAMEP (FONTSET_FRAME (fontset)) - ? XFRAME (FONTSET_FRAME (fontset)) : XFRAME (selected_frame)); + struct frame *f = (FRAMEP (FONTSET_FRAME (fontset)) + ? XFRAME (FONTSET_FRAME (fontset)) + : XFRAME (selected_frame)); Lisp_Object rfont_def; font_group = fontset_get_font_group (fontset, fallback ? -1 : c); @@ -863,7 +853,7 @@ fontset_ascii (int id) } static void -free_realized_fontset (FRAME_PTR f, Lisp_Object fontset) +free_realized_fontset (struct frame *f, Lisp_Object fontset) { #if 0 Lisp_Object tail; @@ -881,7 +871,7 @@ free_realized_fontset (FRAME_PTR f, Lisp_Object fontset) free_realized_face. */ void -free_face_fontset (FRAME_PTR f, struct face *face) +free_face_fontset (struct frame *f, struct face *face) { Lisp_Object fontset; @@ -934,7 +924,7 @@ face_suitable_for_char_p (struct face *face, int c) the macro FACE_FOR_CHAR. */ int -face_for_char (FRAME_PTR f, struct face *face, int c, int pos, Lisp_Object object) +face_for_char (struct frame *f, struct face *face, int c, int pos, Lisp_Object object) { Lisp_Object fontset, rfont_def, charset; int face_id; @@ -947,6 +937,19 @@ face_for_char (FRAME_PTR f, struct face *face, int c, int pos, Lisp_Object objec if (ASCII_CHAR_P (c) || face->fontset < 0) return face->ascii_face->id; +#ifdef HAVE_NS + if (face->font) + { + /* Fonts often have characters in other scripts, like symbol, even if they + don't match script: symbol. So check if the character is present + in the current face first. Only enable for NS for now, but should + perhaps be general? */ + Lisp_Object font_object; + XSETFONT (font_object, face->font); + if (font_has_char (f, font_object, c)) return face->id; + } +#endif + eassert (fontset_id_valid_p (face->fontset)); fontset = FONTSET_FROM_ID (face->fontset); eassert (!BASE_FONTSET_P (fontset)); @@ -1052,7 +1055,7 @@ font_for_char (struct face *face, int c, int pos, Lisp_Object object) Called from realize_x_face. */ int -make_fontset_for_ascii_face (FRAME_PTR f, int base_fontset_id, struct face *face) +make_fontset_for_ascii_face (struct frame *f, int base_fontset_id, struct face *face) { Lisp_Object base_fontset, fontset, frame; @@ -1213,7 +1216,7 @@ If REGEXPP is non-nil, PATTERN is a regular expression. */) Lisp_Object fontset; int id; - (*check_window_system_func) (); + check_window_system (NULL); CHECK_STRING (pattern); @@ -1231,7 +1234,7 @@ If REGEXPP is non-nil, PATTERN is a regular expression. */) /* Return a list of base fontset names matching PATTERN on frame F. */ Lisp_Object -list_fontsets (FRAME_PTR f, Lisp_Object pattern, int size) +list_fontsets (struct frame *f, Lisp_Object pattern, int size) { Lisp_Object frame, regexp, val; int id; @@ -1288,7 +1291,7 @@ free_realized_fontsets (Lisp_Object base) for (tail = FONTSET_FACE_ALIST (this); CONSP (tail); tail = XCDR (tail)) { - FRAME_PTR f = XFRAME (FONTSET_FRAME (this)); + struct frame *f = XFRAME (FONTSET_FRAME (this)); int face_id = XINT (XCDR (XCAR (tail))); struct face *face = FACE_FROM_ID (f, face_id); @@ -1527,7 +1530,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) { if (XFASTINT (target) < 0x80) error ("Can't set a font for partial ASCII range"); - range_list = Fcons (Fcons (target, target), Qnil); + range_list = list1 (Fcons (target, target)); } else if (CONSP (target)) { @@ -1543,7 +1546,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) error ("Can't set a font for partial ASCII range"); ascii_changed = 1; } - range_list = Fcons (target, Qnil); + range_list = list1 (target); } else if (SYMBOLP (target) && !NILP (target)) { @@ -1556,7 +1559,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) { if (EQ (target, Qlatin)) ascii_changed = 1; - val = Fcons (target, Qnil); + val = list1 (target); map_char_table (accumulate_script_ranges, Qnil, Vchar_script_table, val); range_list = Fnreverse (XCDR (val)); @@ -1572,7 +1575,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) SDATA (SYMBOL_NAME (target))); } else if (NILP (target)) - range_list = Fcons (Qnil, Qnil); + range_list = list1 (Qnil); else error ("Invalid target for setting a font"); @@ -1616,7 +1619,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) name = FONTSET_NAME (fontset); FOR_EACH_FRAME (tail, fr) { - FRAME_PTR f = XFRAME (fr); + struct frame *f = XFRAME (fr); Lisp_Object font_object; struct face *face; @@ -1632,7 +1635,7 @@ appended. By default, FONT-SPEC overrides the previous settings. */) if (! NILP (font_object)) { update_auto_fontset_alist (font_object, fontset); - alist = Fcons (Fcons (Qfont, Fcons (name, font_object)), Qnil); + alist = list1 (Fcons (Qfont, Fcons (name, font_object))); Fmodify_frame_parameters (fr, alist); } } @@ -1919,8 +1922,7 @@ format is the same as above. */) Lisp_Object val, elt; int c, i, j, k; - (*check_window_system_func) (); - + check_window_system (NULL); fontset = check_fontset_name (fontset, &frame); /* Recode fontsets realized on FRAME from the base fontset FONTSET @@ -2004,7 +2006,7 @@ format is the same as above. */) slot = Fassq (RFONT_DEF_SPEC (elt), alist); name = AREF (font_object, FONT_NAME_INDEX); if (NILP (Fmember (name, XCDR (slot)))) - nconc2 (slot, Fcons (name, Qnil)); + nconc2 (slot, list1 (name)); } } } @@ -2145,7 +2147,7 @@ dump_fontset (Lisp_Object fontset) frame = FONTSET_FRAME (fontset); if (FRAMEP (frame)) { - FRAME_PTR f = XFRAME (frame); + struct frame *f = XFRAME (frame); if (FRAME_LIVE_P (f)) ASET (vec, 1, @@ -2243,9 +2245,9 @@ alternate fontnames (if any) are tried instead. */); DEFVAR_LISP ("fontset-alias-alist", Vfontset_alias_alist, doc: /* Alist of fontset names vs the aliases. */); - Vfontset_alias_alist = Fcons (Fcons (FONTSET_NAME (Vdefault_fontset), - build_pure_c_string ("fontset-default")), - Qnil); + Vfontset_alias_alist + = list1 (Fcons (FONTSET_NAME (Vdefault_fontset), + build_pure_c_string ("fontset-default"))); DEFVAR_LISP ("vertical-centering-font-regexp", Vvertical_centering_font_regexp,