From ee5be7c3c93602b4c5d6b7181544141e9484c003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Dj=C3=A4rv?= Date: Tue, 18 Feb 2003 21:30:08 +0000 Subject: [PATCH] * xterm.c (x_list_fonts): If maxnames is less than 0, get all font names. * xfaces.c (x_face_list_fonts): Allocate struct font_name here. (sorted_font_list): Moved allocation of struct font_name to x_face_list_fonts. (Fx_font_family_list): Set font-list-limit to -1 to get all font names. (Fx_list_fonts): Set maxnames to -1 to get all font names. --- src/ChangeLog | 11 +++++++++++ src/xfaces.c | 55 ++++++++++++++++++++++++++------------------------- src/xterm.c | 24 ++++++++++++++++++++-- 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 8359b581a9b..5bef6ada00f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2003-02-18 Jan Dj,Ad(Brv + + * xterm.c (x_list_fonts): If maxnames is less than 0, get all font + names. + + * xfaces.c (x_face_list_fonts): Allocate struct font_name here. + (sorted_font_list): Moved allocation of struct font_name to + x_face_list_fonts. + (Fx_font_family_list): Set font-list-limit to -1 to get all font names. + (Fx_list_fonts): Set maxnames to -1 to get all font names. + 2003-02-18 Kim F. Storm * lread.c (read1): Fix last change; "`" is not always special. diff --git a/src/xfaces.c b/src/xfaces.c index bf942be245f..0e6fa8daf34 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -474,7 +474,7 @@ static void set_font_frame_param P_ ((Lisp_Object, Lisp_Object)); 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)); + 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,10 +2435,10 @@ sort_fonts (f, fonts, nfonts, cmpfn) 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) +x_face_list_fonts (f, pattern, pfonts, nfonts, try_alternatives_p) struct frame *f; char *pattern; - struct font_name *fonts; + struct font_name **pfonts; int nfonts, try_alternatives_p; { int n, nignored; @@ -2447,7 +2447,10 @@ x_face_list_fonts (f, pattern, fonts, nfonts, try_alternatives_p) better to do it the other way around. */ Lisp_Object lfonts; Lisp_Object lpattern, tem; + struct font_name *fonts = 0; + int num_fonts = nfonts; + *pfonts = 0; lpattern = build_string (pattern); /* Get the list of fonts matching PATTERN. */ @@ -2459,10 +2462,13 @@ x_face_list_fonts (f, pattern, fonts, nfonts, try_alternatives_p) 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 < nfonts; tem = XCDR (tem)) + for (tem = lfonts; CONSP (tem) && n < num_fonts; tem = XCDR (tem)) { Lisp_Object elt, tail; const char *name = SDATA (XCAR (tem)); @@ -2481,6 +2487,12 @@ x_face_list_fonts (f, pattern, fonts, nfonts, try_alternatives_p) 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,6 +2516,8 @@ x_face_list_fonts (f, pattern, fonts, nfonts, try_alternatives_p) { Lisp_Object list = Valternate_fontname_alist; + if (fonts) xfree (fonts); + while (CONSP (list)) { Lisp_Object entry = XCAR (list); @@ -2527,7 +2541,7 @@ x_face_list_fonts (f, pattern, fonts, nfonts, try_alternatives_p) already with no success. */ && (strcmp (SDATA (name), pattern) == 0 || (n = x_face_list_fonts (f, SDATA (name), - fonts, nfonts, 0), + pfonts, nfonts, 0), n == 0))) patterns = XCDR (patterns); } @@ -2556,17 +2570,17 @@ sorted_font_list (f, pattern, cmpfn, fonts) /* 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); + if (INTEGERP (Vfont_list_limit)) + nfonts = XINT (Vfont_list_limit); - *fonts = (struct font_name *) xmalloc (nfonts * sizeof **fonts); - nfonts = x_face_list_fonts (f, pattern, *fonts, nfonts, 1); + *fonts = NULL; + 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. */ if (nfonts) sort_fonts (f, *fonts, nfonts, cmpfn); - else + else if (*fonts) { xfree (*fonts); *fonts = NULL; @@ -2834,23 +2848,10 @@ are fixed-pitch. */) 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; - } + /* 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,7 +2898,7 @@ the WIDTH times as wide as FACE on FRAME. */) CHECK_STRING (pattern); if (NILP (maximum)) - maxnames = 2000; + maxnames = -1; else { CHECK_NATNUM (maximum); diff --git a/src/xterm.c b/src/xterm.c index a27ddb22612..ebc0366e36b 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -14536,8 +14536,28 @@ x_list_fonts (f, pattern, size, maxnames) { /* 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 (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