[Top][All Lists]
[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