Mercurial > emacs
changeset 49859:c6bacc76cfb6
* 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.
author | Jan Djärv <jan.h.d@swipnet.se> |
---|---|
date | Tue, 18 Feb 2003 21:30:08 +0000 |
parents | f86aab6b2827 |
children | 38c14af619da |
files | src/ChangeLog src/xfaces.c src/xterm.c |
diffstat | 3 files changed, 64 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Tue Feb 18 16:33:32 2003 +0000 +++ b/src/ChangeLog Tue Feb 18 21:30:08 2003 +0000 @@ -1,3 +1,14 @@ +2003-02-18 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> + + * 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 <storm@cua.dk> * lread.c (read1): Fix last change; "`" is not always special.
--- a/src/xfaces.c Tue Feb 18 16:33:32 2003 +0000 +++ b/src/xfaces.c Tue Feb 18 21:30:08 2003 +0000 @@ -474,7 +474,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ { Lisp_Object list = Valternate_fontname_alist; + if (fonts) xfree (fonts); + while (CONSP (list)) { Lisp_Object entry = XCAR (list); @@ -2527,7 +2541,7 @@ 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 @@ /* 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); + if (INTEGERP (Vfont_list_limit)) + nfonts = XINT (Vfont_list_limit); + + *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 @@ 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 @@ CHECK_STRING (pattern); if (NILP (maximum)) - maxnames = 2000; + maxnames = -1; else { CHECK_NATNUM (maximum);
--- a/src/xterm.c Tue Feb 18 16:33:32 2003 +0000 +++ b/src/xterm.c Tue Feb 18 21:30:08 2003 +0000 @@ -14536,8 +14536,28 @@ { /* 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