annotate src/faces.c @ 5178:97eb4942aec8

merge
author Ben Wing <ben@xemacs.org>
date Mon, 29 Mar 2010 21:28:13 -0500
parents 8b2f75cecb89 1fae11d56ad2
children 71ee43b8a74d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* "Face" primitives
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Board of Trustees, University of Illinois.
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
4 Copyright (C) 1995, 1996, 2001, 2002, 2005, 2010 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 Copyright (C) 1995 Sun Microsystems, Inc.
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
6 Copyright (C) 2010 Didier Verna
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* Written by Chuck Thompson and Ben Wing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 based loosely on old face code by Jamie Zawinski. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
34 #include "device-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include "elhash.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
36 #include "extents-impl.h" /* for extent_face */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "faces.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
38 #include "frame-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "glyphs.h"
5176
8b2f75cecb89 rename objects* (.c, .h and .el files) to fontcolor*
Ben Wing <ben@xemacs.org>
parents: 5047
diff changeset
40 #include "fontcolor-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "specifier.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 Lisp_Object Qfacep;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Lisp_Object Qforeground, Qbackground, Qdisplay_table;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
46 Lisp_Object Qbackground_pixmap, Qbackground_placement, Qunderline, Qdim;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Lisp_Object Qblinking, Qstrikethru;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 Lisp_Object Qinit_face_from_resources;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 Lisp_Object Qinit_frame_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Lisp_Object Qinit_device_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 Lisp_Object Qinit_global_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 /* These faces are used directly internally. We use these variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 to be able to reference them directly and save the overhead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 calling Ffind_face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object Vdefault_face, Vmodeline_face, Vgui_element_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Lisp_Object Vleft_margin_face, Vright_margin_face, Vtext_cursor_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 Lisp_Object Vpointer_face, Vvertical_divider_face, Vtoolbar_face, Vwidget_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
61 /* Qdefault, Qhighlight, Qleft_margin, Qright_margin defined in general.c */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
62 Lisp_Object Qmodeline, Qgui_element, Qtext_cursor, Qvertical_divider;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
2867
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
64 Lisp_Object Qface_alias, Qcyclic_face_alias;
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
65
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 /* In the old implementation Vface_list was a list of the face names,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 not the faces themselves. We now distinguish between permanent and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 temporary faces. Permanent faces are kept in a regular hash table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 temporary faces in a weak hash table. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 Lisp_Object Vpermanent_faces_cache;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 Lisp_Object Vtemporary_faces_cache;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 Lisp_Object Vbuilt_in_face_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
76 #ifdef DEBUG_XEMACS
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
77 Fixnum debug_x_faces;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
78 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
79
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
80 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
81
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
82 #ifdef DEBUG_XEMACS
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
83 # define DEBUG_FACES(FORMAT, ...) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
84 do { if (debug_x_faces) stderr_out(FORMAT, __VA_ARGS__); } while (0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
85 #else /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
86 # define DEBUG_FACES(format, ...)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
87 #endif /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
88
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
89 #elif defined(__GNUC__)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
90
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
91 #ifdef DEBUG_XEMACS
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
92 # define DEBUG_FACES(format, args...) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
93 do { if (debug_x_faces) stderr_out(format, args ); } while (0)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
94 #else /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
95 # define DEBUG_FACES(format, args...)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
96 #endif /* DEBUG_XEMACS */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
97
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
98 #else /* defined(__STDC_VERSION__) [...] */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
99 # define DEBUG_FACES (void)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
100 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 mark_face (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
105 Lisp_Face *face = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 mark_object (face->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 mark_object (face->doc_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 mark_object (face->foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 mark_object (face->background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 mark_object (face->font);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 mark_object (face->display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 mark_object (face->background_pixmap);
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
115 mark_object (face->background_placement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 mark_object (face->underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 mark_object (face->strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 mark_object (face->highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 mark_object (face->dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 mark_object (face->blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 mark_object (face->reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 mark_object (face->charsets_warned_about);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 return face->plist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1552
diff changeset
129 print_face (Lisp_Object obj, Lisp_Object printcharfun, int UNUSED (escapeflag))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
131 Lisp_Face *face = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 if (print_readably)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 {
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
135 write_fmt_string_lisp (printcharfun, "#s(face name %S)", 1, face->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 {
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
139 write_fmt_string_lisp (printcharfun, "#<face %S", 1, face->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 if (!NILP (face->doc_string))
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
141 write_fmt_string_lisp (printcharfun, " %S", 1, face->doc_string);
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
142 write_ascstring (printcharfun, ">");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 /* Faces are equal if all of their display attributes are equal. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 don't compare names or doc-strings, because that would make equal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 be eq.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 This isn't concerned with "unspecified" attributes, that's what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 #'face-differs-from-default-p is for. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 static int
4906
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
153 face_equal (Lisp_Object obj1, Lisp_Object obj2, int depth,
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
154 int UNUSED (foldcase))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
156 Lisp_Face *f1 = XFACE (obj1);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
157 Lisp_Face *f2 = XFACE (obj2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 depth++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (internal_equal (f1->foreground, f2->foreground, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 internal_equal (f1->background, f2->background, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 internal_equal (f1->font, f2->font, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 internal_equal (f1->display_table, f2->display_table, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 internal_equal (f1->background_pixmap, f2->background_pixmap, depth) &&
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
167 internal_equal (f1->background_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
168 f2->background_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
169 depth) &&
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 internal_equal (f1->underline, f2->underline, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 internal_equal (f1->strikethru, f2->strikethru, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 internal_equal (f1->highlight, f2->highlight, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 internal_equal (f1->dim, f2->dim, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 internal_equal (f1->blinking, f2->blinking, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 internal_equal (f1->reverse, f2->reverse, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
4906
6ef8256a020a implement equalp in C, fix case-folding, add equal() method for keymaps
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
177 ! plists_differ (f1->plist, f2->plist, 0, 0, depth + 1, 0));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
180 static Hashcode
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 face_hash (Lisp_Object obj, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
183 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 depth++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 /* No need to hash all of the elements; that would take too long.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 Just hash the most common ones. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 return HASH3 (internal_hash (f->foreground, depth),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 internal_hash (f->background, depth),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 internal_hash (f->font, depth));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 face_getprop (Lisp_Object obj, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
197 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 return
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
200 (EQ (prop, Qforeground) ? f->foreground :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
201 EQ (prop, Qbackground) ? f->background :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
202 EQ (prop, Qfont) ? f->font :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
203 EQ (prop, Qdisplay_table) ? f->display_table :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
204 EQ (prop, Qbackground_pixmap) ? f->background_pixmap :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
205 EQ (prop, Qbackground_placement) ? f->background_placement :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
206 EQ (prop, Qunderline) ? f->underline :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
207 EQ (prop, Qstrikethru) ? f->strikethru :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
208 EQ (prop, Qhighlight) ? f->highlight :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
209 EQ (prop, Qdim) ? f->dim :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
210 EQ (prop, Qblinking) ? f->blinking :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
211 EQ (prop, Qreverse) ? f->reverse :
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
212 EQ (prop, Qdoc_string) ? f->doc_string :
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 external_plist_get (&f->plist, prop, 0, ERROR_ME));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 face_putprop (Lisp_Object obj, Lisp_Object prop, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
219 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
221 if (EQ (prop, Qforeground) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
222 EQ (prop, Qbackground) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
223 EQ (prop, Qfont) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
224 EQ (prop, Qdisplay_table) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
225 EQ (prop, Qbackground_pixmap) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
226 EQ (prop, Qbackground_placement) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
227 EQ (prop, Qunderline) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
228 EQ (prop, Qstrikethru) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
229 EQ (prop, Qhighlight) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
230 EQ (prop, Qdim) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
231 EQ (prop, Qblinking) ||
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 EQ (prop, Qreverse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 if (EQ (prop, Qdoc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 if (!NILP (value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 CHECK_STRING (value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 f->doc_string = value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 external_plist_put (&f->plist, prop, value, 0, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 face_remprop (Lisp_Object obj, Lisp_Object prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
250 Lisp_Face *f = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
252 if (EQ (prop, Qforeground) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
253 EQ (prop, Qbackground) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
254 EQ (prop, Qfont) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
255 EQ (prop, Qdisplay_table) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
256 EQ (prop, Qbackground_pixmap) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
257 EQ (prop, Qbackground_placement) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
258 EQ (prop, Qunderline) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
259 EQ (prop, Qstrikethru) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
260 EQ (prop, Qhighlight) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
261 EQ (prop, Qdim) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
262 EQ (prop, Qblinking) ||
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 EQ (prop, Qreverse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 if (EQ (prop, Qdoc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 f->doc_string = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 return external_remprop (&f->plist, prop, 0, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 face_plist (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
278 Lisp_Face *face = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 Lisp_Object result = face->plist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
281 result = cons3 (Qreverse, face->reverse, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
282 result = cons3 (Qblinking, face->blinking, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
283 result = cons3 (Qdim, face->dim, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
284 result = cons3 (Qhighlight, face->highlight, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
285 result = cons3 (Qstrikethru, face->strikethru, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
286 result = cons3 (Qunderline, face->underline, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
287 result = cons3 (Qbackground_placement, face->background_placement, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
288 result = cons3 (Qbackground_pixmap, face->background_pixmap, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
289 result = cons3 (Qdisplay_table, face->display_table, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
290 result = cons3 (Qfont, face->font, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
291 result = cons3 (Qbackground, face->background, result);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
292 result = cons3 (Qforeground, face->foreground, result);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 934
diff changeset
297 static const struct memory_description face_description[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
298 { XD_LISP_OBJECT, offsetof (Lisp_Face, name) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
299 { XD_LISP_OBJECT, offsetof (Lisp_Face, doc_string) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
300 { XD_LISP_OBJECT, offsetof (Lisp_Face, foreground) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
301 { XD_LISP_OBJECT, offsetof (Lisp_Face, background) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
302 { XD_LISP_OBJECT, offsetof (Lisp_Face, font) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
303 { XD_LISP_OBJECT, offsetof (Lisp_Face, display_table) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
304 { XD_LISP_OBJECT, offsetof (Lisp_Face, background_pixmap) },
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
305 { XD_LISP_OBJECT, offsetof (Lisp_Face, background_placement) },
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
306 { XD_LISP_OBJECT, offsetof (Lisp_Face, underline) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
307 { XD_LISP_OBJECT, offsetof (Lisp_Face, strikethru) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
308 { XD_LISP_OBJECT, offsetof (Lisp_Face, highlight) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
309 { XD_LISP_OBJECT, offsetof (Lisp_Face, dim) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
310 { XD_LISP_OBJECT, offsetof (Lisp_Face, blinking) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
311 { XD_LISP_OBJECT, offsetof (Lisp_Face, reverse) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
312 { XD_LISP_OBJECT, offsetof (Lisp_Face, plist) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
313 { XD_LISP_OBJECT, offsetof (Lisp_Face, charsets_warned_about) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
5157
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
317 DEFINE_DUMPABLE_LISP_OBJECT ("face", face,
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
318 mark_face, print_face, 0, face_equal,
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
319 face_hash, face_description,
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
320 Lisp_Face);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 /* face read syntax */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1552
diff changeset
327 face_name_validate (Lisp_Object UNUSED (keyword), Lisp_Object value,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
328 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 if (ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 CHECK_SYMBOL (value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 return SYMBOLP (value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 static int
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
340 face_validate (Lisp_Object data, Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 int name_seen = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 Lisp_Object valw = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 data = Fcdr (data); /* skip over Qface */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 while (!NILP (data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 Lisp_Object keyw = Fcar (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 data = Fcdr (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 valw = Fcar (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 data = Fcdr (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 if (EQ (keyw, Qname))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 name_seen = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 else
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
356 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 if (!name_seen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
361 maybe_sferror ("No face name given", Qunbound, Qface, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 if (NILP (Ffind_face (valw)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
367 maybe_invalid_argument ("No such face", valw, Qface, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 face_instantiate (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 return Fget_face (Fcar (Fcdr (data)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 * utility functions *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
386 reset_face (Lisp_Face *f)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 f->name = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 f->doc_string = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 f->dirty = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 f->foreground = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 f->background = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 f->font = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 f->display_table = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 f->background_pixmap = Qnil;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
396 f->background_placement = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 f->underline = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 f->strikethru = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 f->highlight = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 f->dim = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 f->blinking = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 f->reverse = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 f->plist = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 f->charsets_warned_about = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
407 static Lisp_Face *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 allocate_face (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 {
5127
a9c41067dd88 more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents: 5126
diff changeset
410 Lisp_Object obj = ALLOC_NORMAL_LISP_OBJECT (face);
5117
3742ea8250b5 Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents: 3017
diff changeset
411 Lisp_Face *result = XFACE (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 reset_face (result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 return result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 /* We store the faces in hash tables with the names as the key and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 actual face object as the value. Occasionally we need to use them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 in a list format. These routines provide us with that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 struct face_list_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 Lisp_Object *face_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1552
diff changeset
427 add_face_to_list_mapper (Lisp_Object UNUSED (key), Lisp_Object value,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 void *face_list_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 struct face_list_closure *fcl =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (struct face_list_closure *) face_list_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 *(fcl->face_list) = Fcons (XFACE (value)->name, (*fcl->face_list));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 faces_list_internal (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 Lisp_Object face_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 struct face_list_closure face_list_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 GCPRO1 (face_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 face_list_closure.face_list = &face_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 elisp_maphash (add_face_to_list_mapper, list, &face_list_closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 return face_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 permanent_faces_list (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 return faces_list_internal (Vpermanent_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 temporary_faces_list (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 return faces_list_internal (Vtemporary_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1552
diff changeset
467 mark_face_as_clean_mapper (Lisp_Object UNUSED (key), Lisp_Object value,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 void *flag_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 int *flag = (int *) flag_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 XFACE (value)->dirty = *flag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 mark_all_faces_internal (int flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 elisp_maphash (mark_face_as_clean_mapper, Vpermanent_faces_cache, &flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 elisp_maphash (mark_face_as_clean_mapper, Vtemporary_faces_cache, &flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 mark_all_faces_as_clean (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 mark_all_faces_internal (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 /* Currently unused (see the comment in face_property_was_changed()). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 /* #### OBSOLETE ME, PLEASE. Maybe. Maybe this is just as good as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 any other solution. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 struct face_inheritance_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 Lisp_Object face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 Lisp_Object property;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 update_inheritance_mapper_internal (Lisp_Object cur_face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 Lisp_Object inh_face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 Lisp_Object property)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 /* #### fix this function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 Lisp_Object elt = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 GCPRO1 (elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 for (elt = FACE_PROPERTY_SPEC_LIST (cur_face, property, Qall);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 !NILP (elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 elt = XCDR (elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 Lisp_Object values = XCDR (XCAR (elt));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 for (; !NILP (values); values = XCDR (values))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 Lisp_Object value = XCDR (XCAR (values));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 if (VECTORP (value) && XVECTOR_LENGTH (value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 if (EQ (Ffind_face (XVECTOR_DATA (value)[0]), inh_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 Fset_specifier_dirty_flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (FACE_PROPERTY_SPECIFIER (inh_face, property));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 static int
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
532 update_face_inheritance_mapper (const void *hash_key, void *hash_contents,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 void *face_inheritance_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 Lisp_Object key, contents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 struct face_inheritance_closure *fcl =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (struct face_inheritance_closure *) face_inheritance_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
5013
ae48681c47fa changes to VOID_TO_LISP et al.
Ben Wing <ben@xemacs.org>
parents: 4969
diff changeset
539 key = GET_LISP_FROM_VOID (hash_key);
ae48681c47fa changes to VOID_TO_LISP et al.
Ben Wing <ben@xemacs.org>
parents: 4969
diff changeset
540 contents = GET_LISP_FROM_VOID (hash_contents);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 if (EQ (fcl->property, Qfont))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 update_inheritance_mapper_internal (contents, fcl->face, Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 else if (EQ (fcl->property, Qforeground) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 EQ (fcl->property, Qbackground))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 update_inheritance_mapper_internal (contents, fcl->face, Qforeground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 update_inheritance_mapper_internal (contents, fcl->face, Qbackground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 else if (EQ (fcl->property, Qunderline) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 EQ (fcl->property, Qstrikethru) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 EQ (fcl->property, Qhighlight) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 EQ (fcl->property, Qdim) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 EQ (fcl->property, Qblinking) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 EQ (fcl->property, Qreverse))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 update_inheritance_mapper_internal (contents, fcl->face, Qunderline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 update_inheritance_mapper_internal (contents, fcl->face, Qstrikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 update_inheritance_mapper_internal (contents, fcl->face, Qhighlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 update_inheritance_mapper_internal (contents, fcl->face, Qdim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 update_inheritance_mapper_internal (contents, fcl->face, Qblinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 update_inheritance_mapper_internal (contents, fcl->face, Qreverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 update_faces_inheritance (Lisp_Object face, Lisp_Object property)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 struct face_inheritance_closure face_inheritance_closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 GCPRO2 (face, property);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 face_inheritance_closure.face = face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 face_inheritance_closure.property = property;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 elisp_maphash (update_face_inheritance_mapper, Vpermanent_faces_cache,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 &face_inheritance_closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 elisp_maphash (update_face_inheritance_mapper, Vtemporary_faces_cache,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 &face_inheritance_closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 face_property_matching_instance (Lisp_Object face, Lisp_Object property,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 Lisp_Object charset, Lisp_Object domain,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
591 Error_Behavior errb, int no_fallback,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
592 Lisp_Object depth,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
593 enum font_specifier_matchspec_stages stage)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
595 Lisp_Object retval;
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
596 Lisp_Object matchspec = Qunbound;
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
597 struct gcpro gcpro1;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
598
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
599 if (!NILP (charset))
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
600 matchspec = noseeum_cons (charset,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
601 stage == STAGE_INITIAL ? Qinitial : Qfinal);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
602
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
603 GCPRO1 (matchspec);
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
604 /* This call to specifier_instance_no_quit(), will end up calling
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
605 font_instantiate() if the property in a question is a font (currently,
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
606 this means EQ (property, Qfont), because only the face property named
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
607 `font' contains a font object). See the comments there. */
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
608 retval = specifier_instance_no_quit (Fget (face, property, Qnil), matchspec,
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
609 domain, errb, no_fallback, depth);
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
610 UNGCPRO;
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
611 if (CONSP (matchspec))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
612 free_cons (matchspec);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
614 if (UNBOUNDP (retval) && !no_fallback && STAGE_FINAL == stage)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 if (EQ (property, Qfont))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 if (NILP (memq_no_quit (charset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 XFACE (face)->charsets_warned_about)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
621 if (!UNBOUNDP (charset))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 warn_when_safe
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
623 (Qfont, Qnotice,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
624 "Unable to instantiate font for charset %s, face %s",
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
625 XSTRING_DATA (symbol_name
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
626 (XSYMBOL (XCHARSET_NAME (charset)))),
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
627 XSTRING_DATA (symbol_name
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
628 (XSYMBOL (XFACE (face)->name))));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 XFACE (face)->charsets_warned_about =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 Fcons (charset, XFACE (face)->charsets_warned_about);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 retval = Vthe_null_font_instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 DEFUN ("facep", Ffacep, 1, 1, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
641 Return t if OBJECT is a face.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 return FACEP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 DEFUN ("find-face", Ffind_face, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 Retrieve the face of the given name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 If FACE-OR-NAME is a face object, it is simply returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 Otherwise, FACE-OR-NAME should be a symbol. If there is no such face,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 nil is returned. Otherwise the associated face object is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 (face_or_name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 Lisp_Object retval;
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
657 Lisp_Object face_name;
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
658 Lisp_Object face_alias;
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
659 int i;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 if (FACEP (face_or_name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 return face_or_name;
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
663
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
664 face_name = face_or_name;
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
665 CHECK_SYMBOL (face_name);
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
666
2867
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
667 # define FACE_ALIAS_MAX_DEPTH 32
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
668
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
669 i = 0;
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
670 while (! NILP ((face_alias = Fget (face_name, Qface_alias, Qnil)))
2867
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
671 && i < FACE_ALIAS_MAX_DEPTH)
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
672 {
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
673 face_name = face_alias;
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
674 CHECK_SYMBOL (face_alias);
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
675 i += 1;
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
676 }
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
677
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
678 /* #### This test actually makes the aliasing max depth to 30, which is more
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
679 #### than enough IMO. -- dvl */
2867
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
680 if (i == FACE_ALIAS_MAX_DEPTH)
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
681 signal_error (Qcyclic_face_alias,
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
682 "Max face aliasing depth reached",
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
683 face_name);
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
684
2867
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
685 # undef FACE_ALIAS_MAX_DEPTH
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 /* Check if the name represents a permanent face. */
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
688 retval = Fgethash (face_name, Vpermanent_faces_cache, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 if (!NILP (retval))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 /* Check if the name represents a temporary face. */
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
693 return Fgethash (face_name, Vtemporary_faces_cache, Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 DEFUN ("get-face", Fget_face, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 Retrieve the face of the given name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 Same as `find-face' except an error is signalled if there is no such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 face instead of returning nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 (name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 Lisp_Object face = Ffind_face (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 if (NILP (face))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
706 invalid_argument ("No such face", name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 return face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 DEFUN ("face-name", Fface_name, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 Return the name of the given face.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 return XFACE (Fget_face (face))->name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 DEFUN ("built-in-face-specifiers", Fbuilt_in_face_specifiers, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 Return a list of all built-in face specifier properties.
4534
f32c7f843961 #'built-in-face-specifiers; document that we're returning a copy.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4532
diff changeset
720
f32c7f843961 #'built-in-face-specifiers; document that we're returning a copy.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4532
diff changeset
721 This is a copy; there is no way to modify XEmacs' idea of the built-in face
f32c7f843961 #'built-in-face-specifiers; document that we're returning a copy.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4532
diff changeset
722 specifier properties from Lisp.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 {
4532
16906fefc8df Return a list copy in #'built-in-face-specifiers, pre-empting modification.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4210
diff changeset
726 return Fcopy_list(Vbuilt_in_face_specifiers);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 /* These values are retrieved so often that we make a special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 default_face_font_info (Lisp_Object domain, int *ascent, int *descent,
5047
07dcc7000bbf put width before height consistently, fix a real bug found in the process
Ben Wing <ben@xemacs.org>
parents: 5043
diff changeset
735 int *width, int *height, int *proportional_p)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 Lisp_Object font_instance;
3707
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
738 struct face_cachel *cachel;
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
739 struct window *w = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 if (noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 if (ascent)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
744 *ascent = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 if (descent)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
746 *descent = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 if (height)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
748 *height = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 if (width)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
750 *width = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 if (proportional_p)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
752 *proportional_p = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755
3707
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
756 /* We use ASCII here. This is reasonable because the people calling this
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
757 function are using the resulting values to come up with overall sizes
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
758 for windows and frames.
3707
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
759
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
760 It's possible for this function to get called when the face cachels
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
761 have not been initialized--put a call to debug-print in
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
762 init-locale-at-early-startup to see it happen. */
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
763
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
764 if (WINDOWP (domain) && (w = XWINDOW (domain)) && w->face_cachels)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 if (!Dynarr_length (w->face_cachels))
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
767 reset_face_cachels (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 cachel = WINDOW_FACE_CACHEL (w, DEFAULT_INDEX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 font_instance = FACE_CACHEL_FONT (cachel, Vcharset_ascii);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 font_instance = FACE_FONT (Vdefault_face, domain, Vcharset_ascii);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775
3707
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
776 if (UNBOUNDP (font_instance))
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
777 {
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
778 return;
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
779 }
f6f6fc9eb269 [xemacs-hg @ 2006-11-28 21:20:22 by aidan]
aidan
parents: 3676
diff changeset
780
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 if (height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 *height = XFONT_INSTANCE (font_instance)->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 if (width)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 *width = XFONT_INSTANCE (font_instance)->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 if (ascent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 *ascent = XFONT_INSTANCE (font_instance)->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 if (descent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 *descent = XFONT_INSTANCE (font_instance)->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 if (proportional_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 *proportional_p = XFONT_INSTANCE (font_instance)->proportional_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 void
5047
07dcc7000bbf put width before height consistently, fix a real bug found in the process
Ben Wing <ben@xemacs.org>
parents: 5043
diff changeset
794 default_face_width_and_height (Lisp_Object domain, int *width, int *height)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 {
5047
07dcc7000bbf put width before height consistently, fix a real bug found in the process
Ben Wing <ben@xemacs.org>
parents: 5043
diff changeset
796 default_face_font_info (domain, 0, 0, width, height, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 DEFUN ("face-list", Fface_list, 0, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 Return a list of the names of all defined faces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 If TEMPORARY is nil, only the permanent faces are included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 If it is t, only the temporary faces are included. If it is any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 other non-nil value both permanent and temporary are included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 (temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 Lisp_Object face_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 /* Added the permanent faces, if requested. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 if (NILP (temporary) || !EQ (Qt, temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 face_list = permanent_faces_list ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 if (!NILP (temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 GCPRO1 (face_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 face_list = nconc2 (face_list, temporary_faces_list ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 return face_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 DEFUN ("make-face", Fmake_face, 1, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
825 Define a new face with name NAME (a symbol), described by DOC-STRING.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
826 You can modify the font, color, etc. of a face with the set-face-* functions.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 If the face already exists, it is unmodified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 If TEMPORARY is non-nil, this face will cease to exist if not in use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 (name, doc_string, temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 /* This function can GC if initialized is non-zero */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
833 Lisp_Face *f;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 Lisp_Object face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 CHECK_SYMBOL (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 if (!NILP (doc_string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 CHECK_STRING (doc_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 face = Ffind_face (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 if (!NILP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 return face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 f = allocate_face ();
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
845 face = wrap_face (f);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 f->name = name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 f->doc_string = doc_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 f->foreground = Fmake_specifier (Qcolor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 set_color_attached_to (f->foreground, face, Qforeground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 f->background = Fmake_specifier (Qcolor);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 set_color_attached_to (f->background, face, Qbackground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 f->font = Fmake_specifier (Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 set_font_attached_to (f->font, face, Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 f->background_pixmap = Fmake_specifier (Qimage);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 set_image_attached_to (f->background_pixmap, face, Qbackground_pixmap);
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
857 f->background_placement = Fmake_specifier (Qface_background_placement);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
858 set_face_background_placement_attached_to (f->background_placement, face);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 f->display_table = Fmake_specifier (Qdisplay_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 f->underline = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 set_face_boolean_attached_to (f->underline, face, Qunderline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 f->strikethru = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 set_face_boolean_attached_to (f->strikethru, face, Qstrikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 f->highlight = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 set_face_boolean_attached_to (f->highlight, face, Qhighlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 f->dim = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 set_face_boolean_attached_to (f->dim, face, Qdim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 f->blinking = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 set_face_boolean_attached_to (f->blinking, face, Qblinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 f->reverse = Fmake_specifier (Qface_boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 set_face_boolean_attached_to (f->reverse, face, Qreverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 if (!NILP (Vdefault_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 /* If the default face has already been created, set it as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 the default fallback specifier for all the specifiers we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 just created. This implements the standard "all faces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 inherit from default" behavior. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 set_specifier_fallback (f->foreground,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 Fget (Vdefault_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 set_specifier_fallback (f->background,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 Fget (Vdefault_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 set_specifier_fallback (f->font,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 Fget (Vdefault_face, Qfont, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 set_specifier_fallback (f->background_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 Fget (Vdefault_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 Qunbound));
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
887 set_specifier_fallback (f->background_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
888 Fget (Vdefault_face, Qbackground_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
889 Qunbound));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 set_specifier_fallback (f->display_table,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 Fget (Vdefault_face, Qdisplay_table, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 set_specifier_fallback (f->underline,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 Fget (Vdefault_face, Qunderline, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 set_specifier_fallback (f->strikethru,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 Fget (Vdefault_face, Qstrikethru, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 set_specifier_fallback (f->highlight,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 Fget (Vdefault_face, Qhighlight, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 set_specifier_fallback (f->dim,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 Fget (Vdefault_face, Qdim, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 set_specifier_fallback (f->blinking,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 Fget (Vdefault_face, Qblinking, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 set_specifier_fallback (f->reverse,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 Fget (Vdefault_face, Qreverse, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 /* Add the face to the appropriate list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 if (NILP (temporary))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 Fputhash (name, face, Vpermanent_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 Fputhash (name, face, Vtemporary_faces_cache);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 /* Note that it's OK if we dump faces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 When we start up again when we're not noninteractive,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 `init-global-faces' is called and it resources all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 existing faces. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 if (initialized && !noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 GCPRO2 (name, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 call1 (Qinit_face_from_resources, name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 return face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 initialization code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 init_global_faces (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 /* When making the initial terminal device, there is no Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 loaded, so we can't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 if (initialized && !noninteractive)
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
939 call_critical_lisp_code (d, Qinit_global_faces, wrap_device (d));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 init_device_faces (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 /* This function can call lisp */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 /* When making the initial terminal device, there is no Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 loaded, so we can't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 if (initialized)
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
950 call_critical_lisp_code (d, Qinit_device_faces, wrap_device (d));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 init_frame_faces (struct frame *frm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 /* When making the initial terminal device, there is no Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 loaded, so we can't do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 if (initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
960 Lisp_Object tframe = wrap_frame (frm);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
961
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 /* DO NOT change the selected frame here. If the debugger goes off
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
964 it will try and display on the frame being created, but it is not
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
965 ready for that yet and a horrible death will occur. Any random
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
966 code depending on the selected-frame as an implicit arg should be
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
967 tracked down and shot. For the benefit of the one known,
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
968 xpm-color-symbols, make-frame sets the variable
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
969 Vframe_being_created to the frame it is making and sets it to nil
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
970 when done. Internal functions that this could trigger which are
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
971 currently depending on selected-frame should use this instead. It
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
972 is not currently visible at the lisp level. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 call_critical_lisp_code (XDEVICE (FRAME_DEVICE (frm)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 Qinit_frame_faces, tframe);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 /****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 * face cache element functions *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 #### Here is a description of how the face cache elements ought
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 to be redone. It is *NOT* how they work currently:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 However, when I started to go about implementing this, I realized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 that there are all sorts of subtle problems with cache coherency
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 that are coming up. As it turns out, these problems don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 manifest themselves now due to the brute-force "kill 'em all"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 approach to cache invalidation when faces change; but if this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 is ever made smarter, these problems are going to come up, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 some of them are very non-obvious.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 I'm thinking of redoing the cache code a bit to avoid these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 coherency problems. The bulk of the problems will arise because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 the current display structures have simple indices into the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 face cache, but the cache can be changed at various times,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 which could make the current display structures incorrect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 I guess the dirty and updated flags are an attempt to fix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 this, but this approach doesn't really work.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 Here's an approach that should keep things clean and unconfused:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 1) Imagine a "virtual face cache" that can grow arbitrarily
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 big and for which the only thing allowed is to add new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 elements. Existing elements cannot be removed or changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 This way, any pointers in the existing redisplay structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 into the cache never get screwed up. (This is important
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 because even if a cache element is out of date, if there's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 a pointer to it then its contents still accurately describe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 the way the text currently looks on the screen.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 2) Each element in the virtual cache either describes exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 one face, or describes the merger of a number of faces
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 by some process. In order to simplify things, for mergers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 we do not record which faces or ordering was used, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 simply that this cache element is the result of merging.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 Unlike the current implementation, it's important that a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 single cache element not be used to both describe a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 single face and describe a merger, even if all the property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 values are the same.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 3) Each cache element can be clean or dirty. "Dirty" means
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 that the face that the element points to has been changed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 this gets set at the time the face is changed. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 way, when looking up a value in the cache, you can determine
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 whether it's out of date or not. For merged faces it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 does not matter -- we don't record the faces or priority
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 used to create the merger, so it's impossible to look up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 one of these faces. We have to recompute it each time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 Luckily, this is fine -- doing the merge is much
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 less expensive than recomputing the properties of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 single face.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 4) For each cache element, we keep a hash value. (In order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 to hash the boolean properties, we convert each of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 into a different large prime number so that the hashing works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 well.) This allows us, when comparing runes, to properly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 determine whether the face for that rune has changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 This will be especially important for TTY's, where there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 aren't that many faces and minimizing redraw is very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 important.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 5) We can't actually keep an infinite cache, but that doesn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 really matter that much. The only elements we care about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 are those that are used by either the current or desired
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 display structs. Therefore, we keep a per-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 redisplay iteration number, and mark each element with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 that number as we use it. Just after outputting the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 window and synching the redisplay structs, we go through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 the cache and invalidate all elements that are not clean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 elements referring to a particular face and that do not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 have an iteration number equal to the current one. We
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 keep them in a chain, and use them to allocate new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 elements when possible instead of increasing the Dynarr.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
1055 --ben (?? At least I think I wrote this!)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 /* mark for GC a dynarr of face cachels. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 mark_face_cachels (face_cachel_dynarr *elements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 if (!elements)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 for (elt = 0; elt < Dynarr_length (elements); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 struct face_cachel *cachel = Dynarr_atp (elements, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 if (!NILP (cachel->font[i]) && !UNBOUNDP (cachel->font[i]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 mark_object (cachel->font[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 mark_object (cachel->face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 mark_object (cachel->foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 mark_object (cachel->background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 mark_object (cachel->display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 mark_object (cachel->background_pixmap);
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1084 mark_object (cachel->background_placement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 /* ensure that the given cachel contains an updated font value for
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1089 the given charset. Return the updated font value (which can be
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1090 Qunbound, so this value must not be passed unchecked to Lisp).
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1091
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1092 #### Xft: This function will need to be updated for new font model. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 ensure_face_cachel_contains_charset (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 Lisp_Object domain, Lisp_Object charset)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 Lisp_Object new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 Lisp_Object face = cachel->face;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1100 int bound = 1, final_stage = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 int offs = XCHARSET_LEADING_BYTE (charset) - MIN_LEADING_BYTE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1103 if (!UNBOUNDP (cachel->font[offs]) &&
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1104 bit_vector_bit(FACE_CACHEL_FONT_UPDATED (cachel), offs))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 return cachel->font[offs];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 if (UNBOUNDP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 /* a merged face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 struct window *w = XWINDOW (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 new_val = Qunbound;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1114 set_bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(cachel), offs, 0);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1115
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 for (i = 0; i < cachel->nfaces; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 struct face_cachel *oth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 oth = Dynarr_atp (w->face_cachels,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 FACE_CACHEL_FINDEX_UNSAFE (cachel, i));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 /* Tout le monde aime la recursion */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 ensure_face_cachel_contains_charset (oth, domain, charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1125 if (bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(oth), offs))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 new_val = oth->font[offs];
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1128 set_bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(cachel), offs, 1);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1129 set_bit_vector_bit
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1130 (FACE_CACHEL_FONT_FINAL_STAGE(cachel), offs,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1131 bit_vector_bit(FACE_CACHEL_FONT_FINAL_STAGE(oth), offs));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1136 if (!bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(cachel), offs))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 /* need to do the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 struct face_cachel *oth =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 Dynarr_atp (w->face_cachels, DEFAULT_INDEX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 ensure_face_cachel_contains_charset (oth, domain, charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 new_val = oth->font[offs];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1146 if (!UNBOUNDP (cachel->font[offs]) &&
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1147 !EQ (cachel->font[offs], new_val))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 cachel->dirty = 1;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1149 set_bit_vector_bit(FACE_CACHEL_FONT_UPDATED(cachel), offs, 1);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 cachel->font[offs] = new_val;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1151 DEBUG_FACES("just recursed on the unbound face, returning "
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1152 "something %s\n", UNBOUNDP(new_val) ? "not bound"
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1153 : "bound");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 return new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1157 do {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1158
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1159 /* Lookup the face, specifying the initial stage and that fallbacks
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1160 shouldn't happen. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1161 new_val = face_property_matching_instance (face, Qfont, charset, domain,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1162 /* ERROR_ME_DEBUG_WARN is
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1163 fine here. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1164 ERROR_ME_DEBUG_WARN, 1, Qzero,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1165 STAGE_INITIAL);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1166 DEBUG_FACES("just called f_p_m_i on face %s, charset %s, initial, "
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1167 "result was something %s\n",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1168 XSTRING_DATA(XSYMBOL_NAME(XFACE(cachel->face)->name)),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1169 XSTRING_DATA(XSYMBOL_NAME(XCHARSET_NAME(charset))),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1170 UNBOUNDP(new_val) ? "not bound" : "bound");
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1171
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1172 if (!UNBOUNDP (new_val)) break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1173
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1174 bound = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1175 /* Lookup the face again, this time allowing the fallback. If this
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1176 succeeds, it'll give a font intended for the script in question,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1177 which is preferable to translating to ISO10646-1 and using the
4667
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1178 fixed-width fallback.
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1179
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1180 #### This is questionable. The problem is that unusual scripts
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1181 will typically fallback to the hard-coded values as the user is
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1182 unlikely to have specified them herself, a common complaint. */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1183 new_val = face_property_matching_instance (face, Qfont,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1184 charset, domain,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1185 ERROR_ME_DEBUG_WARN, 0,
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1186 Qzero,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1187 STAGE_INITIAL);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1188
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1189 DEBUG_FACES ("just called f_p_m_i on face %s, charset %s, initial, "
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1190 "allow fallback, result was something %s\n",
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1191 XSTRING_DATA (XSYMBOL_NAME (XFACE (cachel->face)->name)),
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1192 XSTRING_DATA (XSYMBOL_NAME (XCHARSET_NAME (charset))),
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1193 UNBOUNDP (new_val) ? "not bound" : "bound");
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1194
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1195 if (!UNBOUNDP (new_val))
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1196 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1197 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1198 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1199
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1200 bound = 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1201 /* Try the face itself with the final-stage specifiers. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1202 new_val = face_property_matching_instance (face, Qfont,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1203 charset, domain,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1204 ERROR_ME_DEBUG_WARN, 1,
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1205 Qzero,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1206 STAGE_FINAL);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1207
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1208 DEBUG_FACES("just called f_p_m_i on face %s, charset %s, final, "
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1209 "result was something %s\n",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1210 XSTRING_DATA(XSYMBOL_NAME(XFACE(cachel->face)->name)),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1211 XSTRING_DATA(XSYMBOL_NAME(XCHARSET_NAME(charset))),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1212 UNBOUNDP(new_val) ? "not bound" : "bound");
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1213 /* Tell X11 redisplay that it should translate to iso10646-1. */
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1214 if (!UNBOUNDP (new_val))
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1215 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1216 final_stage = 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1217 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1218 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1219
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1220 bound = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1221
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1222 /* Lookup the face again, this time both allowing the fallback and
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1223 allowing its final stage to be used. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1224 new_val = face_property_matching_instance (face, Qfont,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1225 charset, domain,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1226 ERROR_ME_DEBUG_WARN, 0,
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1227 Qzero,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1228 STAGE_FINAL);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1229
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1230 DEBUG_FACES ("just called f_p_m_i on face %s, charset %s, initial, "
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1231 "allow fallback, result was something %s\n",
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1232 XSTRING_DATA (XSYMBOL_NAME (XFACE (cachel->face)->name)),
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1233 XSTRING_DATA (XSYMBOL_NAME (XCHARSET_NAME (charset))),
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
1234 UNBOUNDP (new_val) ? "not bound" : "bound");
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1235 if (!UNBOUNDP(new_val))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1236 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1237 /* Tell X11 redisplay that it should translate to iso10646-1. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1238 final_stage = 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1239 break;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1240 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1241 } while (0);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1242
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 if (!UNBOUNDP (cachel->font[offs]) && !EQ (new_val, cachel->font[offs]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 cachel->dirty = 1;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1245
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1246 set_bit_vector_bit(FACE_CACHEL_FONT_UPDATED(cachel), offs, 1);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1247 set_bit_vector_bit(FACE_CACHEL_FONT_FINAL_STAGE(cachel), offs,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1248 final_stage);
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1249 set_bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(cachel), offs,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1250 (bound || EQ (face, Vdefault_face)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 cachel->font[offs] = new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 return new_val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 /* Ensure that the given cachel contains updated fonts for all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 the charsets specified. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 ensure_face_cachel_complete (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 Lisp_Object domain, unsigned char *charsets)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 if (charsets[i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 {
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1267 Lisp_Object charset = charset_by_leading_byte (i + MIN_LEADING_BYTE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 assert (CHARSETP (charset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 ensure_face_cachel_contains_charset (cachel, domain, charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 face_cachel_charset_font_metric_info (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 unsigned char *charsets,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 struct font_metric_info *fm)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 fm->width = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 fm->height = fm->ascent = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 fm->descent = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 fm->proportional_p = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 if (charsets[i])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 {
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
1289 Lisp_Object charset = charset_by_leading_byte (i + MIN_LEADING_BYTE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 Lisp_Object font_instance = FACE_CACHEL_FONT (cachel, charset);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1291 Lisp_Font_Instance *fi = XFONT_INSTANCE (font_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 assert (CHARSETP (charset));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 assert (FONT_INSTANCEP (font_instance));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 if (fm->ascent < (int) fi->ascent) fm->ascent = (int) fi->ascent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 if (fm->descent < (int) fi->descent) fm->descent = (int) fi->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 fm->height = fm->ascent + fm->descent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 if (fi->proportional_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 fm->proportional_p = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 if (EQ (charset, Vcharset_ascii))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 fm->width = fi->width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 #define FROB(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 Lisp_Object new_val = \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 FACE_PROPERTY_INSTANCE (face, Q##field, domain, 1, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 int bound = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 if (UNBOUNDP (new_val)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 bound = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 new_val = FACE_PROPERTY_INSTANCE (face, Q##field, domain, 0, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 if (!EQ (new_val, cachel->field)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 cachel->field = new_val; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 cachel->dirty = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 cachel->field##_specified = (bound || default_face); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1325 /*
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1326 * A face's background pixmap will override the face's
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1327 * background color. But the background pixmap of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1328 * default face should not override the background color of
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1329 * a face if the background color has been specified or
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1330 * inherited.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1331 *
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1332 * To accomplish this we remove the background pixmap of the
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1333 * cachel and mark it as having been specified so that cachel
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1334 * merging won't override it later.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1335 */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1336 #define MAYBE_UNFROB_BACKGROUND_PIXMAP \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1337 do \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1338 { \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1339 if (! default_face \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1340 && cachel->background_specified \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1341 && ! cachel->background_pixmap_specified) \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1342 { \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1343 cachel->background_pixmap = Qunbound; \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1344 cachel->background_pixmap_specified = 1; \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1345 } \
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1346 } while (0)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1347
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1348
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1349 /* Add a cachel for the given face to the given window's cache. */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1350
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1351 static void
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1352 add_face_cachel (struct window *w, Lisp_Object face)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1353 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1354 int must_finish_frobbing = ! WINDOW_FACE_CACHEL (w, DEFAULT_INDEX);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1355 struct face_cachel new_cachel;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1356 Lisp_Object domain;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1357
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1358 reset_face_cachel (&new_cachel);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1359 domain = wrap_window (w);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1360 update_face_cachel_data (&new_cachel, domain, face);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1361 Dynarr_add (w->face_cachels, new_cachel);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1362
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1363 /* The face's background pixmap have not yet been frobbed (see comment
4667
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1364 in update_face_cachel_data), so we have to do it now */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1365 if (must_finish_frobbing)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1366 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1367 int default_face = EQ (face, Vdefault_face);
4844
91b3d00e717f Various cleanups for Dynarr code, from Unicode-internal ws
Ben Wing <ben@xemacs.org>
parents: 4827
diff changeset
1368 struct face_cachel *cachel = Dynarr_lastp (w->face_cachels);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1369
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1370 FROB (background_pixmap);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1371 MAYBE_UNFROB_BACKGROUND_PIXMAP;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1372 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1373 }
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1374
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1375 /* Called when the updated flag has been cleared on a cachel.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1376 This function returns 1 if the caller must finish the update (see comment
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1377 below), 0 otherwise.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1378 */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1379
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1380 void
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1381 update_face_cachel_data (struct face_cachel *cachel,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1382 Lisp_Object domain,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1383 Lisp_Object face)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1384 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1385 if (XFACE (face)->dirty || UNBOUNDP (cachel->face))
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1386 {
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1387 int default_face = EQ (face, Vdefault_face);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1388 cachel->face = face;
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1389
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1390 /* We normally only set the _specified flags if the value was
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1391 actually bound. The exception is for the default face where
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1392 we always set it since it is the ultimate fallback. */
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1393
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 FROB (foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 FROB (background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 FROB (display_table);
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1397
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1398 /* #### WARNING: the background pixmap property of faces is currently
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1399 the only one dealing with images. The problem we have here is that
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1400 frobbing the background pixmap might lead to image instantiation
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1401 which in turn might require that the cache we're building be up to
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1402 date, hence a crash. Here's a typical scenario of this:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1403
4667
cbe5d2169270 Fix typos in face.c.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4534
diff changeset
1404 - a new window is created and its face cache elements are
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1405 initialized through a call to reset_face_cachels[1]. At that point,
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1406 the cache for the default and modeline faces (normaly taken care of
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1407 by redisplay itself) are null.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1408 - the default face has a background pixmap which needs to be
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1409 instantiated right here, as a consequence of cache initialization.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1410 - the background pixmap image happens to be instantiated as a string
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1411 (this happens on tty's for instance).
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1412 - In order to do this, we need to compute the string geometry.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1413 - In order to do this, we might have to access the window's default
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1414 face cache. But this is the cache we're building right now, it is
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1415 null.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1416 - BARF !!!!!
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1418 To sum up, this means that it is in general unsafe to instantiate
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1419 images before face cache updating is complete (appart from image
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1420 related face attributes). The solution we use below is to actually
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1421 detect whether we're building the window's face_cachels for the first
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1422 time, and simply NOT frob the background pixmap in that case. If
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1423 other image-related face attributes are ever implemented, they should
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1424 be protected the same way right here.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1425
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1426 One note:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1427 * See comment in `default_face_font_info' in face.c. Who wrote it ?
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1428 Maybe we have the begining of an answer here ?
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1429
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1430 Footnotes:
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1431 [1] See comment at the top of `allocate_window' in window.c.
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1432
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1433 -- didier
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1434 */
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1435 if (! WINDOWP (domain)
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1436 || WINDOW_FACE_CACHEL (DOMAIN_XWINDOW (domain), DEFAULT_INDEX))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 {
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1438 FROB (background_pixmap);
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1439 MAYBE_UNFROB_BACKGROUND_PIXMAP;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 }
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1441
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1442 FROB (background_placement);
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1443
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 #undef FROB
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
1445 #undef MAYBE_UNFROB_BACKGROUND_PIXMAP
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 ensure_face_cachel_contains_charset (cachel, domain, Vcharset_ascii);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 #define FROB(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 Lisp_Object new_val = \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 FACE_PROPERTY_INSTANCE (face, Q##field, domain, 1, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 int bound = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 unsigned int new_val_int; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 if (UNBOUNDP (new_val)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 bound = 0; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 new_val = FACE_PROPERTY_INSTANCE (face, Q##field, domain, 0, Qzero); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 new_val_int = EQ (new_val, Qt); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 if (cachel->field != new_val_int) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 cachel->field = new_val_int; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 cachel->dirty = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 cachel->field##_specified = bound; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 FROB (underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 FROB (strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 FROB (highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 FROB (dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 FROB (reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 FROB (blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 cachel->updated = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 /* Merge the cachel identified by FINDEX in window W into the given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 cachel. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 merge_face_cachel_data (struct window *w, face_index findex,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 struct face_cachel *cachel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 {
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1488 int offs;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1489
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 #define FINDEX_FIELD(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 Dynarr_atp (w->face_cachels, findex)->field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 #define FROB(field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 if (!cachel->field##_specified && FINDEX_FIELD (field##_specified)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 cachel->field = FINDEX_FIELD (field); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 cachel->field##_specified = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 cachel->dirty = 1; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 FROB (foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 FROB (background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 FROB (display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 FROB (background_pixmap);
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1507 FROB (background_placement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 FROB (underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 FROB (strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 FROB (highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 FROB (dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 FROB (reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 FROB (blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1515 for (offs = 0; offs < NUM_LEADING_BYTES; ++offs)
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1516 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1517 if (!(bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(cachel), offs))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1518 && bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1519 (Dynarr_atp(w->face_cachels, findex)), offs))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1520 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1521 cachel->font[offs] = FINDEX_FIELD (font[offs]);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1522 set_bit_vector_bit(FACE_CACHEL_FONT_SPECIFIED(cachel), offs, 1);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1523 /* Also propagate whether we're translating to Unicode for the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1524 given face. */
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1525 set_bit_vector_bit(FACE_CACHEL_FONT_FINAL_STAGE(cachel), offs,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1526 bit_vector_bit(FACE_CACHEL_FONT_FINAL_STAGE
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1527 (Dynarr_atp(w->face_cachels,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1528 findex)), offs));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1529 cachel->dirty = 1;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1530 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1531 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 #undef FINDEX_FIELD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 cachel->updated = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 /* Initialize a cachel. */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1539 /* #### Xft: this function will need to be changed for new font model. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 reset_face_cachel (struct face_cachel *cachel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 xzero (*cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 cachel->face = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 cachel->nfaces = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 cachel->merged_faces = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 cachel->foreground = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 cachel->background = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 for (i = 0; i < NUM_LEADING_BYTES; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 cachel->font[i] = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 cachel->display_table = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 cachel->background_pixmap = Qunbound;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1558 cachel->background_placement = Qunbound;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1559 FACE_CACHEL_FONT_SPECIFIED (cachel)->size = sizeof(cachel->font_specified);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1560 FACE_CACHEL_FONT_UPDATED (cachel)->size = sizeof(cachel->font_updated);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 /* Retrieve the index to a cachel for window W that corresponds to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 the specified face. If necessary, add a new element to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 cache. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 face_index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 get_builtin_face_cache_index (struct window *w, Lisp_Object face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 if (noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 for (elt = 0; elt < Dynarr_length (w->face_cachels); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 struct face_cachel *cachel = WINDOW_FACE_CACHEL (w, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 if (EQ (cachel->face, face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1581 Lisp_Object window = wrap_window (w);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1582
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 if (!cachel->updated)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 update_face_cachel_data (cachel, window, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 return elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 /* If we didn't find the face, add it and then return its index. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 add_face_cachel (w, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 return elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 reset_face_cachels (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 /* #### Not initialized in batch mode for the stream device. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 if (w->face_cachels)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 int i;
4208
e820df1cb11a [xemacs-hg @ 2007-10-03 13:28:19 by didierv]
didierv
parents: 4187
diff changeset
1601 face_index fi;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 for (i = 0; i < Dynarr_length (w->face_cachels); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 struct face_cachel *cachel = Dynarr_atp (w->face_cachels, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 if (cachel->merged_faces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 Dynarr_free (cachel->merged_faces);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 Dynarr_reset (w->face_cachels);
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1610 /* #### NOTE: be careful with the order !
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1611 The cpp macros DEFAULT_INDEX and MODELINE_INDEX defined in
4208
e820df1cb11a [xemacs-hg @ 2007-10-03 13:28:19 by didierv]
didierv
parents: 4187
diff changeset
1612 redisplay.h depend on the code below. Please make sure to assert the
e820df1cb11a [xemacs-hg @ 2007-10-03 13:28:19 by didierv]
didierv
parents: 4187
diff changeset
1613 correct values if you ever add new built-in faces here.
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1614 -- dvl */
4208
e820df1cb11a [xemacs-hg @ 2007-10-03 13:28:19 by didierv]
didierv
parents: 4187
diff changeset
1615 fi = get_builtin_face_cache_index (w, Vdefault_face);
4210
65c3847d432c [xemacs-hg @ 2007-10-03 21:31:10 by didierv]
didierv
parents: 4208
diff changeset
1616 assert (noninteractive || fi == DEFAULT_INDEX);
4208
e820df1cb11a [xemacs-hg @ 2007-10-03 13:28:19 by didierv]
didierv
parents: 4187
diff changeset
1617 fi = get_builtin_face_cache_index (w, Vmodeline_face);
4210
65c3847d432c [xemacs-hg @ 2007-10-03 21:31:10 by didierv]
didierv
parents: 4208
diff changeset
1618 assert (noninteractive || fi == MODELINE_INDEX);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 XFRAME (w->frame)->window_face_cache_reset = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 mark_face_cachels_as_clean (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 for (elt = 0; elt < Dynarr_length (w->face_cachels); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 Dynarr_atp (w->face_cachels, elt)->dirty = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1632 /* #### Xft: this function will need to be changed for new font model. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 mark_face_cachels_as_not_updated (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 for (elt = 0; elt < Dynarr_length (w->face_cachels); elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 struct face_cachel *cachel = Dynarr_atp (w->face_cachels, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 cachel->updated = 0;
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
1643 memset(FACE_CACHEL_FONT_UPDATED(cachel)->bits, 0,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
1644 BIT_VECTOR_LONG_STORAGE (NUM_LEADING_BYTES));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 #ifdef MEMORY_USAGE_STATS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 compute_face_cachel_usage (face_cachel_dynarr *face_cachels,
5157
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
1652 struct usage_stats *ustats)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 int total = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 if (face_cachels)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659
5157
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
1660 total += Dynarr_memory_usage (face_cachels, ustats);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 for (i = 0; i < Dynarr_length (face_cachels); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 int_dynarr *merged = Dynarr_at (face_cachels, i).merged_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 if (merged)
5157
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
1665 total += Dynarr_memory_usage (merged, ustats);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 return total;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 #endif /* MEMORY_USAGE_STATS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 * merged face functions *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 *****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 /* Compare two merged face cachels to determine whether we have to add
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 a new entry to the face cache.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 Note that we do not compare the attributes, but just the faces the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 cachels are based on. If they are the same, then the cachels certainly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 ought to have the same attributes, except in the case where fonts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 for different charsets have been determined in the two -- and in that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 case this difference is fine. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 compare_merged_face_cachels (struct face_cachel *cachel1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 struct face_cachel *cachel2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 if (!EQ (cachel1->face, cachel2->face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 || cachel1->nfaces != cachel2->nfaces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 for (i = 0; i < cachel1->nfaces; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 if (FACE_CACHEL_FINDEX_UNSAFE (cachel1, i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 != FACE_CACHEL_FINDEX_UNSAFE (cachel2, i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 /* Retrieve the index to a cachel for window W that corresponds to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 the specified cachel. If necessary, add a new element to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 cache. This is similar to get_builtin_face_cache_index() but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 is intended for merged cachels rather than for cachels representing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 just a face.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 Note that a merged cachel for just one face is not the same as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 the simple cachel for that face, because it is also merged with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 static face_index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 get_merged_face_cache_index (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 struct face_cachel *merged_cachel)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 int elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 int cache_size = Dynarr_length (w->face_cachels);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 for (elt = 0; elt < cache_size; elt++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 struct face_cachel *cachel =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 Dynarr_atp (w->face_cachels, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 if (compare_merged_face_cachels (cachel, merged_cachel))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 return elt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 /* We didn't find it so add this instance to the cache. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 merged_cachel->updated = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 merged_cachel->dirty = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 Dynarr_add (w->face_cachels, *merged_cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 return cache_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 face_index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 get_extent_fragment_face_cache_index (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 struct extent_fragment *ef)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 struct face_cachel cachel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 int len = Dynarr_length (ef->extents);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 face_index findex = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 /* Optimize the default case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 if (len == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 return DEFAULT_INDEX;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 /* Merge the faces of the extents together in order. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 reset_face_cachel (&cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 for (i = len - 1; i >= 0; i--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 EXTENT current = Dynarr_at (ef->extents, i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 int has_findex = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 Lisp_Object face = extent_face (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 if (FACEP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 findex = get_builtin_face_cache_index (w, face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 has_findex = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 merge_face_cachel_data (w, findex, &cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 /* remember, we're called from within redisplay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 so we can't error. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 else while (CONSP (face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 Lisp_Object one_face = XCAR (face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 if (FACEP (one_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 findex = get_builtin_face_cache_index (w, one_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 merge_face_cachel_data (w, findex, &cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 /* code duplication here but there's no clean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 way to avoid it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 if (!cachel.merged_faces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 cachel.merged_faces = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 Dynarr_add (cachel.merged_faces, findex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 cachel.merged_faces_static[cachel.nfaces] = findex;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 cachel.nfaces++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 face = XCDR (face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 if (has_findex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 if (cachel.nfaces >= NUM_STATIC_CACHEL_FACES)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 if (!cachel.merged_faces)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 cachel.merged_faces = Dynarr_new (int);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 Dynarr_add (cachel.merged_faces, findex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 cachel.merged_faces_static[cachel.nfaces] = findex;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 cachel.nfaces++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 /* Now finally merge in the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 findex = get_builtin_face_cache_index (w, Vdefault_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 merge_face_cachel_data (w, findex, &cachel);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1813 findex = get_merged_face_cache_index (w, &cachel);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1814 if (cachel.merged_faces &&
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1815 /* merged_faces did not get stored and available via return value */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1816 Dynarr_at (w->face_cachels, findex).merged_faces !=
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1817 cachel.merged_faces)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1818 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1819 Dynarr_free (cachel.merged_faces);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1820 cachel.merged_faces = 0;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1821 }
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1822 return findex;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1826 /* Return a cache index for window W from merging the faces in FACE_LIST.
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1827 COUNT is the number of faces in the list.
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1828
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1829 The default face should not be included in the list, as it is always
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1830 implicitly merged into the cachel.
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1831
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1832 WARNING: this interface may change. */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1833
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1834 face_index
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1835 merge_face_list_to_cache_index (struct window *w,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1836 Lisp_Object *face_list, int count)
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1837 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1838 int i;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1839 face_index findex = 0;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1840 struct face_cachel cachel;
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1841
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1842 reset_face_cachel (&cachel);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1843
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1844 for (i = 0; i < count; i++)
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1845 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1846 Lisp_Object face = face_list[i];
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1847
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1848 if (!NILP (face))
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1849 {
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1850 CHECK_FACE(face); /* #### presumably unnecessary */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1851 findex = get_builtin_face_cache_index (w, face);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1852 merge_face_cachel_data (w, findex, &cachel);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1853 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1854 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1855
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1856 /* Now finally merge in the default face. */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1857 findex = get_builtin_face_cache_index (w, Vdefault_face);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1858 merge_face_cachel_data (w, findex, &cachel);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1859
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1860 return get_merged_face_cache_index (w, &cachel);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1861 }
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
1862
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 /*****************************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 interface functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 ****************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 update_EmacsFrame (Lisp_Object frame, Lisp_Object name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 struct frame *frm = XFRAME (frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872
3676
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
1873 if (!FRAME_LIVE_P(frm))
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
1874 return;
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
1875
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 if (EQ (name, Qfont))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 MARK_FRAME_SIZE_SLIPPED (frm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 MAYBE_FRAMEMETH (frm, update_frame_external_traits, (frm, name));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 update_EmacsFrames (Lisp_Object locale, Lisp_Object name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 if (FRAMEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 update_EmacsFrame (locale, name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 else if (DEVICEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 Lisp_Object frmcons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 DEVICE_FRAME_LOOP (frmcons, XDEVICE (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 update_EmacsFrame (XCAR (frmcons), name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 else if (EQ (locale, Qglobal) || EQ (locale, Qfallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 Lisp_Object frmcons, devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 update_EmacsFrame (XCAR (frmcons), name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 update_frame_face_values (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1908 Lisp_Object frm = wrap_frame (f);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 update_EmacsFrame (frm, Qforeground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 update_EmacsFrame (frm, Qbackground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 update_EmacsFrame (frm, Qfont);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 face_property_was_changed (Lisp_Object face, Lisp_Object property,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 Lisp_Object locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 int default_face = EQ (face, Vdefault_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 /* If the locale could affect the frame value, then call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 update_EmacsFrames just in case. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 if (default_face &&
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1924 (EQ (property, Qforeground) ||
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
1925 EQ (property, Qbackground) ||
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 EQ (property, Qfont)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 update_EmacsFrames (locale, property);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 if (WINDOWP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 MARK_FRAME_FACES_CHANGED (XFRAME (XWINDOW (locale)->frame));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 else if (FRAMEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 MARK_FRAME_FACES_CHANGED (XFRAME (locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 else if (DEVICEP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 Lisp_Object devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 DEVICE_LOOP_NO_BREAK (devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 MARK_DEVICE_FRAMES_FACES_CHANGED (XDEVICE (XCAR (devcons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 * This call to update_faces_inheritance isn't needed and makes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 * creating and modifying faces _very_ slow. The point of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 * update_face_inheritances is to find all faces that inherit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 * directly from this face property and set the specifier "dirty"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 * flag on the corresponding specifier. This forces recaching of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 * cached specifier values in frame and window struct slots. But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 * currently no face properties are cached in frame and window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 * struct slots, so calling this function does nothing useful!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 * Further, since update_faces_inheritance maps over the whole
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 * face table every time it is called, it gets terribly slow when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 * there are many faces. Creating 500 faces on a 50Mhz 486 took
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 * 433 seconds when update_faces_inheritance was called. With the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 * call commented out, creating those same 500 faces took 0.72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 * seconds.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 /* update_faces_inheritance (face, property);*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 XFACE (face)->dirty = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 DEFUN ("copy-face", Fcopy_face, 2, 6, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 Define and return a new face which is a copy of an existing one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 or makes an already-existing face be exactly like another.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 LOCALE, TAG-SET, EXACT-P, and HOW-TO-ADD are as in `copy-specifier'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 (old_face, new_name, locale, tag_set, exact_p, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1976 Lisp_Face *fold, *fnew;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 Lisp_Object new_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 old_face = Fget_face (old_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 /* We GCPRO old_face because it might be temporary, and GCing could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 occur in various places below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 GCPRO4 (tag_set, locale, old_face, new_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 /* check validity of how_to_add now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 decode_how_to_add_specification (how_to_add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 /* and of tag_set. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 tag_set = decode_specifier_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 /* and of locale. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 locale = decode_locale_list (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 new_face = Ffind_face (new_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 if (NILP (new_face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 Lisp_Object temp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 CHECK_SYMBOL (new_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 /* Create the new face with the same status as the old face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 temp = (NILP (Fgethash (old_face, Vtemporary_faces_cache, Qnil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 ? Qnil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 : Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 new_face = Fmake_face (new_name, Qnil, temp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 fold = XFACE (old_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 fnew = XFACE (new_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 #define COPY_PROPERTY(property) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 Fcopy_specifier (fold->property, fnew->property, \
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2012 locale, tag_set, exact_p, how_to_add);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 COPY_PROPERTY (foreground);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 COPY_PROPERTY (background);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 COPY_PROPERTY (font);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 COPY_PROPERTY (display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 COPY_PROPERTY (background_pixmap);
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2019 COPY_PROPERTY (background_placement);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 COPY_PROPERTY (underline);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 COPY_PROPERTY (strikethru);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 COPY_PROPERTY (highlight);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 COPY_PROPERTY (dim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 COPY_PROPERTY (blinking);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 COPY_PROPERTY (reverse);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 #undef COPY_PROPERTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 /* #### should it copy the individual specifiers, if they exist? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 fnew->plist = Fcopy_sequence (fold->plist);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 return new_name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2035 #ifdef MULE
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2036
3918
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2037 Lisp_Object Qone_dimensional, Qtwo_dimensional, Qx_coverage_instantiator;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2038
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2039 DEFUN ("specifier-tag-one-dimensional-p",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2040 Fspecifier_tag_one_dimensional_p,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2041 1, 1, 0, /*
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2042 Return non-nil if (charset-dimension CHARSET) is 1.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2043
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2044 Used by the X11 platform font code; see `define-specifier-tag'. You
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2045 shouldn't ever need to call this yourself.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2046 */
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2047 (charset))
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2048 {
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2049 CHECK_CHARSET (charset);
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2050 return (1 == XCHARSET_DIMENSION (charset)) ? Qt : Qnil;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2051 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2052
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2053 DEFUN ("specifier-tag-two-dimensional-p",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2054 Fspecifier_tag_two_dimensional_p,
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2055 1, 1, 0, /*
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2056 Return non-nil if (charset-dimension CHARSET) is 2.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2057
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2058 Used by the X11 platform font code; see `define-specifier-tag'. You
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2059 shouldn't ever need to call this yourself.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2060 */
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2061 (charset))
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2062 {
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2063 CHECK_CHARSET (charset);
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2064 return (2 == XCHARSET_DIMENSION (charset)) ? Qt : Qnil;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2065 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2066
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2067 DEFUN ("specifier-tag-final-stage-p",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2068 Fspecifier_tag_final_stage_p,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2069 2, 2, 0, /*
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2070 Return non-nil if STAGE is 'final.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2071
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2072 Used by the X11 platform font code for giving fallbacks; see
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2073 `define-specifier-tag'. You shouldn't ever need to call this.
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2074 */
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2075 (UNUSED (charset), stage))
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2076 {
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 5013
diff changeset
2077 return EQ (stage, Qfinal) ? Qt : Qnil;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2078 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2079
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2080 DEFUN ("specifier-tag-initial-stage-p",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2081 Fspecifier_tag_initial_stage_p,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2082 2, 2, 0, /*
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2083 Return non-nil if STAGE is 'initial.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2084
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2085 Used by the X11 platform font code for giving fallbacks; see
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2086 `define-specifier-tag'. You shouldn't ever need to call this.
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2087 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2088 (UNUSED(charset), stage))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2089 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2090 return EQ(stage, Qinitial) ? Qt : Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2091 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2092
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2093 DEFUN ("specifier-tag-encode-as-utf-8-p",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2094 Fspecifier_tag_encode_as_utf_8_p,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2095 2, 2, 0, /*
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2096 Return t if and only if (charset-property CHARSET 'encode-as-utf-8)).
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2097
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2098 Used by the X11 platform font code; see `define-specifier-tag'. You
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2099 shouldn't ever need to call this.
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2100 */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2101 (charset, UNUSED(stage)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2102 {
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2103 /* Used to check that the stage was initial too. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2104 CHECK_CHARSET(charset);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2105 return XCHARSET_ENCODE_AS_UTF_8(charset) ? Qt : Qnil;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2106 }
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2107
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2108 #endif /* MULE */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2109
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 void
5157
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2112 face_objects_create (void)
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2113 {
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2114 OBJECT_HAS_METHOD (face, getprop);
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2115 OBJECT_HAS_METHOD (face, putprop);
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2116 OBJECT_HAS_METHOD (face, remprop);
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2117 OBJECT_HAS_METHOD (face, plist);
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2118 }
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2119
1fae11d56ad2 redo memory-usage mechanism, add way of dynamically initializing Lisp objects
Ben Wing <ben@xemacs.org>
parents: 5128
diff changeset
2120 void
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 syms_of_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 {
5117
3742ea8250b5 Checking in final CVS version of workspace 'ben-lisp-object'
Ben Wing <ben@xemacs.org>
parents: 3017
diff changeset
2123 INIT_LISP_OBJECT (face);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2124
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2125 /* Qdefault, Qwidget, Qleft_margin, Qright_margin defined in general.c */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2126 DEFSYMBOL (Qmodeline);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2127 DEFSYMBOL (Qgui_element);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2128 DEFSYMBOL (Qtext_cursor);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2129 DEFSYMBOL (Qvertical_divider);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 DEFSUBR (Ffacep);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 DEFSUBR (Ffind_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 DEFSUBR (Fget_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 DEFSUBR (Fface_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 DEFSUBR (Fbuilt_in_face_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 DEFSUBR (Fface_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 DEFSUBR (Fmake_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 DEFSUBR (Fcopy_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2140 #ifdef MULE
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2141 DEFSYMBOL (Qone_dimensional);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2142 DEFSYMBOL (Qtwo_dimensional);
3918
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2143 DEFSYMBOL (Qx_coverage_instantiator);
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2144
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2145 /* I would much prefer these were in Lisp. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2146 DEFSUBR (Fspecifier_tag_one_dimensional_p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2147 DEFSUBR (Fspecifier_tag_two_dimensional_p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2148 DEFSUBR (Fspecifier_tag_initial_stage_p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2149 DEFSUBR (Fspecifier_tag_final_stage_p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2150 DEFSUBR (Fspecifier_tag_encode_as_utf_8_p);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2151 #endif /* MULE */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2152
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2153 DEFSYMBOL (Qfacep);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2154 DEFSYMBOL (Qforeground);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2155 DEFSYMBOL (Qbackground);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 /* Qfont defined in general.c */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2157 DEFSYMBOL (Qdisplay_table);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2158 DEFSYMBOL (Qbackground_pixmap);
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2159 DEFSYMBOL (Qbackground_placement);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2160 DEFSYMBOL (Qunderline);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2161 DEFSYMBOL (Qstrikethru);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 /* Qhighlight, Qreverse defined in general.c */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2163 DEFSYMBOL (Qdim);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2164 DEFSYMBOL (Qblinking);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
2166 DEFSYMBOL (Qface_alias);
2867
abbd4c295aa2 [xemacs-hg @ 2005-07-20 07:36:33 by didierv]
didierv
parents: 2865
diff changeset
2167 DEFERROR_STANDARD (Qcyclic_face_alias, Qinvalid_state);
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
2168
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2169 DEFSYMBOL (Qinit_face_from_resources);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2170 DEFSYMBOL (Qinit_global_faces);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2171 DEFSYMBOL (Qinit_device_faces);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
2172 DEFSYMBOL (Qinit_frame_faces);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 structure_type_create_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 struct structure_type *st;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 st = define_structure_type (Qface, face_validate, face_instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 define_structure_type_keyword (st, Qname, face_name_validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 vars_of_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 staticpro (&Vpermanent_faces_cache);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2189 Vpermanent_faces_cache =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2190 make_lisp_hash_table (10, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 staticpro (&Vtemporary_faces_cache);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2192 Vtemporary_faces_cache =
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2193 make_lisp_hash_table (0, HASH_TABLE_WEAK, HASH_TABLE_EQ);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 staticpro (&Vdefault_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 Vdefault_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 staticpro (&Vgui_element_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 Vgui_element_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 staticpro (&Vwidget_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 Vwidget_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 staticpro (&Vmodeline_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 Vmodeline_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 staticpro (&Vtoolbar_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 Vtoolbar_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 staticpro (&Vvertical_divider_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 Vvertical_divider_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 staticpro (&Vleft_margin_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 Vleft_margin_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 staticpro (&Vright_margin_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 Vright_margin_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 staticpro (&Vtext_cursor_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 Vtext_cursor_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 staticpro (&Vpointer_face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 Vpointer_face = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2217 #ifdef DEBUG_XEMACS
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2218 DEFVAR_INT ("debug-x-faces", &debug_x_faces /*
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2219 If non-zero, display debug information about X faces
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2220 */ );
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2221 debug_x_faces = 0;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2222 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2223
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 Lisp_Object syms[20];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 int n = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 syms[n++] = Qforeground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 syms[n++] = Qbackground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 syms[n++] = Qfont;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 syms[n++] = Qdisplay_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 syms[n++] = Qbackground_pixmap;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2233 syms[n++] = Qbackground_placement;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 syms[n++] = Qunderline;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 syms[n++] = Qstrikethru;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 syms[n++] = Qhighlight;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 syms[n++] = Qdim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 syms[n++] = Qblinking;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 syms[n++] = Qreverse;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 Vbuilt_in_face_specifiers = Flist (n, syms);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 staticpro (&Vbuilt_in_face_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 complex_vars_of_faces (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 /* Create the default face now so we know what it is immediately. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 Vdefault_face = Qnil; /* so that Fmake_face() doesn't set up a bogus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 default value */
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2253 Vdefault_face = Fmake_face (Qdefault, build_defer_string ("default face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 /* Provide some last-resort fallbacks to avoid utter fuckage if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 someone provides invalid values for the global specifications. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 Lisp_Object fg_fb = Qnil, bg_fb = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2262 #ifdef HAVE_GTK
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2263 fg_fb = acons (list1 (Qgtk), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2264 bg_fb = acons (list1 (Qgtk), build_ascstring ("white"), bg_fb);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2265 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 #ifdef HAVE_X_WINDOWS
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2267 fg_fb = acons (list1 (Qx), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2268 bg_fb = acons (list1 (Qx), build_ascstring ("gray80"), bg_fb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 #ifdef HAVE_TTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 fg_fb = acons (list1 (Qtty), Fvector (0, 0), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 bg_fb = acons (list1 (Qtty), Fvector (0, 0), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 #ifdef HAVE_MS_WINDOWS
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2275 fg_fb = acons (list1 (Qmsprinter), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2276 bg_fb = acons (list1 (Qmsprinter), build_ascstring ("white"), bg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2277 fg_fb = acons (list1 (Qmswindows), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2278 bg_fb = acons (list1 (Qmswindows), build_ascstring ("white"), bg_fb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 set_specifier_fallback (Fget (Vdefault_face, Qforeground, Qnil), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 set_specifier_fallback (Fget (Vdefault_face, Qbackground, Qnil), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 Lisp_Object inst_list = Qnil;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2286
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 826
diff changeset
2287 #if defined (HAVE_X_WINDOWS) || defined (HAVE_GTK)
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
2288
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2289 #ifdef HAVE_GTK
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2290 Lisp_Object device_symbol = Qgtk;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2291 #else
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2292 Lisp_Object device_symbol = Qx;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2293 #endif
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2294
4916
a6c778975d7d split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents: 4906
diff changeset
2295 #if defined (HAVE_XFT) || defined (MULE)
3802
d6f975442bd3 [xemacs-hg @ 2007-01-27 17:14:20 by michaels]
michaels
parents: 3747
diff changeset
2296 const Ascbyte **fontptr;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2297
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
2298 const Ascbyte *fonts[] =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 {
4916
a6c778975d7d split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents: 4906
diff changeset
2300 #ifdef HAVE_XFT
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2301 /************** Xft fonts *************/
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2302
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2303 /* Note that fontconfig can search for several font families in one
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2304 call. We should use this facility. */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2305 "Monospace-12",
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2306 /* do we need to worry about non-Latin characters for monospace?
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2307 No, at least in Debian's implementation of Xft.
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2308 We should recommend that "gothic" and "mincho" aliases be created? */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2309 "Sazanami Mincho-12",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2310 /* Japanese #### add encoding info? */
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2311 /* Arphic for Chinese? */
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2312 /* Korean */
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2313 #else
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2314 /* The default Japanese fonts installed with XFree86 4.0 use this
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2315 point size, and the -misc-fixed fonts (which look really bad with
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2316 Han characters) don't. We need to prefer the former. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2317 "-*-*-medium-r-*-*-*-150-*-*-c-*-*-*",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2318 /* And the Chinese ones, maddeningly, use this one. (But on 4.0, while
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2319 XListFonts returns them, XLoadQueryFont on the fully-specified XLFD
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2320 corresponding to one of them fails!) */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2321 "-*-*-medium-r-*-*-*-160-*-*-c-*-*-*",
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2322 "-*-*-medium-r-*-*-*-170-*-*-c-*-*-*",
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2323 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 };
4916
a6c778975d7d split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents: 4906
diff changeset
2325 #endif /* defined (HAVE_XFT) || defined (MULE) */
3802
d6f975442bd3 [xemacs-hg @ 2007-01-27 17:14:20 by michaels]
michaels
parents: 3747
diff changeset
2326
d6f975442bd3 [xemacs-hg @ 2007-01-27 17:14:20 by michaels]
michaels
parents: 3747
diff changeset
2327 #ifdef MULE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2329 /* Define some specifier tags for classes of character sets. Combining
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2330 these allows for distinct fallback fonts for distinct dimensions of
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2331 character sets and stages. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2332
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2333 define_specifier_tag(Qtwo_dimensional, Qnil,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2334 intern ("specifier-tag-two-dimensional-p"));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2335
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2336 define_specifier_tag(Qone_dimensional, Qnil,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2337 intern ("specifier-tag-one-dimensional-p"));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2338
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2339 define_specifier_tag(Qinitial, Qnil,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2340 intern ("specifier-tag-initial-stage-p"));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2341
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2342 define_specifier_tag(Qfinal, Qnil,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2343 intern ("specifier-tag-final-stage-p"));
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2344
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2345 define_specifier_tag (Qencode_as_utf_8, Qnil,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2346 intern("specifier-tag-encode-as-utf-8-p"));
3918
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2347
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2348 /* This tag is used to group those instantiators made available in the
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2349 fallback for the sake of coverage of obscure characters, notably
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2350 Markus Kuhn's misc-fixed fonts. They will be copied from the fallback
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2351 when the default face is determined from X resources at startup. */
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2352 define_specifier_tag (Qx_coverage_instantiator, Qnil, Qnil);
049dc907c17a [xemacs-hg @ 2007-04-22 19:58:27 by aidan]
aidan
parents: 3802
diff changeset
2353
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2354 #endif /* MULE */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2355
4916
a6c778975d7d split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents: 4906
diff changeset
2356 #ifdef HAVE_XFT
3747
c13b89ba4796 [xemacs-hg @ 2006-12-17 11:25:58 by aidan]
aidan
parents: 3707
diff changeset
2357 for (fontptr = fonts + countof(fonts) - 1; fontptr >= fonts; fontptr--)
c13b89ba4796 [xemacs-hg @ 2006-12-17 11:25:58 by aidan]
aidan
parents: 3707
diff changeset
2358 inst_list = Fcons (Fcons (list1 (device_symbol),
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
2359 build_cistring (*fontptr)),
3747
c13b89ba4796 [xemacs-hg @ 2006-12-17 11:25:58 by aidan]
aidan
parents: 3707
diff changeset
2360 inst_list);
c13b89ba4796 [xemacs-hg @ 2006-12-17 11:25:58 by aidan]
aidan
parents: 3707
diff changeset
2361
4916
a6c778975d7d split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents: 4906
diff changeset
2362 #else /* !HAVE_XFT */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2363 inst_list =
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2364 Fcons
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2365 (Fcons
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2366 (list1 (device_symbol),
4766
32b358a240b0 Avoid calling Xft if not built in.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4759
diff changeset
2367 /* grrr. This really does need to be "*", not an XLFD.
32b358a240b0 Avoid calling Xft if not built in.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4759
diff changeset
2368 An unspecified XLFD won't pick up stuff like 10x20. */
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2369 build_ascstring ("*")),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2370 inst_list);
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2371 #ifdef MULE
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2372
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2373 /* For Han characters and Ethiopic, we want the misc-fixed font used to
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2374 be distinct from that for alphabetic scripts, because the font
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2375 specified below is distractingly ugly when used for Han characters
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2376 (this is slightly less so) and because its coverage isn't up to
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2377 handling them (well, chiefly, it's not up to handling Ethiopic--we do
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2378 have charset-specific fallbacks for the East Asian charsets.) */
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2379 inst_list =
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2380 Fcons
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2381 (Fcons
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2382 (list4(device_symbol, Qtwo_dimensional, Qfinal, Qx_coverage_instantiator),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2383 build_ascstring
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2384 ("-misc-fixed-medium-r-normal--15-140-75-75-c-90-iso10646-1")),
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2385 inst_list);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2386
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2387 /* Use Markus Kuhn's version of misc-fixed as the font for the font for
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2388 when a given charset's registries can't be found and redisplay for
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2389 that charset falls back to iso10646-1. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2391 inst_list =
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2392 Fcons
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2393 (Fcons
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2394 (list4(device_symbol, Qone_dimensional, Qfinal, Qx_coverage_instantiator),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2395 build_ascstring
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2396 ("-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1")),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2397 inst_list);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2398
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2399 for (fontptr = fonts + countof(fonts) - 1; fontptr >= fonts; fontptr--)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2400 inst_list = Fcons (Fcons (list3 (device_symbol,
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2401 Qtwo_dimensional, Qinitial),
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
2402 build_cistring (*fontptr)),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2403 inst_list);
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2404
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2405 /* We need to set the font for the JIT-ucs-charsets separately from the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2406 final stage, since otherwise it picks up the two-dimensional
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2407 specification (see specifier-tag-two-dimensional-initial-stage-p
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2408 above). They also use Markus Kuhn's ISO 10646-1 fixed fonts for
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2409 redisplay. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2410
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2411 inst_list =
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2412 Fcons
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2413 (Fcons
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2414 (list4(device_symbol, Qencode_as_utf_8, Qinitial, Qx_coverage_instantiator),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2415 build_ascstring
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2416 ("-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1")),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2417 inst_list);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2418
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2419 #endif /* MULE */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2420
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2421 /* Needed to make sure that charsets with non-specified fonts don't
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2422 use bold and oblique first if medium and regular are available. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2423 inst_list =
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2424 Fcons
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2425 (Fcons
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2426 (list1 (device_symbol),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2427 build_ascstring ("-*-*-medium-r-*-*-*-120-*-*-c-*-*-*")),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2428 inst_list);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2429
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2430 /* With a Cygwin XFree86 install, this returns the best (clearest,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2431 most readable) font I can find when scaling of bitmap fonts is
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2432 turned on, as it is by default. (WHO IN THE NAME OF CHRIST THOUGHT
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2433 THAT WAS A GOOD IDEA?!?!) The other fonts that used to be specified
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2434 here gave horrendous results. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2435
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2436 inst_list =
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2437 Fcons
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2438 (Fcons
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2439 (list1 (device_symbol),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2440 build_ascstring ("-*-lucidatypewriter-medium-r-*-*-*-120-*-*-*-*-*-*")),
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2441 inst_list);
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3094
diff changeset
2442
4916
a6c778975d7d split USE_XFT into HAVE_XFT/USE_XFT
Ben Wing <ben@xemacs.org>
parents: 4906
diff changeset
2443 #endif /* !HAVE_XFT */
3747
c13b89ba4796 [xemacs-hg @ 2006-12-17 11:25:58 by aidan]
aidan
parents: 3707
diff changeset
2444
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2445 #endif /* HAVE_X_WINDOWS || HAVE_GTK */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2446
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 #ifdef HAVE_TTY
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2448 inst_list = Fcons (Fcons (list1 (Qtty), build_ascstring ("normal")),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 #endif /* HAVE_TTY */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
2451
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2452 #ifdef HAVE_MS_WINDOWS
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2453 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
2454 const Ascbyte *mswfonts[] =
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2455 {
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2456 "Courier New:Regular:10::",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2457 "Courier:Regular:10::",
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2458 ":Regular:10::"
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2459 };
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
2460 const Ascbyte **mswfontptr;
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
2461
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2462 for (mswfontptr = mswfonts + countof (mswfonts) - 1;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2463 mswfontptr >= mswfonts; mswfontptr--)
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2464 {
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2465 /* display device */
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2466 inst_list = Fcons (Fcons (list1 (Qmswindows),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2467 build_ascstring (*mswfontptr)),
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2468 inst_list);
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2469 /* printer device */
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2470 inst_list = Fcons (Fcons (list1 (Qmsprinter),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2471 build_ascstring (*mswfontptr)),
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2472 inst_list);
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2473 }
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2474 /* Use Lucida Console rather than Courier New if it exists -- the
4187
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2475 line spacing is much less, so many more lines fit with the same
26dccfc8fa60 [xemacs-hg @ 2007-09-26 13:27:59 by didierv]
didierv
parents: 3918
diff changeset
2476 size font. (And it's specifically designed for screens.) */
2865
8baa2f03d853 [xemacs-hg @ 2005-07-19 09:45:00 by didierv]
didierv
parents: 2720
diff changeset
2477 inst_list = Fcons (Fcons (list1 (Qmswindows),
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2478 build_ascstring ("Lucida Console:Regular:10::")),
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2479 inst_list);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2480 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 #endif /* HAVE_MS_WINDOWS */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2482
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 set_specifier_fallback (Fget (Vdefault_face, Qfont, Qnil), inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 set_specifier_fallback (Fget (Vdefault_face, Qunderline, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 set_specifier_fallback (Fget (Vdefault_face, Qstrikethru, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 set_specifier_fallback (Fget (Vdefault_face, Qhighlight, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 set_specifier_fallback (Fget (Vdefault_face, Qdim, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 set_specifier_fallback (Fget (Vdefault_face, Qblinking, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 set_specifier_fallback (Fget (Vdefault_face, Qreverse, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 list1 (Fcons (Qnil, Qnil)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 /* gui-element is the parent face of all gui elements such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 modeline, vertical divider and toolbar. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 Vgui_element_face = Fmake_face (Qgui_element,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2502 build_defer_string ("gui element face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 /* Provide some last-resort fallbacks for gui-element face which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 mustn't default to default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 Lisp_Object fg_fb = Qnil, bg_fb = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2510 /* #### gui-element face doesn't have a font property?
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2511 But it gets referred to later! */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2512 #ifdef HAVE_GTK
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2513 /* We need to put something in there, or error checking gets
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2514 #%!@#ed up before the styles are set, which override the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2515 fallbacks. */
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2516 fg_fb = acons (list1 (Qgtk), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2517 bg_fb = acons (list1 (Qgtk), build_ascstring ("Gray80"), bg_fb);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents: 446
diff changeset
2518 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 #ifdef HAVE_X_WINDOWS
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2520 fg_fb = acons (list1 (Qx), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2521 bg_fb = acons (list1 (Qx), build_ascstring ("Gray80"), bg_fb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 #ifdef HAVE_TTY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 fg_fb = acons (list1 (Qtty), Fvector (0, 0), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 bg_fb = acons (list1 (Qtty), Fvector (0, 0), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 #ifdef HAVE_MS_WINDOWS
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2528 fg_fb = acons (list1 (Qmsprinter), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2529 bg_fb = acons (list1 (Qmsprinter), build_ascstring ("white"), bg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2530 fg_fb = acons (list1 (Qmswindows), build_ascstring ("black"), fg_fb);
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2531 bg_fb = acons (list1 (Qmswindows), build_ascstring ("Gray75"), bg_fb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 set_specifier_fallback (Fget (Vgui_element_face, Qforeground, Qnil), fg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 set_specifier_fallback (Fget (Vgui_element_face, Qbackground, Qnil), bg_fb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 /* Now create the other faces that redisplay needs to refer to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 directly. We could create them in Lisp but it's simpler this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 way since we need to get them anyway. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 /* modeline is gui element. */
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2542 Vmodeline_face = Fmake_face (Qmodeline, build_defer_string ("modeline face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 set_specifier_fallback (Fget (Vmodeline_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 set_specifier_fallback (Fget (Vmodeline_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 Fget (Vgui_element_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 set_specifier_fallback (Fget (Vmodeline_face, Qbackground_pixmap, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 Fget (Vgui_element_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 Qunbound));
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2552 set_specifier_fallback (Fget (Vmodeline_face, Qbackground_placement, Qnil),
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2553 Fget (Vgui_element_face, Qbackground_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2554 Qunbound));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556 /* toolbar is another gui element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557 Vtoolbar_face = Fmake_face (Qtoolbar,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2558 build_defer_string ("toolbar face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 set_specifier_fallback (Fget (Vtoolbar_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 set_specifier_fallback (Fget (Vtoolbar_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563 Fget (Vgui_element_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 set_specifier_fallback (Fget (Vtoolbar_face, Qbackground_pixmap, Qnil),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 Fget (Vgui_element_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 Qunbound));
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2567 set_specifier_fallback (Fget (Vtoolbar_face, Qbackground_placement, Qnil),
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2568 Fget (Vgui_element_face, Qbackground_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2569 Qunbound));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 /* vertical divider is another gui element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 Vvertical_divider_face = Fmake_face (Qvertical_divider,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2573 build_defer_string ("vertical divider face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 set_specifier_fallback (Fget (Vvertical_divider_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 set_specifier_fallback (Fget (Vvertical_divider_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 Fget (Vgui_element_face, Qbackground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 set_specifier_fallback (Fget (Vvertical_divider_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 Fget (Vgui_element_face, Qbackground_pixmap,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 Qunbound));
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2584 set_specifier_fallback (Fget (Vvertical_divider_face, Qbackground_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2585 Qnil),
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2586 Fget (Vgui_element_face, Qbackground_placement,
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
2587 Qunbound));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 /* widget is another gui element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 Vwidget_face = Fmake_face (Qwidget,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2591 build_defer_string ("widget face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 Qnil);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3017
diff changeset
2593 /* #### weird ... the gui-element face doesn't have its own font yet */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2594 set_specifier_fallback (Fget (Vwidget_face, Qfont, Qunbound),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2595 Fget (Vgui_element_face, Qfont, Qunbound));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 set_specifier_fallback (Fget (Vwidget_face, Qforeground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 Fget (Vgui_element_face, Qforeground, Qunbound));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 set_specifier_fallback (Fget (Vwidget_face, Qbackground, Qunbound),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 Fget (Vgui_element_face, Qbackground, Qunbound));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2600 /* We don't want widgets to have a default background pixmap. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 Vleft_margin_face = Fmake_face (Qleft_margin,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2603 build_defer_string ("left margin face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 Vright_margin_face = Fmake_face (Qright_margin,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2606 build_defer_string ("right margin face"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 Vtext_cursor_face = Fmake_face (Qtext_cursor,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2609 build_defer_string ("face for text cursor"),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 Vpointer_face =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 Fmake_face (Qpointer,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4862
diff changeset
2613 build_defer_string
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 ("face for foreground/background colors of mouse pointer"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 }