Mercurial > hg > xemacs-beta
comparison src/redisplay.h @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | a5df635868b2 |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
1 /* Redisplay data structures. | |
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois. | |
3 Copyright (C) 1996 Chuck Thompson. | |
4 Copyright (C) 1995, 1996 Ben Wing. | |
5 | |
6 This file is part of XEmacs. | |
7 | |
8 XEmacs is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 2, or (at your option) any | |
11 later version. | |
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 | |
19 along with XEmacs; see the file COPYING. If not, write to | |
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
21 Boston, MA 02111-1307, USA. */ | |
22 | |
23 /* Synched up with: Not in FSF. */ | |
24 | |
25 #ifndef _XEMACS_REDISPLAY_H_ | |
26 #define _XEMACS_REDISPLAY_H_ | |
27 | |
28 /* Redisplay DASSERT types */ | |
29 #define DB_DISP_POS 1 | |
30 #define DB_DISP_TEXT_LAYOUT 2 | |
31 #define DB_DISP_REDISPLAY 4 | |
32 | |
33 /* These are the possible return values from pixel_to_glyph_translation. */ | |
34 #define OVER_MODELINE 0 | |
35 #define OVER_TEXT 1 | |
36 #define OVER_OUTSIDE 2 | |
37 #define OVER_NOTHING 3 | |
38 #define OVER_BORDER 4 | |
39 #define OVER_TOOLBAR 5 | |
40 #define OVER_V_DIVIDER 6 | |
41 | |
42 #define NO_BLOCK -1 | |
43 | |
44 /* Imagine that the text in the buffer is displayed on a piece of paper | |
45 the width of the frame and very very tall. The line start cache is | |
46 an array of struct line_start_cache's, describing the start and | |
47 end buffer positions for a contiguous set of lines on that piece | |
48 of paper. */ | |
49 | |
50 typedef struct line_start_cache line_start_cache; | |
51 struct line_start_cache | |
52 { | |
53 Bufpos start, end; | |
54 int height; | |
55 }; | |
56 | |
57 typedef struct | |
58 { | |
59 Dynarr_declare (line_start_cache); | |
60 } line_start_cache_dynarr; | |
61 | |
62 /* The possible types of runes. | |
63 | |
64 #### The Lisp_Glyph type is broken. There should instead be a pixmap | |
65 type. Currently the device-specific output routines have to worry | |
66 about whether the glyph is textual or not, etc. For Mule this is | |
67 a big problem because you might need multiple fonts to display the | |
68 text. It also eliminates optimizations that could come from glumping | |
69 the text of multiple text glyphs together -- this makes displaying | |
70 binary files (with lots of control chars, etc.) very very slow. */ | |
71 | |
72 #define RUNE_BLANK 0 | |
73 #define RUNE_CHAR 1 | |
74 #define RUNE_DGLYPH 2 | |
75 #define RUNE_HLINE 3 | |
76 #define RUNE_VLINE 4 | |
77 | |
78 #define CURSOR_ON 0 | |
79 #define CURSOR_OFF 1 | |
80 #define NO_CURSOR 2 | |
81 #define NEXT_CURSOR 3 | |
82 #define IGNORE_CURSOR 4 | |
83 | |
84 #define DEFAULT_INDEX (face_index) 0 | |
85 #define MODELINE_INDEX (face_index) 1 | |
86 | |
87 /* A rune is a single display element, such as a printable character | |
88 or pixmap. Any single character in a buffer has one or more runes | |
89 (or zero, if the character is invisible) corresponding to it. | |
90 (Printable characters typically have one rune associated with them, | |
91 but control characters have two -- a ^ and a letter -- and other | |
92 non-printing characters (those displayed in octal) have four. */ | |
93 | |
94 /* WARNING! In compare_runes (one of the most heavily used functions) | |
95 two runes are compared. So please be careful with changes to this | |
96 structure. See comments in compare_runes. | |
97 | |
98 #### This should really be made smaller. | |
99 */ | |
100 | |
101 typedef struct rune rune; | |
102 struct rune | |
103 { | |
104 face_index findex; /* face rune is displayed with. The | |
105 face_index is an index into a | |
106 window-specific array of face cache | |
107 elements. Each face cache element | |
108 corresponds to one "merged face" | |
109 (the result of merging all the | |
110 faces that overlap the rune) and | |
111 contains the instance values for | |
112 each of the face properties in this | |
113 particular window. */ | |
114 | |
115 Bufpos bufpos; /* buffer position this rune is displaying; | |
116 for the modeline, the value here is a | |
117 Charcount, but who's looking? */ | |
118 Bufpos endpos; /* if set this rune covers a range of pos */ | |
119 /* #### Chuck, what does it mean for a rune | |
120 to cover a range of pos? I don't get | |
121 this. */ | |
122 /* #### This isn't used as an rvalue anywhere! | |
123 remove! */ | |
124 | |
125 | |
126 short xpos; /* horizontal starting position in pixels */ | |
127 short width; /* pixel width of rune */ | |
128 | |
129 | |
130 unsigned char cursor_type; /* is this rune covered by the cursor? */ | |
131 unsigned char type; /* type of rune object */ | |
132 /* We used to do bitfields here, but if I | |
133 (JV) count correctly that doesn't matter | |
134 for the size of the structure. All the bit | |
135 fiddling _does_ slow down redisplay by | |
136 about 10%. So don't do that */ | |
137 | |
138 union /* Information specific to the type of rune */ | |
139 { | |
140 /* #### GLyps are are. Is it really necessary to waste 8 bytes on every | |
141 rune for that?! */ | |
142 /* DGLYPH */ | |
143 struct | |
144 { | |
145 Lisp_Object glyph; | |
146 Lisp_Object extent; /* extent rune is attached to, if any. | |
147 If this is a rune in the modeline | |
148 then this might be nil. */ | |
149 | |
150 int xoffset; /* Number of pixels that need to be | |
151 chopped off the left of the glyph. | |
152 This has the effect of shifting the | |
153 glyph to the left while still clipping | |
154 at XPOS. */ | |
155 } dglyph; | |
156 | |
157 /* CHAR */ | |
158 struct | |
159 { | |
160 Emchar ch; /* Character of this rune. */ | |
161 } chr; | |
162 | |
163 /* HLINE */ | |
164 struct | |
165 { | |
166 short thickness; /* how thick to make hline */ | |
167 short yoffset; /* how far down from top of line to put top */ | |
168 } hline; | |
169 } object; /* actual rune object */ | |
170 }; | |
171 | |
172 typedef struct | |
173 { | |
174 Dynarr_declare (rune); | |
175 } rune_dynarr; | |
176 | |
177 /* These must have distinct values. Note that the ordering actually | |
178 represents priority levels. TEXT has the lowest priority level. */ | |
179 enum display_type | |
180 { | |
181 TEXT, | |
182 LEFT_OUTSIDE_MARGIN, | |
183 LEFT_INSIDE_MARGIN, | |
184 RIGHT_INSIDE_MARGIN, | |
185 RIGHT_OUTSIDE_MARGIN, | |
186 OVERWRITE | |
187 }; | |
188 | |
189 /* A display block represents a run of text on a single line. | |
190 Apparently there is only one display block per line for each | |
191 of the types listed in `enum display_type'. | |
192 | |
193 A display block consists mostly of an array of runes, one per | |
194 atomic display element (printable character, pixmap, etc.). */ | |
195 | |
196 /* #### Yuckity yuckity yuck yuck yuck yuck yuck!! | |
197 | |
198 Chuck, I think you should redo this. It should not be the | |
199 responsibility of the device-specific code to worry about | |
200 the different faces. The generic stuff in redisplay-output.c | |
201 should glump things up into sub-blocks, each of which | |
202 corresponds to a single pixmap or a single run of text in | |
203 the same font. | |
204 | |
205 It might still make sense for the device-specific output routine | |
206 to get passed an entire display line. That way, it can make | |
207 calls to XDrawText() (which draws multiple runs of single-font | |
208 data) instead of XDrawString(). The reason for this is to | |
209 reduce the amount of X traffic, which will help things significantly | |
210 on a slow line. */ | |
211 | |
212 typedef struct display_block display_block; | |
213 struct display_block | |
214 { | |
215 enum display_type type; /* type of display block */ | |
216 | |
217 int start_pos; /* starting pixel position of block */ | |
218 int end_pos; /* ending pixel position of block */ | |
219 | |
220 rune_dynarr *runes; /* Dynamic array of runes */ | |
221 }; | |
222 | |
223 typedef struct | |
224 { | |
225 Dynarr_declare (display_block); | |
226 } display_block_dynarr; | |
227 | |
228 typedef struct layout_bounds_type | |
229 { | |
230 int left_out; | |
231 int left_in; | |
232 int left_white; | |
233 int right_white; | |
234 int right_in; | |
235 int right_out; | |
236 } layout_bounds; | |
237 | |
238 typedef struct glyph_block glyph_block; | |
239 struct glyph_block | |
240 { | |
241 Lisp_Object glyph; | |
242 Lisp_Object extent; | |
243 /* The rest are only used by margin routines. */ | |
244 face_index findex; | |
245 int active; | |
246 int width; | |
247 }; | |
248 | |
249 typedef struct | |
250 { | |
251 Dynarr_declare (glyph_block); | |
252 } glyph_block_dynarr; | |
253 | |
254 /*************************************************************************/ | |
255 /* display lines */ | |
256 /*************************************************************************/ | |
257 | |
258 /* Modeline commentary: IMO the modeline is handled very badly, we | |
259 special case virtually *everything* in the redisplay routines for | |
260 the modeline. The fact that dl->bufpos can be either a buffer | |
261 position or a char count highlights this. There is no abstraction at | |
262 all that I can find and it means that the code is made very ugly as | |
263 a result. Either we should treat the modeline *entirely* separately, | |
264 or we should abstract to something that applies equally well to the | |
265 modeline and to buffer text, the things are not enormously different | |
266 after all and handling them identically at some level would | |
267 eliminate some bugs that still exist (mainly to do with modeline | |
268 handling). This problem doesn't help trying to implement gutters | |
269 which are somewhere in between buffer text and modeline text. | |
270 | |
271 Redisplay commentary: Everything in redisplay is tied very tightly | |
272 to the things that are being displayed, and the context, | |
273 e.g. buffers and windows. According to Chuck this is so that we can | |
274 get speed, which seems fine to me, however this usage is extended | |
275 too far down the redispay routines IMO. At some level there should | |
276 be functions that know how to display strings with extents and | |
277 faces, regardless of buffer etc. After all the window system does | |
278 not care. <andy@xemacs.org> */ | |
279 | |
280 typedef struct display_line display_line; | |
281 struct display_line | |
282 { | |
283 short ypos; /* vertical position in pixels | |
284 of the baseline for this line. */ | |
285 unsigned short ascent, descent; /* maximum values for this line. | |
286 The ascent is the number of | |
287 pixels above the baseline, and | |
288 the descent is the number of | |
289 pixels below the baseline. | |
290 The descent includes the baseline | |
291 pixel-row itself, I think. */ | |
292 unsigned short clip; /* amount of bottom of line to clip | |
293 in pixels.*/ | |
294 unsigned short top_clip; /* amount of top of line to clip | |
295 in pixels.*/ | |
296 Bufpos bufpos; /* first buffer position on line */ | |
297 Bufpos end_bufpos; /* last buffer position on line */ | |
298 Charcount offset; /* adjustment to bufpos vals */ | |
299 Charcount num_chars; /* # of chars on line | |
300 including expansion of tabs | |
301 and control chars */ | |
302 int cursor_elt; /* rune block of TEXT display | |
303 block cursor is at or -1 */ | |
304 char used_prop_data; /* can't incrementally update if line | |
305 used propagation data */ | |
306 | |
307 layout_bounds bounds; /* line boundary positions */ | |
308 | |
309 char modeline; /* t if this line is a modeline */ | |
310 | |
311 /* Dynamic array of display blocks */ | |
312 display_block_dynarr *display_blocks; | |
313 | |
314 /* Dynamic arrays of left and right glyph blocks */ | |
315 glyph_block_dynarr *left_glyphs; | |
316 glyph_block_dynarr *right_glyphs; | |
317 | |
318 face_index left_margin_findex; | |
319 face_index right_margin_findex; | |
320 face_index default_findex; | |
321 }; | |
322 | |
323 #define DISPLAY_LINE_HEIGHT(dl) \ | |
324 (dl->ascent + dl->descent - (dl->clip + dl->top_clip)) | |
325 #define DISPLAY_LINE_YPOS(dl) \ | |
326 (dl->ypos - (dl->ascent - dl->top_clip)) | |
327 #define DISPLAY_LINE_YEND(dl) \ | |
328 ((dl->ypos + dl->descent) - dl->clip) | |
329 | |
330 typedef struct | |
331 { | |
332 Dynarr_declare (display_line); | |
333 } display_line_dynarr; | |
334 | |
335 /* The following two structures are used to represent an area to | |
336 displayed and where to display it. Using these two structures all | |
337 combinations of clipping and position can be accommodated. */ | |
338 | |
339 /* This represents an area to be displayed into. */ | |
340 typedef struct display_box display_box; | |
341 struct display_box | |
342 { | |
343 int xpos; /* absolute horizontal position of area */ | |
344 int ypos; /* absolute vertical position of area */ | |
345 int width, height; | |
346 }; | |
347 | |
348 /* This represents the area from a glyph to be displayed. */ | |
349 typedef struct display_glyph_area display_glyph_area; | |
350 struct display_glyph_area | |
351 { | |
352 int xoffset; /* horizontal offset of the glyph, +ve means | |
353 display the glyph with x offset by xoffset, | |
354 -ve means display starting xoffset into the | |
355 glyph. */ | |
356 int yoffset; /* vertical offset of the glyph, +ve means | |
357 display the glyph with y offset by yoffset, | |
358 -ve means display starting xoffset into the | |
359 glyph. */ | |
360 int width, height; /* width and height of glyph to display. */ | |
361 }; | |
362 | |
363 /* It could be argued that the following two structs belong in | |
364 extents.h, but they're only used by redisplay and it simplifies | |
365 the header files to put them here. */ | |
366 | |
367 typedef struct | |
368 { | |
369 Dynarr_declare (EXTENT); | |
370 } EXTENT_dynarr; | |
371 | |
372 struct font_metric_info | |
373 { | |
374 int width; | |
375 int height; /* always ascent + descent; for convenience */ | |
376 int ascent; | |
377 int descent; | |
378 | |
379 int proportional_p; | |
380 }; | |
381 | |
382 /* NOTE NOTE NOTE: Currently the positions in an extent fragment | |
383 structure are Bytind's, not Bufpos's. This could change. */ | |
384 | |
385 struct extent_fragment | |
386 { | |
387 Lisp_Object object; /* buffer or string */ | |
388 struct frame *frm; | |
389 Bytind pos, end; | |
390 EXTENT_dynarr *extents; | |
391 glyph_block_dynarr *begin_glyphs, *end_glyphs; | |
392 unsigned int invisible:1; | |
393 unsigned int invisible_ellipses:1; | |
394 unsigned int previously_invisible:1; | |
395 unsigned int invisible_ellipses_already_displayed:1; | |
396 }; | |
397 | |
398 #define EDGE_TOP 1 | |
399 #define EDGE_LEFT 2 | |
400 #define EDGE_BOTTOM 4 | |
401 #define EDGE_RIGHT 8 | |
402 #define EDGE_ALL (EDGE_TOP | EDGE_LEFT | EDGE_BOTTOM | EDGE_RIGHT) | |
403 | |
404 | |
405 /*************************************************************************/ | |
406 /* change flags */ | |
407 /*************************************************************************/ | |
408 | |
409 /* Quick flags to signal redisplay. redisplay() sets them all to 0 | |
410 when it finishes. If none of them are set when it starts, it | |
411 assumes that nothing needs to be done. Functions that make a change | |
412 that is (potentially) visible on the screen should set the | |
413 appropriate flag. | |
414 | |
415 If any of these flags are set, redisplay will look more carefully | |
416 to see if anything has really changed. */ | |
417 | |
418 /* non-nil if the contents of a buffer have changed since the last time | |
419 redisplay completed */ | |
420 extern int buffers_changed; | |
421 extern int buffers_changed_set; | |
422 | |
423 /* Nonzero if head_clip or tail_clip of a buffer has changed | |
424 since last redisplay that finished */ | |
425 extern int clip_changed; | |
426 extern int clip_changed_set; | |
427 | |
428 /* non-nil if any extent has changed since the last time redisplay completed */ | |
429 extern int extents_changed; | |
430 extern int extents_changed_set; | |
431 | |
432 /* non-nil if any face has changed since the last time redisplay completed */ | |
433 extern int faces_changed; | |
434 | |
435 /* Nonzero means one or more frames have been marked as garbaged */ | |
436 extern int frame_changed; | |
437 | |
438 /* True if any of the builtin display glyphs (continuation, | |
439 hscroll, control-arrow, etc) is in need of updating | |
440 somewhere. */ | |
441 extern int glyphs_changed; | |
442 extern int glyphs_changed_set; | |
443 | |
444 /* True if any displayed subwindow is in need of updating | |
445 somewhere. */ | |
446 extern int subwindows_changed; | |
447 extern int subwindows_changed_set; | |
448 | |
449 /* True if any displayed subwindow is in need of updating | |
450 somewhere. */ | |
451 extern int subwindows_state_changed; | |
452 extern int subwindows_state_changed_set; | |
453 | |
454 /* True if an icon is in need of updating somewhere. */ | |
455 extern int icon_changed; | |
456 extern int icon_changed_set; | |
457 | |
458 /* True if a menubar is in need of updating somewhere. */ | |
459 extern int menubar_changed; | |
460 extern int menubar_changed_set; | |
461 | |
462 /* true iff we should redraw the modelines on the next redisplay */ | |
463 extern int modeline_changed; | |
464 extern int modeline_changed_set; | |
465 | |
466 /* non-nil if point has changed in some buffer since the last time | |
467 redisplay completed */ | |
468 extern int point_changed; | |
469 extern int point_changed_set; | |
470 | |
471 /* non-nil if some frame has changed its size */ | |
472 extern int size_changed; | |
473 | |
474 /* non-nil if some device has signaled that it wants to change size */ | |
475 extern int asynch_device_change_pending; | |
476 | |
477 /* non-nil if any toolbar has changed */ | |
478 extern int toolbar_changed; | |
479 extern int toolbar_changed_set; | |
480 | |
481 /* non-nil if any gutter has changed */ | |
482 extern int gutter_changed; | |
483 extern int gutter_changed_set; | |
484 | |
485 /* non-nil if any window has changed since the last time redisplay completed */ | |
486 extern int windows_changed; | |
487 | |
488 /* non-nil if any frame's window structure has changed since the last | |
489 time redisplay completed */ | |
490 extern int windows_structure_changed; | |
491 | |
492 /* These macros can be relatively expensive. Since they are often | |
493 called numerous times between each call to redisplay, we keep track | |
494 if each has already been called and don't bother doing most of the | |
495 work if it is currently set. */ | |
496 | |
497 #define MARK_TYPE_CHANGED(object) do { \ | |
498 if (!object##_changed_set) { \ | |
499 Lisp_Object MTC_devcons, MTC_concons; \ | |
500 DEVICE_LOOP_NO_BREAK (MTC_devcons, MTC_concons) \ | |
501 { \ | |
502 Lisp_Object MTC_frmcons; \ | |
503 struct device *MTC_d = XDEVICE (XCAR (MTC_devcons)); \ | |
504 DEVICE_FRAME_LOOP (MTC_frmcons, MTC_d) \ | |
505 { \ | |
506 struct frame *MTC_f = XFRAME (XCAR (MTC_frmcons)); \ | |
507 MTC_f->object##_changed = 1; \ | |
508 MTC_f->modiff++; \ | |
509 } \ | |
510 MTC_d->object##_changed = 1; \ | |
511 } \ | |
512 object##_changed = 1; \ | |
513 object##_changed_set = 1; } \ | |
514 } while (0) | |
515 | |
516 #define MARK_BUFFERS_CHANGED MARK_TYPE_CHANGED (buffers) | |
517 #define MARK_CLIP_CHANGED MARK_TYPE_CHANGED (clip) | |
518 #define MARK_EXTENTS_CHANGED MARK_TYPE_CHANGED (extents) | |
519 #define MARK_ICON_CHANGED MARK_TYPE_CHANGED (icon) | |
520 #define MARK_MENUBAR_CHANGED MARK_TYPE_CHANGED (menubar) | |
521 #define MARK_MODELINE_CHANGED MARK_TYPE_CHANGED (modeline) | |
522 #define MARK_POINT_CHANGED MARK_TYPE_CHANGED (point) | |
523 #define MARK_TOOLBAR_CHANGED MARK_TYPE_CHANGED (toolbar) | |
524 #define MARK_GUTTER_CHANGED MARK_TYPE_CHANGED (gutter) | |
525 #define MARK_GLYPHS_CHANGED MARK_TYPE_CHANGED (glyphs) | |
526 #define MARK_SUBWINDOWS_CHANGED MARK_TYPE_CHANGED (subwindows) | |
527 #define MARK_SUBWINDOWS_STATE_CHANGED MARK_TYPE_CHANGED (subwindows_state) | |
528 | |
529 | |
530 #define CLASS_RESET_CHANGED_FLAGS(p) do { \ | |
531 (p)->buffers_changed = 0; \ | |
532 (p)->clip_changed = 0; \ | |
533 (p)->extents_changed = 0; \ | |
534 (p)->faces_changed = 0; \ | |
535 (p)->frame_changed = 0; \ | |
536 (p)->icon_changed = 0; \ | |
537 (p)->menubar_changed = 0; \ | |
538 (p)->modeline_changed = 0; \ | |
539 (p)->point_changed = 0; \ | |
540 (p)->toolbar_changed = 0; \ | |
541 (p)->gutter_changed = 0; \ | |
542 (p)->glyphs_changed = 0; \ | |
543 (p)->subwindows_changed = 0; \ | |
544 (p)->subwindows_state_changed = 0; \ | |
545 (p)->windows_changed = 0; \ | |
546 (p)->windows_structure_changed = 0; \ | |
547 } while (0) | |
548 | |
549 #define GLOBAL_RESET_CHANGED_FLAGS do { \ | |
550 buffers_changed = 0; \ | |
551 clip_changed = 0; \ | |
552 extents_changed = 0; \ | |
553 faces_changed = 0; \ | |
554 frame_changed = 0; \ | |
555 icon_changed = 0; \ | |
556 menubar_changed = 0; \ | |
557 modeline_changed = 0; \ | |
558 point_changed = 0; \ | |
559 toolbar_changed = 0; \ | |
560 gutter_changed = 0; \ | |
561 glyphs_changed = 0; \ | |
562 subwindows_changed = 0; \ | |
563 subwindows_state_changed = 0; \ | |
564 windows_changed = 0; \ | |
565 windows_structure_changed = 0; \ | |
566 } while (0) | |
567 | |
568 #define CLASS_REDISPLAY_FLAGS_CHANGEDP(p) \ | |
569 ( (p)->buffers_changed || \ | |
570 (p)->clip_changed || \ | |
571 (p)->extents_changed || \ | |
572 (p)->faces_changed || \ | |
573 (p)->frame_changed || \ | |
574 (p)->icon_changed || \ | |
575 (p)->menubar_changed || \ | |
576 (p)->modeline_changed || \ | |
577 (p)->point_changed || \ | |
578 (p)->toolbar_changed || \ | |
579 (p)->gutter_changed || \ | |
580 (p)->glyphs_changed || \ | |
581 (p)->subwindows_changed || \ | |
582 (p)->subwindows_state_changed || \ | |
583 (p)->windows_changed || \ | |
584 (p)->windows_structure_changed ) | |
585 | |
586 #define GLOBAL_REDISPLAY_FLAGS_CHANGEDP \ | |
587 ( buffers_changed || \ | |
588 clip_changed || \ | |
589 extents_changed || \ | |
590 faces_changed || \ | |
591 frame_changed || \ | |
592 icon_changed || \ | |
593 menubar_changed || \ | |
594 modeline_changed || \ | |
595 point_changed || \ | |
596 toolbar_changed || \ | |
597 gutter_changed || \ | |
598 glyphs_changed || \ | |
599 subwindows_changed || \ | |
600 subwindows_state_changed || \ | |
601 windows_changed || \ | |
602 windows_structure_changed ) | |
603 | |
604 | |
605 /* Anytime a console, device or frame is added or deleted we need to reset | |
606 these flags. */ | |
607 #define RESET_CHANGED_SET_FLAGS do { \ | |
608 buffers_changed_set = 0; \ | |
609 clip_changed_set = 0; \ | |
610 extents_changed_set = 0; \ | |
611 icon_changed_set = 0; \ | |
612 menubar_changed_set = 0; \ | |
613 modeline_changed_set = 0; \ | |
614 point_changed_set = 0; \ | |
615 toolbar_changed_set = 0; \ | |
616 gutter_changed_set = 0; \ | |
617 glyphs_changed_set = 0; \ | |
618 subwindows_changed_set = 0; \ | |
619 subwindows_state_changed_set = 0; \ | |
620 } while (0) | |
621 | |
622 | |
623 /*************************************************************************/ | |
624 /* redisplay global variables */ | |
625 /*************************************************************************/ | |
626 | |
627 /* redisplay structure used by various utility routines. */ | |
628 extern display_line_dynarr *cmotion_display_lines; | |
629 | |
630 /* Nonzero means truncate lines in all windows less wide than the frame. */ | |
631 extern int truncate_partial_width_windows; | |
632 | |
633 /* Nonzero if we're in a display critical section. */ | |
634 extern int in_display; | |
635 | |
636 /* Nonzero means no need to redraw the entire frame on resuming | |
637 a suspended Emacs. This is useful on terminals with multiple pages, | |
638 where one page is used for Emacs and another for all else. */ | |
639 extern int no_redraw_on_reenter; | |
640 | |
641 /* Nonzero means flash the frame instead of ringing the bell. */ | |
642 extern int visible_bell; | |
643 | |
644 /* Thickness of shadow border around 3D modelines. */ | |
645 extern Lisp_Object Vmodeline_shadow_thickness; | |
646 | |
647 /* Scroll if point lands on the bottom line and that line is partially | |
648 clipped. */ | |
649 extern int scroll_on_clipped_lines; | |
650 | |
651 extern Lisp_Object Vglobal_mode_string; | |
652 | |
653 /* The following two variables are defined in emacs.c and are used | |
654 to convey information discovered on the command line way early | |
655 (before *anything* is initialized). */ | |
656 | |
657 /* If non-zero, a window-system was specified on the command line. | |
658 Defined in emacs.c. */ | |
659 extern int display_arg; | |
660 | |
661 /* Type of display specified. Defined in emacs.c. */ | |
662 extern CONST char *display_use; | |
663 | |
664 /* Nonzero means reading single-character input with prompt | |
665 so put cursor on minibuffer after the prompt. */ | |
666 | |
667 extern int cursor_in_echo_area; | |
668 | |
669 extern Lisp_Object Qbar_cursor, Qcursor_in_echo_area, Vwindow_system; | |
670 | |
671 | |
672 /*************************************************************************/ | |
673 /* redisplay exported functions */ | |
674 /*************************************************************************/ | |
675 EXFUN (Fredraw_frame, 2); | |
676 | |
677 int redisplay_text_width_string (struct window *w, int findex, | |
678 Bufbyte *nonreloc, Lisp_Object reloc, | |
679 Bytecount offset, Bytecount len); | |
680 int redisplay_frame_text_width_string (struct frame *f, | |
681 Lisp_Object face, | |
682 Bufbyte *nonreloc, | |
683 Lisp_Object reloc, | |
684 Bytecount offset, Bytecount len); | |
685 void redisplay (void); | |
686 struct display_block *get_display_block_from_line (struct display_line *dl, | |
687 enum display_type type); | |
688 layout_bounds calculate_display_line_boundaries (struct window *w, | |
689 int modeline); | |
690 Bufpos point_at_center (struct window *w, int type, Bufpos start, | |
691 Bufpos point); | |
692 int line_at_center (struct window *w, int type, Bufpos start, Bufpos point); | |
693 int window_half_pixpos (struct window *w); | |
694 void redisplay_echo_area (void); | |
695 void free_display_structs (struct window_mirror *mir); | |
696 void free_display_lines (display_line_dynarr *dla); | |
697 Bufbyte *generate_formatted_string (struct window *w, Lisp_Object format_str, | |
698 Lisp_Object result_str, face_index findex, | |
699 int type); | |
700 void generate_displayable_area (struct window *w, Lisp_Object disp_string, | |
701 int xpos, int ypos, int width, int height, | |
702 display_line_dynarr* dl, | |
703 Bufpos start_pos, face_index default_face); | |
704 int real_current_modeline_height (struct window *w); | |
705 int pixel_to_glyph_translation (struct frame *f, int x_coord, | |
706 int y_coord, int *col, int *row, | |
707 int *obj_x, int *obj_y, | |
708 struct window **w, Bufpos *bufpos, | |
709 Bufpos *closest, Charcount *modeline_closest, | |
710 Lisp_Object *obj1, Lisp_Object *obj2); | |
711 void glyph_to_pixel_translation (struct window *w, int char_x, | |
712 int char_y, int *pix_x, int *pix_y); | |
713 void mark_redisplay (void); | |
714 int point_in_line_start_cache (struct window *w, Bufpos point, | |
715 int min_past); | |
716 int point_would_be_visible (struct window *w, Bufpos startp, | |
717 Bufpos point); | |
718 Bufpos start_of_last_line (struct window *w, Bufpos startp); | |
719 Bufpos end_of_last_line (struct window *w, Bufpos startp); | |
720 Bufpos start_with_line_at_pixpos (struct window *w, Bufpos point, | |
721 int pixpos); | |
722 Bufpos start_with_point_on_display_line (struct window *w, Bufpos point, | |
723 int line); | |
724 int redisplay_variable_changed (Lisp_Object sym, Lisp_Object *val, | |
725 Lisp_Object in_object, int flags); | |
726 void redisplay_glyph_changed (Lisp_Object glyph, Lisp_Object property, | |
727 Lisp_Object locale); | |
728 | |
729 #ifdef MEMORY_USAGE_STATS | |
730 int compute_display_line_dynarr_usage (display_line_dynarr *dyn, | |
731 struct overhead_stats *ovstats); | |
732 int compute_line_start_cache_dynarr_usage (line_start_cache_dynarr *dyn, | |
733 struct overhead_stats *ovstats); | |
734 #endif | |
735 | |
736 | |
737 /* defined in redisplay-output.c */ | |
738 int get_next_display_block (layout_bounds bounds, | |
739 display_block_dynarr *dba, int start_pos, | |
740 int *next_start); | |
741 void redisplay_output_layout (struct window *w, | |
742 Lisp_Object image_instance, | |
743 struct display_box* db, struct display_glyph_area* dga, | |
744 face_index findex, int cursor_start, int cursor_width, | |
745 int cursor_height); | |
746 void redisplay_output_subwindow (struct window *w, | |
747 Lisp_Object image_instance, | |
748 struct display_box* db, struct display_glyph_area* dga, | |
749 face_index findex, int cursor_start, int cursor_width, | |
750 int cursor_height); | |
751 void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height); | |
752 void redisplay_output_pixmap (struct window *w, | |
753 Lisp_Object image_instance, | |
754 struct display_box* db, struct display_glyph_area* dga, | |
755 face_index findex, int cursor_start, int cursor_width, | |
756 int cursor_height, int offset_bitmap); | |
757 int redisplay_calculate_display_boxes (struct display_line *dl, int xpos, | |
758 int xoffset, int start_pixpos, int width, | |
759 struct display_box* dest, | |
760 struct display_glyph_area* src); | |
761 int redisplay_normalize_glyph_area (struct display_box* dest, | |
762 struct display_glyph_area* glyphsrc); | |
763 void redisplay_clear_to_window_end (struct window *w, int ypos1, int ypos2); | |
764 void redisplay_clear_region (Lisp_Object window, face_index findex, int x, | |
765 int y, int width, int height); | |
766 void redisplay_clear_bottom_of_window (struct window *w, | |
767 display_line_dynarr *ddla, | |
768 int min_start, int max_end); | |
769 void redisplay_update_line (struct window *w, int first_line, | |
770 int last_line, int update_values); | |
771 void redisplay_output_window (struct window *w); | |
772 void bevel_modeline (struct window *w, struct display_line *dl); | |
773 int redisplay_move_cursor (struct window *w, Bufpos new_point, | |
774 int no_output_end); | |
775 void redisplay_redraw_cursor (struct frame *f, int run_begin_end_meths); | |
776 void output_display_line (struct window *w, display_line_dynarr *cdla, | |
777 display_line_dynarr *ddla, int line, | |
778 int force_start, int force_end); | |
779 | |
780 #endif /* _XEMACS_REDISPLAY_H_ */ |