diff options
author | Kenichi Handa <handa@m17n.org> | 2006-10-21 01:57:34 +0000 |
---|---|---|
committer | Kenichi Handa <handa@m17n.org> | 2006-10-21 01:57:34 +0000 |
commit | cd987aaa0a8254a701886b3c32c269b09025c7a1 (patch) | |
tree | 31fa5fd7d4ad6ba4fb843d1ec4e8cd5c5b57a5fc /src/xfns.c | |
parent | f5da083ed9884178b88bf2ee81486e4527d0da81 (diff) | |
download | emacs-cd987aaa0a8254a701886b3c32c269b09025c7a1.tar.gz emacs-cd987aaa0a8254a701886b3c32c269b09025c7a1.tar.bz2 emacs-cd987aaa0a8254a701886b3c32c269b09025c7a1.zip |
(xic_create_fontsetname): If ADSTYLE field is not a wild
card, change it to "*".
(xic_create_xfontset): Call XCreateFontSet for each single
fontname in fontsetname.
Diffstat (limited to 'src/xfns.c')
-rw-r--r-- | src/xfns.c | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/src/xfns.c b/src/xfns.c index 3afaf0ea20a..9f656d4cd7b 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -2020,13 +2020,14 @@ xic_create_fontsetname (base_fontname, motif) else { int len; - char *p1 = NULL, *p2 = NULL; + char *p1 = NULL, *p2 = NULL, *p3 = NULL; char *font_allcs = NULL; char *font_allfamilies = NULL; char *font_all = NULL; char *allcs = "*-*-*-*-*-*-*"; char *allfamilies = "-*-*-"; char *all = "*-*-*-*-"; + char *base; for (i = 0, p = base_fontname; i < 8; p++) { @@ -2037,8 +2038,27 @@ xic_create_fontsetname (base_fontname, motif) p1 = p + 1; else if (i == 7) p2 = p + 1; + else if (i == 6) + p3 = p + 1; } } + /* If base_fontname specifies ADSTYLE, make it a + wildcard. */ + if (*p3 != '*') + { + int diff = (p2 - p3) - 2; + + base = alloca (strlen (base_fontname) + 1); + bcopy (base_fontname, base, p3 - base_fontname); + base[p3 - base_fontname] = '*'; + base[(p3 - base_fontname) + 1] = '-'; + strcpy (base + (p3 - base_fontname) + 2, p2); + p = base + (p - base_fontname) - diff; + p1 = base + (p1 - base_fontname); + p2 = base + (p2 - base_fontname) - diff; + base_fontname = base; + } + /* Build the font spec that matches all charsets. */ len = p - base_fontname + strlen (allcs) + 1; font_allcs = (char *) alloca (len); @@ -2046,7 +2066,8 @@ xic_create_fontsetname (base_fontname, motif) bcopy (base_fontname, font_allcs, p - base_fontname); strcat (font_allcs, allcs); - /* Build the font spec that matches all families. */ + /* Build the font spec that matches all families and + add-styles. */ len = p - p1 + strlen (allcs) + strlen (allfamilies) + 1; font_allfamilies = (char *) alloca (len); bzero (font_allfamilies, len); @@ -2113,13 +2134,28 @@ xic_create_xfontset (f, base_fontname) if (!xfs) { char *fontsetname = xic_create_fontsetname (base_fontname, False); + char *p0 = fontsetname, *p1; /* New fontset. */ - xfs = XCreateFontSet (FRAME_X_DISPLAY (f), - fontsetname, &missing_list, - &missing_count, &def_string); - if (missing_list) - XFreeStringList (missing_list); + /* FONTSETNAME contains a list of font names (specific fonts + first, general fonts last), but giving that to XCreateFontSet + at once occasionally fails (bug of X?). So, we try to call + XCreateFontSet for each fontname. */ + + while (p0) + { + p1 = strchr (p0, ','); + if (p1) + *p1 = '\0'; + xfs = XCreateFontSet (FRAME_X_DISPLAY (f), + p0, &missing_list, + &missing_count, &def_string); + if (missing_list) + XFreeStringList (missing_list); + if (xfs) + break; + p0 = p1 ? p1 + 1 : NULL; + } xfree (fontsetname); } |