]> code.delx.au - gnu-emacs/commitdiff
(xic_create_fontsetname): If ADSTYLE field is not a wild
authorKenichi Handa <handa@m17n.org>
Sat, 21 Oct 2006 01:57:34 +0000 (01:57 +0000)
committerKenichi Handa <handa@m17n.org>
Sat, 21 Oct 2006 01:57:34 +0000 (01:57 +0000)
card, change it to "*".
(xic_create_xfontset): Call XCreateFontSet for each single
fontname in fontsetname.

src/ChangeLog
src/xfns.c

index 0f098a07c8a6ee45828d55784e60f537e83e40ee..930c2a44d4de2b909a1c705a89c9d8af581f10fe 100644 (file)
@@ -1,3 +1,10 @@
+2006-10-21  Kenichi Handa  <handa@m17n.org>
+
+       * 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  <cyd@stupidchicken.com>
 
        * callint.c (callint_message): Convert to a Lisp string.
index 3afaf0ea20a76ca49873ba4897158bb6f1da8168..9f656d4cd7b7ec3c4d33079e6a012d3b70ebb63c 100644 (file)
@@ -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);
     }