annotate src/objects-xlike-inc.c @ 4758:75975fd0b7fc

Implement more of the fontconfig API. Improve implementation, avoiding nonsyntactic macros and compiler warnings. Clean up some documentation. Guard against freeing NULL pointers returned from fonconfig.
author Stephen J. Turnbull <stephen@xemacs.org>
date Wed, 18 Nov 2009 22:44:28 +0900
parents a23ac8f90a49
children 0d3ccd5a2509
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
1 /* Shared object code between X and GTK -- include file.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
2 Copyright (C) 1991-5, 1997 Free Software Foundation, Inc.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
4 Copyright (C) 1996, 2001, 2002, 2003 Ben Wing.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
5
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
6 This file is part of XEmacs.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
7
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
11 later version.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
12
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
16 for more details.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
17
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
22
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
24
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
25 /* Pango is ready for prime-time now, as far as I understand it. The GTK
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
26 people should be using that. Oh well. (Aidan Kehoe, Sat Nov 4 12:41:12
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
27 CET 2006) */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
28
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
29 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
30
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
31 #ifdef DEBUG_XEMACS
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
32 # define DEBUG_OBJECTS(FORMAT, ...) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
33 do { if (debug_x_objects) stderr_out(FORMAT, __VA_ARGS__); } while (0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
34 #else /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
35 # define DEBUG_OBJECTS(format, ...)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
36 #endif /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
37
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
38 #elif defined(__GNUC__)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
39
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
40 #ifdef DEBUG_XEMACS
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
41 # define DEBUG_OBJECTS(format, args...) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
42 do { if (debug_x_objects) stderr_out(format, args ); } while (0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
43 #else /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
44 # define DEBUG_OBJECTS(format, args...)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
45 #endif /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
46
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
47 #else /* defined(__STDC_VERSION__) [...] */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
48 # define DEBUG_OBJECTS (void)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
49 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
50
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
51 #ifdef MULE
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
52
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
53 /* For some code it's reasonable to have only one copy and conditionalize
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
54 at run-time. For other code it isn't. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
55
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
56 static int
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
57 count_hyphens(const Ibyte *str, Bytecount length, Ibyte **last_hyphen)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
58 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
59 int hyphen_count = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
60 const Ibyte *hyphening = str;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
61 const Ibyte *new_hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
62
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
63 for (hyphen_count = 0;
4124
9a633a00c3f2 [xemacs-hg @ 2007-08-17 08:08:05 by crestani]
crestani
parents: 3841
diff changeset
64 NULL != (new_hyphening = (Ibyte *) memchr((const void *)hyphening, '-', length));
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
65 hyphen_count++)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
66 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
67 ++new_hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
68 length -= new_hyphening - hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
69 hyphening = new_hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
70 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
71
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
72 if (NULL != last_hyphen)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
73 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
74 *last_hyphen = (Ibyte *)hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
75 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
76
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
77 return hyphen_count;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
78 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
79
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
80 static int
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
81 #ifdef THIS_IS_GTK
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
82 gtk_font_spec_matches_charset (struct device * USED_IF_XFT (d),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
83 Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
84 const Ibyte *nonreloc, Lisp_Object reloc,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
85 Bytecount offset, Bytecount length,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
86 enum font_specifier_matchspec_stages stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
87 #else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
88 x_font_spec_matches_charset (struct device * USED_IF_XFT (d),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
89 Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
90 const Ibyte *nonreloc, Lisp_Object reloc,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
91 Bytecount offset, Bytecount length,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
92 enum font_specifier_matchspec_stages stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
93 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
94 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
95 Lisp_Object registries = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
96 long i, registries_len;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
97 const Ibyte *the_nonreloc;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
98 Bytecount the_length;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
99
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
100 the_nonreloc = nonreloc;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
101 the_length = length;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
102
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
103 if (!the_nonreloc)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
104 the_nonreloc = XSTRING_DATA (reloc);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
105 fixup_internal_substring (nonreloc, reloc, offset, &the_length);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
106 the_nonreloc += offset;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
107
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
108 #ifdef USE_XFT
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
109 if (stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
110 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
111 Display *dpy = DEVICE_X_DISPLAY (d);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
112 Extbyte *extname;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
113 XftFont *rf;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
114 const Ibyte *the_nonreloc;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
115
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
116 if (!NILP(reloc))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
117 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
118 the_nonreloc = XSTRING_DATA (reloc);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
119 LISP_STRING_TO_EXTERNAL (reloc, extname, Qx_font_name_encoding);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
120 rf = xft_open_font_by_name (dpy, extname);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
121 return 0; /* #### maybe this will compile and run ;) */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
122 /* Jesus, Stephen, what the fuck? */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
123 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
124 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
125 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
126
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
127 /* Hmm, this smells bad. */
4353
4143b78d0df0 Merge an old patch of Ben's, involving font instantiation and charsets.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4124
diff changeset
128 if (NILP (charset))
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
129 return 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
130
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
131 /* Hack! Short font names don't have the registry in them,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
132 so we just assume the user knows what they're doing in the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
133 case of ASCII. For other charsets, you gotta give the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
134 long form; sorry buster.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
135 #### FMH: this screws fontconfig/Xft?
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
136 STRATEGY: use fontconfig's ability to hack languages and character
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
137 sets (lang and charset properties).
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
138 #### Maybe we can use the fontconfig model to eliminate the difference
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
139 between faces and fonts? No - it looks like that would be an abuse
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
140 (fontconfig doesn't know about colors, although Xft does).
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
141 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
142 if (EQ (charset, Vcharset_ascii) &&
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
143 (!memchr (the_nonreloc, '*', the_length))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
144 && (5 > (count_hyphens(the_nonreloc, the_length, NULL))))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
145 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
146 return 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
147 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
148
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
149 if (final == stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
150 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
151 registries = Qunicode_registries;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
152 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
153 else if (initial == stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
154 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
155 registries = XCHARSET_REGISTRIES (charset);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
156 if (NILP(registries))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
157 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
158 return 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
159 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
160 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
161 else assert(0);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
162
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
163 CHECK_VECTOR (registries);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
164 registries_len = XVECTOR_LENGTH(registries);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
165
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
166 for (i = 0; i < registries_len; ++i)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
167 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
168 if (!(STRINGP(XVECTOR_DATA(registries)[i]))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
169 || (XSTRING_LENGTH(XVECTOR_DATA(registries)[i]) > the_length))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
170 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
171 continue;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
172 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
173
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
174 /* Check if the font spec ends in the registry specified. X11 says
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
175 this comparison is case insensitive: XLFD, section 3.11:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
176
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
177 "Alphabetic case distinctions are allowed but are for human
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
178 readability concerns only. Conforming X servers will perform
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
179 matching on font name query or open requests independent of case." */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
180 if (0 == qxestrcasecmp(XSTRING_DATA(XVECTOR_DATA(registries)[i]),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
181 the_nonreloc + (the_length -
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
182 XSTRING_LENGTH
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
183 (XVECTOR_DATA(registries)[i]))))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
184 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
185 return 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
186 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
187 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
188 return 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
189 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
190
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
191 static Lisp_Object
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
192 xlistfonts_checking_charset (Lisp_Object device, const Extbyte *xlfd,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
193 Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
194 enum font_specifier_matchspec_stages stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
195 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
196 Extbyte **names;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
197 Lisp_Object result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
198 int count = 0, i;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
199 DECLARE_EISTRING(ei_single_result);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
200
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
201 names = XListFonts (
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
202 #ifdef THIS_IS_GTK
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
203 GDK_DISPLAY (),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
204 #else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
205 DEVICE_X_DISPLAY (XDEVICE (device)),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
206 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
207 xlfd, MAX_FONT_COUNT, &count);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
208
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
209 for (i = 0; i < count; ++i)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
210 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
211 eireset(ei_single_result);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
212 eicpy_ext(ei_single_result, names[i], Qx_font_name_encoding);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
213
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
214 if (DEVMETH_OR_GIVEN(XDEVICE (device), font_spec_matches_charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
215 (XDEVICE (device), charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
216 eidata(ei_single_result), Qnil, 0,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
217 -1, stage), 0))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
218 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
219 result = eimake_string(ei_single_result);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
220 DEBUG_OBJECTS ("in xlistfonts_checking_charset, returning %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
221 eidata(ei_single_result));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
222 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
223 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
224 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
225
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
226 if (names)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
227 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
228 XFreeFontNames (names);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
229 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
230
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
231 return result;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
232 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
233
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
234 #ifdef USE_XFT
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
235 /* #### debug functions: find a better place for us */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
236 const char *FcResultToString (FcResult r);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
237 const char *
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
238 FcResultToString (FcResult r)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
239 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
240 static char buffer[256];
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
241 switch (r)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
242 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
243 case FcResultMatch:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
244 return "FcResultMatch";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
245 case FcResultNoMatch:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
246 return "FcResultNoMatch";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
247 case FcResultTypeMismatch:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
248 return "FcResultTypeMismatch";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
249 case FcResultNoId:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
250 return "FcResultNoId";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
251 default:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
252 snprintf (buffer, 255, "FcResultUndocumentedValue (%d)", r);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
253 return buffer;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
254 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
255 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
256
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
257 const char *FcTypeOfValueToString (FcValue v);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
258 const char *
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
259 FcTypeOfValueToString (FcValue v)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
260 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
261 static char buffer[256];
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
262 switch (v.type)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
263 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
264 case FcTypeMatrix:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
265 return "FcTypeMatrix";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
266 case FcTypeString:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
267 return "FcTypeString";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
268 case FcTypeVoid:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
269 return "FcTypeVoid";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
270 case FcTypeDouble:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
271 return "FcTypeDouble";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
272 case FcTypeInteger:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
273 return "FcTypeInteger";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
274 case FcTypeBool:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
275 return "FcTypeBool";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
276 case FcTypeCharSet:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
277 return "FcTypeCharSet";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
278 case FcTypeLangSet:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
279 return "FcTypeLangSet";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
280 /* #### There is no union member of this type, but there are void* and
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
281 FcPattern* members, as of fontconfig.h FC_VERSION 10002 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
282 case FcTypeFTFace:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
283 return "FcTypeFTFace";
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
284 default:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
285 snprintf (buffer, 255, "FcTypeUndocumentedType (%d)", v.type);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
286 return buffer;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
287 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
288 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
289
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
290 static FcCharSet *
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
291 mule_to_fc_charset (Lisp_Object cs)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
292 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
293 int ucode, i, j;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
294 FcCharSet *fccs;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
295
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
296 CHECK_CHARSET (cs);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
297 fccs = FcCharSetCreate ();
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
298 /* #### do we also need to deal with 94 vs. 96 charsets?
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
299 ie, how are SP and DEL treated in ASCII? non-graphic should return -1 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
300 if (1 == XCHARSET_DIMENSION (cs))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
301 /* Unicode tables are indexed by offsets from ASCII SP, not by ASCII */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
302 for (i = 0; i < 96; i++)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
303 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
304 ucode = ((int *) XCHARSET_TO_UNICODE_TABLE (cs))[i];
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
305 if (ucode >= 0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
306 /* #### should check for allocation failure */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
307 FcCharSetAddChar (fccs, (FcChar32) ucode);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
308 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
309 else if (2 == XCHARSET_DIMENSION (cs))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
310 /* Unicode tables are indexed by offsets from ASCII SP, not by ASCII */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
311 for (i = 0; i < 96; i++)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
312 for (j = 0; j < 96; j++)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
313 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
314 ucode = ((int **) XCHARSET_TO_UNICODE_TABLE (cs))[i][j];
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
315 if (ucode >= 0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
316 /* #### should check for allocation failure */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
317 FcCharSetAddChar (fccs, (FcChar32) ucode);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
318 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
319 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
320 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
321 FcCharSetDestroy (fccs);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
322 fccs = NULL;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
323 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
324 return fccs;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
325 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
326
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
327 struct charset_reporter {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
328 Lisp_Object *charset;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
329 /* This is a debug facility, require ASCII. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
330 Extbyte *language; /* ASCII, please */
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
331 /* Technically this is FcChar8, but fsckin' GCC 4 bitches.
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
332 RFC 3066 is a combination of ISO 639 and ISO 3166. */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
333 Extbyte *rfc3066; /* ASCII, please */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
334 };
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
335
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
336 static struct charset_reporter charset_table[] =
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
337 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
338 /* #### It's my branch, my favorite charsets get checked first!
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
339 That's a joke, Son.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
340 Ie, I don't know what I'm doing, so my charsets first is as good as
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
341 any other arbitrary order. If you have a better idea, speak up! */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
342 { &Vcharset_ascii, "English", "en" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
343 { &Vcharset_japanese_jisx0208, "Japanese", "ja" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
344 { &Vcharset_japanese_jisx0212, "Japanese", "ja" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
345 { &Vcharset_katakana_jisx0201, "Japanese", "ja" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
346 { &Vcharset_latin_jisx0201, "Japanese", "ja" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
347 { &Vcharset_japanese_jisx0208_1978, "Japanese", "ja" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
348 { &Vcharset_greek_iso8859_7, "Greek", "el" },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
349 /* #### all the Chinese need checking
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
350 Damn the blood-sucking ISO anyway. */
4756
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
351 { &Vcharset_chinese_gb2312, "simplified Chinese", "zh-cn" },
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
352 { &Vcharset_korean_ksc5601, "Korean", "ko" },
4756
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
353 { &Vcharset_chinese_cns11643_1, "traditional Chinese", "zh-tw" },
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
354 { &Vcharset_chinese_cns11643_2, "traditional Chinese", "zh-tw" },
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
355 /* #### not obvious how to handle these
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
356 We could (for experimental purposes) make the last element into
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
357 an array of ISO 639 codes, and check for all of them. If a font
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
358 provides some but not others, warn. */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
359 { &Vcharset_latin_iso8859_1, NULL, NULL },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
360 { &Vcharset_latin_iso8859_2, NULL, NULL },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
361 { &Vcharset_latin_iso8859_3, NULL, NULL },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
362 { &Vcharset_latin_iso8859_4, NULL, NULL },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
363 { &Vcharset_latin_iso8859_9, NULL, NULL },
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
364 { &Vcharset_latin_iso8859_15, NULL, NULL },
4756
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
365 { &Vcharset_thai_tis620, "Thai", "th" },
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
366 /* We don't have an arabic charset. bidi issues, I guess? */
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
367 /* { &Vcharset_arabic_iso8859_6, "Arabic", "ar" }, */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
368 { &Vcharset_hebrew_iso8859_8, "Hebrew", "he" },
4756
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
369 /* #### probably close enough for Ukraine? */
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
370 { &Vcharset_cyrillic_iso8859_5, "Russian", "ru" },
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
371 /* #### these probably are not quite right */
4756
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
372 { &Vcharset_chinese_big5_1, "traditional Chinese", "zh-tw" },
5d67242595a8 Update charset_table used by Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4494
diff changeset
373 { &Vcharset_chinese_big5_2, "traditional Chinese", "zh-tw" },
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
374 { NULL, NULL, NULL }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
375 };
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
376
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
377 /* Choose appropriate font name for debug messages.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
378 Use only in the top half of next function (enforced with #undef). */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
379 #define DECLARE_DEBUG_FONTNAME(__xemacs_name) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
380 Eistring *__xemacs_name; \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
381 do \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
382 { \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
383 __xemacs_name = debug_xft > 2 ? eistr_fullname \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
384 : debug_xft > 1 ? eistr_longname \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
385 : eistr_shortname; \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
386 } while (0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
387
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
388 static Lisp_Object
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
389 xft_find_charset_font (Lisp_Object font, Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
390 enum font_specifier_matchspec_stages stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
391 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
392 const Extbyte *patternext;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
393 Lisp_Object result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
394
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
395 /* #### with Xft need to handle second stage here -- sjt
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
396 Hm. Or maybe not. That would be cool. :-) */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
397 if (stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
398 return Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
399
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
400 /* Fontconfig converts all FreeType names to UTF-8 before passing them
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
401 back to callers---see fcfreetype.c (FcFreeTypeQuery).
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
402 I don't believe this is documented. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
403
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
404 DEBUG_XFT1 (1, "confirming charset for font instance %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
405 XSTRING_DATA(font));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
406
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
407 /* #### this looks like a fair amount of work, but the basic design
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
408 has never been rethought, and it should be
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
409
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
410 what really should happen here is that we use FcFontSort (FcFontList?)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
411 to get a list of matching fonts, then pick the first (best) one that
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
412 gives language or repertoire coverage.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
413 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
414
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
415 FcInit (); /* No-op if already initialized.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
416 In fontconfig 2.3.2, this cannot return
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
417 failure, but that looks like a bug. We
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
418 check for it with FcGetCurrentConfig(),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
419 which *can* fail. */
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
420 if (!FcConfigGetCurrent())
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
421 stderr_out ("Failed fontconfig initialization\n");
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
422 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
423 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
424 FcPattern *fontxft; /* long-lived, freed at end of this block */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
425 FcResult fcresult;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
426 FcConfig *fcc;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
427 FcChar8 *lang = (FcChar8 *) "en"; /* #### fix this bogus hack! */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
428 FcCharSet *fccs = NULL;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
429 DECLARE_EISTRING (eistr_shortname); /* user-friendly nickname */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
430 DECLARE_EISTRING (eistr_longname); /* omit FC_LANG and FC_CHARSET */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
431 DECLARE_EISTRING (eistr_fullname); /* everything */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
432
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
433 LISP_STRING_TO_EXTERNAL (font, patternext, Qfc_font_name_encoding);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
434 fcc = FcConfigGetCurrent ();
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
435
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
436 /* parse the name, do the substitutions, and match the font */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
437
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
438 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
439 FcPattern *p = FcNameParse ((FcChar8 *) patternext);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
440 PRINT_XFT_PATTERN (3, "FcNameParse'ed name is %s\n", p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
441 /* #### Next two return FcBool, but what does the return mean? */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
442 /* The order is correct according the fontconfig docs. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
443 FcConfigSubstitute (fcc, p, FcMatchPattern);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
444 PRINT_XFT_PATTERN (2, "FcConfigSubstitute'ed name is %s\n", p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
445 FcDefaultSubstitute (p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
446 PRINT_XFT_PATTERN (3, "FcDefaultSubstitute'ed name is %s\n", p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
447 /* #### check fcresult of following match? */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
448 fontxft = FcFontMatch (fcc, p, &fcresult);
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
449 switch (fcresult)
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
450 {
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
451 /* case FcResultOutOfMemory: */
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
452 case FcResultNoMatch:
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
453 case FcResultTypeMismatch:
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
454 case FcResultNoId:
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
455 break;
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
456 case FcResultMatch:
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
457 /* this prints the long fontconfig name */
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
458 PRINT_XFT_PATTERN (1, "FcFontMatch'ed name is %s\n", fontxft);
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
459 break;
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
460 }
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
461 FcPatternDestroy (p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
462 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
463
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
464 /* heuristic to give reasonable-length names for debug reports
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
465
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
466 I considered #ifdef SUPPORT_FULL_FONTCONFIG_NAME etc but that's
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
467 pointless. We're just going to remove this code once the font/
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
468 face refactoring is done, but until then it could be very useful.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
469 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
470 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
471 FcPattern *p = FcFontRenderPrepare (fcc, fontxft, fontxft);
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
472 Extbyte *name;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
473
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
474 /* full name, including language coverage and repertoire */
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
475 name = (Extbyte *) FcNameUnparse (p);
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
476 eicpy_ext (eistr_fullname,
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
477 (name ? name : "NOT FOUND"),
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
478 Qfc_font_name_encoding);
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
479 if (name) free (name);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
480
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
481 /* long name, omitting coverage and repertoire, plus a number
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
482 of rarely useful properties */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
483 FcPatternDel (p, FC_CHARSET);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
484 FcPatternDel (p, FC_LANG);
3841
5989b9bbb612 [xemacs-hg @ 2007-02-22 16:19:40 by stephent]
stephent
parents: 3680
diff changeset
485 #ifdef FC_WIDTH
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
486 FcPatternDel (p, FC_WIDTH);
3841
5989b9bbb612 [xemacs-hg @ 2007-02-22 16:19:40 by stephent]
stephent
parents: 3680
diff changeset
487 #endif
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
488 FcPatternDel (p, FC_SPACING);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
489 FcPatternDel (p, FC_HINTING);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
490 FcPatternDel (p, FC_VERTICAL_LAYOUT);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
491 FcPatternDel (p, FC_AUTOHINT);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
492 FcPatternDel (p, FC_GLOBAL_ADVANCE);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
493 FcPatternDel (p, FC_INDEX);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
494 FcPatternDel (p, FC_SCALE);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
495 FcPatternDel (p, FC_FONTVERSION);
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
496 name = (Extbyte *) FcNameUnparse (p);
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
497 eicpy_ext (eistr_longname,
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
498 (name ? name : "NOT FOUND"),
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
499 Qfc_font_name_encoding);
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
500 if (name) free (name);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
501
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
502 /* nickname, just family and size, but
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
503 "family" names usually have style, slant, and weight */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
504 FcPatternDel (p, FC_FOUNDRY);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
505 FcPatternDel (p, FC_STYLE);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
506 FcPatternDel (p, FC_SLANT);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
507 FcPatternDel (p, FC_WEIGHT);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
508 FcPatternDel (p, FC_PIXEL_SIZE);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
509 FcPatternDel (p, FC_OUTLINE);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
510 FcPatternDel (p, FC_SCALABLE);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
511 FcPatternDel (p, FC_DPI);
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
512 name = (Extbyte *) FcNameUnparse (p);
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
513 eicpy_ext (eistr_shortname,
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
514 (name ? name : "NOT FOUND"),
4757
a23ac8f90a49 Improve warning and error messages from Xft.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4756
diff changeset
515 Qfc_font_name_encoding);
4758
75975fd0b7fc Implement more of the fontconfig API.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4757
diff changeset
516 if (name) free (name);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
517
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
518 FcPatternDestroy (p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
519 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
520
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
521 /* The language approach may better in the long run, but we can't use
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
522 it based on Mule charsets; fontconfig doesn't provide a way to test
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
523 for unions of languages, etc. That will require support from the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
524 text module.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
525
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
526 Optimization: cache the generated FcCharSet in the Mule charset.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
527 Don't forget to destroy it if the Mule charset gets deallocated. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
528
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
529 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
530 /* This block possibly should be a function, but it generates
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
531 multiple values. I find the "pass an address to return the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
532 value in" idiom opaque, so prefer a block. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
533 struct charset_reporter *cr;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
534 for (cr = charset_table;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
535 cr->charset && !EQ (*(cr->charset), charset);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
536 cr++)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
537 ;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
538
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
539 if (cr->rfc3066)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
540 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
541 DECLARE_DEBUG_FONTNAME (name);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
542 CHECKING_LANG (0, eidata(name), cr->language);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
543 lang = (FcChar8 *) cr->rfc3066;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
544 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
545 else if (cr->charset)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
546 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
547 /* what the hey, build 'em on the fly */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
548 /* #### in the case of error this could return NULL! */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
549 fccs = mule_to_fc_charset (charset);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
550 lang = (FcChar8 *) XSTRING_DATA (XSYMBOL
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
551 (XCHARSET_NAME (charset))-> name);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
552 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
553 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
554 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
555 /* OK, we fell off the end of the table */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
556 warn_when_safe_lispobj (intern ("xft"), intern ("alert"),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
557 list2 (build_string ("unchecked charset"),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
558 charset));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
559 /* default to "en"
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
560 #### THIS IS WRONG, WRONG, WRONG!!
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
561 It is why we never fall through to XLFD-checking. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
562 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
563
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
564 ASSERT_ASCTEXT_ASCII((Extbyte *) lang);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
565
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
566 if (fccs)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
567 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
568 /* check for character set coverage */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
569 int i = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
570 FcCharSet *v;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
571 FcResult r = FcPatternGetCharSet (fontxft, FC_CHARSET, i, &v);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
572
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
573 if (r == FcResultTypeMismatch)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
574 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
575 DEBUG_XFT0 (0, "Unexpected type return in charset value\n");
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
576 result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
577 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
578 else if (r == FcResultMatch && FcCharSetIsSubset (fccs, v))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
579 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
580 /* The full pattern with the bitmap coverage is massively
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
581 unwieldy, but the shorter names are just *wrong*. We
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
582 should have the full thing internally as truename, and
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
583 filter stuff the client doesn't want to see on output.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
584 Should we just store it into the truename right here? */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
585 DECLARE_DEBUG_FONTNAME (name);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
586 DEBUG_XFT2 (0, "Xft font %s supports %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
587 eidata(name), lang);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
588 #ifdef RETURN_LONG_FONTCONFIG_NAMES
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
589 result = eimake_string(eistr_fullname);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
590 #else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
591 result = eimake_string(eistr_longname);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
592 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
593 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
594 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
595 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
596 DECLARE_DEBUG_FONTNAME (name);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
597 DEBUG_XFT2 (0, "Xft font %s doesn't support %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
598 eidata(name), lang);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
599 result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
600 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
601
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
602 /* clean up */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
603 FcCharSetDestroy (fccs);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
604 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
605 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
606 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
607 /* check for language coverage */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
608 int i = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
609 FcValue v;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
610 /* the main event */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
611 FcResult r = FcPatternGet (fontxft, FC_LANG, i, &v);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
612
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
613 if (r == FcResultMatch)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
614 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
615 if (v.type != FcTypeLangSet) /* excessive paranoia */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
616 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
617 ASSERT_ASCTEXT_ASCII(FcTypeOfValueToString(v));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
618 /* Urk! Fall back and punt to core font. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
619 DEBUG_XFT1 (0, "Unexpected type of lang value (%s)\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
620 FcTypeOfValueToString (v));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
621 result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
622 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
623 else if (FcLangSetHasLang (v.u.l, lang) != FcLangDifferentLang)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
624 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
625 DECLARE_DEBUG_FONTNAME (name);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
626 DEBUG_XFT2 (0, "Xft font %s supports %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
627 eidata(name), lang);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
628 #ifdef RETURN_LONG_FONTCONFIG_NAMES
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
629 result = eimake_string(eistr_fullname);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
630 #else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
631 result = eimake_string(eistr_longname);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
632 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
633 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
634 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
635 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
636 DECLARE_DEBUG_FONTNAME (name);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
637 DEBUG_XFT2 (0, "Xft font %s doesn't support %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
638 eidata(name), lang);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
639 result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
640 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
641 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
642 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
643 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
644 ASSERT_ASCTEXT_ASCII(FcResultToString(r));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
645 DEBUG_XFT1 (0, "Getting lang: unexpected result=%s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
646 FcResultToString (r));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
647 result = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
648 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
649 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
650
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
651 /* clean up and maybe return */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
652 FcPatternDestroy (fontxft);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
653 if (!UNBOUNDP (result))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
654 return result;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
655 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
656 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
657 return Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
658 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
659 #undef DECLARE_DEBUG_FONTNAME
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
660
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
661 #endif /* USE_XFT */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
662
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
663 /* find a font spec that matches font spec FONT and also matches
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
664 (the registry of) CHARSET. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
665 static Lisp_Object
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
666 #ifdef THIS_IS_GTK
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
667 gtk_find_charset_font (Lisp_Object device, Lisp_Object font,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
668 Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
669 enum font_specifier_matchspec_stages stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
670 #else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
671 x_find_charset_font (Lisp_Object device, Lisp_Object font, Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
672 enum font_specifier_matchspec_stages stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
673 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
674 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
675 Lisp_Object result = Qnil, registries = Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
676 int j, hyphen_count, registries_len = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
677 Ibyte *hyphening, *new_hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
678 Bytecount xlfd_length;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
679
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
680 DECLARE_EISTRING(ei_xlfd_without_registry);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
681 DECLARE_EISTRING(ei_xlfd);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
682
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
683 #ifdef USE_XFT
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
684 result = xft_find_charset_font(font, charset, stage);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
685 if (!NILP(result))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
686 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
687 return result;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
688 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
689 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
690
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
691 switch (stage)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
692 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
693 case initial:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
694 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
695 if (!(NILP(XCHARSET_REGISTRIES(charset)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
696 && VECTORP(XCHARSET_REGISTRIES(charset)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
697 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
698 registries_len = XVECTOR_LENGTH(XCHARSET_REGISTRIES(charset));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
699 registries = XCHARSET_REGISTRIES(charset);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
700 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
701 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
702 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
703 case final:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
704 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
705 registries_len = 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
706 registries = Qunicode_registries;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
707 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
708 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
709 default:
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
710 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
711 assert(0);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
712 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
713 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
714 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
715
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
716 eicpy_lstr(ei_xlfd, font);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
717 hyphening = eidata(ei_xlfd);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
718 xlfd_length = eilen(ei_xlfd);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
719
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
720 /* Count the hyphens in the string, moving new_hyphening to just after the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
721 last one. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
722 hyphen_count = count_hyphens(hyphening, xlfd_length, &new_hyphening);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
723
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
724 if (0 == registries_len || (5 > hyphen_count &&
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
725 !(1 == xlfd_length && '*' == *hyphening)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
726 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
727 /* No proper XLFD specified, or we can't modify the pattern to change
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
728 the registry and encoding to match what we want, or we have no
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
729 information on the registry needed. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
730 eito_external(ei_xlfd, Qx_font_name_encoding);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
731 DEBUG_OBJECTS ("about to xlistfonts_checking_charset, XLFD %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
732 eidata(ei_xlfd));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
733 result = xlistfonts_checking_charset (device, eiextdata(ei_xlfd),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
734 charset, stage);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
735 /* No need to loop through the available registries; return
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
736 immediately. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
737 return result;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
738 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
739 else if (1 == xlfd_length && '*' == *hyphening)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
740 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
741 /* It's a single asterisk. We can add the registry directly to the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
742 end. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
743 eicpy_ch(ei_xlfd_without_registry, '*');
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
744 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
745 else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
746 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
747 /* It's a fully-specified XLFD. Work out where the registry and
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
748 encoding are, and initialise ei_xlfd_without_registry to the string
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
749 without them. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
750
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
751 /* count_hyphens has set new_hyphening to just after the last
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
752 hyphen. Move back to just after the hyphen before it. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
753
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
754 for (new_hyphening -= 2; new_hyphening > hyphening
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
755 && '-' != *new_hyphening; --new_hyphening)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
756 ;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
757 ++new_hyphening;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
758
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
759 eicpy_ei(ei_xlfd_without_registry, ei_xlfd);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
760
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
761 /* Manipulate ei_xlfd_without_registry, using the information about
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
762 ei_xlfd, to which it's identical. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
763 eidel(ei_xlfd_without_registry, new_hyphening - hyphening, -1,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
764 eilen(ei_xlfd) - (new_hyphening - hyphening), -1);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
765
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
766 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
767
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
768 /* Now, loop through the registries and encodings defined for this
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
769 charset, doing an XListFonts each time with the pattern modified to
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
770 specify the regisry and encoding. This avoids huge amounts of IPC and
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
771 duplicated searching; now we use the searching the X server was doing
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
772 anyway, where before the X server did its search, transferred huge
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
773 amounts of data, and then we proceeded to do a regexp search on that
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
774 data. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
775 for (j = 0; j < registries_len && NILP(result); ++j)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
776 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
777 eireset(ei_xlfd);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
778 eicpy_ei(ei_xlfd, ei_xlfd_without_registry);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
779
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
780 eicat_lstr(ei_xlfd, XVECTOR_DATA(registries)[j]);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
781
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
782 eito_external(ei_xlfd, Qx_font_name_encoding);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
783
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
784 DEBUG_OBJECTS ("about to xlistfonts_checking_charset, XLFD %s\n",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
785 eidata(ei_xlfd));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
786 result = xlistfonts_checking_charset (device, eiextdata(ei_xlfd),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
787 charset, stage);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
788 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
789
3676
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
790 /* In the event that the charset is ASCII and we haven't matched
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
791 anything up to now, even with a pattern of "*", add "iso8859-1"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
792 to the charset's registry and try again. Not returning a result
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
793 for ASCII means our frame geometry calculations are
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
794 inconsistent, and that we may crash. */
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
795
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
796 if (1 == xlfd_length && EQ(charset, Vcharset_ascii) && NILP(result)
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
797 && ('*' == eigetch(ei_xlfd_without_registry, 0)))
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
798
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
799 {
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
800 int have_latin1 = 0;
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
801
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
802 /* Set this to, for example, is08859-1 if you want to see the
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
803 error behaviour. */
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
804
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
805 #define FALLBACK_ASCII_REGISTRY "iso8859-1"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
806
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
807 for (j = 0; j < registries_len; ++j)
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
808 {
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
809 if (0 == qxestrcasecmp(XSTRING_DATA(XVECTOR_DATA(registries)[j]),
4124
9a633a00c3f2 [xemacs-hg @ 2007-08-17 08:08:05 by crestani]
crestani
parents: 3841
diff changeset
810 (Ibyte *) FALLBACK_ASCII_REGISTRY))
3676
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
811 {
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
812 have_latin1 = 1;
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
813 break;
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
814 }
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
815 }
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
816
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
817 if (!have_latin1)
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
818 {
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
819 Lisp_Object new_registries = make_vector(registries_len + 1, Qnil);
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
820
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
821 XVECTOR_DATA(new_registries)[0]
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
822 = build_string(FALLBACK_ASCII_REGISTRY);
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
823
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
824 memcpy(XVECTOR_DATA(new_registries) + 1,
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
825 XVECTOR_DATA(registries),
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
826 sizeof XVECTOR_DATA(registries)[0] *
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
827 XVECTOR_LENGTH(registries));
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
828
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
829 /* Calling set_charset_registries instead of overwriting the
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
830 value directly, to allow the charset font caches to be
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
831 invalidated and a change to the default face to be
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
832 noted. */
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
833 set_charset_registries(charset, new_registries);
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
834
3680
efca49973324 [xemacs-hg @ 2006-11-15 21:12:13 by aidan]
aidan
parents: 3676
diff changeset
835 warn_when_safe (Qface, Qwarning,
efca49973324 [xemacs-hg @ 2006-11-15 21:12:13 by aidan]
aidan
parents: 3676
diff changeset
836 "Your ASCII charset registries contain nothing "
efca49973324 [xemacs-hg @ 2006-11-15 21:12:13 by aidan]
aidan
parents: 3676
diff changeset
837 "sensible. Adding `" FALLBACK_ASCII_REGISTRY "'.");
efca49973324 [xemacs-hg @ 2006-11-15 21:12:13 by aidan]
aidan
parents: 3676
diff changeset
838
3676
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
839 /* And recurse. */
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
840 result =
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
841 DEVMETH_OR_GIVEN (XDEVICE (device), find_charset_font,
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
842 (device, font, charset, stage),
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
843 result);
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
844 }
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
845 else
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
846 {
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
847 DECLARE_EISTRING (ei_connection_name);
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
848
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
849 /* We preserve a copy of the connection name for the error message
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
850 after the device is deleted. */
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
851 eicpy_lstr (ei_connection_name,
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
852 DEVICE_CONNECTION (XDEVICE(device)));
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
853
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
854 stderr_out ("Cannot find a font for ASCII, deleting device on %s\n",
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
855 eidata (ei_connection_name));
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
856
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
857 io_error_delete_device (device);
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
858
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
859 /* Do a normal warning in the event that we have other, non-X
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
860 frames available. (If we don't, io_error_delete_device will
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
861 have exited.) */
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
862 warn_when_safe
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
863 (Qface, Qerror,
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
864 "Cannot find a font for ASCII, deleting device on %s.\n"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
865 "\n"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
866 "Your X server fonts appear to be inconsistent; fix them, or\n"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
867 "the next frame you create on that DISPLAY will crash this\n"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
868 "XEmacs. At a minimum, provide one font with an XLFD ending\n"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
869 "in `" FALLBACK_ASCII_REGISTRY "', so we can work out what size\n"
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
870 "a frame should be. ",
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
871 eidata (ei_connection_name));
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
872 }
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
873
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
874 }
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
875
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
876 /* This function used to return the font spec, in the case where a font
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
877 didn't exist on the X server but it did match the charset. We're not
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
878 doing that any more, because none of the other platform code does, and
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
879 the old behaviour was badly-judged in other respects, so I don't trust
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
880 the original author to have had a good reason for it. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
881
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
882 return result;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
883 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
884
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents:
diff changeset
885 #endif /* MULE */