emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fontset problem


From: Kenichi Handa
Subject: Re: Fontset problem
Date: Thu, 26 Sep 2002 17:10:34 +0900 (JST)
User-agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.1.30 (sparc-sun-solaris2.6) MULE/5.0 (SAKAKI)

Sorry for the late response.

In article <address@hidden>, Andreas Schwab <address@hidden> writes:

> Kenichi Handa <address@hidden> writes:
> |> So, please try this:
> |> 
> |> Emacs.Fontset-0: 
> -*-courier-medium-r-normal--*-140-*-*-*-*-fontset-startup,\
> |>    mule-unicode-2500-33ff:-*-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1,\
> |>    mule-unicode-e000-ffff:-*-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1,\
> |>    mule-unicode-0100-24ff:-*-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1

> That does not work either, now Emacs is using courier instead of fixed for
> the mule-unicode charsets.

Ah, I see.  You actually have courier iso10646-1 fonts.

Hmmm, currently, Emacs tries at first the family specified
by face, and if you have that font, Emacs uses it.

Perhaps, for finding a font or non-ASCII, non-Latin-1 chars,
Emacs should prefer the family specified in the fontset to
the family specified in the face.

I've just installed this change.  Please try it.  At least
it works for me with the above resource on the machine that
has courier iso10646-1 fonts.  Other people please check if
it doesn't break your font/fontset setting.  Font selection
routine is one of very delicate parts.

---
Ken'ichi HANDA
address@hidden

2002-09-26  Kenichi Handa  <address@hidden>

        * xfaces.c (try_font_list): New arg PREFER_FACE_FAMILY.  If it is
        nonzero, try face's family at first.  Otherwise try FAMILY at
        first.
        (choose_face_font): If C is a single byte char or latin-1, call
        try_font_list with PREFER_FACE_FAMILY 1.

Index: xfaces.c
===================================================================
RCS file: /cvs/emacs/src/xfaces.c,v
retrieving revision 1.262
retrieving revision 1.263
diff -u -c -r1.262 -r1.263
cvs server: conflicting specifications of output style
*** xfaces.c    13 Sep 2002 19:35:08 -0000      1.262
--- xfaces.c    26 Sep 2002 08:03:52 -0000      1.263
***************
*** 510,516 ****
  static int font_list P_ ((struct frame *, Lisp_Object, Lisp_Object,
                          Lisp_Object, struct font_name **));
  static int try_font_list P_ ((struct frame *, Lisp_Object *, 
!                             Lisp_Object, Lisp_Object, struct font_name **));
  static int try_alternative_families P_ ((struct frame *f, Lisp_Object,
                                         Lisp_Object, struct font_name **));
  static int cmp_font_names P_ ((const void *, const void *));
--- 510,517 ----
  static int font_list P_ ((struct frame *, Lisp_Object, Lisp_Object,
                          Lisp_Object, struct font_name **));
  static int try_font_list P_ ((struct frame *, Lisp_Object *, 
!                             Lisp_Object, Lisp_Object, struct font_name **,
!                             int));
  static int try_alternative_families P_ ((struct frame *f, Lisp_Object,
                                         Lisp_Object, struct font_name **));
  static int cmp_font_names P_ ((const void *, const void *));
***************
*** 6324,6344 ****
     match.  A value of nil means include fonts of any registry and
     encoding.
     
     Return in *FONTS a pointer to a vector of font_name structures for
     the fonts matched.  Value is the number of fonts found.  */
  
  static int
! try_font_list (f, attrs, family, registry, fonts)
       struct frame *f;
       Lisp_Object *attrs;
       Lisp_Object family, registry;
       struct font_name **fonts;
  {
    int nfonts = 0;
    Lisp_Object face_family = attrs[LFACE_FAMILY_INDEX];
  
!   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
--- 6325,6352 ----
     match.  A value of nil means include fonts of any registry and
     encoding.
     
+    If PREFER_FACE_FAMILY is nonzero, perfer face's family to FAMILY.
+    Otherwise, prefer FAMILY.
+ 
     Return in *FONTS a pointer to a vector of font_name structures for
     the fonts matched.  Value is the number of fonts found.  */
  
  static int
! try_font_list (f, attrs, family, registry, fonts, prefer_face_family)
       struct frame *f;
       Lisp_Object *attrs;
       Lisp_Object family, registry;
       struct font_name **fonts;
+      int prefer_face_family;
  {
    int nfonts = 0;
    Lisp_Object face_family = attrs[LFACE_FAMILY_INDEX];
+   Lisp_Object try_family;
+ 
+   try_family = prefer_face_family ? face_family : family;
  
!   if (STRINGP (try_family))
!     nfonts = try_alternative_families (f, try_family, registry, fonts);
  
  #ifdef MAC_OS
    /* When realizing the default face and a font spec does not matched
***************
*** 6346,6357 ****
       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 (SDATA (registry), "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);
  
    /* Try font family of the default face or "fixed".  */
--- 6354,6368 ----
       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 (try_family) && STRINGP (registry)
        && xstricmp (SDATA (registry), "mac-roman") == 0)
!     nfonts = try_alternative_families (f, try_family, Qnil, fonts);
  #endif
  
!   if (! prefer_face_family)
!     family = face_family;
! 
!   if (nfonts == 0 && STRINGP (family))
      nfonts = try_alternative_families (f, family, registry, fonts);
  
    /* Try font family of the default face or "fixed".  */
***************
*** 6425,6431 ****
  
    /* Get a list of fonts matching that pattern and choose the
       best match for the specified face attributes from it.  */
!   nfonts = try_font_list (f, attrs, XCAR (pattern), XCDR (pattern), &fonts);
    width_ratio = (SINGLE_BYTE_CHAR_P (c)
                 ? 1
                 : CHARSET_WIDTH (CHAR_CHARSET (c)));
--- 6436,6444 ----
  
    /* Get a list of fonts matching that pattern and choose the
       best match for the specified face attributes from it.  */
!   nfonts = try_font_list (f, attrs, XCAR (pattern), XCDR (pattern), &fonts,
!                         (SINGLE_BYTE_CHAR_P (c)
!                          || CHAR_CHARSET (c) == charset_latin_iso8859_1));
    width_ratio = (SINGLE_BYTE_CHAR_P (c)
                 ? 1
                 : CHARSET_WIDTH (CHAR_CHARSET (c)));




reply via email to

[Prev in Thread] Current Thread [Next in Thread]