From cd987aaa0a8254a701886b3c32c269b09025c7a1 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Sat, 21 Oct 2006 01:57:34 +0000 Subject: [PATCH] (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. --- src/ChangeLog | 7 +++++++ src/xfns.c | 50 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 0f098a07c8a..930c2a44d4d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2006-10-21 Kenichi Handa + + * xfns.c (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. + 2006-10-19 Chong Yidong * callint.c (callint_message): Convert to a Lisp string. 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); } -- 2.39.5