Mercurial > emacs
diff src/macterm.c @ 46169:36989d5089ee
2002-07-03 Andrew Choi <akochoi@shaw.ca>
* macterm.c (x_list_fonts): Fix comment. Cache fonts matching
pattern. Search cache first.
| author | Andrew Choi <akochoi@shaw.ca> |
|---|---|
| date | Thu, 04 Jul 2002 02:43:48 +0000 |
| parents | 56be68853618 |
| children | 40db0673e6f0 |
line wrap: on
line diff
--- a/src/macterm.c Thu Jul 04 02:10:45 2002 +0000 +++ b/src/macterm.c Thu Jul 04 02:43:48 2002 +0000 @@ -10860,11 +10860,9 @@ /* Return a list of at most MAXNAMES font specs matching the one in - PATTERN. Note that each '*' in the PATTERN matches exactly one - field of the font spec, unlike X in which an '*' in a font spec can - match a number of fields. The result is in the Mac implementation - all fonts must be specified by a font spec with all 13 fields - (although many of these can be "*'s"). */ + PATTERN. Cache matching fonts for patterns in + dpyinfo->name_list_element to avoid looking them up again by + calling mac_font_pattern_match (slow). */ Lisp_Object x_list_fonts (struct frame *f, @@ -10873,14 +10871,28 @@ int maxnames) { char *ptnstr; - Lisp_Object newlist = Qnil; + Lisp_Object newlist = Qnil, tem, key; int n_fonts = 0; int i; struct gcpro gcpro1, gcpro2; + struct mac_display_info *dpyinfo = f ? FRAME_MAC_DISPLAY_INFO (f) : NULL; if (font_name_table == NULL) /* Initialize when first used. */ init_font_name_table (); + if (dpyinfo) + { + tem = XCDR (dpyinfo->name_list_element); + key = Fcons (pattern, make_number (maxnames)); + + newlist = Fassoc (key, tem); + if (!NILP (newlist)) + { + newlist = Fcdr_safe (newlist); + goto label_cached; + } + } + ptnstr = XSTRING (pattern)->data; GCPRO2 (pattern, newlist); @@ -10902,6 +10914,14 @@ UNGCPRO; + if (dpyinfo) + { + XSETCDR (dpyinfo->name_list_element, + Fcons (Fcons (key, newlist), + XCDR (dpyinfo->name_list_element))); + } + label_cached: + return newlist; }
