summaryrefslogtreecommitdiff
path: root/src/xfns.c
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2006-10-21 01:57:34 +0000
committerKenichi Handa <handa@m17n.org>2006-10-21 01:57:34 +0000
commitcd987aaa0a8254a701886b3c32c269b09025c7a1 (patch)
tree31fa5fd7d4ad6ba4fb843d1ec4e8cd5c5b57a5fc /src/xfns.c
parentf5da083ed9884178b88bf2ee81486e4527d0da81 (diff)
downloademacs-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.c50
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);
}