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