]> code.delx.au - gnu-emacs/blobdiff - src/fontset.c
(get_keyelt): Handle an indirect entry with meta char.
[gnu-emacs] / src / fontset.c
index 93fdbfeccd1e150f889c442633beae288803d874..840555b427df0bb2af876908aa4f5666e9e12963 100644 (file)
@@ -31,9 +31,12 @@ Boston, MA 02111-1307, USA.  */
 #include "frame.h"
 
 Lisp_Object Vglobal_fontset_alist;
-
 Lisp_Object Vfont_encoding_alist;
 Lisp_Object Vuse_default_ascent;
+Lisp_Object Valternative_fontname_alist;
+Lisp_Object Vfontset_alias_alist;
+Lisp_Object Vhighlight_wrong_size_font;
+Lisp_Object Vclip_large_size_font;
 
 /* We had better have our own strcasecmp function because some system
    doesn't have it.  */
@@ -96,7 +99,7 @@ free_fontset_data (fontset_data)
       int j;
 
       xfree (fontset_data->fontset_table[i]->name);
-      for (j = 0; j < MAX_CHARSET; j++)
+      for (j = 0; j <= MAX_CHARSET; j++)
        if (fontset_data->fontset_table[i]->fontname[j])
          xfree (fontset_data->fontset_table[i]->fontname[j]);
       xfree (fontset_data->fontset_table[i]);
@@ -172,7 +175,7 @@ fs_load_font (f, font_table, charset, fontname, fontset)
       int i;
 
       fontp->encoding[0] = fontp->encoding[1];
-      for (i = MIN_CHARSET_OFFICIAL_DIMENSION1; i < MAX_CHARSET; i++)
+      for (i = MIN_CHARSET_OFFICIAL_DIMENSION1; i <= MAX_CHARSET; i++)
        fontp->encoding[i] = fontp->encoding[1];
     }
   else
@@ -182,7 +185,7 @@ fs_load_font (f, font_table, charset, fontname, fontset)
 
       /* At first, set 1 (means 0xA0..0xFF) as the default.  */
       fontp->encoding[0] = 1;
-      for (i = MIN_CHARSET_OFFICIAL_DIMENSION1; i < MAX_CHARSET; i++)
+      for (i = MIN_CHARSET_OFFICIAL_DIMENSION1; i <= MAX_CHARSET; i++)
        fontp->encoding[i] = 1;
       /* Then override them by a specification in Vfont_encoding_alist.  */
       for (list = Vfont_encoding_alist; CONSP (list); list = XCONS (list)->cdr)
@@ -242,7 +245,7 @@ fs_load_font (f, font_table, charset, fontname, fontset)
 
          fontsetp->size = fontp->size;
          fontsetp->height = fontp->height;
-         for (i = CHARSET_ASCII + 1; i < MAX_CHARSET; i++)
+         for (i = CHARSET_ASCII + 1; i <= MAX_CHARSET; i++)
            {
              font_idx = fontsetp->font_indexes[i];
              if (font_idx >= 0)
@@ -317,7 +320,7 @@ fs_register_fontset (f, fontset_info)
 
   fontsetp->size = fontsetp->height = 0;
 
-  for (i = 0; i < MAX_CHARSET; i++)
+  for (i = 0; i <= MAX_CHARSET; i++)
     {
       fontsetp->fontname[i] = (char *) 0;
       fontsetp->font_indexes[i] = FONT_NOT_OPENED;
@@ -382,50 +385,31 @@ Lisp_Object
 fontset_pattern_regexp (pattern)
      Lisp_Object pattern;
 {
-  int nickname = 0;
-
   if (!index (XSTRING (pattern)->data, '*')
       && !index (XSTRING (pattern)->data, '?'))
     /* PATTERN does not contain any wild cards.  */
-    {
-      if (XSTRING (pattern)->size > 8
-         && ! bcmp (XSTRING (pattern)->data, "fontset-", 8))
-       /* Just a nickname of a fontset is specified.  */
-       nickname = 1;
-      else
-       return Qnil;
-    }
+    return Qnil;
 
   if (!CONSP (Vcached_fontset_data)
       || strcmp (XSTRING (pattern)->data, CACHED_FONTSET_NAME))
     {
       /* We must at first update the cached data.  */
-      char *regex = (char *) alloca (XSTRING (pattern)->size * 2 + 3);
+      char *regex = (char *) alloca (XSTRING (pattern)->size * 2);
       char *p0, *p1 = regex;
 
-      if (nickname)
+      /* Convert "*" to ".*", "?" to ".".  */
+      *p1++ = '^';
+      for (p0 = XSTRING (pattern)->data; *p0; p0++)
        {
-         /* Just prepend ".*-" to PATTERN.  */
-         *p1++= '.'; *p1++= '*', *p1++= '-';
-         bcopy (XSTRING (pattern)->data, p1, XSTRING (pattern)->size);
-         p1 += XSTRING (pattern)->size;
-       }
-      else
-       {
-         /* Convert "*" to ".*", "?" to ".".  */
-         *p1++ = '^';
-         for (p0 = XSTRING (pattern)->data; *p0; p0++)
+         if (*p0 == '*')
            {
-             if (*p0 == '*')
-               {
-                 *p1++ = '.';
-                 *p1++ = '*';
-               }
-             else if (*p0 == '?')
-               *p1++ == '.';
-             else
-               *p1++ = *p0;
+             *p1++ = '.';
+             *p1++ = '*';
            }
+         else if (*p0 == '?')
+           *p1++ == '.';
+         else
+           *p1++ = *p0;
        }
       *p1++ = '$';
       *p1++ = 0;
@@ -453,6 +437,10 @@ just like X's font name matching algorithm allows.")
   if (XSTRING (pattern)->size == 0)
     return Qnil;
 
+  tem = Frassoc (pattern, Vfontset_alias_alist);
+  if (!NILP (tem))
+    return Fcar (tem);
+
   regexp = fontset_pattern_regexp (pattern);
 
   for (tem = Vglobal_fontset_alist; CONSP (tem); tem = XCONS (tem)->cdr)
@@ -521,7 +509,7 @@ list_fontsets (f, pattern, size)
                 one with SIZE.  */
              int j;
 
-             for (j = 0; j < MAX_CHARSET; j++)
+             for (j = 0; j <= MAX_CHARSET; j++)
                if (fontsetp->fontname[j])
                  {
                    if ((*load_font_func) (f, fontsetp->fontname[j], size))
@@ -764,7 +752,7 @@ loading failed.")
   XVECTOR (info)->contents[0] = make_number (fontsetp->size);
   XVECTOR (info)->contents[1] = make_number (fontsetp->height);
   val = Qnil;
-  for (i = 0; i < MAX_CHARSET; i++)
+  for (i = 0; i <= MAX_CHARSET; i++)
     if (fontsetp->fontname[i])
       {
        int font_idx = fontsetp->font_indexes[i];
@@ -827,6 +815,36 @@ If an entry for a character is non-nil, the ascent value of the glyph\n\
 is assumed to be what specified by _MULE_DEFAULT_ASCENT property of a font.");
   Vuse_default_ascent = Qnil;
 
+  DEFVAR_LISP ("alternative-fontname-alist", &Valternative_fontname_alist,
+     "Alist of fontname vs list of the alternative fontnames.\n\
+When no font can be opened by a fontname, the corresponding\n\
+alternative fontnames are tried.");
+  Valternative_fontname_alist = Qnil;
+
+  DEFVAR_LISP ("fontset-alias-alist", &Vfontset_alias_alist,
+     "Alist of fontset names vs the aliases.");
+  Vfontset_alias_alist = Qnil;
+
+  DEFVAR_LISP ("highlight-wrong-size-font", &Vhighlight_wrong_size_font,
+     "*Non-nil means highlight characters shown in wrong size fonts somehow.\n\
+The way to highlight them depends on window system on which Emacs runs.\n\
+On X window, a rectangle is shown around each such character.");
+  Vhighlight_wrong_size_font = Qt;
+
+  DEFVAR_LISP ("clip-large-size-font", &Vclip_large_size_font,
+     "*Non-nil means characters shown in large size fonts are clipped.\n\
+The height of clipping area is the same as that of an ASCII character.\n\
+The width of the area is the same as that of an ASCII character or\n\
+twice wider than that of an ASCII character depending on\n\
+the width (i.e. column numbers occupied on screen) of the character set\n\
+of the character.\n\
+\n\
+In the case that you only have too large size font for a specific\n\
+charscter set, and clipping characters of the character set makes them\n\
+almost unreadable, you can set this variable to t to see the\n\
+characters in exchage for garbage dots left on your screen.");
+  Vclip_large_size_font = Qt;
+
   defsubr (&Squery_fontset);
   defsubr (&Snew_fontset);
   defsubr (&Sset_fontset_font);