comparison src/redisplay.h @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
comparison
equal deleted inserted replaced
-1:000000000000 0:376386a54a3c
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
41 #define NO_BLOCK -1
42
43 /* Imagine that the text in the buffer is displayed on a piece of paper
44 the width of the frame and very very tall. The line start cache is
45 an array of struct line_start_cache's, describing the start and
46 end buffer positions for a contiguous set of lines on that piece
47 of paper. */
48
49 struct line_start_cache
50 {
51 Bufpos start, end;
52 int height;
53 };
54
55 typedef struct line_start_cache_dynarr_type
56 {
57 Dynarr_declare (struct line_start_cache);
58 } line_start_cache_dynarr;
59
60 /* The possible types of runes.
61
62 #### The Lisp_Glyph type is broken. There should instead be a pixmap
63 type. Currently the device-specific output routines have to worry
64 about whether the glyph is textual or not, etc. For Mule this is
65 a big problem because you might need multiple fonts to display the
66 text. It also eliminates optimizations that could come from glumping
67 the text of multiple text glyphs together -- this makes displaying
68 binary files (with lots of control chars, etc.) very very slow. */
69
70 #define RUNE_BLANK 0
71 #define RUNE_CHAR 1
72 #define RUNE_DGLYPH 2
73 #define RUNE_HLINE 3
74 #define RUNE_VLINE 4
75
76 #define CURSOR_ON 0
77 #define CURSOR_OFF 1
78 #define NO_CURSOR 2
79 #define NEXT_CURSOR 3
80 #define IGNORE_CURSOR 4
81
82 #define DEFAULT_INDEX (face_index) 0
83 #define MODELINE_INDEX (face_index) 1
84
85 /* A rune is a single display element, such as a printable character
86 or pixmap. Any single character in a buffer has one or more runes
87 (or zero, if the character is invisible) corresponding to it.
88 (Printable characters typically have one rune associated with them,
89 but control characters have two -- a ^ and a letter -- and other
90 non-printing characters (those displayed in octal) have four. */
91
92 struct rune
93 {
94 face_index findex; /* face rune is displayed with. The
95 face_index is an index into a
96 window-specific array of face cache
97 elements. Each face cache element
98 corresponds to one "merged face"
99 (the result of merging all the
100 faces that overlap the rune) and
101 contains the instance values for
102 each of the face properties in this
103 particular window. */
104
105 short xpos; /* horizontal starting position in pixels */
106 short width; /* pixel width of rune */
107
108
109 Bufpos bufpos; /* buffer position this rune is displaying;
110 for the modeline, the value here is a
111 Charcount, but who's looking? */
112 Bufpos endpos; /* if set this rune covers a range of pos */
113 /* #### Chuck, what does it mean for a rune
114 to cover a range of pos? I don't get
115 this. */
116 unsigned int cursor_type :3; /* is this rune covered by the cursor? */
117 unsigned int type :3; /* type of rune object */
118
119 union /* Information specific to the type of rune */
120 {
121 /* DGLYPH */
122 struct
123 {
124 Lisp_Object glyph;
125 Lisp_Object extent; /* extent rune is attached to, if any.
126 If this is a rune in the modeline
127 then this might be nil. */
128
129 int xoffset; /* Number of pixels that need to be
130 chopped off the left of the glyph.
131 This has the effect of shifting the
132 glyph to the left while still clipping
133 at XPOS. */
134 } dglyph;
135
136 /* CHAR */
137 struct
138 {
139 Emchar ch; /* Cbaracter of this rune. */
140 } chr;
141
142 /* HLINE */
143 struct
144 {
145 int thickness; /* how thick to make hline */
146 int yoffset; /* how far down from top of line to put top */
147 } hline;
148 } object; /* actual rune object */
149 };
150
151 typedef struct rune_dynarr_type
152 {
153 Dynarr_declare (struct rune);
154 } rune_dynarr;
155
156 /* These must have distinct values. Note that the ordering actually
157 represents priority levels. TEXT has the lowest priority level. */
158 enum display_type
159 {
160 TEXT,
161 LEFT_OUTSIDE_MARGIN,
162 LEFT_INSIDE_MARGIN,
163 RIGHT_INSIDE_MARGIN,
164 RIGHT_OUTSIDE_MARGIN,
165 OVERWRITE
166 };
167
168 /* A display block represents a run of text on a single line.
169 Apparently there is only one display block per line for each
170 of the types listed in `enum display_type'.
171
172 A display block consists mostly of an array of runes, one per
173 atomic display element (printable character, pixmap, etc.). */
174
175 /* #### Yuckity yuckity yuck yuck yuck yuck yuck!!
176
177 Chuck, I think you should redo this. It should not be the
178 responsibility of the device-specific code to worry about
179 the different faces. The generic stuff in redisplay-output.c
180 should glump things up into sub-blocks, each of which
181 corresponds to a single pixmap or a single run of text in
182 the same font.
183
184 It might still make sense for the device-specific output routine
185 to get passed an entire display line. That way, it can make
186 calls to XDrawText() (which draws multiple runs of single-font
187 data) instead of XDrawString(). The reason for this is to
188 reduce the amount of X traffic, which will help things significantly
189 on a slow line. */
190
191 struct display_block
192 {
193 enum display_type type; /* type of display block */
194
195 int start_pos; /* starting pixel position of block */
196 int end_pos; /* ending pixel position of block */
197
198 rune_dynarr *runes; /* Dynamic array of runes */
199 };
200
201 typedef struct display_block_dynarr_type
202 {
203 Dynarr_declare (struct display_block);
204 } display_block_dynarr;
205
206 typedef struct layout_bounds_type
207 {
208 int left_out;
209 int left_in;
210 int left_white;
211 int right_white;
212 int right_in;
213 int right_out;
214 } layout_bounds;
215
216 struct glyph_block
217 {
218 Lisp_Object glyph;
219 Lisp_Object extent;
220 /* The rest are only used by margin routines. */
221 face_index findex;
222 int active;
223 int width;
224 };
225
226 typedef struct glyph_block_dynarr_type
227 {
228 Dynarr_declare (struct glyph_block);
229 } glyph_block_dynarr;
230
231 struct display_line
232 {
233 short ypos; /* vertical position in pixels
234 of the baseline for this line. */
235 unsigned short ascent, descent; /* maximum values for this line.
236 The ascent is the number of
237 pixels above the baseline, and
238 the descent is the number of
239 pixels below the baseline.
240 The descent includes the baseline
241 pixel-row itself, I think. */
242 unsigned short clip; /* amount of bottom of line to clip
243 in pixels.*/
244 Bufpos bufpos; /* first buffer position on line */
245 Bufpos end_bufpos; /* last buffer position on line */
246 Charcount offset; /* adjustment to bufpos vals */
247 Charcount num_chars; /* # of chars on line
248 including expansion of tabs
249 and control chars */
250 int cursor_elt; /* rune block of TEXT display
251 block cursor is at or -1 */
252 char used_prop_data; /* can't incrementally updated if line
253 used propogation data */
254
255 layout_bounds bounds; /* line boundary positions */
256
257 char modeline; /* t if this line is a modeline */
258
259 /* Dynamic array of display blocks */
260 display_block_dynarr *display_blocks;
261
262 /* Dynamic arrays of left and right glyph blocks */
263 glyph_block_dynarr *left_glyphs;
264 glyph_block_dynarr *right_glyphs;
265 };
266
267 typedef struct display_line_dynarr_type
268 {
269 Dynarr_declare (struct display_line);
270 } display_line_dynarr;
271
272 /* It could be argued that the following two structs belong in
273 extents.h, but they're only used by redisplay and it simplifies
274 the header files to put them here. */
275
276 typedef struct extent_dynarr_type
277 {
278 Dynarr_declare (struct extent *);
279 } extent_dynarr;
280
281 struct font_metric_info
282 {
283 int width;
284 int height; /* always ascent + descent; for convenience */
285 int ascent;
286 int descent;
287
288 char proportional_p;
289 };
290
291 /* NOTE NOTE NOTE: Currently the positions in an extent fragment
292 structure are Bytind's, not Bufpos's. This could change. */
293
294 struct extent_fragment
295 {
296 Lisp_Object object; /* buffer or string */
297 struct frame *frm;
298 Bytind pos, end;
299 extent_dynarr *extents;
300 glyph_block_dynarr *begin_glyphs, *end_glyphs;
301 int invisible:1;
302 int invisible_ellipses:1;
303 int previously_invisible:1;
304 int invisible_ellipses_already_displayed:1;
305 };
306
307
308 /*************************************************************************/
309 /* change flags */
310 /*************************************************************************/
311
312 /* Quick flags to signal redisplay. redisplay() sets them all to 0
313 when it finishes. If none of them are set when it starts, it
314 assumes that nothing needs to be done. Functions that make a change
315 that is (potentially) visible on the screen should set the
316 appropriate flag.
317
318 If any of these flags are set, redisplay will look more carefully
319 to see if anything has really changed. */
320
321 /* non-nil if the contents of a buffer have changed since the last time
322 redisplay completed */
323 extern int buffers_changed;
324 extern int buffers_changed_set;
325
326 /* Nonzero if head_clip or tail_clip of a buffer has changed
327 since last redisplay that finished */
328 extern int clip_changed;
329 extern int clip_changed_set;
330
331 /* non-nil if any extent has changed since the last time redisplay completed */
332 extern int extents_changed;
333 extern int extents_changed_set;
334
335 /* non-nil if any face has changed since the last time redisplay completed */
336 extern int faces_changed;
337
338 /* Nonzero means one or more frames have been marked as garbaged */
339 extern int frame_changed;
340
341 /* True if an icon is in need of updating somewhere. */
342 extern int icon_changed;
343 extern int icon_changed_set;
344
345 /* True if a menubar is in need of updating somewhere. */
346 extern int menubar_changed;
347 extern int menubar_changed_set;
348
349 /* true iff we should redraw the modelines on the next redisplay */
350 extern int modeline_changed;
351 extern int modeline_changed_set;
352
353 /* non-nil if point has changed in some buffer since the last time
354 redisplay completed */
355 extern int point_changed;
356 extern int point_changed_set;
357
358 /* non-nil if some frame has changed its size */
359 extern int size_changed;
360
361 /* non-nil if some device has signaled that it wants to change size */
362 extern int asynch_device_change_pending;
363
364 /* non-nil if any toolbar has changed */
365 extern int toolbar_changed;
366 extern int toolbar_changed_set;
367
368 /* non-nil if any window has changed since the last time redisplay completed */
369 extern int windows_changed;
370
371 /* non-nil if any frame's window structure has changed since the last
372 time redisplay completed */
373 extern int windows_structure_changed;
374
375 /* These macros can be relatively expensive. Since they are often
376 called numerous times between each call to redisplay, we keep track
377 if each has already been called and don't bother doing most of the
378 work if it is currently set. */
379
380 #define MARK_TYPE_CHANGED(object) do { \
381 if (!object##_changed_set) { \
382 Lisp_Object _devcons_, _concons_; \
383 DEVICE_LOOP_NO_BREAK (_devcons_, _concons_) \
384 { \
385 Lisp_Object _frmcons_; \
386 struct device *_d_ = XDEVICE (XCONS (_devcons_)->car); \
387 DEVICE_FRAME_LOOP (_frmcons_, _d_) \
388 { \
389 struct frame *_f_ = XFRAME (XCONS (_frmcons_)->car); \
390 _f_->object##_changed = 1; \
391 _f_->modiff++; \
392 } \
393 _d_->object##_changed = 1; \
394 } \
395 object##_changed = 1; \
396 object##_changed_set = 1; } \
397 } while (0)
398
399 #define MARK_BUFFERS_CHANGED MARK_TYPE_CHANGED (buffers)
400 #define MARK_CLIP_CHANGED MARK_TYPE_CHANGED (clip)
401 #define MARK_EXTENTS_CHANGED MARK_TYPE_CHANGED (extents)
402 #define MARK_ICON_CHANGED MARK_TYPE_CHANGED (icon)
403 #define MARK_MENUBAR_CHANGED MARK_TYPE_CHANGED (menubar)
404 #define MARK_MODELINE_CHANGED MARK_TYPE_CHANGED (modeline)
405 #define MARK_POINT_CHANGED MARK_TYPE_CHANGED (point)
406 #define MARK_TOOLBAR_CHANGED MARK_TYPE_CHANGED (toolbar)
407
408 /* Anytime a console, device or frame is added or deleted we need to reset
409 these flags. */
410 #define RESET_CHANGED_SET_FLAGS \
411 do { \
412 buffers_changed_set = 0; \
413 clip_changed_set = 0; \
414 extents_changed_set = 0; \
415 icon_changed_set = 0; \
416 menubar_changed_set = 0; \
417 modeline_changed_set = 0; \
418 point_changed_set = 0; \
419 toolbar_changed_set = 0; \
420 } while (0)
421
422
423 /*************************************************************************/
424 /* redisplay global variables */
425 /*************************************************************************/
426
427 /* redisplay structre used by various utility routines. */
428 extern display_line_dynarr *cmotion_display_lines;
429
430 /* nil or a symbol naming the window system
431 under which emacs is running
432 ('x is the only current possibility) */
433 extern Lisp_Object Vwindow_system;
434
435 /* Nonzero means truncate lines in all windows less wide than the frame. */
436 extern int truncate_partial_width_windows;
437
438 /* Nonzero if we're in a display critical section. */
439 extern int in_display;
440
441 /* Nonzero means no need to redraw the entire frame on resuming
442 a suspended Emacs. This is useful on terminals with multiple pages,
443 where one page is used for Emacs and another for all else. */
444 extern int no_redraw_on_reenter;
445
446 /* Nonzero means flash the frame instead of ringing the bell. */
447 extern int visible_bell;
448
449 /* Thickness of shadow border around 3D modelines. */
450 extern Lisp_Object Vmodeline_shadow_thickness;
451
452 /* Scroll if point lands on the bottom line and that line is partially
453 clipped. */
454 extern int scroll_on_clipped_lines;
455
456 extern Lisp_Object Vglobal_mode_string;
457
458 /* The following two variables are defined in emacs.c are are used
459 to convey information discovered on the command line way early
460 (before *anything* is initialized). */
461
462 /* If non-zero, a window-system was specified on the command line.
463 Defined in emacs.c. */
464 extern int display_arg;
465
466 /* Type of display specified. Defined in emacs.c. */
467 extern char *display_use;
468
469
470 /*************************************************************************/
471 /* redisplay exported functions */
472 /*************************************************************************/
473
474 int redisplay_text_width_string (struct window *w, int findex,
475 Bufbyte *nonreloc, Lisp_Object reloc,
476 Bytecount offset, Bytecount len);
477 int redisplay_frame_text_width_string (struct frame *f,
478 Lisp_Object face,
479 Bufbyte *nonreloc,
480 Lisp_Object reloc,
481 Bytecount offset, Bytecount len);
482 void redisplay (void);
483 struct display_block *get_display_block_from_line (struct display_line *dl,
484 enum display_type type);
485 layout_bounds calculate_display_line_boundaries (struct window *w,
486 int modeline);
487 Bufpos point_at_center (struct window *w, int type, Bufpos start,
488 Bufpos point);
489 int line_at_center (struct window *w, int type, Bufpos start, Bufpos point);
490 int window_half_pixpos (struct window *w);
491 void redisplay_echo_area (void);
492 void free_display_structs (struct window_mirror *mir);
493 char *generate_formatted_string (struct window *w, Lisp_Object format_str,
494 Lisp_Object result_str, face_index findex,
495 int type);
496 int real_current_modeline_height (struct window *w);
497 int pixel_to_glyph_translation (struct frame *f, int x_coord,
498 int y_coord, int *col, int *row,
499 int *obj_x, int *obj_y,
500 struct window **w, Bufpos *bufpos,
501 Bufpos *closest, Charcount *modeline_closest,
502 Lisp_Object *obj1, Lisp_Object *obj2);
503 void glyph_to_pixel_translation (struct window *w, int char_x,
504 int char_y, int *pix_x, int *pix_y);
505 void mark_redisplay (void (*) (Lisp_Object));
506 int point_in_line_start_cache (struct window *w, Bufpos point,
507 int min_past);
508 int point_would_be_visible (struct window *w, Bufpos startp,
509 Bufpos point);
510 Bufpos start_of_last_line (struct window *w, Bufpos startp);
511 Bufpos end_of_last_line (struct window *w, Bufpos startp);
512 Bufpos start_with_line_at_pixpos (struct window *w, Bufpos point,
513 int pixpos);
514 Bufpos start_with_point_on_display_line (struct window *w, Bufpos point,
515 int line);
516 int redisplay_variable_changed (Lisp_Object sym, Lisp_Object *val,
517 Lisp_Object in_object, int flags);
518 void redisplay_glyph_changed (Lisp_Object glyph, Lisp_Object property,
519 Lisp_Object locale);
520
521 #ifdef MEMORY_USAGE_STATS
522 int compute_display_line_dynarr_usage (display_line_dynarr *dyn,
523 struct overhead_stats *ovstats);
524 int compute_line_start_cache_dynarr_usage (line_start_cache_dynarr *dyn,
525 struct overhead_stats *ovstats);
526 #endif
527
528
529 /* defined in redisplay-output.c */
530 int get_next_display_block (layout_bounds bounds,
531 display_block_dynarr *dba, int start_pos,
532 int *next_start);
533 void redisplay_clear_bottom_of_window (struct window *w,
534 display_line_dynarr *ddla,
535 int min_start, int max_end);
536 void redisplay_update_line (struct window *w, int first_line,
537 int last_line, int update_values);
538 void redisplay_output_window (struct window *w);
539 int redisplay_move_cursor (struct window *w, Bufpos new_point,
540 int no_output_end);
541 void redisplay_redraw_cursor (struct frame *f, int run_begin_end_meths);
542 void output_display_line (struct window *w, display_line_dynarr *cdla,
543 display_line_dynarr *ddla, int line,
544 int force_start, int force_end);
545
546 #endif /* _XEMACS_REDISPLAY_H_ */