annotate src/xfont.c @ 90679:9a7955701103

*** empty log message ***
author Kenichi Handa <handa@m17n.org>
date Fri, 24 Nov 2006 01:48:49 +0000
parents 0af2dbdeaeb3
children a31984e21969
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1 /* xfont.c -- X core font driver.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2 Copyright (C) 2006 Free Software Foundation, Inc.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
3 Copyright (C) 2006
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
4 National Institute of Advanced Industrial Science and Technology (AIST)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
5 Registration Number H13PRO009
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
6
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
7 This file is part of GNU Emacs.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
8
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
9 GNU Emacs is free software; you can redistribute it and/or modify
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10 it under the terms of the GNU General Public License as published by
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
11 the Free Software Foundation; either version 2, or (at your option)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
12 any later version.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
13
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
14 GNU Emacs is distributed in the hope that it will be useful,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
17 GNU General Public License for more details.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
18
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
20 along with GNU Emacs; see the file COPYING. If not, write to
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
22 Boston, MA 02110-1301, USA. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
23
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
24 #include <config.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
25 #include <stdio.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26 #include <X11/Xlib.h>
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
27
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28 #include "lisp.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29 #include "dispextern.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30 #include "xterm.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 #include "frame.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 #include "blockinput.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 #include "character.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 #include "charset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 #include "fontset.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36 #include "font.h"
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39 /* X core font driver. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41 Lisp_Object Qx;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
42
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
43 /* Alist of font registry symbol and the corresponding charsets
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
44 information. The information is retrieved from
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45 Vfont_encoding_alist on demand.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
47 Eash element has the form:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 (REGISTRY . (ENCODING-CHARSET-ID . REPERTORY-CHARSET-ID))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 or
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50 (REGISTRY . nil)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
52 In the former form, ENCODING-CHARSET-ID is an ID of a charset that
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53 encodes a character code to a glyph code of a font, and
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54 REPERTORY-CHARSET-ID is an ID of a charset that tells if a
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55 character is supported by a font.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57 The latter form means that the information for REGISTRY couldn't be
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58 retrieved. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 static Lisp_Object x_font_charset_alist;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61 /* Prototypes of support functions. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62 extern void x_clear_errors P_ ((Display *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
63
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
64 static char *xfont_query_font P_ ((Display *, char *, Lisp_Object));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
65 static XCharStruct *xfont_get_pcm P_ ((XFontStruct *, XChar2b *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66 static int xfont_registry_charsets P_ ((Lisp_Object, struct charset **,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67 struct charset **));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 static char *
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 xfont_query_font (display, name, spec)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 Display *display;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 char *name;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 Lisp_Object spec;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 XFontStruct *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
76
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
77 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
78 x_catch_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 font = XLoadQueryFont (display, name);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
80 name = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
81 if (x_had_errors_p (display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 /* This error is perhaps due to insufficient memory on X
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 server. Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 x_clear_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 else if (font)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89 unsigned long value;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91 if (XGetFontProperty (font, XA_FONT, &value))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 char *n = (char *) XGetAtomName (display, (Atom) value);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
95 if (font_parse_xlfd (n, spec) >= 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 name = n;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 XFree (n);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
99 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100 XFreeFont (display, font);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
101 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
104
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 return name;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
108
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
109 /* Get metrics of character CHAR2B in XFONT. Value is null if CHAR2B
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 is not contained in the font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 static XCharStruct *
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113 xfont_get_pcm (xfont, char2b)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 XFontStruct *xfont;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115 XChar2b *char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
116 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117 /* The result metric information. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
118 XCharStruct *pcm = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 xassert (xfont && char2b);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
122 if (xfont->per_char != NULL)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
123 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
124 if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
125 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
126 /* min_char_or_byte2 specifies the linear character index
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
127 corresponding to the first element of the per_char array,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
128 max_char_or_byte2 is the index of the last character. A
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
129 character with non-zero CHAR2B->byte1 is not in the font.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
130 A character with byte2 less than min_char_or_byte2 or
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
131 greater max_char_or_byte2 is not in the font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
132 if (char2b->byte1 == 0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133 && char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 pcm = xfont->per_char + char2b->byte2 - xfont->min_char_or_byte2;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
136 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
137 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139 /* If either min_byte1 or max_byte1 are nonzero, both
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
140 min_char_or_byte2 and max_char_or_byte2 are less than
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141 256, and the 2-byte character index values corresponding
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
142 to the per_char array element N (counting from 0) are:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
144 byte1 = N/D + min_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
145 byte2 = N\D + min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
146
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
147 where:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
148
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
149 D = max_char_or_byte2 - min_char_or_byte2 + 1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
150 / = integer division
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
151 \ = integer modulus */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
152 if (char2b->byte1 >= xfont->min_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
153 && char2b->byte1 <= xfont->max_byte1
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154 && char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
156 pcm = (xfont->per_char
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157 + ((xfont->max_char_or_byte2 - xfont->min_char_or_byte2 + 1)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
158 * (char2b->byte1 - xfont->min_byte1))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
159 + (char2b->byte2 - xfont->min_char_or_byte2));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
160 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
161 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
162 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 /* If the per_char pointer is null, all glyphs between the first
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 and last character indexes inclusive have the same
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
166 information, as given by both min_bounds and max_bounds. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167 if (char2b->byte2 >= xfont->min_char_or_byte2
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 && char2b->byte2 <= xfont->max_char_or_byte2)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169 pcm = &xfont->max_bounds;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
170 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172 return ((pcm == NULL
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 || (pcm->width == 0 && (pcm->rbearing - pcm->lbearing) == 0))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174 ? NULL : pcm);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
177 extern Lisp_Object find_font_encoding P_ ((Lisp_Object));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
178
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 /* Return encoding charset and repertory charset for REGISTRY in
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 ENCODING and REPERTORY correspondingly. If correct information for
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 REGISTRY is available, return 0. Otherwise return -1. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
184 xfont_registry_charsets (registry, encoding, repertory)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
185 Lisp_Object registry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
186 struct charset **encoding, **repertory;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
187 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
188 Lisp_Object val;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
189 int encoding_id, repertory_id;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
190
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 val = assq_no_quit (registry, x_font_charset_alist);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192 if (! NILP (val))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
194 val = XCDR (val);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
195 if (NILP (val))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
196 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
197 encoding_id = XINT (XCAR (val));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 repertory_id = XINT (XCDR (val));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
199 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
201 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
202 val = find_font_encoding (SYMBOL_NAME (registry));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203 if (SYMBOLP (val) && CHARSETP (val))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205 encoding_id = repertory_id = XINT (CHARSET_SYMBOL_ID (val));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
206 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
207 else if (CONSP (val))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
208 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
209 if (! CHARSETP (XCAR (val)))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
210 goto invalid_entry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
211 encoding_id = XINT (CHARSET_SYMBOL_ID (XCAR (val)));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
212 if (NILP (XCDR (val)))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
213 repertory_id = -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
214 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
216 if (! CHARSETP (XCDR (val)))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
217 goto invalid_entry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
218 repertory_id = XINT (CHARSET_SYMBOL_ID (XCDR (val)));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
219 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
220 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
221 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
222 goto invalid_entry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
223 val = Fcons (make_number (encoding_id), make_number (repertory_id));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
224 x_font_charset_alist
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
225 = nconc2 (x_font_charset_alist, Fcons (Fcons (registry, val), Qnil));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
226 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
228 if (encoding)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
229 *encoding = CHARSET_FROM_ID (encoding_id);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
230 if (repertory)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
231 *repertory = repertory_id >= 0 ? CHARSET_FROM_ID (repertory_id) : NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232 return 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
233
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
234 invalid_entry:
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
235 x_font_charset_alist
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
236 = nconc2 (x_font_charset_alist, Fcons (Fcons (registry, Qnil), Qnil));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
237 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
238 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
239
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
240 static Lisp_Object xfont_get_cache P_ ((Lisp_Object));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
241 static Lisp_Object xfont_list P_ ((Lisp_Object, Lisp_Object));
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
242 static Lisp_Object xfont_match P_ ((Lisp_Object, Lisp_Object));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
243 static Lisp_Object xfont_list_family P_ ((Lisp_Object));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
244 static struct font *xfont_open P_ ((FRAME_PTR, Lisp_Object, int));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
245 static void xfont_close P_ ((FRAME_PTR, struct font *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
246 static int xfont_prepare_face P_ ((FRAME_PTR, struct face *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
247 #if 0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
248 static void xfont_done_face P_ ((FRAME_PTR, struct face *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
249 #endif
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
250 static int xfont_has_char P_ ((Lisp_Object, int));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
251 static unsigned xfont_encode_char P_ ((struct font *, int));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
252 static int xfont_text_extents P_ ((struct font *, unsigned *, int,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
253 struct font_metrics *));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
254 static int xfont_draw P_ ((struct glyph_string *, int, int, int, int, int));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
255
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
256 struct font_driver xfont_driver =
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
257 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
258 (Lisp_Object) NULL, /* Qx */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
259 xfont_get_cache,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
260 xfont_list,
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
261 xfont_match,
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
262 xfont_list_family,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
263 NULL,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
264 xfont_open,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
265 xfont_close,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
266 xfont_prepare_face,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
267 NULL /*xfont_done_face*/,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
268 xfont_has_char,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
269 xfont_encode_char,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
270 xfont_text_extents,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
271 xfont_draw,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
272 };
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
273
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
274 extern Lisp_Object QCname;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
275
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
276 static Lisp_Object
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277 xfont_get_cache (frame)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
278 Lisp_Object frame;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
279 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
280 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (XFRAME (frame));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
281
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
282 return (dpyinfo->name_list_element);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
283 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
284
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
285 extern Lisp_Object Vface_alternative_font_registry_alist;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
286
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
287 static Lisp_Object
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
288 xfont_list_pattern (frame, display, pattern)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
289 Lisp_Object frame;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
290 Display *display;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
291 char *pattern;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
292 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
293 Lisp_Object list = Qnil;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
294 int i, limit, num_fonts;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
295 char **names;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
296
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
297 BLOCK_INPUT;
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
298 x_catch_errors (display);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
300 for (limit = 512; ; limit *= 2)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
302 names = XListFonts (display, pattern, limit, &num_fonts);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
303 if (x_had_errors_p (display))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
304 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
305 /* This error is perhaps due to insufficient memory on X
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
306 server. Let's just ignore it. */
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
307 x_clear_errors (display);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
308 num_fonts = 0;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
309 break;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
310 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
311 if (num_fonts < limit)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
312 break;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
313 XFreeFontNames (names);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
314 }
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
315
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
316 for (i = 0; i < num_fonts; i++)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
317 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
318 Lisp_Object entity = Fmake_vector (make_number (FONT_ENTITY_MAX), Qnil);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
319 int result;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
320
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
321 ASET (entity, FONT_TYPE_INDEX, Qx);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
322 ASET (entity, FONT_FRAME_INDEX, frame);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
323
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
324 result = font_parse_xlfd (names[i], entity);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
325 if (result < 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
326 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
327 /* This may be an alias name. Try to get the full XLFD name
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
328 from XA_FONT property of the font. */
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
329 XFontStruct *font = XLoadQueryFont (display, names[i]);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
330 unsigned long value;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
331
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
332 if (! font)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
333 continue;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
334 if (XGetFontProperty (font, XA_FONT, &value))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
335 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
336 char *name = (char *) XGetAtomName (display, (Atom) value);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
337 int len = strlen (name);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
338
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
339 /* If DXPC (a Differential X Protocol Compressor)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
340 Ver.3.7 is running, XGetAtomName will return null
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
341 string. We must avoid such a name. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
342 if (len > 0)
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
343 result = font_parse_xlfd (name, entity);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
344 XFree (name);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
345 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
346 XFreeFont (display, font);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
347 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
348
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
349 if (result == 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
350 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
351 Lisp_Object val = AREF (entity, FONT_EXTRA_INDEX);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
352 char *p = (char *) SDATA (SYMBOL_NAME (val));
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
353
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
354 /* P == "RESX-RESY-SPACING-AVGWIDTH. We rejust this font if
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
355 it's an autoscaled one (i.e. RESX > 0 && AVGWIDTH == 0). */
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
356 if (atoi (p) > 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
357 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
358 p += SBYTES (SYMBOL_NAME (val));
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
359 while (p[-1] != '-') p--;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
360 if (atoi (p) == 0)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
361 continue;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
362 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
363 list = Fcons (entity, list);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
364 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
365 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
366
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
368 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
369
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
370 return list;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
371 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
372
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
373 static Lisp_Object
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
374 xfont_list (frame, spec)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
375 Lisp_Object frame, spec;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
376 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
377 FRAME_PTR f = XFRAME (frame);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
378 Display *display = FRAME_X_DISPLAY_INFO (f)->display;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
379 Lisp_Object list, val, extra, font_name;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
380 int len;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
381 char name[256];
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
382
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
383 extra = AREF (spec, FONT_EXTRA_INDEX);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
384 font_name = Qnil;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
385 if (CONSP (extra))
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
386 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
387 val = assq_no_quit (QCotf, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
388 if (! NILP (val))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
389 return null_vector;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
390 val = assq_no_quit (QCscript, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
391 if (! NILP (val))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
392 return null_vector;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
393 val = assq_no_quit (QClanguage, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
394 if (! NILP (val))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
395 return null_vector;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
396 val = assq_no_quit (QCname, extra);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
397 if (CONSP (val))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
398 font_name = XCDR (val);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
399 }
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
400
90545
7536a4fa3a3b (xfont_list): Don't try listing by :name property if the
Kenichi Handa <handa@m17n.org>
parents: 90501
diff changeset
401 if (STRINGP (font_name)
7536a4fa3a3b (xfont_list): Don't try listing by :name property if the
Kenichi Handa <handa@m17n.org>
parents: 90501
diff changeset
402 && ! strchr ((char *) SDATA (font_name), ':'))
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
403 list = xfont_list_pattern (frame, display, (char *) SDATA (font_name));
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
404 else if ((len = font_unparse_xlfd (spec, 0, name, 256)) < 0)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
405 return null_vector;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
406 else
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
407 {
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
408 list = xfont_list_pattern (frame, display, name);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
409 if (NILP (list))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
410 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
411 Lisp_Object registry = AREF (spec, FONT_REGISTRY_INDEX);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
412 Lisp_Object alter;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
413
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
414 if (! NILP (registry)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
415 && (alter = Fassoc (SYMBOL_NAME (registry),
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
416 Vface_alternative_font_registry_alist))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
417 && CONSP (alter))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
418 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
419 /* Pointer to REGISTRY-ENCODING field. */
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
420 char *r = name + len - SBYTES (SYMBOL_NAME (registry));
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
421
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
422 for (alter = XCDR (alter); CONSP (alter); alter = XCDR (alter))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
423 if (STRINGP (XCAR (alter))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
424 && ((r - name) + SBYTES (XCAR (alter))) < 255)
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
425 {
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
426 strcpy (r, (char *) SDATA (XCAR (alter)));
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
427 list = xfont_list_pattern (frame, display, name);
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
428 if (! NILP (list))
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
429 break;
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
430 }
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
431 }
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
432 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
433 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
434
90501
2ef165ebcc7d (xfont_query_font): Adjusted for the change of
Kenichi Handa <handa@m17n.org>
parents: 90461
diff changeset
435 return (NILP (list) ? null_vector : Fvconcat (1, &list));
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
436 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
437
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
438 static Lisp_Object
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
439 xfont_match (frame, spec)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
440 Lisp_Object frame, spec;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
441 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
442 FRAME_PTR f = XFRAME (frame);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
443 Display *display = FRAME_X_DISPLAY_INFO (f)->display;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
444 Lisp_Object extra, val, entity;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
445 char *name;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
446 XFontStruct *xfont;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
447 unsigned long value;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
448
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
449 extra = AREF (spec, FONT_EXTRA_INDEX);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
450 val = assq_no_quit (QCname, extra);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
451 if (! CONSP (val) || ! STRINGP (XCDR (val)))
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
452 return Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
453
90569
0af2dbdeaeb3 (xfont_match): Block and unblock input while callin Xlib.
Kenichi Handa <handa@m17n.org>
parents: 90561
diff changeset
454 BLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
455 entity = Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
456 name = (char *) SDATA (XCDR (val));
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
457 xfont = XLoadQueryFont (display, name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
458 if (xfont)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
459 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
460 if (XGetFontProperty (xfont, XA_FONT, &value))
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
461 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
462 int len;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
463
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
464 name = (char *) XGetAtomName (display, (Atom) value);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
465 len = strlen (name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
466
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
467 /* If DXPC (a Differential X Protocol Compressor)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
468 Ver.3.7 is running, XGetAtomName will return null
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
469 string. We must avoid such a name. */
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
470 if (len > 0)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
471 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
472 entity = Fmake_vector (make_number (FONT_ENTITY_MAX), Qnil);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
473 ASET (entity, FONT_TYPE_INDEX, Qx);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
474 ASET (entity, FONT_FRAME_INDEX, frame);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
475 if (font_parse_xlfd (name, entity) < 0)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
476 entity = Qnil;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
477 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
478 XFree (name);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
479 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
480 XFreeFont (display, xfont);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
481 }
90569
0af2dbdeaeb3 (xfont_match): Block and unblock input while callin Xlib.
Kenichi Handa <handa@m17n.org>
parents: 90561
diff changeset
482 UNBLOCK_INPUT;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
483
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
484 return entity;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
485 }
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
486
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
488 memq_no_quit (elt, list)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
489 Lisp_Object elt, list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
490 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
491 while (CONSP (list) && ! EQ (XCAR (list), elt))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
492 list = XCDR (list);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
493 return (CONSP (list));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
494 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
495
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496 static Lisp_Object
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
497 xfont_list_family (frame)
90443
57b847825c30 (xfont_list): If script is specified for a font, return
Kenichi Handa <handa@m17n.org>
parents: 90427
diff changeset
498 Lisp_Object frame;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
499 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
500 FRAME_PTR f = XFRAME (frame);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
501 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
502 char **names;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
503 int num_fonts, i;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
504 Lisp_Object list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
505 char *last_family;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
506 int last_len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
507
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
508 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
509 x_catch_errors (dpyinfo->display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
510 names = XListFonts (dpyinfo->display, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*",
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
511 0x8000, &num_fonts);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
512 if (x_had_errors_p (dpyinfo->display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
513 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
514 /* This error is perhaps due to insufficient memory on X server.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
515 Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
516 x_clear_errors (dpyinfo->display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
517 num_fonts = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
518 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
519
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
520 list = Qnil;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
521 for (i = 0, last_len = 0; i < num_fonts; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
522 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
523 char *p0 = names[i], *p1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
524 Lisp_Object family;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
525
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
526 p0++; /* skip the leading '-' */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 while (*p0 && *p0 != '-') p0++; /* skip foundry */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
528 if (! *p0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
529 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
530 p1 = ++p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
531 while (*p1 && *p1 != '-') p1++; /* find the end of family */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
532 if (! *p1 || p1 == p0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
533 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
534 if (last_len == p1 - p0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
535 && bcmp (last_family, p0, last_len) == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
536 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
537 last_len = p1 - p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
538 last_family = p0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
539 family = intern_downcase (p0, last_len);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
540 if (! memq_no_quit (family, list))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
541 list = Fcons (family, list);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
542 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
543
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
544 XFreeFontNames (names);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
545 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
546 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
547
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
548 return list;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
549 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
550
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551 static struct font *
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
552 xfont_open (f, entity, pixel_size)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
553 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
554 Lisp_Object entity;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
555 int pixel_size;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
556 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
557 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
558 Display *display = dpyinfo->display;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
559 char name[256];
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
560 int len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
561 unsigned long value;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
562 Lisp_Object registry;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
563 struct charset *encoding, *repertory;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
564 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
565 XFontStruct *xfont;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
566
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
567 /* At first, check if we know how to encode characters for this
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
568 font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
569 registry = AREF (entity, FONT_REGISTRY_INDEX);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
570 if (xfont_registry_charsets (registry, &encoding, &repertory) < 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
571 return NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
572
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
573 if (XINT (AREF (entity, FONT_SIZE_INDEX)) != 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
574 pixel_size = XINT (AREF (entity, FONT_SIZE_INDEX));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
575 len = font_unparse_xlfd (entity, pixel_size, name, 256);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
576 if (len <= 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
577 return NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
578
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
579 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
580 x_catch_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
581 xfont = XLoadQueryFont (display, name);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
582 if (x_had_errors_p (display))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
583 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
584 /* This error is perhaps due to insufficient memory on X server.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
585 Let's just ignore it. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
586 x_clear_errors (display);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
587 xfont = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
588 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
589 x_uncatch_errors ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
590 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
591
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
592 if (! xfont)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
593 return NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 font = malloc (sizeof (struct font));
90679
9a7955701103 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 90569
diff changeset
595 font->format = Qx;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
596 font->font.font = xfont;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
597 font->entity = entity;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
598 font->pixel_size = pixel_size;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
599 font->driver = &xfont_driver;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
600 font->font.name = malloc (len + 1);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
601 if (! font->font.name)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
602 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
603 XFreeFont (display, xfont);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
604 free (font);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
605 return NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
606 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
607 bcopy (name, font->font.name, len + 1);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
608 font->font.charset = encoding->id;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
609 font->encoding_charset = encoding->id;
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
610 font->repertory_charset = repertory ? repertory->id : -1;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
611 font->ascent = xfont->ascent;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
612 font->descent = xfont->descent;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
613
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
614 if (xfont->min_bounds.width == xfont->max_bounds.width)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
615 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
616 /* Fixed width font. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
617 font->font.average_width = font->font.space_width
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
618 = xfont->min_bounds.width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
619 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
620 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
621 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
622 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
623 XCharStruct *pcm;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
624
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
625 char2b.byte1 = 0x00, char2b.byte2 = 0x20;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
626 pcm = xfont_get_pcm (xfont, &char2b);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
627 if (pcm)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
628 font->font.space_width = pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
629 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
630 font->font.space_width = xfont->max_bounds.width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
631
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632 font->font.average_width
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633 = (XGetFontProperty (xfont, dpyinfo->Xatom_AVERAGE_WIDTH, &value)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 ? (long) value / 10 : 0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
635 if (font->font.average_width < 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636 font->font.average_width = - font->font.average_width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
637 if (font->font.average_width == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
638 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
639 if (pcm)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
640 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
641 int width = pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
642 for (char2b.byte2 = 33; char2b.byte2 <= 126; char2b.byte2++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
643 if ((pcm = xfont_get_pcm (xfont, &char2b)) != NULL)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
644 width += pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
645 font->font.average_width = width / 95;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
646 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
647 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
648 font->font.average_width = xfont->max_bounds.width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
649 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
650 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
651 font->min_width = xfont->min_bounds.width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
652 if (font->min_width <= 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
653 font->min_width = font->font.space_width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
654
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
655 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
656 /* Try to get the full name of FONT. Put it in FULL_NAME. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
657 if (XGetFontProperty (xfont, XA_FONT, &value))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
658 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
659 char *full_name = NULL, *p0, *p;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
660 int dashes = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
661
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
662 p0 = p = (char *) XGetAtomName (FRAME_X_DISPLAY (f), (Atom) value);;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
663 /* Count the number of dashes in the "full name".
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
664 If it is too few, this isn't really the font's full name,
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
665 so don't use it.
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666 In X11R4, the fonts did not come with their canonical names
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667 stored in them. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
668 while (*p)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
669 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
670 if (*p == '-')
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
671 dashes++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
672 p++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
673 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
674
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
675 if (dashes >= 13)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
676 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
677 full_name = (char *) malloc (p - p0 + 1);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
678 if (full_name)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
679 bcopy (p0, full_name, p - p0 + 1);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
680 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681 XFree (p0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
682
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
683 if (full_name)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
684 font->font.full_name = full_name;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
685 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
686 font->font.full_name = font->font.name;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
687 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
688 font->file_name = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
689
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
690 font->font.size = xfont->max_bounds.width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
691 font->font.height = xfont->ascent + xfont->descent;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
692 font->font.baseline_offset
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
693 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_BASELINE_OFFSET, &value)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
694 ? (long) value : 0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695 font->font.relative_compose
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_RELATIVE_COMPOSE, &value)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697 ? (long) value : 0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698 font->font.default_ascent
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
699 = (XGetFontProperty (xfont, dpyinfo->Xatom_MULE_DEFAULT_ASCENT, &value)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
700 ? (long) value : 0);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
701 font->font.vertical_centering
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
702 = (STRINGP (Vvertical_centering_font_regexp)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
703 && (fast_c_string_match_ignore_case
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704 (Vvertical_centering_font_regexp, font->font.full_name) >= 0));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
706 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
707
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
708 dpyinfo->n_fonts++;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
709
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
710 /* Set global flag fonts_changed_p to non-zero if the font loaded
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
711 has a character with a smaller width than any other character
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
712 before, or if the font loaded has a smaller height than any other
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
713 font loaded before. If this happens, it will make a glyph matrix
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
714 reallocation necessary. */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
715 if (dpyinfo->n_fonts == 1)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
716 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
717 dpyinfo->smallest_font_height = font->font.height;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
718 dpyinfo->smallest_char_width = font->min_width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
719 fonts_changed_p = 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
720 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
721 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
722 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
723 if (dpyinfo->smallest_font_height > font->font.height)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
724 dpyinfo->smallest_font_height = font->font.height, fonts_changed_p |= 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
725 if (dpyinfo->smallest_char_width > font->min_width)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
726 dpyinfo->smallest_char_width = font->min_width, fonts_changed_p |= 1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
727 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
728
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
729 return font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
730 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
731
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
732 static void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
733 xfont_close (f, font)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
734 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
735 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
736 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
737 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
738 XFreeFont (FRAME_X_DISPLAY (f), font->font.font);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
739 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
740
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
741 if (font->font.name != font->font.full_name)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
742 free (font->font.full_name);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
743 free (font->font.name);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
744 free (font);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
745 FRAME_X_DISPLAY_INFO (f)->n_fonts--;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
746 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
747
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
748 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
749 xfont_prepare_face (f, face)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
750 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
751 struct face *face;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
752 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
753 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
754 XSetFont (FRAME_X_DISPLAY (f), face->gc, face->font->fid);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
755 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
756
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
757 return 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
758 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
759
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
760 #if 0
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
761 static void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
762 xfont_done_face (f, face)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
763 FRAME_PTR f;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
764 struct face *face;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
765 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
766 if (face->extra)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
767 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
768 BLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
769 XFreeGC (FRAME_X_DISPLAY (f), (GC) face->extra);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
770 UNBLOCK_INPUT;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
771 face->extra = NULL;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
772 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
773 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
774 #endif /* 0 */
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
775
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
776 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
777 xfont_has_char (entity, c)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
778 Lisp_Object entity;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
779 int c;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
780 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
781 Lisp_Object registry = AREF (entity, FONT_REGISTRY_INDEX);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
782 struct charset *repertory;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
783
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
784 if (xfont_registry_charsets (registry, NULL, &repertory) < 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
785 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
786 if (! repertory)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
787 return -1;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
788 return (ENCODE_CHAR (repertory, c) != CHARSET_INVALID_CODE (repertory));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
789 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
790
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
791 static unsigned
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
792 xfont_encode_char (font, c)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
793 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
794 int c;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
795 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
796 struct charset *charset;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
797 unsigned code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
798 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
799
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
800 charset = CHARSET_FROM_ID (font->encoding_charset);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
801 code = ENCODE_CHAR (charset, c);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
802 if (code == CHARSET_INVALID_CODE (charset))
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
803 return 0xFFFFFFFF;
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
804 if (font->repertory_charset >= 0)
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
805 {
90454
a8b745412821 (xfont_open, xfont_encode_char): Fix typo.
Kenichi Handa <handa@m17n.org>
parents: 90443
diff changeset
806 charset = CHARSET_FROM_ID (font->repertory_charset);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
807 return (ENCODE_CHAR (charset, c) != CHARSET_INVALID_CODE (charset)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
808 ? code : 0xFFFFFFFF);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
809 }
90425
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
810 char2b.byte1 = code >> 8;
5976e428d68e (xfont_encode_char): Fix calculation of char2b.
Kenichi Handa <handa@m17n.org>
parents: 90400
diff changeset
811 char2b.byte2 = code & 0xFF;
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
812 return (xfont_get_pcm (font->font.font, &char2b) ? code : 0xFFFFFFFF);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
813 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
814
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
815 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
816 xfont_text_extents (font, code, nglyphs, metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
817 struct font *font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
818 unsigned *code;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
819 int nglyphs;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
820 struct font_metrics *metrics;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
821 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
822 int width = 0;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
823 int i, x;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
824
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
825 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
826 bzero (metrics, sizeof (struct font_metrics));
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
827 for (i = 0, x = 0; i < nglyphs; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
828 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
829 XChar2b char2b;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
830 static XCharStruct *pcm;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
831
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
832 if (code[i] >= 0x10000)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
833 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
834 char2b.byte1 = code[i] >> 8, char2b.byte2 = code[i] & 0xFF;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
835 pcm = xfont_get_pcm (font->font.font, &char2b);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
836 if (! pcm)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
837 continue;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
838 if (metrics->lbearing > width + pcm->lbearing)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
839 metrics->lbearing = width + pcm->lbearing;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
840 if (metrics->rbearing < width + pcm->rbearing)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
841 metrics->rbearing = width + pcm->rbearing;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
842 if (metrics->ascent < pcm->ascent)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
843 metrics->ascent = pcm->ascent;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
844 if (metrics->descent < pcm->descent)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
845 metrics->descent = pcm->descent;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
846 width += pcm->width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
847 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
848 if (metrics)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
849 metrics->width = width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
850 return width;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
851 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
852
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
853 static int
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
854 xfont_draw (s, from, to, x, y, with_background)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
855 struct glyph_string *s;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
856 int from, to, x, y, with_background;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
857 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
858 XFontStruct *xfont = s->face->font;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
859 int len = to - from;
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
860 GC gc = s->gc;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
861
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
862 if (gc != s->face->gc)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
863 {
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
864 XGCValues xgcv;
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
865 Display_Info *dpyinfo = FRAME_X_DISPLAY_INFO (s->f);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
866
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
867 XGetGCValues (s->display, gc, GCFont, &xgcv);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
868 if (xgcv.font != xfont->fid)
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
869 XSetFont (s->display, gc, xfont->fid);
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
870 }
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
871
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
872 if (xfont->min_byte1 == 0 && xfont->max_byte1 == 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
873 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
874 char *str;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
875 int i;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
876 USE_SAFE_ALLOCA;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
877
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
878 SAFE_ALLOCA (str, char *, len);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
879 for (i = 0; i < len ; i++)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
880 str[i] = XCHAR2B_BYTE2 (s->char2b + from + i);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
881 if (with_background > 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
882 XDrawImageString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
883 gc, x, y, str, len);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
884 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
885 XDrawString (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
886 gc, x, y, str, len);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
887 SAFE_FREE ();
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
888 return s->nchars;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
889 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
890
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
891 if (with_background > 0)
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
892 XDrawImageString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
893 gc, x, y, s->char2b + from, len);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
894 else
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
895 XDrawString16 (FRAME_X_DISPLAY (s->f), FRAME_X_WINDOW (s->f),
90561
73750c4e078a (xfont_match): New function.
Kenichi Handa <handa@m17n.org>
parents: 90545
diff changeset
896 gc, x, y, s->char2b + from, len);
90400
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
897
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
898 return len;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
899 }
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
900
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
901
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
902
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
903 void
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
904 syms_of_xfont ()
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
905 {
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
906 staticpro (&x_font_charset_alist);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
907 x_font_charset_alist = Qnil;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
908
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
909 DEFSYM (Qx, "x");
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
910 xfont_driver.type = Qx;
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
911 register_font_driver (&xfont_driver, NULL);
80fff33f74f5 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
912 }
90427
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
913
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
914 /* arch-tag: 23c5f366-a5ee-44b7-a3b7-90d6da7fd749
ddb25860d044 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90425
diff changeset
915 (do not change this comment) */