From: Andrew C. <ak...@sh...> - 2002-05-27 23:34:49
|
Hi Everyone, The following patch (to be applied to the version in the CVS repository) fixes a bug which prevents Emacs from correctly displaying the italic, bold, and bold-italic variants of most fonts on the Mac OS (classic and X). Please test it. I'll check it into the CVS once I have used it a bit more. Andrew. ----- Index: lisp/term/mac-win.el =================================================================== RCS file: /cvsroot/emacs//emacs/lisp/term/mac-win.el,v retrieving revision 1.8 diff -u -r1.8 mac-win.el --- lisp/term/mac-win.el 26 Apr 2002 23:39:04 -0000 1.8 +++ lisp/term/mac-win.el 27 May 2002 22:59:32 -0000 @@ -225,6 +225,12 @@ ;; ange-ftp will not work without it. (setq process-connection-type nil) +;; Assume that fonts are always scalable on the Mac. This sometimes +;; results in characters with jagged edges. However, without it, +;; fonts with both truetype and bitmap representations but no italic +;; or bold bitmap versions will not display these variants correctly. +(setq scalable-fonts-allowed t) + ;; (prefer-coding-system 'mac-roman) ;; Index: src/fontset.c =================================================================== RCS file: /cvsroot/emacs//emacs/src/fontset.c,v retrieving revision 1.67 diff -u -r1.67 fontset.c --- src/fontset.c 20 May 2002 08:05:48 -0000 1.67 +++ src/fontset.c 27 May 2002 22:59:34 -0000 @@ -1413,7 +1413,7 @@ #if defined (MAC_OS) FONTSET_ASCII (Vdefault_fontset) = Fcons (make_number (0), - build_string ("-ETL-fixed-medium-r-*--*-160-*-*-*-*-iso8859-1")); + build_string ("-apple-monaco-medium-r-*--*-120-*-*-*-*-mac-roman")); #elif defined (WINDOWSNT) FONTSET_ASCII (Vdefault_fontset) = Fcons (make_number (0), Index: src/macfns.c =================================================================== RCS file: /cvsroot/emacs//emacs/src/macfns.c,v retrieving revision 1.3 diff -u -r1.3 macfns.c --- src/macfns.c 20 May 2002 08:06:16 -0000 1.3 +++ src/macfns.c 27 May 2002 22:59:43 -0000 @@ -4434,7 +4434,7 @@ } #endif /* 0 */ - error ("Display has an unknown visual class"); + return (intern ("true-color")); } DEFUN ("x-display-save-under", Fx_display_save_under, Index: src/macterm.c =================================================================== RCS file: /cvsroot/emacs//emacs/src/macterm.c,v retrieving revision 1.3 diff -u -r1.3 macterm.c --- src/macterm.c 8 May 2002 21:30:03 -0000 1.3 +++ src/macterm.c 27 May 2002 22:59:54 -0000 @@ -9559,6 +9559,13 @@ /* Now make the frame display the given font. */ if (FRAME_MAC_WINDOW (f) != 0) { + XSetFont (FRAME_MAC_DISPLAY (f), f->output_data.mac->normal_gc, + f->output_data.mac->font); + XSetFont (FRAME_MAC_DISPLAY (f), f->output_data.mac->reverse_gc, + f->output_data.mac->font); + XSetFont (FRAME_MAC_DISPLAY (f), f->output_data.mac->cursor_gc, + f->output_data.mac->font); + frame_update_line_height (f); if (NILP (tip_frame) || XFRAME (tip_frame) != f) x_set_window_size (f, 0, f->width, f->height); @@ -10651,10 +10658,30 @@ } -/* Sets up the table font_name_table to contain the list of all - monospace fonts in the system the first time the table is used so - that the Resource Manager need not be accessed every time this - information is needed. */ +static void +add_font_name_table_entry (char *font_name) +{ + if (font_name_table_size == 0) + { + font_name_table_size = 16; + font_name_table = (char **) + xmalloc (font_name_table_size * sizeof (char *)); + } + else if (font_name_count + 1 >= font_name_table_size) + { + font_name_table_size += 16; + font_name_table = (char **) + xrealloc (font_name_table, + font_name_table_size * sizeof (char *)); + } + + font_name_table[font_name_count++] = font_name; +} + +/* Sets up the table font_name_table to contain the list of all fonts + in the system the first time the table is used so that the Resource + Manager need not be accessed every time this information is + needed. */ static void init_font_name_table () @@ -10700,23 +10727,21 @@ while (FMGetNextFontFamilyInstance (&ffii, &font, &style, &size) == noErr) - { - if (font_name_table_size == 0) - { - font_name_table_size = 16; - font_name_table = (char **) - xmalloc (font_name_table_size * sizeof (char *)); - } - else if (font_name_count + 1 >= font_name_table_size) - { - font_name_table_size += 16; - font_name_table = (char **) - xrealloc (font_name_table, - font_name_table_size * sizeof (char *)); - } - font_name_table[font_name_count++] - = mac_to_x_fontname (name, size, style, sc); - } + if (size == 0) + { + add_font_name_table_entry (mac_to_x_fontname (name, size, + style, sc)); + add_font_name_table_entry (mac_to_x_fontname (name, size, + italic, sc)); + add_font_name_table_entry (mac_to_x_fontname (name, size, + bold, sc)); + add_font_name_table_entry (mac_to_x_fontname (name, size, + italic | bold, + sc)); + } + else + add_font_name_table_entry (mac_to_x_fontname (name, size, style, + sc)); } /* Dispose of the iterators. */ Index: src/xfaces.c =================================================================== RCS file: /cvsroot/emacs//emacs/src/xfaces.c,v retrieving revision 1.253 diff -u -r1.253 xfaces.c --- src/xfaces.c 20 May 2002 08:06:45 -0000 1.253 +++ src/xfaces.c 27 May 2002 22:59:59 -0000 @@ -918,6 +918,9 @@ #ifdef WINDOWSNT if (!FRAME_WINDOW_P (f) || FRAME_W32_WINDOW (f)) #endif +#ifdef MAC_OS + if (!FRAME_MAC_P (f) || FRAME_MAC_WINDOW (f)) +#endif if (!realize_basic_faces (f)) abort (); } @@ -6026,6 +6029,17 @@ if (STRINGP (face_family)) nfonts = try_alternative_families (f, face_family, registry, fonts); +#ifdef MAC_OS + /* When realizing the default face and a font spec does not matched + exactly, Emacs looks for ones with the same registry as the + default font. On the Mac, this is mac-roman, which does not work + if the family is -etl-fixed, e.g. The following widens the + choices and fixes that problem. */ + if (nfonts == 0 && STRINGP (face_family) && STRINGP (registry) + && xstricmp (XSTRING (registry)->data, "mac-roman") == 0) + nfonts = try_alternative_families (f, face_family, Qnil, fonts); +#endif + if (nfonts == 0 && !NILP (family)) nfonts = try_alternative_families (f, family, registry, fonts); @@ -6432,18 +6446,6 @@ fontset = default_face->fontset; face->fontset = make_fontset_for_ascii_face (f, fontset); face->font = NULL; /* to force realize_face to load font */ - -#ifdef MAC_OS - /* Load the font if it is specified in ATTRS. This fixes - changing frame font on the Mac. */ - if (STRINGP (attrs[LFACE_FONT_INDEX])) - { - struct font_info *font_info = - FS_LOAD_FONT (f, 0, XSTRING (attrs[LFACE_FONT_INDEX])->data, -1); - if (font_info) - face->font = font_info->font; - } -#endif } /* Load colors, and set remaining attributes. */ |