diff options
| author | Richard M. Stallman | 1997-07-12 06:49:03 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1997-07-12 06:49:03 +0000 |
| commit | e14a8fb0a2cc1514750e27cc1e818be652c0489b (patch) | |
| tree | df878a6d273bf27cca91c75a7884ed73f4dd35e3 /src | |
| parent | c3597849243b38e36e0124197fd5de4185227906 (diff) | |
| download | emacs-e14a8fb0a2cc1514750e27cc1e818be652c0489b.tar.gz emacs-e14a8fb0a2cc1514750e27cc1e818be652c0489b.zip | |
Initial revision
Diffstat (limited to 'src')
| -rw-r--r-- | src/x-list-font.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/x-list-font.c b/src/x-list-font.c new file mode 100644 index 00000000000..a531123a5b9 --- /dev/null +++ b/src/x-list-font.c | |||
| @@ -0,0 +1,91 @@ | |||
| 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 (make_number (2), args); | ||
| 90 | } | ||
| 91 | } | ||