18753
|
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
|
23518
|
28 (*check_window_system_func) ();
|
18753
|
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 }
|
23518
|
53 if (! FRAME_WINDOW_P (f))
|
18753
|
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))
|
23518
|
73 size = FONT_WIDTH (FRAME_FONT (f));
|
18753
|
74 else
|
23518
|
75 size = FONT_WIDTH (FRAME_PARAM_FACES (f) [face_id]->font);
|
18753
|
76
|
|
77 if (!NILP (width))
|
|
78 size *= XINT (width);
|
|
79 }
|
|
80
|
|
81 {
|
|
82 Lisp_Object args[2];
|
|
83
|
23518
|
84 args[0] = (*list_fonts_func) (f, pattern, size, maxnames);
|
18753
|
85 if (f == NULL)
|
|
86 /* We don't have to check fontsets. */
|
|
87 return args[0];
|
|
88 args[1] = list_fontsets (f, pattern, size);
|
18754
|
89 return Fnconc (2, args);
|
18753
|
90 }
|
|
91 }
|