Mercurial > hg > xemacs-beta
annotate src/faces.h @ 5857:6ec4964c1687
Be more careful about echo_buf arithmetic, event-stream.c.
src/ChangeLog addition:
2015-03-12 Aidan Kehoe <kehoea@parhasard.net>
* event-stream.c (lookup_command_event):
Check whether echo_buf_fill_pointer is negative before using it in
arithmetic, avoiding a crash in GC.
Oddly the old code didn't do this check and didn't crash, but its
echo_buf was from malloced memory, not from our string data, so
there may have been more room to manoeuvre.
| author | Aidan Kehoe <kehoea@parhasard.net> |
|---|---|
| date | Thu, 12 Mar 2015 23:31:42 +0000 |
| parents | c39052c921b5 |
| children |
| rev | line source |
|---|---|
| 428 | 1 /* Face data structures. |
| 2 Copyright (C) 1995 Board of Trustees, University of Illinois. | |
| 5043 | 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 | 5 |
| 6 This file is part of XEmacs. | |
| 7 | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5157
diff
changeset
|
8 XEmacs is free software: you can redistribute it and/or modify it |
| 428 | 9 under the terms of the GNU General Public License as published by the |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5157
diff
changeset
|
10 Free Software Foundation, either version 3 of the License, or (at your |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5157
diff
changeset
|
11 option) any later version. |
| 428 | 12 |
| 13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 16 for more details. | |
| 17 | |
| 18 You should have received a copy of the GNU General Public License | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5157
diff
changeset
|
19 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 428 | 20 |
| 21 /* Synched up with: Not in FSF. */ | |
| 22 | |
| 440 | 23 #ifndef INCLUDED_faces_h_ |
| 24 #define INCLUDED_faces_h_ | |
| 428 | 25 |
| 771 | 26 #include "charset.h" /* for NUM_LEADING_BYTES */ |
| 3659 | 27 #include "specifier.h" |
| 428 | 28 |
| 440 | 29 /* a Lisp_Face is the C object corresponding to a face. There is one |
| 30 of these per face. It basically contains all of the specifiers for | |
| 31 the built-in face properties, plus the plist of user-specified | |
| 428 | 32 properties. */ |
| 33 | |
| 34 struct Lisp_Face | |
| 35 { | |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
36 NORMAL_LISP_OBJECT_HEADER header; |
| 428 | 37 |
| 38 Lisp_Object name; | |
| 39 Lisp_Object doc_string; | |
| 40 unsigned int dirty :1; /* Set whenever a face property is changed on | |
| 41 a face. */ | |
| 42 | |
| 43 Lisp_Object foreground; | |
|
5624
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
44 Lisp_Object foreback; |
| 428 | 45 Lisp_Object background; |
| 46 Lisp_Object font; | |
| 47 | |
| 48 Lisp_Object display_table; | |
| 49 Lisp_Object background_pixmap; | |
|
5080
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
50 Lisp_Object background_placement; |
| 428 | 51 |
| 52 Lisp_Object underline; | |
| 53 Lisp_Object strikethru; | |
| 54 Lisp_Object highlight; | |
| 55 Lisp_Object dim; | |
| 56 Lisp_Object blinking; | |
| 57 Lisp_Object reverse; | |
|
5619
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
58 Lisp_Object shrink; |
| 428 | 59 |
| 60 Lisp_Object plist; | |
| 61 | |
| 62 Lisp_Object charsets_warned_about; | |
| 63 }; | |
| 64 | |
| 65 /* | |
| 66 | |
| 67 A face cache element caches the results of instantiating the | |
| 68 properties of a face in a particular window. (Instantiation can | |
| 69 take a long time so this is very important.) Each window contains | |
| 70 an array of face cache elements (called the "face cache"), one for | |
| 71 each face that has been seen in the window so far. | |
| 72 | |
| 73 Some tricky stuff is done to make sure the face cache does not | |
| 74 become inconsistent: | |
| 75 | |
| 76 1) Switching buffers in a window clears the face cache for that | |
| 77 window, because this can change the way any property is | |
| 78 instantiated in the window. | |
| 79 2) Setting a face property causes that face to be marked as | |
| 80 dirty. This causes various stuff to happen to make sure | |
| 81 the appropriate face cache elements are invalidated. | |
| 82 (#### Actually this doesn't work quite right, and errs | |
| 83 too much on the side of invalidating unnecessary stuff.) | |
| 84 | |
| 85 There are also face cache elements for "merged faces", which are the | |
| 86 result of merging all the faces that overlap a particular buffer | |
| 87 position. The merging is always done in the context of a particular | |
| 88 domain (specifically, a window), and the face cache element is | |
| 89 specific to a particular window. (Face cache elements are contained | |
| 90 in an array that is attached to each struct_window.) The reason that | |
| 91 the merging takes place in the context of a particular window has | |
| 92 to do with the way the merging works: | |
| 93 | |
| 94 1) All extents overlying the buffer position are sorted by descending | |
| 95 priority. | |
| 96 2) The property of a particular merged face comes from the highest- | |
| 97 priority face that specifies a value for that particular property. | |
| 98 3) The way to determine whether a face specifies a value for a | |
| 99 particular property is to instantiate that face's property in | |
| 100 the window in question with the no-fallback option set, to | |
| 101 see if we got anything. | |
| 102 | |
| 103 For Mule, things get a bit trickier because there can be multiple | |
| 104 fonts per face/window combination -- the charset is an argument | |
| 105 to specifier-instance. | |
| 106 | |
| 107 We have two possible data structure representations: | |
| 108 | |
| 109 1) Keep the original "one font per face cache element" representation | |
| 110 and use a different face cache element for each charset. | |
| 111 2) Allow multiple fonts to be in a single face cache element. | |
| 112 | |
| 113 I've chosen to use (2) -- the data structure gets more complicated | |
| 114 but the algorithms for maintaining face cache elements end up | |
| 115 simpler. | |
| 116 */ | |
| 117 | |
| 118 #define NUM_STATIC_CACHEL_FACES 4 | |
| 119 | |
| 120 typedef struct face_cachel face_cachel; | |
| 121 struct face_cachel | |
| 122 { | |
| 3092 | 123 #ifdef NEW_GC |
|
5127
a9c41067dd88
more cleanups, terminology clarification, lots of doc work
Ben Wing <ben@xemacs.org>
parents:
5126
diff
changeset
|
124 NORMAL_LISP_OBJECT_HEADER header; |
| 3263 | 125 #endif /* NEW_GC */ |
| 428 | 126 /* There are two kinds of cachels; those created from a single face |
| 127 and those created by merging more than one face. In the former | |
| 128 case, the FACE element specifies the face used. In the latter | |
| 129 case, the MERGED_FACES_STATIC and MERGED_FACES elements specify | |
| 130 the faces used for merging by giving the indices of the | |
| 131 corresponding single-face cachels. | |
| 132 | |
| 133 Formerly we didn't bother to keep track of the faces used for | |
| 442 | 134 merging. We do now because we need to do so because there is no |
| 428 | 135 other way to properly handle multiple charsets for Mule in the |
| 136 presence of display tables short of always computing the values | |
| 137 for all charsets, which is very expensive. Instead, we use a | |
| 138 lazy scheme where we only compute the font for a particular charset | |
| 139 when it is needed. (The exception is the font for the ASCII charset. | |
| 140 We always compute it, just like the other attributes, because | |
| 141 many places in the C code refer to the font of the ASCII charset | |
| 142 and expect it to always be there.) | |
| 143 | |
| 144 We store the first four faces in a static array, and use a | |
| 145 Dynarr for the rest. This has the advantage that the space used | |
| 146 is small but the Dynarr will almost never be created, so we | |
| 147 won't spend much time in malloc()/free(). | |
| 148 | |
| 149 The order of the faces here is decreasing extent priority. */ | |
| 150 Lisp_Object face; | |
| 151 int merged_faces_static[NUM_STATIC_CACHEL_FACES]; | |
| 152 int_dynarr *merged_faces; | |
| 153 int nfaces; | |
| 154 | |
| 155 /* The values stored here are computed by calling specifier_instance() | |
| 156 on the appropriate specifiers. This means that we will have either | |
| 157 a value computed from the face itself or a value computed from the | |
| 158 default face. We need to distinguish the two so that merging works | |
| 159 properly -- a value that comes from the default face is treated | |
| 160 as "unspecified" during merging and is overridden by lower-priority | |
| 161 faces. This is what the _specified flags below are for. */ | |
| 162 | |
| 163 Lisp_Object foreground; | |
|
5624
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
164 Lisp_Object foreback; |
| 428 | 165 Lisp_Object background; |
| 771 | 166 /* There are currently 128 or 129 possible charsets under Mule. For the |
| 428 | 167 moment we just take the easy way out and allocate space for each |
| 168 of them. This avoids messing with Dynarrs. | |
| 169 | |
| 170 #### We should look into this and probably clean it up | |
| 3094 | 171 to use Dynarrs. This may be a big space hog as is. |
| 172 sjt sez: doesn't look like it, my total face cache is 170KB. | |
| 173 Could be reduced to maybe 50KB. */ | |
| 428 | 174 Lisp_Object font[NUM_LEADING_BYTES]; |
| 175 | |
| 176 Lisp_Object display_table; | |
| 177 Lisp_Object background_pixmap; | |
|
5080
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
178 Lisp_Object background_placement; |
| 428 | 179 |
| 180 unsigned int underline :1; | |
| 181 unsigned int strikethru :1; | |
| 182 unsigned int highlight :1; | |
| 183 unsigned int dim :1; | |
| 184 unsigned int blinking :1; | |
| 185 unsigned int reverse :1; | |
|
5619
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
186 unsigned int shrink :1; |
| 428 | 187 |
| 188 /* Used when merging to tell if the above field represents an actual | |
| 189 value of this face or a fallback value. */ | |
| 3659 | 190 DECLARE_INLINE_LISP_BIT_VECTOR(NUM_LEADING_BYTES) font_specified; |
| 191 | |
| 428 | 192 unsigned int foreground_specified :1; |
|
5624
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
193 unsigned int foreback_specified :1; |
| 428 | 194 unsigned int background_specified :1; |
| 195 unsigned int display_table_specified :1; | |
| 196 unsigned int background_pixmap_specified :1; | |
|
5080
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
197 unsigned int background_placement_specified :1; |
| 428 | 198 |
| 199 unsigned int strikethru_specified :1; | |
| 200 unsigned int underline_specified :1; | |
| 201 unsigned int highlight_specified :1; | |
| 202 unsigned int dim_specified :1; | |
| 203 unsigned int blinking_specified :1; | |
| 204 unsigned int reverse_specified :1; | |
|
5619
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
205 unsigned int shrink_specified :1; |
| 428 | 206 |
| 207 /* The updated flag is set after we calculate the values for the | |
| 208 face cachel and cleared whenever a face changes, to indicate | |
| 209 that the values stored here might be wrong. The next time | |
| 210 we go to access the values, we recompute them; if any values | |
| 211 change, we set the DIRTY flag, which tells the output routines | |
| 212 that a face value has in fact changed and the sections of text | |
| 213 using this face need to be redrawn. | |
| 214 | |
| 215 It is trickier with fonts because we don't automatically | |
| 216 recompute the fonts but do it only when it is necessary. | |
| 217 (The ASCII font is an exception, of course; see above). | |
| 218 | |
| 219 In the case of fonts, we maintain a separate updated flag | |
| 220 for each font. Whenever we need to access the font for | |
| 221 a particular charset, we recalculate it if either its | |
| 222 value is Qunbound (meaning it's never been computed at all) | |
| 223 or the updated flag is not set. We set the dirty flag if | |
| 224 the value is not the same as before and the previous value | |
| 225 was not Qunbound. | |
| 226 | |
| 227 #### Note that we don't yet deal with the case of the new | |
| 228 value being Qunbound, as could happen if no fonts of the | |
| 229 right sort are available on the system. In this case, the | |
| 230 whole program will just crash. For the moment, this is | |
| 231 OK (for debugging purposes) but we should fix this by | |
| 232 storing a "blank font" if the instantiation fails. */ | |
| 233 unsigned int dirty :1; | |
| 234 unsigned int updated :1; | |
| 3659 | 235 |
| 236 DECLARE_INLINE_LISP_BIT_VECTOR(NUM_LEADING_BYTES) font_updated; | |
| 237 | |
| 238 /* Whether the font for the charset in question was determined in the | |
| 239 "final stage"; that is, the last stage Lisp code could specify it, | |
| 240 after the initial stage and before the fallback. */ | |
| 241 DECLARE_INLINE_LISP_BIT_VECTOR(NUM_LEADING_BYTES) font_final_stage; | |
| 428 | 242 }; |
| 243 | |
| 3092 | 244 #ifdef NEW_GC |
| 245 typedef struct face_cachel Lisp_Face_Cachel; | |
| 246 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
3676
diff
changeset
|
247 DECLARE_LISP_OBJECT (face_cachel, Lisp_Face_Cachel); |
| 3092 | 248 |
| 249 #define XFACE_CACHEL(x) \ | |
| 250 XRECORD (x, face_cachel, Lisp_Face_Cachel) | |
| 251 #define wrap_face_cachel(p) wrap_record (p, face_cachel) | |
| 252 #define FACE_CACHEL_P(x) RECORDP (x, face_cachel) | |
| 253 #define CHECK_FACE_CACHEL(x) CHECK_RECORD (x, face_cachel) | |
| 254 #define CONCHECK_FACE_CACHEL(x) CONCHECK_RECORD (x, face_cachel) | |
| 255 #endif /* NEW_GC */ | |
| 256 | |
|
5118
e0db3c197671
merge up to latest default branch, doesn't compile yet
Ben Wing <ben@xemacs.org>
parents:
3676
diff
changeset
|
257 DECLARE_LISP_OBJECT (face, Lisp_Face); |
| 440 | 258 #define XFACE(x) XRECORD (x, face, Lisp_Face) |
| 617 | 259 #define wrap_face(p) wrap_record (p, face) |
| 428 | 260 #define FACEP(x) RECORDP (x, face) |
| 261 #define CHECK_FACE(x) CHECK_RECORD (x, face) | |
| 262 | |
| 263 Lisp_Object ensure_face_cachel_contains_charset (struct face_cachel *cachel, | |
| 264 Lisp_Object domain, | |
| 265 Lisp_Object charset); | |
| 266 void ensure_face_cachel_complete (struct face_cachel *cachel, | |
| 267 Lisp_Object domain, | |
| 268 unsigned char *charsets); | |
| 269 void update_face_cachel_data (struct face_cachel *cachel, | |
| 270 Lisp_Object domain, | |
| 271 Lisp_Object face); | |
| 272 void face_cachel_charset_font_metric_info (struct face_cachel *cachel, | |
| 273 unsigned char *charsets, | |
| 274 struct font_metric_info *fm); | |
| 275 void mark_face_cachels (face_cachel_dynarr *elements); | |
| 276 void mark_face_cachels_as_clean (struct window *w); | |
| 277 void mark_face_cachels_as_not_updated (struct window *w); | |
| 278 void reset_face_cachel (struct face_cachel *inst); | |
| 279 void reset_face_cachels (struct window *w); | |
| 280 face_index get_builtin_face_cache_index (struct window *w, | |
| 281 Lisp_Object face); | |
| 3094 | 282 /* WARNING: this interface may change. */ |
| 283 face_index merge_face_list_to_cache_index (struct window *w, | |
| 284 Lisp_Object *face_list, int count); | |
| 285 | |
| 428 | 286 #ifdef MEMORY_USAGE_STATS |
| 287 int 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
|
288 struct usage_stats *ustats); |
| 428 | 289 #endif /* MEMORY_USAGE_STATS */ |
| 290 | |
| 291 EXFUN (Fface_name, 1); | |
| 292 EXFUN (Ffind_face, 1); | |
| 293 EXFUN (Fget_face, 1); | |
| 294 | |
| 295 extern Lisp_Object Qstrikethru, Vbuilt_in_face_specifiers, Vdefault_face; | |
| 296 extern Lisp_Object Vleft_margin_face, Vpointer_face, Vright_margin_face; | |
| 432 | 297 extern Lisp_Object Vtext_cursor_face, Vvertical_divider_face; |
| 428 | 298 extern Lisp_Object Vtoolbar_face, Vgui_element_face, Vwidget_face; |
| 299 | |
| 300 void mark_all_faces_as_clean (void); | |
| 301 void init_frame_faces (struct frame *f); | |
| 302 void init_device_faces (struct device *d); | |
| 303 void init_global_faces (struct device *d); | |
| 304 face_index get_extent_fragment_face_cache_index (struct window *w, | |
| 305 struct extent_fragment *ef); | |
| 306 void update_frame_face_values (struct frame *f); | |
| 307 void face_property_was_changed (Lisp_Object face, Lisp_Object property, | |
| 308 Lisp_Object locale); | |
| 309 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
|
310 int *descent, int *width, int *height, |
| 428 | 311 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
|
312 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
|
313 int *height); |
| 428 | 314 |
| 315 #define FACE_CACHEL_FONT(cachel, charset) \ | |
| 771 | 316 (cachel->font[XCHARSET_LEADING_BYTE (charset) - MIN_LEADING_BYTE]) |
| 428 | 317 |
| 3659 | 318 #define FACE_CACHEL_FONT_UPDATED(x) \ |
| 319 ((struct Lisp_Bit_Vector *)(&((x)->font_updated))) | |
| 320 #define FACE_CACHEL_FONT_SPECIFIED(x) \ | |
| 321 ((struct Lisp_Bit_Vector *)(&((x)->font_specified))) | |
| 322 #define FACE_CACHEL_FONT_FINAL_STAGE(x) \ | |
| 323 ((struct Lisp_Bit_Vector *)(&((x)->font_final_stage))) | |
| 324 | |
| 428 | 325 #define WINDOW_FACE_CACHEL(window, index) \ |
| 326 Dynarr_atp ((window)->face_cachels, index) | |
| 327 | |
| 328 #define FACE_CACHEL_FINDEX_UNSAFE(cachel, offset) \ | |
| 329 ((offset) < NUM_STATIC_CACHEL_FACES \ | |
| 330 ? (cachel)->merged_faces_static[offset] \ | |
| 331 : Dynarr_at ((cachel)->merged_faces, (offset) - NUM_STATIC_CACHEL_FACES)) | |
| 332 | |
| 333 #define WINDOW_FACE_CACHEL_FACE(window, index) \ | |
| 334 (WINDOW_FACE_CACHEL (window, index)->face) | |
| 335 #define WINDOW_FACE_CACHEL_FOREGROUND(window, index) \ | |
| 336 (WINDOW_FACE_CACHEL (window, index)->foreground) | |
|
5624
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
337 #define WINDOW_FACE_CACHEL_FOREBACK(window, index) \ |
|
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
338 (WINDOW_FACE_CACHEL (window, index)->foreback) |
| 428 | 339 #define WINDOW_FACE_CACHEL_BACKGROUND(window, index) \ |
| 340 (WINDOW_FACE_CACHEL (window, index)->background) | |
| 341 /* #### This can be referenced by various functions, | |
| 342 but face_cachels isn't initialized for the stream device. | |
| 343 Since it doesn't need the value we just return nil here to avoid | |
| 344 blowing up in multiple places. */ | |
| 345 #define WINDOW_FACE_CACHEL_FONT(window, index, charset) \ | |
| 346 ((window)->face_cachels \ | |
| 347 ? FACE_CACHEL_FONT (WINDOW_FACE_CACHEL (window, index), charset) \ | |
| 348 : Qnil) | |
| 349 #define WINDOW_FACE_CACHEL_DISPLAY_TABLE(window, index) \ | |
| 350 (WINDOW_FACE_CACHEL (window, index)->display_table) | |
| 351 #define WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP(window, index) \ | |
| 352 (WINDOW_FACE_CACHEL (window, index)->background_pixmap) | |
|
5080
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
353 #define WINDOW_FACE_CACHEL_BACKGROUND_PLACEMENT(window, index) \ |
|
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
354 (WINDOW_FACE_CACHEL (window, index)->background_placement) |
| 428 | 355 #define WINDOW_FACE_CACHEL_DIRTY(window, index) \ |
| 356 (WINDOW_FACE_CACHEL (window, index)->dirty) | |
| 357 #define WINDOW_FACE_CACHEL_UNDERLINE_P(window, index) \ | |
| 358 (WINDOW_FACE_CACHEL (window, index)->underline) | |
| 359 #define WINDOW_FACE_CACHEL_HIGHLIGHT_P(window, index) \ | |
| 360 (WINDOW_FACE_CACHEL (window, index)->highlight) | |
| 361 #define WINDOW_FACE_CACHEL_DIM_P(window, index) \ | |
| 362 (WINDOW_FACE_CACHEL (window, index)->dim) | |
| 363 #define WINDOW_FACE_CACHEL_BLINKING_P(window, index) \ | |
| 364 (WINDOW_FACE_CACHEL (window, index)->blinking) | |
| 365 #define WINDOW_FACE_CACHEL_REVERSE_P(window, index) \ | |
| 366 (WINDOW_FACE_CACHEL (window, index)->reverse) | |
|
5619
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
367 #define WINDOW_FACE_CACHEL_SHRINK_P(window, index) \ |
|
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
368 (WINDOW_FACE_CACHEL (window, index)->shrink) |
| 428 | 369 |
| 370 #define FACE_PROPERTY_SPECIFIER(face, property) Fget (face, property, Qnil) | |
| 371 | |
| 372 #define FACE_PROPERTY_INSTANCE_1(face, property, domain, errb, no_fallback, depth) \ | |
| 373 specifier_instance (FACE_PROPERTY_SPECIFIER (face, property), Qunbound, \ | |
| 374 domain, errb, 1, no_fallback, depth) | |
| 375 | |
| 376 #define FACE_PROPERTY_INSTANCE(face, property, domain, no_fallback, depth) \ | |
| 793 | 377 FACE_PROPERTY_INSTANCE_1 (face, property, domain, ERROR_ME_DEBUG_WARN, \ |
| 428 | 378 no_fallback, depth) |
| 379 | |
| 3659 | 380 Lisp_Object face_property_matching_instance |
| 381 (Lisp_Object face, | |
| 382 Lisp_Object property, | |
| 383 Lisp_Object charset, | |
| 384 Lisp_Object domain, | |
| 385 Error_Behavior errb, | |
| 386 int no_fallback, | |
| 387 Lisp_Object depth, | |
| 388 enum font_specifier_matchspec_stages stages); | |
| 428 | 389 |
| 390 #define FACE_PROPERTY_SPEC_LIST(face, property, locale) \ | |
| 391 Fspecifier_spec_list (FACE_PROPERTY_SPECIFIER (face, property), \ | |
| 392 locale, Qnil, Qnil) | |
| 498 | 393 #define SET_FACE_PROPERTY(face, property, value, locale, tag, how_to_add) \ |
| 428 | 394 Fadd_spec_to_specifier (FACE_PROPERTY_SPECIFIER (face, property), \ |
| 498 | 395 value, locale, tag, how_to_add) |
| 428 | 396 |
| 397 #define FACE_FOREGROUND(face, domain) \ | |
| 398 FACE_PROPERTY_INSTANCE (face, Qforeground, domain, 0, Qzero) | |
|
5624
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
399 #define FACE_FOREBACK(face, domain) \ |
|
c39052c921b5
New "foreback" face property.
Didier Verna <didier@xemacs.org>
parents:
5619
diff
changeset
|
400 FACE_PROPERTY_INSTANCE (face, Qforeback, domain, 0, Qzero) |
| 428 | 401 #define FACE_BACKGROUND(face, domain) \ |
| 402 FACE_PROPERTY_INSTANCE (face, Qbackground, domain, 0, Qzero) | |
| 3676 | 403 |
| 404 /* Calling this function on the default face with the ASCII character set | |
| 405 may delete any X11 frames; see the code at the end of | |
| 406 x_find_charset_font. */ | |
| 428 | 407 #define FACE_FONT(face, domain, charset) \ |
| 408 face_property_matching_instance (face, Qfont, charset, domain, \ | |
| 3659 | 409 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
|
410 STAGE_INITIAL) |
| 428 | 411 #define FACE_DISPLAY_TABLE(face, domain) \ |
| 412 FACE_PROPERTY_INSTANCE (face, Qdisplay_table, domain, 0, Qzero) | |
| 413 #define FACE_BACKGROUND_PIXMAP(face, domain) \ | |
| 414 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
|
415 |
|
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
416 extern Lisp_Object Qbackground_placement; |
|
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
417 #define FACE_BACKGROUND_PLACEMENT(face, domain) \ |
|
5502045ec510
The background-placement face property.
Didier Verna <didier@lrde.epita.fr>
parents:
5047
diff
changeset
|
418 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
|
419 |
| 428 | 420 #define FACE_UNDERLINE_P(face, domain) \ |
| 421 (!NILP (FACE_PROPERTY_INSTANCE (face, Qunderline, domain, 0, Qzero))) | |
| 440 | 422 #define FACE_STRIKETHRU_P(face, domain) \ |
| 423 (!NILP (FACE_PROPERTY_INSTANCE (face, Qstrikethru, domain, 0, Qzero))) | |
| 428 | 424 #define FACE_HIGHLIGHT_P(face, domain) \ |
| 425 (!NILP (FACE_PROPERTY_INSTANCE (face, Qhighlight, domain, 0, Qzero))) | |
| 426 #define FACE_DIM_P(face, domain) \ | |
| 427 (!NILP (FACE_PROPERTY_INSTANCE (face, Qdim, domain, 0, Qzero))) | |
| 428 #define FACE_BLINKING_P(face, domain) \ | |
| 429 (!NILP (FACE_PROPERTY_INSTANCE (face, Qblinking, domain, 0, Qzero))) | |
| 430 #define FACE_REVERSE_P(face, domain) \ | |
| 431 (!NILP (FACE_PROPERTY_INSTANCE (face, Qreverse, domain, 0, Qzero))) | |
|
5619
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
432 #define FACE_SHRINK_P(face, domain) \ |
|
75ad4969a16d
Replace the 'flush face property with the opposite 'shrink one.
Didier Verna <didier@xemacs.org>
parents:
5617
diff
changeset
|
433 (!NILP (FACE_PROPERTY_INSTANCE (face, Qshrink, domain, 0, Qzero))) |
| 428 | 434 |
| 440 | 435 #endif /* INCLUDED_faces_h_ */ |
