emacs-devel
[Top][All Lists]
Advanced

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

Re: address@hidden: x-font-family-list gives incomplete results]


From: Jan D.
Subject: Re: address@hidden: x-font-family-list gives incomplete results]
Date: Sun, 16 Feb 2003 20:20:43 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2a) Gecko/20020910

Jan D. wrote:

One alternative solution would be to make maxnames passed to x_list_fonts (xterm.c) mean "get all font names" if it is less than zero. This also affects w32 and mac, since those ports also have a function with this name.

Making maxnames < 0 mean "all font names" should perhaps be propagated into Fx_list_fonts? Now it uses an arbitrary limit of 2000 if maximum is not given, which is too few on many machines.


Here is a proposed patch. Comments welcome. I can not do the mac and w32 parts, because I have no development environment on such systems.

        Jan D.

Index: src/xfaces.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xfaces.c,v
retrieving revision 1.267
diff -c -r1.267 xfaces.c
*** src/xfaces.c        4 Feb 2003 14:03:17 -0000       1.267
--- src/xfaces.c        16 Feb 2003 19:17:34 -0000
***************
*** 474,480 ****
  static int better_font_p P_ ((int *, struct font_name *, struct font_name *,
                              int, int));
  static int x_face_list_fonts P_ ((struct frame *, char *,
!                                 struct font_name *, int, int));
  static int font_scalable_p P_ ((struct font_name *));
  static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object 
*, int));
  static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned 
*));
--- 474,480 ----
  static int better_font_p P_ ((int *, struct font_name *, struct font_name *,
                              int, int));
  static int x_face_list_fonts P_ ((struct frame *, char *,
!                                 struct font_name **, int, int));
  static int font_scalable_p P_ ((struct font_name *));
  static int get_lface_attributes P_ ((struct frame *, Lisp_Object, Lisp_Object 
*, int));
  static int load_pixmap P_ ((struct frame *, Lisp_Object, unsigned *, unsigned 
*));
***************
*** 2435,2444 ****
     fonts that we can't parse.  Value is the number of fonts found.  */
  
  static int
! x_face_list_fonts (f, pattern, fonts, nfonts, try_alternatives_p)
       struct frame *f;
       char *pattern;
!      struct font_name *fonts;
       int nfonts, try_alternatives_p;
  {
    int n, nignored;
--- 2435,2444 ----
     fonts that we can't parse.  Value is the number of fonts found.  */
  
  static int
! x_face_list_fonts (f, pattern, pfonts, nfonts, try_alternatives_p)
       struct frame *f;
       char *pattern;
!      struct font_name **pfonts;
       int nfonts, try_alternatives_p;
  {
    int n, nignored;
***************
*** 2447,2452 ****
--- 2447,2454 ----
       better to do it the other way around. */
    Lisp_Object lfonts;
    Lisp_Object lpattern, tem;
+   struct font_name *fonts = 0;
+   int num_fonts = nfonts;
  
    lpattern = build_string (pattern);
  
***************
*** 2459,2468 ****
    lfonts = x_list_fonts (f, lpattern, -1, nfonts);
  #endif
  
    /* Make a copy of the font names we got from X, and
       split them into fields.  */
    n = nignored = 0;
!   for (tem = lfonts; CONSP (tem) && n < nfonts; tem = XCDR (tem))
      {
        Lisp_Object elt, tail;
        const char *name = SDATA (XCAR (tem));
--- 2461,2473 ----
    lfonts = x_list_fonts (f, lpattern, -1, nfonts);
  #endif
  
+   if (nfonts < 0 && CONSP (lfonts))
+     num_fonts = Flength (lfonts);
+   
    /* Make a copy of the font names we got from X, and
       split them into fields.  */
    n = nignored = 0;
!   for (tem = lfonts; CONSP (tem) && n < num_fonts; tem = XCDR (tem))
      {
        Lisp_Object elt, tail;
        const char *name = SDATA (XCAR (tem));
***************
*** 2481,2486 ****
--- 2486,2497 ----
          continue;
        }
  
+       if (! fonts)
+         {
+           *pfonts = (struct font_name *) xmalloc (num_fonts * sizeof 
**pfonts);
+           fonts = *pfonts;
+         }
+ 
        /* Make a copy of the font name.  */
        fonts[n].name = xstrdup (name);
  
***************
*** 2504,2509 ****
--- 2515,2522 ----
      {
        Lisp_Object list = Valternate_fontname_alist;
  
+       if (fonts) xfree (fonts);
+       
        while (CONSP (list))
        {
          Lisp_Object entry = XCAR (list);
***************
*** 2527,2533 ****
                    already with no success.  */
                 && (strcmp (SDATA (name), pattern) == 0
                     || (n = x_face_list_fonts (f, SDATA (name),
!                                               fonts, nfonts, 0),
                         n == 0)))
            patterns = XCDR (patterns);
        }
--- 2540,2546 ----
                    already with no success.  */
                 && (strcmp (SDATA (name), pattern) == 0
                     || (n = x_face_list_fonts (f, SDATA (name),
!                                               pfonts, nfonts, 0),
                         n == 0)))
            patterns = XCDR (patterns);
        }
***************
*** 2556,2566 ****
  
    /* Get the list of fonts matching pattern.  100 should suffice.  */
    nfonts = DEFAULT_FONT_LIST_LIMIT;
!   if (INTEGERP (Vfont_list_limit) && XINT (Vfont_list_limit) > 0)
!     nfonts = XFASTINT (Vfont_list_limit);
  
!   *fonts = (struct font_name *) xmalloc (nfonts * sizeof **fonts);
!   nfonts = x_face_list_fonts (f, pattern, *fonts, nfonts, 1);
  
    /* Sort the resulting array and return it in *FONTS.  If no
       fonts were found, make sure to set *FONTS to null.  */
--- 2569,2578 ----
  
    /* Get the list of fonts matching pattern.  100 should suffice.  */
    nfonts = DEFAULT_FONT_LIST_LIMIT;
!   if (INTEGERP (Vfont_list_limit))
!     nfonts = XINT (Vfont_list_limit);
  
!   nfonts = x_face_list_fonts (f, pattern, fonts, nfonts, 1);
  
    /* Sort the resulting array and return it in *FONTS.  If no
       fonts were found, make sure to set *FONTS to null.  */
***************
*** 2834,2856 ****
    Lisp_Object result;
    struct gcpro gcpro1;
    int count = SPECPDL_INDEX ();
-   int limit;
- 
-   /* Let's consider all fonts.  Increase the limit for matching
-      fonts until we have them all.  */
-   for (limit = 500;;)
-     {
-       specbind (intern ("font-list-limit"), make_number (limit));
-       nfonts = font_list (f, Qnil, Qnil, Qnil, &fonts);
  
!       if (nfonts == limit)
!       {
!         free_font_names (fonts, nfonts);
!         limit *= 2;
!       }
!       else
!       break;
!     }
  
    result = Qnil;
    GCPRO1 (result);
--- 2846,2855 ----
    Lisp_Object result;
    struct gcpro gcpro1;
    int count = SPECPDL_INDEX ();
  
!   /* Let's consider all fonts.  */
!   specbind (intern ("font-list-limit"), make_number (-1));
!   nfonts = font_list (f, Qnil, Qnil, Qnil, &fonts);
  
    result = Qnil;
    GCPRO1 (result);
***************
*** 2897,2903 ****
    CHECK_STRING (pattern);
  
    if (NILP (maximum))
!     maxnames = 2000;
    else
      {
        CHECK_NATNUM (maximum);
--- 2896,2902 ----
    CHECK_STRING (pattern);
  
    if (NILP (maximum))
!     maxnames = -1;
    else
      {
        CHECK_NATNUM (maximum);
Index: src/xterm.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xterm.c,v
retrieving revision 1.772
diff -c -r1.772 xterm.c
*** src/xterm.c 8 Feb 2003 11:18:32 -0000       1.772
--- src/xterm.c 16 Feb 2003 19:17:45 -0000
***************
*** 14536,14543 ****
        {
          /* We try at least 10 fonts because XListFonts will return
             auto-scaled fonts at the head.  */
!         names = XListFonts (dpy, SDATA (pattern), max (maxnames, 10),
!                             &num_fonts);
          if (x_had_errors_p (dpy))
            {
              /* This error is perhaps due to insufficient memory on X
--- 14536,14563 ----
        {
          /* We try at least 10 fonts because XListFonts will return
             auto-scaled fonts at the head.  */
!           if (maxnames < 0)
!             {
!               int limit;
! 
!               for (limit = 500;;)
!                 {
!                   names = XListFonts (dpy, SDATA (pattern), limit, 
&num_fonts);
!                   if (num_fonts == limit)
!                     {
!                       BLOCK_INPUT;
!                       XFreeFontNames (names);
!                       UNBLOCK_INPUT;
!                       limit *= 2;
!                     }
!                   else
!                     break;
!                 }
!             }
!           else
!             names = XListFonts (dpy, SDATA (pattern), max (maxnames, 10),
!                                 &num_fonts);
! 
          if (x_had_errors_p (dpy))
            {
              /* This error is perhaps due to insufficient memory on X

reply via email to

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