annotate src/faces.h @ 5080:5502045ec510

The background-placement face property. -------------------- ChangeLog entries follow: -------------------- lisp/ChangeLog addition: 2010-02-25 Didier Verna <didier@xemacs.org> The background-placement face property. * cl-macs.el (face-background-placement): New defsetf. * cus-face.el (custom-face-attributes): * faces.el (face-interactive): * faces.el (set-face-property): * faces.el (face-equal): * faces.el (init-other-random-faces): Update. * faces.el (face-background-placement): * faces.el (set-face-background-placement): * faces.el (face-background-placement-instance): * faces.el (face-background-placement-instance-p): * frame.el (set-frame-background-placement): * frame.el (frame-background-placement): * frame.el (frame-background-placement-instance): * objects.el (make-face-background-placement-specifier): New. man/ChangeLog addition: 2010-02-25 Didier Verna <didier@xemacs.org> The background-placement face property. * xemacs/custom.texi (Faces): Document it. src/ChangeLog addition: 2010-02-25 Didier Verna <didier@xemacs.org> The background-placement face property. * console-x-impl.h (struct x_frame): Add new slots x and y. * console-x-impl.h (FRAME_X_X, FRAME_X_Y): New slot accessors. * console-gtk-impl.h: Fake something similar for potential port. * frame-x.c (x_get_frame_text_position): New function. * frame-x.c (x_init_frame_3): Use it. * event-Xt.c (emacs_Xt_handle_magic_event): Eat spurious ConfigureNotify events, get the frame position and mark frame faces changed. * objects-impl.h: The face_background_placement_specifier structure and its accessors. * objects.c: New symbols Qabsolute and Qrelative. * objects.c (face_background_placement_create): * objects.c (face_background_placement_mark): * objects.c (face_background_placement_instantiate): * objects.c (face_background_placement_validate): * objects.c (face_background_placement_after_change): * objects.c (set_face_background_placement_attached_to): New. * objects.h (set_face_background_palcement_attached_to): Declare the one above. * objects.c (syms_of_objects): * objects.c (specifier_type_create_objects): * objects.c (reinit_specifier_type_create_objects): * objects.c (reinit_vars_of_objects): Update for the modifications above. * console-xlike-inc.h (XLIKE_GC_TS_X_ORIGIN, XLIKE_GC_TS_X_ORIGIN): New X11/Gtk compatibility macros. * redisplay-xlike-inc.c (XLIKE_get_gc): Add a background placement argument and handle it. * gtk-glue.c (face_to_gc): * redisplay-xlike-inc.c (XLIKE_output_string): * redisplay-xlike-inc.c (XLIKE_output_pixmap): * redisplay-xlike-inc.c (XLIKE_output_blank): * redisplay-xlike-inc.c (XLIKE_output_horizontal_line): * redisplay-xlike-inc.c (XLIKE_output_eol_cursor): Update accordingly. * console-impl.h (struct console_methods): Add a background placement (Lisp_Object) argument to the clear_region method. * console-stream.c (stream_clear_region): * redisplay-tty.c (tty_clear_region): * redisplay-msw.c (mswindows_clear_region): * redisplay-xlike-inc.c (XLIKE_clear_region): Update accordingly. * redisplay-output.c (redisplay_clear_region): Handle the background placement property and update the call to the clear_region method. * faces.h (struct Lisp_Face): * faces.h (struct face_cachel): Add a background placement slot. * faces.h (WINDOW_FACE_CACHEL_BACKGROUND_PLACEMENT): New accessor. * faces.c (mark_face): * faces.c (face_equal): * faces.c (face_getprop): * faces.c (face_putprop): * faces.c (face_remprop): * faces.c (face_plist): * faces.c (reset_face): * faces.c (mark_face_cachels): * faces.c (update_face_cachel_data): * faces.c (merge_face_cachel_data): * faces.c (reset_face_cachel): * faces.c (Fmake_face): * faces.c (Fcopy_face): Handle the background placement property. * faces.c (syms_of_faces): * faces.c (vars_of_faces): * faces.c (complex_vars_of_faces): Update accordingly.
author Didier Verna <didier@lrde.epita.fr>
date Thu, 25 Feb 2010 16:19:01 +0100
parents 07dcc7000bbf
children 7be849cb8828
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 data structures.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1995 Board of Trustees, University of Illinois.
5043
d0c14ea98592 various frame-geometry fixes
Ben Wing <ben@xemacs.org>
parents: 5015
diff changeset
3 Copyright (C) 1995, 2002, 2010 Ben Wing
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
4 Copyright (C) 2010 Didier Verna
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
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 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 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
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 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
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
25 #ifndef INCLUDED_faces_h_
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
26 #define INCLUDED_faces_h_
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 617
diff changeset
28 #include "charset.h" /* for NUM_LEADING_BYTES */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
29 #include "specifier.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
31 /* a Lisp_Face is the C object corresponding to a face. There is one
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
32 of these per face. It basically contains all of the specifiers for
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
33 the built-in face properties, plus the plist of user-specified
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 properties. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 struct Lisp_Face
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 {
3017
1e7cc382eb16 [xemacs-hg @ 2005-10-24 10:07:26 by ben]
ben
parents: 2720
diff changeset
38 struct LCRECORD_HEADER header;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 Lisp_Object name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 Lisp_Object doc_string;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 unsigned int dirty :1; /* Set whenever a face property is changed on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 a face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Lisp_Object foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 Lisp_Object background;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Lisp_Object font;
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 display_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 Lisp_Object background_pixmap;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
51 Lisp_Object background_placement;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 Lisp_Object underline;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Lisp_Object strikethru;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 Lisp_Object highlight;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Lisp_Object dim;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object blinking;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Lisp_Object reverse;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 Lisp_Object plist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 Lisp_Object charsets_warned_about;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 A face cache element caches the results of instantiating the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 properties of a face in a particular window. (Instantiation can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 take a long time so this is very important.) Each window contains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 an array of face cache elements (called the "face cache"), one for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 each face that has been seen in the window so far.
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 Some tricky stuff is done to make sure the face cache does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 become inconsistent:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 1) Switching buffers in a window clears the face cache for that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 window, because this can change the way any property is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 instantiated in the window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 2) Setting a face property causes that face to be marked as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 dirty. This causes various stuff to happen to make sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 the appropriate face cache elements are invalidated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (#### Actually this doesn't work quite right, and errs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 too much on the side of invalidating unnecessary stuff.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 There are also face cache elements for "merged faces", which are the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 result of merging all the faces that overlap a particular buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 position. The merging is always done in the context of a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 domain (specifically, a window), and the face cache element is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 specific to a particular window. (Face cache elements are contained
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 in an array that is attached to each struct_window.) The reason that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 the merging takes place in the context of a particular window has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 to do with the way the merging works:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 1) All extents overlying the buffer position are sorted by descending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 priority.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 2) The property of a particular merged face comes from the highest-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 priority face that specifies a value for that particular property.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 3) The way to determine whether a face specifies a value for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 particular property is to instantiate that face's property in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 the window in question with the no-fallback option set, to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 see if we got anything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 For Mule, things get a bit trickier because there can be multiple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 fonts per face/window combination -- the charset is an argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 to specifier-instance.
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 We have two possible data structure representations:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 1) Keep the original "one font per face cache element" representation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 and use a different face cache element for each charset.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 2) Allow multiple fonts to be in a single face cache element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 I've chosen to use (2) -- the data structure gets more complicated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 but the algorithms for maintaining face cache elements end up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 simpler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 #define NUM_STATIC_CACHEL_FACES 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 typedef struct face_cachel face_cachel;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 struct face_cachel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 {
3092
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
123 #ifdef NEW_GC
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
124 struct lrecord_header header;
3263
d674024a8674 [xemacs-hg @ 2006-02-27 16:29:00 by crestani]
crestani
parents: 3094
diff changeset
125 #endif /* NEW_GC */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 /* There are two kinds of cachels; those created from a single face
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 and those created by merging more than one face. In the former
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 case, the FACE element specifies the face used. In the latter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 case, the MERGED_FACES_STATIC and MERGED_FACES elements specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 the faces used for merging by giving the indices of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 corresponding single-face cachels.
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 Formerly we didn't bother to keep track of the faces used for
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
134 merging. We do now because we need to do so because there is no
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 other way to properly handle multiple charsets for Mule in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 presence of display tables short of always computing the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 for all charsets, which is very expensive. Instead, we use a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 lazy scheme where we only compute the font for a particular charset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 when it is needed. (The exception is the font for the ASCII charset.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 We always compute it, just like the other attributes, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 many places in the C code refer to the font of the ASCII charset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 and expect it to always be there.)
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 We store the first four faces in a static array, and use a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 Dynarr for the rest. This has the advantage that the space used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 is small but the Dynarr will almost never be created, so we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 won't spend much time in malloc()/free().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 The order of the faces here is decreasing extent priority. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 Lisp_Object face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 int merged_faces_static[NUM_STATIC_CACHEL_FACES];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 int_dynarr *merged_faces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 int nfaces;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 /* The values stored here are computed by calling specifier_instance()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 on the appropriate specifiers. This means that we will have either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 a value computed from the face itself or a value computed from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 default face. We need to distinguish the two so that merging works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 properly -- a value that comes from the default face is treated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 as "unspecified" during merging and is overridden by lower-priority
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 faces. This is what the _specified flags below are for. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 Lisp_Object foreground;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 Lisp_Object background;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 617
diff changeset
165 /* There are currently 128 or 129 possible charsets under Mule. For the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 moment we just take the easy way out and allocate space for each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 of them. This avoids messing with Dynarrs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 #### We should look into this and probably clean it up
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
170 to use Dynarrs. This may be a big space hog as is.
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
171 sjt sez: doesn't look like it, my total face cache is 170KB.
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
172 Could be reduced to maybe 50KB. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 Lisp_Object font[NUM_LEADING_BYTES];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 Lisp_Object display_table;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 Lisp_Object background_pixmap;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
177 Lisp_Object background_placement;
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 unsigned int underline :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 unsigned int strikethru :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 unsigned int highlight :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 unsigned int dim :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 unsigned int blinking :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 unsigned int reverse :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 /* Used when merging to tell if the above field represents an actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 value of this face or a fallback value. */
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
188 DECLARE_INLINE_LISP_BIT_VECTOR(NUM_LEADING_BYTES) font_specified;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
189
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 unsigned int foreground_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 unsigned int background_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 unsigned int display_table_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 unsigned int background_pixmap_specified :1;
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
194 unsigned int background_placement_specified :1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 unsigned int strikethru_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 unsigned int underline_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 unsigned int highlight_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 unsigned int dim_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 unsigned int blinking_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 unsigned int reverse_specified :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 /* The updated flag is set after we calculate the values for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 face cachel and cleared whenever a face changes, to indicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 that the values stored here might be wrong. The next time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 we go to access the values, we recompute them; if any values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 change, we set the DIRTY flag, which tells the output routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 that a face value has in fact changed and the sections of text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 using this face need to be redrawn.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 It is trickier with fonts because we don't automatically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 recompute the fonts but do it only when it is necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (The ASCII font is an exception, of course; see above).
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 In the case of fonts, we maintain a separate updated flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 for each font. Whenever we need to access the font for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 a particular charset, we recalculate it if either its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 value is Qunbound (meaning it's never been computed at all)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 or the updated flag is not set. We set the dirty flag if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 the value is not the same as before and the previous value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 was not Qunbound.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 #### Note that we don't yet deal with the case of the new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 value being Qunbound, as could happen if no fonts of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 right sort are available on the system. In this case, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 whole program will just crash. For the moment, this is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 OK (for debugging purposes) but we should fix this by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 storing a "blank font" if the instantiation fails. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 unsigned int dirty :1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 unsigned int updated :1;
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
231
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
232 DECLARE_INLINE_LISP_BIT_VECTOR(NUM_LEADING_BYTES) font_updated;
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
233
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
234 /* Whether the font for the charset in question was determined in the
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
235 "final stage"; that is, the last stage Lisp code could specify it,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
236 after the initial stage and before the fallback. */
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
237 DECLARE_INLINE_LISP_BIT_VECTOR(NUM_LEADING_BYTES) font_final_stage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3092
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
240 #ifdef NEW_GC
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
241 typedef struct face_cachel Lisp_Face_Cachel;
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
242
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
243 DECLARE_LRECORD (face_cachel, Lisp_Face_Cachel);
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
244
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
245 #define XFACE_CACHEL(x) \
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
246 XRECORD (x, face_cachel, Lisp_Face_Cachel)
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
247 #define wrap_face_cachel(p) wrap_record (p, face_cachel)
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
248 #define FACE_CACHEL_P(x) RECORDP (x, face_cachel)
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
249 #define CHECK_FACE_CACHEL(x) CHECK_RECORD (x, face_cachel)
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
250 #define CONCHECK_FACE_CACHEL(x) CONCHECK_RECORD (x, face_cachel)
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
251 #endif /* NEW_GC */
141c2920ea48 [xemacs-hg @ 2005-11-25 01:41:31 by crestani]
crestani
parents: 3017
diff changeset
252
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
253 DECLARE_LRECORD (face, Lisp_Face);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
254 #define XFACE(x) XRECORD (x, face, Lisp_Face)
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 578
diff changeset
255 #define wrap_face(p) wrap_record (p, face)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 #define FACEP(x) RECORDP (x, face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 #define CHECK_FACE(x) CHECK_RECORD (x, face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 Lisp_Object ensure_face_cachel_contains_charset (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 Lisp_Object domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 Lisp_Object charset);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 void ensure_face_cachel_complete (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 Lisp_Object domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 unsigned char *charsets);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 void update_face_cachel_data (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 Lisp_Object domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 Lisp_Object face);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 void face_cachel_charset_font_metric_info (struct face_cachel *cachel,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 unsigned char *charsets,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 struct font_metric_info *fm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 void mark_face_cachels (face_cachel_dynarr *elements);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 void mark_face_cachels_as_clean (struct window *w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 void mark_face_cachels_as_not_updated (struct window *w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 void reset_face_cachel (struct face_cachel *inst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 void reset_face_cachels (struct window *w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 face_index get_builtin_face_cache_index (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 Lisp_Object face);
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
278 /* WARNING: this interface may change. */
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
279 face_index merge_face_list_to_cache_index (struct window *w,
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
280 Lisp_Object *face_list, int count);
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 3092
diff changeset
281
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 #ifdef MEMORY_USAGE_STATS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 int compute_face_cachel_usage (face_cachel_dynarr *face_cachels,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 struct overhead_stats *ovstats);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 #endif /* MEMORY_USAGE_STATS */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 EXFUN (Fface_name, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 EXFUN (Ffind_face, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 EXFUN (Fget_face, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 extern Lisp_Object Qstrikethru, Vbuilt_in_face_specifiers, Vdefault_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 extern Lisp_Object Vleft_margin_face, Vpointer_face, Vright_margin_face;
432
3a7e78e1142d Import from CVS: tag r21-2-24
cvs
parents: 428
diff changeset
293 extern Lisp_Object Vtext_cursor_face, Vvertical_divider_face;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 extern Lisp_Object Vtoolbar_face, Vgui_element_face, Vwidget_face;
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 void mark_all_faces_as_clean (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 void init_frame_faces (struct frame *f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 void init_device_faces (struct device *d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 void init_global_faces (struct device *d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 face_index get_extent_fragment_face_cache_index (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 struct extent_fragment *ef);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 void update_frame_face_values (struct frame *f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 void face_property_was_changed (Lisp_Object face, Lisp_Object property,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 Lisp_Object locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 void default_face_font_info (Lisp_Object domain, int *ascent,
5047
07dcc7000bbf put width before height consistently, fix a real bug found in the process
Ben Wing <ben@xemacs.org>
parents: 5043
diff changeset
306 int *descent, int *width, int *height,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 int *proportional_p);
5047
07dcc7000bbf put width before height consistently, fix a real bug found in the process
Ben Wing <ben@xemacs.org>
parents: 5043
diff changeset
308 void default_face_width_and_height (Lisp_Object domain, int *width,
07dcc7000bbf put width before height consistently, fix a real bug found in the process
Ben Wing <ben@xemacs.org>
parents: 5043
diff changeset
309 int *height);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 #define FACE_CACHEL_FONT(cachel, charset) \
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 617
diff changeset
312 (cachel->font[XCHARSET_LEADING_BYTE (charset) - MIN_LEADING_BYTE])
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
314 #define FACE_CACHEL_FONT_UPDATED(x) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
315 ((struct Lisp_Bit_Vector *)(&((x)->font_updated)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
316 #define FACE_CACHEL_FONT_SPECIFIED(x) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
317 ((struct Lisp_Bit_Vector *)(&((x)->font_specified)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
318 #define FACE_CACHEL_FONT_FINAL_STAGE(x) \
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
319 ((struct Lisp_Bit_Vector *)(&((x)->font_final_stage)))
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
320
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 #define WINDOW_FACE_CACHEL(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 Dynarr_atp ((window)->face_cachels, index)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 #define FACE_CACHEL_FINDEX_UNSAFE(cachel, offset) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 ((offset) < NUM_STATIC_CACHEL_FACES \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 ? (cachel)->merged_faces_static[offset] \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 : Dynarr_at ((cachel)->merged_faces, (offset) - NUM_STATIC_CACHEL_FACES))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 #define WINDOW_FACE_CACHEL_FACE(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 (WINDOW_FACE_CACHEL (window, index)->face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 #define WINDOW_FACE_CACHEL_FOREGROUND(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (WINDOW_FACE_CACHEL (window, index)->foreground)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 #define WINDOW_FACE_CACHEL_BACKGROUND(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (WINDOW_FACE_CACHEL (window, index)->background)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 /* #### This can be referenced by various functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 but face_cachels isn't initialized for the stream device.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 Since it doesn't need the value we just return nil here to avoid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 blowing up in multiple places. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 #define WINDOW_FACE_CACHEL_FONT(window, index, charset) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 ((window)->face_cachels \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 ? FACE_CACHEL_FONT (WINDOW_FACE_CACHEL (window, index), charset) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 : Qnil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 #define WINDOW_FACE_CACHEL_DISPLAY_TABLE(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 (WINDOW_FACE_CACHEL (window, index)->display_table)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 #define WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 (WINDOW_FACE_CACHEL (window, index)->background_pixmap)
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
347 #define WINDOW_FACE_CACHEL_BACKGROUND_PLACEMENT(window, index) \
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
348 (WINDOW_FACE_CACHEL (window, index)->background_placement)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 #define WINDOW_FACE_CACHEL_DIRTY(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (WINDOW_FACE_CACHEL (window, index)->dirty)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 #define WINDOW_FACE_CACHEL_UNDERLINE_P(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (WINDOW_FACE_CACHEL (window, index)->underline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 #define WINDOW_FACE_CACHEL_HIGHLIGHT_P(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (WINDOW_FACE_CACHEL (window, index)->highlight)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 #define WINDOW_FACE_CACHEL_DIM_P(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (WINDOW_FACE_CACHEL (window, index)->dim)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 #define WINDOW_FACE_CACHEL_BLINKING_P(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (WINDOW_FACE_CACHEL (window, index)->blinking)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 #define WINDOW_FACE_CACHEL_REVERSE_P(window, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (WINDOW_FACE_CACHEL (window, index)->reverse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 #define FACE_PROPERTY_SPECIFIER(face, property) Fget (face, property, Qnil)
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 #define FACE_PROPERTY_INSTANCE_1(face, property, domain, errb, no_fallback, depth) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 specifier_instance (FACE_PROPERTY_SPECIFIER (face, property), Qunbound, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 domain, errb, 1, no_fallback, depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 #define FACE_PROPERTY_INSTANCE(face, property, domain, no_fallback, depth) \
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
369 FACE_PROPERTY_INSTANCE_1 (face, property, domain, ERROR_ME_DEBUG_WARN, \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 no_fallback, depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
372 Lisp_Object face_property_matching_instance
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
373 (Lisp_Object face,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
374 Lisp_Object property,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
375 Lisp_Object charset,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
376 Lisp_Object domain,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
377 Error_Behavior errb,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
378 int no_fallback,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
379 Lisp_Object depth,
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
380 enum font_specifier_matchspec_stages stages);
428
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 #define FACE_PROPERTY_SPEC_LIST(face, property, locale) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 Fspecifier_spec_list (FACE_PROPERTY_SPECIFIER (face, property), \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 locale, Qnil, Qnil)
498
88e7e9bafe19 [xemacs-hg @ 2001-05-02 16:08:10 by james]
james
parents: 442
diff changeset
385 #define SET_FACE_PROPERTY(face, property, value, locale, tag, how_to_add) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 Fadd_spec_to_specifier (FACE_PROPERTY_SPECIFIER (face, property), \
498
88e7e9bafe19 [xemacs-hg @ 2001-05-02 16:08:10 by james]
james
parents: 442
diff changeset
387 value, locale, tag, how_to_add)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 #define FACE_FOREGROUND(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 FACE_PROPERTY_INSTANCE (face, Qforeground, domain, 0, Qzero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 #define FACE_BACKGROUND(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 FACE_PROPERTY_INSTANCE (face, Qbackground, domain, 0, Qzero)
3676
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
393
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
394 /* Calling this function on the default face with the ASCII character set
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
395 may delete any X11 frames; see the code at the end of
3ef0aaf3dc34 [xemacs-hg @ 2006-11-12 13:40:04 by aidan]
aidan
parents: 3659
diff changeset
396 x_find_charset_font. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 #define FACE_FONT(face, domain, charset) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 face_property_matching_instance (face, Qfont, charset, domain, \
3659
98af8a976fc3 [xemacs-hg @ 2006-11-05 22:31:31 by aidan]
aidan
parents: 3263
diff changeset
399 ERROR_ME_DEBUG_WARN, 0, Qzero, \
5015
d95c102a96d3 cleanups for specifier font stages, from ben-unicode-internal (preparation for eliminating shadowed warnings)
Ben Wing <ben@xemacs.org>
parents: 3676
diff changeset
400 STAGE_INITIAL)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 #define FACE_DISPLAY_TABLE(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 FACE_PROPERTY_INSTANCE (face, Qdisplay_table, domain, 0, Qzero)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 #define FACE_BACKGROUND_PIXMAP(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 FACE_PROPERTY_INSTANCE (face, Qbackground_pixmap, domain, 0, Qzero)
5080
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
405
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
406 extern Lisp_Object Qbackground_placement;
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
407 #define FACE_BACKGROUND_PLACEMENT(face, domain) \
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
408 FACE_PROPERTY_INSTANCE (face, Qbackground_placement, domain, 0, Qzero)
5502045ec510 The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents: 5047
diff changeset
409
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 #define FACE_UNDERLINE_P(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (!NILP (FACE_PROPERTY_INSTANCE (face, Qunderline, domain, 0, Qzero)))
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
412 #define FACE_STRIKETHRU_P(face, domain) \
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
413 (!NILP (FACE_PROPERTY_INSTANCE (face, Qstrikethru, domain, 0, Qzero)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 #define FACE_HIGHLIGHT_P(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (!NILP (FACE_PROPERTY_INSTANCE (face, Qhighlight, domain, 0, Qzero)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 #define FACE_DIM_P(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (!NILP (FACE_PROPERTY_INSTANCE (face, Qdim, domain, 0, Qzero)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 #define FACE_BLINKING_P(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (!NILP (FACE_PROPERTY_INSTANCE (face, Qblinking, domain, 0, Qzero)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 #define FACE_REVERSE_P(face, domain) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 (!NILP (FACE_PROPERTY_INSTANCE (face, Qreverse, domain, 0, Qzero)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 432
diff changeset
423 #endif /* INCLUDED_faces_h_ */