home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / e20313sr.zip / emacs / 20.3.1 / src / x-list-font.c < prev    next >
Text File  |  1999-07-31  |  3KB  |  92 lines

  1. DEFUN ("x-list-fonts", Fx_list_fonts, Sx_list_fonts, 1, 5, 0,
  2.   "Return a list of the names of available fonts matching PATTERN.\n\
  3. If optional arguments FACE and FRAME are specified, return only fonts\n\
  4. the same size as FACE on FRAME.\n\
  5. PATTERN is a string, perhaps with wildcard characters;\n\
  6.   the * character matches any substring, and\n\
  7.   the ? character matches any single character.\n\
  8.   PATTERN is case-insensitive.\n\
  9. FACE is a face name--a symbol.\n\
  10. \n\
  11. The return value is a list of strings, suitable as arguments to\n\
  12. set-face-font.\n\
  13. \n\
  14. Fonts Emacs can't use (i.e. proportional fonts) may or may not be excluded\n\
  15. even if they match PATTERN and FACE.\n\
  16. The optional fourth argument MAXIMUM sets a limit on how many\n\
  17. fonts to match.  The first MAXIMUM fonts are reported.\n\
  18. The optional fifth argument WIDTH, if specified, is a number of columns\n\
  19. occupied by a character of a font.  In that case, return only fonts\n\
  20. the WIDTH times as wide as FACE on FRAME.")
  21.   (pattern, face, frame, maximum, width)
  22.     Lisp_Object pattern, face, frame, maximum, width;
  23. {
  24.   FRAME_PTR f;
  25.   int size, cols;
  26.   int maxnames;
  27.  
  28.   check_x ();
  29.   CHECK_STRING (pattern, 0);
  30.   if (!NILP (face))
  31.     CHECK_SYMBOL (face, 1);
  32.  
  33.   if (NILP (maximum))
  34.     maxnames = 2000;
  35.   else
  36.     {
  37.       CHECK_NATNUM (maximum, 0);
  38.       maxnames = XINT (maximum);
  39.     }
  40.  
  41.   if (!NILP (width))
  42.     CHECK_NUMBER (width, 4);
  43.  
  44.   /* We can't simply call check_x_frame because this function may be
  45.      called before any frame is created.  */
  46.   if (NILP (frame))
  47.     f = selected_frame;
  48.   else
  49.     {
  50.       CHECK_LIVE_FRAME (frame, 0);
  51.       f = XFRAME (frame);
  52.     }
  53.   if (! FRAME_X_P (f))
  54.     {
  55.       /* Perhaps we have not yet created any frame.  */
  56.       f = NULL;
  57.       face = Qnil;
  58.     }
  59.  
  60.   /* Determine the width standard for comparison with the fonts we find.  */
  61.  
  62.   if (NILP (face))
  63.     size = 0;
  64.   else
  65.     {
  66.       int face_id;
  67.  
  68.       face_id = face_name_id_number (f, face);
  69.  
  70.       if (face_id < 0 || face_id >= FRAME_N_PARAM_FACES (f)
  71.       || FRAME_PARAM_FACES (f) [face_id] == 0
  72.       || FRAME_PARAM_FACES (f) [face_id]->font == (XFontStruct *) (~0))
  73.     size = f->output_data.x->font->max_bounds.width;
  74.       else
  75.     size = FRAME_PARAM_FACES (f) [face_id]->font->max_bounds.width;
  76.  
  77.       if (!NILP (width))
  78.       size *= XINT (width);
  79.     }
  80.  
  81.   {
  82.     Lisp_Object args[2];
  83.  
  84.     args[0] = x_list_fonts (f, pattern, size, maxnames);
  85.     if (f == NULL)
  86.       /* We don't have to check fontsets.  */
  87.       return args[0];
  88.     args[1] = list_fontsets (f, pattern, size);
  89.     return Fnconc (2, args);
  90.   }
  91. }
  92.