]> code.delx.au - gnu-emacs/blobdiff - src/xfns.c
(ada-83-string-keywords, ada-95-string-keywords, ada-2005-string-keywords):
[gnu-emacs] / src / xfns.c
index 7d19113db28108a894142d9e812b87b9f748c421..8f03d90c79670d1472de90c13873003121a8c709 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);
@@ -2116,10 +2137,33 @@ xic_create_xfontset (f, base_fontname)
 
       /* New fontset.  */
       xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
-                            fontsetname, &missing_list,
-                            &missing_count, &def_string);
+                           fontsetname, &missing_list,
+                           &missing_count, &def_string);
       if (missing_list)
-        XFreeStringList (missing_list);
+       XFreeStringList (missing_list);
+      if (! xfs)
+       {
+         /* 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.  */
+         char *p0 = fontsetname, *p1;
+
+         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);
     }
 
@@ -5819,7 +5863,7 @@ chooser to show or not show hidden files on a case by case basis.  */);
   x_gtk_show_hidden_files = 0;
 
   DEFVAR_BOOL ("x-gtk-file-dialog-help-text", &x_gtk_file_dialog_help_text,
-    doc: /* *If non-nil, the GTK file chooser will by show additional help text.
+    doc: /* *If non-nil, the GTK file chooser will show additional help text.
 If more space for files in the file chooser dialog is wanted, set this to nil
 to turn the additional text off.  */);
   x_gtk_file_dialog_help_text = 1;