From 022eef6211c560013e6dda4c25b07921f8e9525c Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Sat, 5 Dec 2009 20:16:42 +0000 Subject: [PATCH] * xfaces.c (Fx_family_fonts): Handle 2009-07-14 change to return value of font_list_entities (Bug#5085). --- src/ChangeLog | 5 +++++ src/xfaces.c | 58 ++++++++++++++++++++++++++++----------------------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 35100e126a3..1909af820fb 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-12-05 Chong Yidong + + * xfaces.c (Fx_family_fonts): Handle 2009-07-14 change to return + value of font_list_entities (Bug#5085). + 2009-12-04 Juanma Barranquero Fix `string-to-number' to deal consistently with integers and floats. diff --git a/src/xfaces.c b/src/xfaces.c index 4c7f2d969d5..6630c10edcf 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -1745,8 +1745,8 @@ the face font sort order. */) (family, frame) Lisp_Object family, frame; { - Lisp_Object font_spec, vec; - int i, nfonts; + Lisp_Object font_spec, list, *drivers, vec; + int i, nfonts, ndrivers; Lisp_Object result; if (NILP (frame)) @@ -1759,32 +1759,38 @@ the face font sort order. */) CHECK_STRING (family); font_parse_family_registry (family, Qnil, font_spec); } - vec = font_list_entities (frame, font_spec); - nfonts = ASIZE (vec); - if (nfonts == 0) + + list = font_list_entities (frame, font_spec); + if (NILP (list)) return Qnil; - if (nfonts > 1) - { - for (i = 0; i < 4; i++) - switch (font_sort_order[i]) - { - case XLFD_SWIDTH: - font_props_for_sorting[i] = FONT_WIDTH_INDEX; break; - case XLFD_POINT_SIZE: - font_props_for_sorting[i] = FONT_SIZE_INDEX; break; - case XLFD_WEIGHT: - font_props_for_sorting[i] = FONT_WEIGHT_INDEX; break; - default: - font_props_for_sorting[i] = FONT_SLANT_INDEX; break; - } - font_props_for_sorting[i++] = FONT_FAMILY_INDEX; - font_props_for_sorting[i++] = FONT_FOUNDRY_INDEX; - font_props_for_sorting[i++] = FONT_ADSTYLE_INDEX; - font_props_for_sorting[i++] = FONT_REGISTRY_INDEX; - qsort (XVECTOR (vec)->contents, nfonts, sizeof (Lisp_Object), - compare_fonts_by_sort_order); - } + /* Sort the font entities. */ + for (i = 0; i < 4; i++) + switch (font_sort_order[i]) + { + case XLFD_SWIDTH: + font_props_for_sorting[i] = FONT_WIDTH_INDEX; break; + case XLFD_POINT_SIZE: + font_props_for_sorting[i] = FONT_SIZE_INDEX; break; + case XLFD_WEIGHT: + font_props_for_sorting[i] = FONT_WEIGHT_INDEX; break; + default: + font_props_for_sorting[i] = FONT_SLANT_INDEX; break; + } + font_props_for_sorting[i++] = FONT_FAMILY_INDEX; + font_props_for_sorting[i++] = FONT_FOUNDRY_INDEX; + font_props_for_sorting[i++] = FONT_ADSTYLE_INDEX; + font_props_for_sorting[i++] = FONT_REGISTRY_INDEX; + + ndrivers = XINT (Flength (list)); + drivers = alloca (sizeof (Lisp_Object) * ndrivers); + for (i = 0; i < ndrivers; i++, list = XCDR (list)) + drivers[i] = XCAR (list); + vec = Fvconcat (ndrivers, drivers); + nfonts = ASIZE (vec); + + qsort (XVECTOR (vec)->contents, nfonts, sizeof (Lisp_Object), + compare_fonts_by_sort_order); result = Qnil; for (i = nfonts - 1; i >= 0; --i) -- 2.39.5