(struct Lisp_Cons, XCAR, XCDR, struct Lisp_Float): Change names of structure
[bpt/emacs.git] / src / dispextern.h
CommitLineData
c22ca93b 1/* Interface definitions for display code.
5f5c8ee5
GM
2 Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999
3 Free Software Foundation, Inc.
c22ca93b
JB
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
e5d77022 9the Free Software Foundation; either version 2, or (at your option)
c22ca93b
JB
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
c22ca93b 21
5f5c8ee5 22/* New redisplay written by Gerd Moellmann <gerd@acm.org>. */
87485d6f 23
5f5c8ee5
GM
24#ifndef DISPEXTERN_H_INCLUDED
25#define DISPEXTERN_H_INCLUDED
c22ca93b
JB
26
27#ifdef HAVE_X_WINDOWS
9f2279ad 28#include <X11/Xlib.h>
87485d6f
MW
29#endif
30
31#ifdef MSDOS
32#include "msdos.h"
33#endif
9f2279ad 34
497fbd42 35#ifdef HAVE_NTGUI
c0ac470c 36#include "w32gui.h"
497fbd42
GV
37#endif
38
5f5c8ee5
GM
39
40/* Structure forward declarations. Some are here because function
41 prototypes below reference structure types before their definition
42 in this file. Some are here because not every file including
43 dispextern.h also includes frame.h and windows.h. */
44
45struct glyph;
46struct glyph_row;
47struct glyph_matrix;
48struct glyph_pool;
49struct frame;
50struct window;
51
52
53\f
5f5c8ee5
GM
54/***********************************************************************
55 Debugging
56 ***********************************************************************/
57
58/* If GLYPH_DEBUG is non-zero, additional checks are activated. Turn
59 it off by defining the macro GLYPH_DEBUG to zero. */
60
61#ifndef GLYPH_DEBUG
62#define GLYPH_DEBUG 0
63#endif
64
65/* Macros to include code only if GLYPH_DEBUG != 0. */
66
67#if GLYPH_DEBUG
68#define IF_DEBUG(X) X
69#define xassert(X) if (!(X)) abort (); else (void) 0
70#else
71#define IF_DEBUG(X) (void) 0
72#define xassert(X) (void) 0
73#endif
74
75/* Macro for displaying traces of redisplay. If Emacs was compiled
76 with GLYPH_DEBUG != 0, the variable trace_redisplay_p can be set to
77 a non-zero value in debugging sessions to activate traces. */
78
79#if GLYPH_DEBUG
80
81extern int trace_redisplay_p;
82#include <stdio.h>
83
84#define TRACE(X) \
85 if (trace_redisplay_p) \
86 fprintf X; \
87 else \
88 (void) 0
89
90#else /* GLYPH_DEBUG == 0 */
91
92#define TRACE(X) (void) 0
93
94#endif /* GLYPH_DEBUG == 0 */
95
96
97\f
98/***********************************************************************
99 Text positions
100 ***********************************************************************/
101
102/* Starting with Emacs 20.3, characters from strings and buffers have
103 both a character and a byte position associated with them. The
104 following structure holds such a pair of positions. */
105
106struct text_pos
107{
108 /* Character position. */
109 int charpos;
110
111 /* Corresponding byte position. */
112 int bytepos;
113};
114
115/* Access character and byte position of POS in a functional form. */
116
117#define BYTEPOS(POS) (POS).bytepos
118#define CHARPOS(POS) (POS).charpos
119
120/* Set character position of POS to CHARPOS, byte position to BYTEPOS. */
121
122#define SET_TEXT_POS(POS, CHARPOS, BYTEPOS) \
123 ((POS).charpos = (CHARPOS), (POS).bytepos = BYTEPOS)
124
125/* Increment text position POS. */
126
127#define INC_TEXT_POS(POS) \
128 do \
129 { \
130 ++(POS).charpos; \
131 INC_POS ((POS).bytepos); \
132 } \
133 while (0)
134
135/* Decrement text position POS. */
136
137#define DEC_TEXT_POS(POS) \
138 do \
139 { \
140 --(POS).charpos; \
141 DEC_POS ((POS).bytepos); \
142 } \
143 while (0)
144
145/* Set text position POS from marker MARKER. */
146
147#define SET_TEXT_POS_FROM_MARKER(POS, MARKER) \
148 (CHARPOS (POS) = marker_position ((MARKER)), \
149 BYTEPOS (POS) = marker_byte_position ((MARKER)))
150
151/* Set marker MARKER from text position POS. */
152
153#define SET_MARKER_FROM_TEXT_POS(MARKER, POS) \
154 set_marker_both ((MARKER), Qnil, CHARPOS ((POS)), BYTEPOS ((POS)))
155
156/* Value is non-zero if character and byte positions of POS1 and POS2
157 are equal. */
158
159#define TEXT_POS_EQUAL_P(POS1, POS2) \
160 ((POS1).charpos == (POS2).charpos \
161 && (POS1).bytepos == (POS2).bytepos)
162
163/* When rendering glyphs, redisplay scans string or buffer text,
164 overlay strings in that text, and does display table or control
165 character translations. The following structure captures a
166 position taking all this into account. */
167
168struct display_pos
169{
170 /* Buffer or string position. */
171 struct text_pos pos;
172
173 /* If this is a position in an overlay string, overlay_string_index
174 is the index of that overlay string in the sequence of overlay
175 strings at `pos' in the order redisplay processes them. A value
176 < 0 means that this is not a position in an overlay string. */
177 int overlay_string_index;
178
179 /* If this is a position in an overlay string, string_pos is the
180 position within that string. */
181 struct text_pos string_pos;
182
183 /* If the character at the position above is a control character or
184 has a display table entry, dpvec_index is an index in the display
185 table or control character translation of that character. A
186 value < 0 means this is not a position in such a translation. */
187 int dpvec_index;
188};
189
190
191\f
192/***********************************************************************
193 Glyphs
194 ***********************************************************************/
195
196/* Enumeration of glyph types. Glyph structures contain a type field
197 containing one of the enumerators defined here. */
198
199enum glyph_type
200{
201 /* Glyph describes a character. */
202 CHAR_GLYPH,
203
204 /* Glyph describes an image. */
205 IMAGE_GLYPH,
206
207 /* Glyph is a space of fractional width and/or height. */
208 STRETCH_GLYPH
209};
210
211
212/* Glyphs. */
213
214struct glyph
215{
216 /* Position from which this glyph was drawn. If `object' below is a
217 Lisp string, this is a position in that string. If it is a
218 buffer, this is a position in that buffer. A value of -1
219 together with a null object means glyph is a truncation glyph at
220 the start of a row. */
221 int charpos;
222
223 /* Lisp object source of this glyph. Currently either a buffer or
224 a string, or 0. */
225 Lisp_Object object;
226
227 /* Width in pixels. */
228 short pixel_width;
229
230 /* Vertical offset. If < 0, the glyph is displayed raised, if > 0
231 the glyph is displayed lowered. */
232 short voffset;
233
234 /* Which kind of glyph this is---character, image etc. Value
235 should be an enumerator of type enum glyph_type. */
236 unsigned type : 2;
237
238 /* 1 means this glyph was produced from multibyte text. Zero
239 means it was produced from unibyte text, i.e. charsets aren't
240 applicable, and encoding is not performed. */
241 unsigned multibyte_p : 1;
242
243 /* Non-zero means draw a box line at the left or right side of this
244 glyph. This is part of the implementation of the face attribute
245 `:box'. */
246 unsigned left_box_line_p : 1;
247 unsigned right_box_line_p : 1;
248
2febf6e0
GM
249 /* Non-zero means this glyph's physical ascent or descent is greater
250 than its logical ascent/descent, i.e. it may potentially overlap
251 glyphs above or below it. */
252 unsigned overlaps_vertically_p : 1;
253
5f5c8ee5
GM
254 /* A union of sub-structures for different glyph types. */
255 union
256 {
257 /* Sub-structure for character glyphs (type == CHAR_GLYPH). */
258 struct
259 {
260 /* Character code. */
261 unsigned code : 19;
262
263 /* Character's face. */
264 unsigned face_id : 11;
265
266 /* 1 means glyph is a padding glyph. Padding glyphs are used
267 for characters whose visual shape consists of more than one
268 glyph (e.g. Asian characters). All but the first glyph of
269 such a glyph sequence have the padding_p flag set. Only used
270 for terminal frames, and there only to minimize code changes.
271 A better way would probably be to use the width field of
272 glyphs to express padding. */
273 unsigned padding_p : 1;
274 }
275 ch;
276
277 /* Sub-structure for image glyphs (type == IMAGE_GLYPH). */
278 struct
279 {
280 /* Image id. */
281 unsigned id : 20;
282
283 /* Face under the image. */
284 unsigned face_id : 12;
285 }
286 img;
287
288 /* Sub-structure for type == STRETCH_GLYPH. */
289 struct
290 {
291 /* The height of the glyph. */
292 unsigned height : 11;
293
294 /* The ascent of the glyph. */
295 unsigned ascent : 10;
296
297 /* The face of the stretch glyph. */
298 unsigned face_id : 11;
299 }
300 stretch;
301
302 /* Used to compare all bit-fields above in one step. */
303 unsigned val;
304 } u;
305};
306
307
308/* Is GLYPH a space? */
309
310#define CHAR_GLYPH_SPACE_P(GLYPH) \
311 (GLYPH_FROM_CHAR_GLYPH ((GLYPH)) == SPACEGLYPH)
312
313/* Are glyphs *X and *Y equal? */
314
315#define GLYPH_EQUAL_P(X, Y) \
316 ((X)->type == (Y)->type \
317 && (X)->u.val == (Y)->u.val \
318 && (X)->left_box_line_p == (Y)->left_box_line_p \
319 && (X)->right_box_line_p == (Y)->right_box_line_p \
320 && (X)->voffset == (Y)->voffset)
321
322/* Fill a character glyph GLYPH. CODE, FACE_ID, PADDING_P correspond
323 to the bits defined for the typedef `GLYPH' in lisp.h. */
324
325#define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P) \
326 do \
327 { \
328 (GLYPH).u.ch.code = (CODE); \
329 (GLYPH).u.ch.face_id = (FACE_ID); \
330 (GLYPH).u.ch.padding_p = (PADDING_P); \
331 } \
332 while (0)
333
334/* Fill a character type glyph GLYPH from a glyph typedef FROM as
335 defined in lisp.h. */
336
337#define SET_CHAR_GLYPH_FROM_GLYPH(GLYPH, FROM) \
338 SET_CHAR_GLYPH ((GLYPH), \
339 FAST_GLYPH_CHAR ((FROM)), \
340 FAST_GLYPH_FACE ((FROM)), \
341 ((FROM) & GLYPH_MASK_PADDING) != 0)
342
343/* Construct a typedef'd GLYPH value from a character glyph GLYPH. */
344
345#define GLYPH_FROM_CHAR_GLYPH(GLYPH) \
346 ((GLYPH).u.ch.code \
347 | ((GLYPH).u.ch.face_id << CHARACTERBITS) \
348 | ((GLYPH).u.ch.padding_p ? GLYPH_MASK_PADDING : 0))
349
350/* Is GLYPH a padding glyph? */
351
352#define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).u.ch.padding_p
353
354
355
356\f
357/***********************************************************************
358 Glyph Pools
359 ***********************************************************************/
360
361/* Glyph Pool.
362
363 Glyph memory for frame-based redisplay is allocated from the heap
364 in one vector kept in a glyph pool structure which is stored with
365 the frame. The size of the vector is made large enough to cover
366 all windows on the frame.
367
368 Both frame and window glyph matrices reference memory from a glyph
369 pool in frame-based redisplay.
370
371 In window-based redisplay, no glyphs pools exist; windows allocate
372 and free their glyph memory themselves. */
373
374struct glyph_pool
375{
376 /* Vector of glyphs allocated from the heap. */
377 struct glyph *glyphs;
378
379 /* Allocated size of `glyphs'. */
380 int nglyphs;
381
382 /* Number of rows and columns in a matrix. */
383 int nrows, ncolumns;
384};
385
386
387\f
388/***********************************************************************
389 Glyph Matrix
390 ***********************************************************************/
391
392/* Glyph Matrix.
393
394 Three kinds of glyph matrices exist:
395
396 1. Frame glyph matrices. These are used for terminal frames whose
397 redisplay needs a view of the whole screen due to limited terminal
398 capabilities. Frame matrices are used only in the update phase
399 of redisplay. They are built in update_frame and not used after
400 the update has been performed.
401
402 2. Window glyph matrices on frames having frame glyph matrices.
403 Such matrices are sub-matrices of their corresponding frame matrix,
404 i.e. frame glyph matrices and window glyph matrices share the same
405 glyph memory which is allocated in form of a glyph_pool structure.
406 Glyph rows in such a window matrix are slices of frame matrix rows.
407
408 2. Free-standing window glyph matrices managing their own glyph
409 storage. This form is used in window-based redisplay which
410 includes variable width and height fonts etc.
411
412 The size of a window's row vector depends on the height of fonts
413 defined on its frame. It is chosen so that the vector is large
414 enough to describe all lines in a window when it is displayed in
415 the smallest possible character size. When new fonts are loaded,
416 or window sizes change, the row vector is adjusted accordingly. */
417
418struct glyph_matrix
419{
420 /* The pool from which glyph memory is allocated, if any. This is
421 null for frame matrices and for window matrices managing their
422 own storage. */
423 struct glyph_pool *pool;
424
425 /* Vector of glyph row structures. The row at nrows - 1 is reserved
426 for the mode line. */
427 struct glyph_row *rows;
428
429 /* Number of elements allocated for the vector rows above. */
430 int rows_allocated;
431
432 /* The number of rows used by the window if all lines were displayed
433 with the smallest possible character height. */
434 int nrows;
435
436 /* Origin within the frame matrix if this is a window matrix on a
437 frame having a frame matrix. Both values are zero for
438 window-based redisplay. */
439 int matrix_x, matrix_y;
440
441 /* Width and height of the matrix in columns and rows. */
442 int matrix_w, matrix_h;
443
444 /* If this structure describes a window matrix, window_top_y is the
445 top-most y-position and window_height is the height of the
446 window, and window_vscroll is the vscroll at the time the matrix
447 was last adjusted. Only set for window-based redisplay. */
448 int window_top_y, window_height, window_width, window_vscroll;
449
450 /* Number of glyphs reserved for left and right marginal areas when
451 the matrix was last adjusted. */
452 int left_margin_glyphs, right_margin_glyphs;
453
454 /* Flag indicating that scrolling should not be tried in
455 update_window. This flag is set by functions like try_window_id
456 which do their own scrolling. */
457 unsigned no_scrolling_p : 1;
458
459 /* Non-zero means window displayed in this matrix has a top mode
460 line. */
461 unsigned top_line_p : 1;
462
463#ifdef GLYPH_DEBUG
464 /* A string identifying the method used to display the matrix. */
465 char method[512];
466#endif
2201e367
GM
467
468 /* The buffer this matrix displays. Set in redisplay_internal. */
469 struct buffer *buffer;
470
471 /* Values of BEGV and ZV as of last redisplay. */
472 int begv, zv;
5f5c8ee5
GM
473};
474
475
476/* Check that glyph pointers stored in glyph rows of MATRIX are okay.
477 This aborts if any pointer is found twice. */
478
479#if GLYPH_DEBUG
480void check_matrix_pointer_lossage P_ ((struct glyph_matrix *));
481#define CHECK_MATRIX(MATRIX) check_matrix_pointer_lossage ((MATRIX))
482#else
483#define CHECK_MATRIX(MATRIX) (void) 0
484#endif
485
486
487\f
488/***********************************************************************
489 Glyph Rows
490 ***********************************************************************/
491
492/* Area in window glyph matrix. If values are added or removed, the
493 function mark_object in alloc.c has to be changed. */
494
495enum glyph_row_area
496{
497 LEFT_MARGIN_AREA,
498 TEXT_AREA,
499 RIGHT_MARGIN_AREA,
500 LAST_AREA
501};
502
503
504/* Rows of glyphs in a windows or frame glyph matrix.
505
506 Each row is partitioned into three areas. The start and end of
507 each area is recorded in a pointer as shown below.
508
509 +--------------------+-------------+---------------------+
510 | left margin area | text area | right margin area |
511 +--------------------+-------------+---------------------+
512 | | | |
513 glyphs[LEFT_MARGIN_AREA] glyphs[RIGHT_MARGIN_AREA]
514 | |
515 glyphs[TEXT_AREA] |
516 glyphs[LAST_AREA]
517
518 Rows in frame matrices reference glyph memory allocated in a frame
519 glyph pool (see the description of struct glyph_pool). Rows in
520 window matrices on frames having frame matrices reference slices of
521 the glyphs of corresponding rows in the frame matrix.
522
523 Rows in window matrices on frames having no frame matrices point to
524 glyphs allocated from the heap via xmalloc;
525 glyphs[LEFT_MARGIN_AREA] is the start address of the allocated
526 glyph structure array. */
527
528struct glyph_row
529{
530 /* Pointers to beginnings of areas. The end of an area A is found at
531 A + 1 in the vector. The last element of the vector is the end
532 of the whole row.
533
534 Kludge alert: Even if used[TEXT_AREA] == 0, glyphs[TEXT_AREA][0]'s
535 position field is used. It is -1 if this row does not correspond
536 to any text; it is some buffer position if the row corresponds to
537 an empty display line that displays a line end. This is what old
538 redisplay used to do. (Except in code for terminal frames, this
539 kludge is no longer use, I believe. --gerd).
540
541 See also start, end, displays_text_p and ends_at_zv_p for cleaner
542 ways to do it. The special meaning of positions 0 and -1 will be
543 removed some day, so don't use it in new code. */
544 struct glyph *glyphs[1 + LAST_AREA];
545
546 /* Number of glyphs actually filled in areas. */
547 short used[LAST_AREA];
548
549 /* Window-relative x and y-position of the top-left corner of this
550 row. If y < 0, this means that abs (y) pixels of the row are
551 invisible because it is partially visible at the top of a window.
552 If x < 0, this means that abs (x) pixels of the first glyph of
553 the text area of the row are invisible because the glyph is
554 partially visible. */
555 int x, y;
556
557 /* Width of the row in pixels without taking face extension at the
558 end of the row into account. */
559 int pixel_width;
560
2febf6e0
GM
561 /* Logical ascent/height of this line. The value of ascent is zero
562 and height is 1 on terminal frames. */
5f5c8ee5
GM
563 int ascent, height;
564
2febf6e0
GM
565 /* Physical ascent/height of this line. If max_ascent > ascent,
566 this line overlaps the line above it on the display. Otherwise,
567 if max_height > height, this line overlaps the line beneath it. */
568 int phys_ascent, phys_height;
569
5f5c8ee5
GM
570 /* Portion of row that is visible. Partially visible rows may be
571 found at the top and bottom of a window. This is 1 for tty
572 frames. It may be < 0 in case of completely invisible rows. */
573 int visible_height;
574
575 /* Hash code. This hash code is available as soon as the row
576 is constructed, i.e. after a call to display_line. */
577 unsigned hash;
578
579 /* First position in this row. This is the text position, including
580 overlay position information etc, where the display of this row
581 started, and can thus be less the position of the first glyph
582 (e.g. due to invisible text or horizontal scrolling). */
583 struct display_pos start;
584
585 /* Text position at the end of this row. This is the position after
586 the last glyph on this row. It can be greater than the last
587 glyph position + 1, due to truncation, invisible text etc. In an
588 up-to-date display, this should always be equal to the start
589 position of the next row. */
590 struct display_pos end;
591
592 /* In a desired matrix, 1 means that this row must be updated. In a
593 current matrix, 0 means that the row has been invalidated, i.e.
594 the row's contents do not agree with what is visible on the
595 screen. */
596 unsigned enabled_p : 1;
597
598 /* Display this line in inverse video? Used for the mode line and
599 menu bar lines. */
600 unsigned inverse_p : 1;
601
602 /* 1 means row displays a text line that is truncated on the left or
603 right side. */
604 unsigned truncated_on_left_p : 1;
605 unsigned truncated_on_right_p : 1;
606
607 /* 1 means the overlay arrow is on this line. */
608 unsigned overlay_arrow_p : 1;
609
610 /* 1 means that this row displays a continued line, i.e. it has a
611 continuation mark at the right side. */
612 unsigned continued_p : 1;
613
614 /* 0 means that this row does not contain any text, i.e. it is
615 a blank line at the window and buffer end. */
616 unsigned displays_text_p : 1;
617
618 /* 1 means that this line ends at ZV. */
619 unsigned ends_at_zv_p : 1;
620
621 /* 1 means the face of the last glyph in the text area is drawn to
622 the right end of the window. This flag is used in
623 update_text_area to optimize clearing to the end of the area. */
624 unsigned fill_line_p : 1;
625
626 /* Non-zero means display a bitmap on X frames indicating that this
627 line contains no text and ends in ZV. */
628 unsigned indicate_empty_line_p : 1;
629
630 /* 1 means this row contains glyphs that overlap each other because
631 of lbearing or rbearing. */
632 unsigned contains_overlapping_glyphs_p : 1;
633
634 /* 1 means this row is a wide as the window it is displayed in, including
635 scroll bars, bitmap areas, and internal borders. This also
636 implies that the row doesn't have marginal areas. */
637 unsigned full_width_p : 1;
638
5f5c8ee5
GM
639 /* Non-zero means row is a mode or top-line. */
640 unsigned mode_line_p : 1;
641
2febf6e0
GM
642 /* 1 in a current row means this row is overlapped by another row. */
643 unsigned overlapped_p : 1;
644
645 /* 1 in a current row means this row overlaps others. */
646 unsigned overlapping_p : 1;
647
5f5c8ee5
GM
648 /* Continuation lines width at the start of the row. */
649 int continuation_lines_width;
650};
651
652
653/* Get a pointer to row number ROW in matrix MATRIX. If GLYPH_DEBUG
654 is defined to a non-zero value, the function matrix_row checks that
655 we don't try to access rows that are out of bounds. */
656
657#if GLYPH_DEBUG
658struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
659#define MATRIX_ROW(MATRIX, ROW) matrix_row ((MATRIX), (ROW))
660#else
661#define MATRIX_ROW(MATRIX, ROW) ((MATRIX)->rows + (ROW))
662#endif
663
664/* Return a pointer to the row reserved for the mode line in MATRIX.
665 Row MATRIX->nrows - 1 is always reserved for the mode line. */
666
667#define MATRIX_MODE_LINE_ROW(MATRIX) \
668 ((MATRIX)->rows + (MATRIX)->nrows - 1)
669
670/* Return a pointer to the row reserved for the top line in MATRIX.
671 This is always the first row in MATRIX because that's the only
672 way that works in frame-based redisplay. */
673
674#define MATRIX_TOP_LINE_ROW(MATRIX) (MATRIX)->rows
675
676/* Return a pointer to first row in MATRIX used for text display. */
677
678#define MATRIX_FIRST_TEXT_ROW(MATRIX) \
679 ((MATRIX)->rows->mode_line_p ? (MATRIX)->rows + 1 : (MATRIX)->rows)
680
681/* Return a pointer to the first glyph in the text area of a row.
682 MATRIX is the glyph matrix accessed, and ROW is the row index in
683 MATRIX. */
684
685#define MATRIX_ROW_GLYPH_START(MATRIX, ROW) \
686 (MATRIX_ROW ((MATRIX), (ROW))->glyphs[TEXT_AREA])
687
688/* Return the number of used glyphs in the text area of a row. */
689
690#define MATRIX_ROW_USED(MATRIX, ROW) \
691 (MATRIX_ROW ((MATRIX), (ROW))->used[TEXT_AREA])
692
693/* Return the character/ byte position at which the display of ROW
694 starts. */
695
696#define MATRIX_ROW_START_CHARPOS(ROW) ((ROW)->start.pos.charpos)
697#define MATRIX_ROW_START_BYTEPOS(ROW) ((ROW)->start.pos.bytepos)
698
699/* Return character/ byte position at which ROW ends. */
700
701#define MATRIX_ROW_END_CHARPOS(ROW) ((ROW)->end.pos.charpos)
702#define MATRIX_ROW_END_BYTEPOS(ROW) ((ROW)->end.pos.bytepos)
703
704/* Return the vertical position of ROW in MATRIX. */
705
706#define MATRIX_ROW_VPOS(ROW, MATRIX) ((ROW) - (MATRIX)->rows)
707
708/* Return the last glyph row + 1 in MATRIX on window W reserved for
709 text. If W has a mode line, the last row in the matrix is reserved
710 for it. */
711
712#define MATRIX_BOTTOM_TEXT_ROW(MATRIX, W) \
713 ((MATRIX)->rows \
714 + (MATRIX)->nrows \
715 - (WINDOW_WANTS_MODELINE_P ((W)) ? 1 : 0))
716
717/* Non-zero if the face of the last glyph in ROW's text area has
718 to be drawn to the end of the text area. */
719
720#define MATRIX_ROW_EXTENDS_FACE_P(ROW) ((ROW)->fill_line_p)
721
722/* Set and query the enabled_p flag of glyph row ROW in MATRIX. */
723
724#define SET_MATRIX_ROW_ENABLED_P(MATRIX, ROW, VALUE) \
725 (MATRIX_ROW ((MATRIX), (ROW))->enabled_p = (VALUE) != 0)
726
727#define MATRIX_ROW_ENABLED_P(MATRIX, ROW) \
728 (MATRIX_ROW ((MATRIX), (ROW))->enabled_p)
729
730/* Non-zero if ROW displays text. Value is non-zero if the row is
731 blank but displays a line end. */
732
733#define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p)
734
735/* Non-zero if ROW is not completely visible in window W. */
736
737#define MATRIX_ROW_PARTIALLY_VISIBLE_P(ROW) \
738 ((ROW)->height != (ROW)->visible_height)
739
740/* Non-zero if ROW is partially visible at the top of window W. */
741
742#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW) \
743 (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \
744 && (ROW)->y < WINDOW_DISPLAY_TOP_LINE_HEIGHT ((W)))
745
746/* Non-zero if ROW is partially visible at the bottom of window W. */
747
748#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \
749 (MATRIX_ROW_PARTIALLY_VISIBLE_P ((ROW)) \
750 && (ROW)->y + (ROW)->height > WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE ((W)))
751
752/* Return the bottom Y + 1 of ROW. */
753
754#define MATRIX_ROW_BOTTOM_Y(ROW) ((ROW)->y + (ROW)->height)
755
756/* Is ROW the last visible one in the display described by the
757 iterator structure pointed to by IT?. */
758
759#define MATRIX_ROW_LAST_VISIBLE_P(ROW, IT) \
760 (MATRIX_ROW_BOTTOM_Y ((ROW)) >= (IT)->last_visible_y)
761
762/* Non-zero if ROW displays a continuation line. */
763
764#define MATRIX_ROW_CONTINUATION_LINE_P(ROW) \
765 ((ROW)->continuation_lines_width > 0)
766
767/* Non-zero if ROW ends in the middle of a character. This is the
768 case for continued lines showing only part of a display table entry
769 or a control char, or an overlay string. */
770
771#define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW) \
772 ((ROW)->end.dpvec_index >= 0 \
773 || (ROW)->end.overlay_string_index >= 0)
774
775/* Non-zero if ROW ends in the middle of an overlay string. */
776
777#define MATRIX_ROW_ENDS_IN_OVERLAY_STRING_P(ROW) \
778 ((ROW)->end.overlay_string_index >= 0)
779
780/* Non-zero if ROW starts in the middle of a character. See above. */
781
782#define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW) \
783 ((ROW)->start.dpvec_index >= 0 \
784 || ((ROW)->start.overlay_string_index >= 0 \
785 && (ROW)->start.string_pos.charpos > 0))
786
2febf6e0
GM
787/* Non-zero means ROW overlaps its predecessor. */
788
789#define MATRIX_ROW_OVERLAPS_PRED_P(ROW) \
790 ((ROW)->phys_ascent > (ROW)->ascent)
791
792/* Non-zero means ROW overlaps its successor. */
793
794#define MATRIX_ROW_OVERLAPS_SUCC_P(ROW) \
795 ((ROW)->phys_height - (ROW)->phys_ascent \
796 > (ROW)->height - (ROW)->ascent)
797
5f5c8ee5
GM
798/* Non-zero means that fonts have been loaded since the last glyph
799 matrix adjustments. The function redisplay_internal adjusts glyph
800 matrices when this flag is non-zero. */
801
802extern int fonts_changed_p;
803
804/* A glyph for a space. */
805
806extern struct glyph space_glyph;
807
808/* Window being updated by update_window. This is non-null as long as
809 update_window has not finished, and null otherwise. It's role is
810 analogous to updating_frame. */
811
812extern struct window *updated_window;
813
814/* Glyph row and area updated by update_window_line. */
815
816extern struct glyph_row *updated_row;
817extern int updated_area;
818
819/* Non-zero means reading single-character input with prompt so put
820 cursor on mini-buffer after the prompt. Positive means at end of
821 text in echo area; negative means at beginning of line. */
822
823extern int cursor_in_echo_area;
824
825/* Non-zero means last display completed. Zero means it was
826 preempted. */
827
828extern int display_completed;
829
830/* Non-zero means redisplay has been performed directly (see also
831 direct_output_for_insert and direct_output_forward_char), so that
832 no further updating has to be performed. The function
833 redisplay_internal checks this flag, and does nothing but reset it
834 to zero if it is non-zero. */
835
836extern int redisplay_performed_directly_p;
837
838/* A temporary storage area, including a row of glyphs. Initialized
839 in xdisp.c. Used for various purposes, as an example see
840 direct_output_for_insert. */
841
842extern struct glyph_row scratch_glyph_row;
843
844
845\f
846/************************************************************************
847 Display Dimensions
848 ************************************************************************/
849
850/* Return the height of the mode line in glyph matrix MATRIX, or zero
851 if not known. This macro is called under circumstances where
852 MATRIX might not have been allocated yet. */
853
854#define MATRIX_MODE_LINE_HEIGHT(MATRIX) \
855 ((MATRIX) && (MATRIX)->rows \
856 ? MATRIX_MODE_LINE_ROW (MATRIX)->height \
857 : 0)
858
859/* Return the height of the top line in glyph matrix MATRIX, or zero
860 if not known. This macro is called under circumstances where
861 MATRIX might not have been allocated yet. */
862
863#define MATRIX_TOP_LINE_HEIGHT(MATRIX) \
864 ((MATRIX) && (MATRIX)->rows \
865 ? MATRIX_TOP_LINE_ROW (MATRIX)->height \
866 : 0)
867
868/* Return the current height of the mode line of window W. If not
869 known from W's current glyph matrix, return a default based on the
870 height of the font of the face `modeline'. */
871
872#define CURRENT_MODE_LINE_HEIGHT(W) \
873 (MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \
874 ? MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \
875 : estimate_mode_line_height (XFRAME ((W)->frame), MODE_LINE_FACE_ID))
876
877/* Return the current height of the top line of window W. If not
878 known from W's current glyph matrix, return an estimation based on
879 the height of the font of the face `top-line'. */
880
881#define CURRENT_TOP_LINE_HEIGHT(W) \
882 (MATRIX_TOP_LINE_HEIGHT ((W)->current_matrix) \
883 ? MATRIX_TOP_LINE_HEIGHT ((W)->current_matrix) \
884 : estimate_mode_line_height (XFRAME ((W)->frame), TOP_LINE_FACE_ID))
885
886/* Return the height of the desired mode line of window W. */
887
888#define DESIRED_MODE_LINE_HEIGHT(W) \
889 MATRIX_MODE_LINE_HEIGHT ((W)->desired_matrix)
890
891/* Return the height of the desired top line of window W. */
892
893#define DESIRED_TOP_LINE_HEIGHT(W) \
894 MATRIX_TOP_LINE_HEIGHT ((W)->desired_matrix)
895
896/* Like FRAME_INTERNAL_BORDER_WIDTH but checks whether frame F is a
897 window-system frame. */
898
899#define FRAME_INTERNAL_BORDER_WIDTH_SAFE(F) \
900 (FRAME_WINDOW_P (F) ? FRAME_INTERNAL_BORDER_WIDTH (F) : 0)
901
902/* Width of display region of window W. For terminal frames, this
903 equals the width of W since there are no vertical scroll bars. For
904 window system frames, the value has to be corrected by the pixel
905 width of vertical scroll bars, and bitmap areas. */
906
907#define WINDOW_DISPLAY_PIXEL_WIDTH(W) \
908 (((XFASTINT ((W)->width) \
909 - FRAME_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME ((W)))) \
910 - 2 * FRAME_FLAGS_AREA_COLS (XFRAME (WINDOW_FRAME ((W))))) \
911 * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))))
912
913/* Height of the display region of W, including a mode line, if any. */
914
915#define WINDOW_DISPLAY_PIXEL_HEIGHT(W) \
916 (XFASTINT ((W)->height) \
917 * CANON_Y_UNIT (XFRAME (WINDOW_FRAME ((W)))))
918
919/* Height in pixels of the mode line. May be zero if W doesn't have a
920 mode line. */
921
922#define WINDOW_DISPLAY_MODE_LINE_HEIGHT(W) \
923 (WINDOW_WANTS_MODELINE_P ((W)) \
924 ? CURRENT_MODE_LINE_HEIGHT (W) \
925 : 0)
926
927/* Height in pixels of the top line. Zero if W doesn't have a top
928 line. */
929
930#define WINDOW_DISPLAY_TOP_LINE_HEIGHT(W) \
931 (WINDOW_WANTS_TOP_LINE_P ((W)) \
932 ? CURRENT_TOP_LINE_HEIGHT (W) \
933 : 0)
934
935/* Pixel height of window W without mode line. */
936
937#define WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE(W) \
938 (WINDOW_DISPLAY_PIXEL_HEIGHT ((W)) \
939 - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W)))
940
941/* Pixel height of window W without mode and top line. */
942
943#define WINDOW_DISPLAY_TEXT_HEIGHT(W) \
944 (WINDOW_DISPLAY_PIXEL_HEIGHT ((W)) \
945 - WINDOW_DISPLAY_MODE_LINE_HEIGHT ((W)) \
946 - WINDOW_DISPLAY_TOP_LINE_HEIGHT ((W)))
947
948/* Left edge of W in pixels relative to its frame. */
949
950#define WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X(W) \
951 (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W)))) \
952 + (WINDOW_LEFT_MARGIN ((W)) \
953 * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))) \
954 + FRAME_FLAGS_AREA_WIDTH (XFRAME (WINDOW_FRAME ((W)))))
955
956/* Right edge of window W in pixels, relative to its frame. */
957
958#define WINDOW_DISPLAY_RIGHT_EDGE_PIXEL_X(W) \
959 (WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X ((W)) \
960 + WINDOW_DISPLAY_PIXEL_WIDTH ((W)))
961
962/* Top edge of W in pixels relative to its frame. */
963
964#define WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y(W) \
965 (FRAME_INTERNAL_BORDER_WIDTH_SAFE (XFRAME (WINDOW_FRAME ((W)))) \
966 + (XFASTINT ((W)->top) \
967 * CANON_Y_UNIT (XFRAME (WINDOW_FRAME ((W))))))
968
969/* Bottom edge of window W relative to its frame. */
970
971#define WINDOW_DISPLAY_BOTTOM_EDGE_PIXEL_Y(W) \
972 (WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W)) \
973 + WINDOW_DISPLAY_PIXEL_HEIGHT ((W)))
974
975/* Convert window W relative pixel X to frame pixel coordinates. */
976
977#define WINDOW_TO_FRAME_PIXEL_X(W, X) \
978 ((X) + WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X ((W)))
979
980/* Convert window W relative pixel Y to frame pixel coordinates. */
981
982#define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \
983 ((Y) + WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W)))
984
985/* Convert frame relative pixel X to window relative pixel X. */
986
987#define FRAME_TO_WINDOW_PIXEL_X(W, X) \
988 ((X) - WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X ((W)))
989
990/* Convert frame relative pixel X to window relative pixel Y. */
991
992#define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \
993 ((Y) - WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y ((W)))
994
995/* Width of left margin area in pixels. */
996
997#define WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH(W) \
998 (NILP ((W)->left_margin_width) \
999 ? 0 \
1000 : (XINT ((W)->left_margin_width) \
1001 * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))))
1002
1003/* Width of right marginal area in pixels. */
1004
1005#define WINDOW_DISPLAY_RIGHT_AREA_PIXEL_WIDTH(W) \
1006 (NILP ((W)->right_margin_width) \
1007 ? 0 \
1008 : (XINT ((W)->right_margin_width) \
1009 * CANON_X_UNIT (XFRAME (WINDOW_FRAME ((W))))))
1010
1011/* Width of text area in pixels. */
1012
1013#define WINDOW_DISPLAY_TEXT_AREA_PIXEL_WIDTH(W) \
1014 (WINDOW_DISPLAY_PIXEL_WIDTH ((W)) \
1015 - WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)) \
1016 - WINDOW_DISPLAY_RIGHT_AREA_PIXEL_WIDTH ((W)))
1017
1018/* Convert a text area relative x-position in window W to frame X
1019 pixel coordinates. */
1020
1021#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \
1022 (WINDOW_TO_FRAME_PIXEL_X ((W), (X)) \
1023 + WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)))
1024
1025/* Translate an x-position relative to AREA in window W to frame pixel
1026 coordinates. */
1027
1028#define WINDOW_AREA_TO_FRAME_PIXEL_X(W, AREA, X) \
1029 (WINDOW_TO_FRAME_PIXEL_X ((W), (X)) \
1030 + (((AREA) > LEFT_MARGIN_AREA) \
1031 ? WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)) \
1032 : 0) \
1033 + (((AREA) > TEXT_AREA) \
1034 ? WINDOW_DISPLAY_TEXT_AREA_PIXEL_WIDTH ((W)) \
1035 : 0))
1036
1037/* Return the pixel width of AREA in W. */
1038
1039#define WINDOW_AREA_PIXEL_WIDTH(W, AREA) \
1040 (((AREA) == TEXT_AREA) \
1041 ? WINDOW_DISPLAY_TEXT_AREA_PIXEL_WIDTH ((W)) \
1042 : (((AREA) == LEFT_MARGIN_AREA) \
1043 ? WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH ((W)) \
1044 : WINDOW_DISPLAY_RIGHT_AREA_PIXEL_WIDTH ((W))))
1045
1046/* Value is non-zero if window W has a mode line. */
1047
1048#define WINDOW_WANTS_MODELINE_P(W) \
1049 (!MINI_WINDOW_P (W) \
1050 && !(W)->pseudo_window_p \
1051 && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W))) \
1052 && !NILP (XBUFFER ((W)->buffer)->mode_line_format))
1053
1054/* Value is non-zero if window W wants a top line. */
1055
1056#define WINDOW_WANTS_TOP_LINE_P(W) \
1057 (!MINI_WINDOW_P (W) \
1058 && !(W)->pseudo_window_p \
1059 && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME (W))) \
1060 && !NILP (XBUFFER ((W)->buffer)->top_line_format))
1061
1062\f
1063/***********************************************************************
1064 Faces
1065 ***********************************************************************/
1066
1067/* Indices of face attributes in Lisp face vectors. Slot zero is the
1068 symbol `face'. */
1069
1070enum lface_attribute_index
1071{
1072 LFACE_FAMILY_INDEX = 1,
1073 LFACE_SWIDTH_INDEX,
1074 LFACE_HEIGHT_INDEX,
1075 LFACE_WEIGHT_INDEX,
1076 LFACE_SLANT_INDEX,
1077 LFACE_UNDERLINE_INDEX,
1078 LFACE_INVERSE_INDEX,
1079 LFACE_FOREGROUND_INDEX,
1080 LFACE_BACKGROUND_INDEX,
1081 LFACE_STIPPLE_INDEX,
1082 LFACE_OVERLINE_INDEX,
1083 LFACE_STRIKE_THROUGH_INDEX,
1084 LFACE_BOX_INDEX,
1085 LFACE_VECTOR_SIZE
1086};
1087
1088
1089/* Box types of faces. */
1090
1091enum face_box_type
1092{
1093 /* No box around text. */
1094 FACE_NO_BOX,
1095
1096 /* Simple box of specified width and color. Default width is 1, and
1097 default color is the foreground color of the face. */
1098 FACE_SIMPLE_BOX,
1099
1100 /* Boxes with 3D shadows. Color equals the background color of the
1101 face. Width is specified. */
1102 FACE_RAISED_BOX,
1103 FACE_SUNKEN_BOX
1104};
1105
1106
1107/* Structure describing a realized face.
1108
1109 For each Lisp face, 0..N realized faces can exist for different
1110 frames and different charsets. Realized faces are built from Lisp
1111 faces and text properties/overlays by merging faces and adding
1112 unspecified attributes from the `default' face. */
1113
9f2279ad 1114struct face
5f5c8ee5
GM
1115{
1116 /* The id of this face. The id equals the index of this face in the
1117 vector faces_by_id of its face cache. */
1118 int id;
1119
1120#ifdef HAVE_WINDOW_SYSTEM
1121
1122 /* If non-zero, a GC we can use without modification to draw
1123 characters in this face. */
1124 GC gc;
1125
1126 /* Font used for this face, or null if the font could not be loaded
1127 for some reason. This points to a `font' slot of a struct
1128 font_info, and we should not call XFreeFont on it because the
1129 font may still be used somewhere else. */
1130 XFontStruct *font;
1131
1132 /* Background stipple or bitmap used for this face. */
1133 Pixmap stipple;
1134
1135#else /* not HAVE_WINDOW_SYSTEM */
1136
1137 /* Dummy. */
1138 int stipple;
1139
1140#endif /* not HAVE_WINDOW_SYSTEM */
1141
1142 /* Pixel value of foreground color for X frames. Color index
1143 for tty frames. */
1144 unsigned long foreground;
1145
1146 /* Pixel value or color index of background color. */
1147 unsigned long background;
1148
1149 /* Pixel value or color index of underline color. */
1150 unsigned long underline_color;
1151
1152 /* Pixel value or color index of overlined, strike-through, or box
1153 color. */
1154 unsigned long overline_color;
1155 unsigned long strike_through_color;
1156 unsigned long box_color;
1157
1158 /* The font's name. This points to a `name' of a font_info, and it
1159 must not be freed. */
1160 char *font_name;
1161
1162 /* The X font registry and encoding of font_name. */
1163 Lisp_Object registry;
1164
1165 /* Font info ID for this face's font. An ID is stored here because
1166 pointers to font_info structures may change. The reason is that
1167 they are pointers into a font table vector that is itself
1168 reallocated. */
1169 int font_info_id;
1170
1171 /* Fontset ID if this face uses a fontset, or -1. This is only >= 0
1172 if the face was realized for CHARSET_COMPOSITION. For all other
1173 charsets, a specific font is loaded from the set of fonts
1174 specified by the fontset given by the family attribute of the face. */
1175 int fontset;
1176
1177 /* Pixmap width and height. */
1178 unsigned int pixmap_w, pixmap_h;
1179
1180 /* Non-zero means characters in this face have a box that thickness
1181 around them. */
1182 int box_line_width;
1183
1184 /* Type of box drawn. A value of FACE_NO_BOX means no box is drawn
1185 around text in this face. A value of FACE_SIMPLE_BOX means a box
1186 of width box_line_width is drawn in color box_color. A value of
1187 FACE_RAISED_BOX or FACE_SUNKEN_BOX means a 3D box is drawn with
1188 shadow colors derived from the background color of the face. */
1189 enum face_box_type box;
1190
1191 /* If `box' above specifies a 3D type, 1 means use box_color for
1192 drawing shadows. */
1193 unsigned use_box_color_for_shadows_p : 1;
1194
1195 /* The Lisp face attributes this face realizes. All attributes
1196 in this vector are non-nil. */
1197 Lisp_Object lface[LFACE_VECTOR_SIZE];
1198
1199 /* The hash value of this face. */
1200 unsigned hash;
1201
1202 /* The charset for which this face was realized if it was realized
1203 for use in multibyte text. If fontset >= 0, this is
1204 CHARSET_COMPOSITION. A value of charset < 0 means the face was
1205 realized for use in unibyte text where the idea of Emacs
1206 charsets isn't applicable. */
1207 int charset;
1208
1209 /* Non-zero if text in this face should be underlined, overlined,
1210 strike-through or have a box drawn around it. */
1211 unsigned underline_p : 1;
1212 unsigned overline_p : 1;
1213 unsigned strike_through_p : 1;
1214
1215 /* 1 means that the colors specified for this face could not be
1216 loaded, and were replaced by default colors, so they shouldn't be
1217 freed. */
1218 unsigned foreground_defaulted_p : 1;
1219 unsigned background_defaulted_p : 1;
1220
1221 /* 1 means that either no color is specified for underlining or that
1222 the the specified color couldn't be loaded. Use the foreground
1223 color when drawing in that case. */
1224 unsigned underline_defaulted_p : 1;
1225
1226 /* 1 means that either no color is specified for the corresponding
1227 attribute or that the the specified color couldn't be loaded.
1228 Use the foreground color when drawing in that case. */
1229 unsigned overline_color_defaulted_p : 1;
1230 unsigned strike_through_color_defaulted_p : 1;
1231 unsigned box_color_defaulted_p : 1;
1232
1233 /* TTY appearances. Blinking is not yet implemented. Colors are
1234 found in `lface' with empty color string meaning the default
1235 color of the TTY. */
1236 unsigned tty_bold_p : 1;
1237 unsigned tty_dim_p : 1;
1238 unsigned tty_underline_p : 1;
1239 unsigned tty_alt_charset_p : 1;
1240 unsigned tty_reverse_p : 1;
1241 unsigned tty_blinking_p : 1;
1242
1243 /* Next and previous face in hash collision list of face cache. */
1244 struct face *next, *prev;
1245};
1246
1247
1248/* Color index indicating that face uses a terminal's default color. */
1249
1250#define FACE_TTY_DEFAULT_COLOR ((unsigned long) -1)
1251
1252/* Non-zero if FACE was realized for unibyte use. */
1253
1254#define FACE_UNIBYTE_P(FACE) ((FACE)->charset < 0)
1255
1256
1257/* IDs of important faces known by the C face code. These are the IDs
1258 of the faces for CHARSET_ASCII. */
1259
1260enum face_id
1261{
1262 DEFAULT_FACE_ID,
1263 MODE_LINE_FACE_ID,
1264 TOOLBAR_FACE_ID,
1265 BITMAP_AREA_FACE_ID,
1266 TOP_LINE_FACE_ID,
1267 BASIC_FACE_ID_SENTINEL
1268};
1269
1270
1271/* A cache of realized faces. Each frame has its own cache because
1272 Emacs allows different frame-local face definitions. */
1273
1274struct face_cache
1275{
1276 /* Hash table of cached realized faces. */
1277 struct face **buckets;
1278
1279 /* Back-pointer to the frame this cache belongs to. */
1280 struct frame *f;
1281
1282 /* A vector of faces so that faces can be referenced by an ID. */
1283 struct face **faces_by_id;
1284
1285 /* The allocated size, and number of used slots of faces_by_id. */
1286 int size, used;
1287};
1288
1289
1290/* Prepare face FACE for use on frame F. This must be called before
1291 using X resources of FACE. */
1292
1293#define PREPARE_FACE_FOR_DISPLAY(F, FACE) \
1294 if ((FACE)->gc == 0) \
1295 prepare_face_for_display ((F), (FACE)); \
1296 else \
1297 (void) 0
1298
1299/* Return a pointer to the face with ID on frame F, or null if such a
1300 face doesn't exist. */
1301
1302#define FACE_FROM_ID(F, ID) \
1303 (((ID) >= 0 && (ID) < FRAME_FACE_CACHE (F)->used) \
1304 ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \
1305 : NULL)
1306
1307/* Non-zero if FACE is suitable for displaying characters of CHARSET.
1308 CHARSET < 0 means unibyte text. */
1309
1310#define FACE_SUITABLE_FOR_CHARSET_P(FACE, CHARSET) \
1311 (((CHARSET) < 0 \
1312 ? (EQ ((FACE)->registry, Vface_default_registry) \
1313 || !NILP (Fequal ((FACE)->registry, Vface_default_registry))) \
1314 : ((FACE)->charset == (CHARSET) \
1315 || ((FACE)->charset == CHARSET_ASCII \
1316 && (CHARSET) == charset_latin_iso8859_1 \
1317 && face_suitable_for_iso8859_1_p ((FACE))) \
1318 || ((FACE)->charset == charset_latin_iso8859_1 \
1319 && (CHARSET) == CHARSET_ASCII))))
1320
1321/* Return the id of the realized face on frame F that is like the face
1322 with id ID but is suitable for displaying characters of CHARSET.
1323 This macro is only meaningful for CHARSET >= 0, i.e. multibyte
1324 text. */
1325
1326#define FACE_FOR_CHARSET(F, ID, CHARSET) \
1327 (FACE_SUITABLE_FOR_CHARSET_P (FACE_FROM_ID ((F), (ID)), (CHARSET)) \
1328 ? (ID) \
1329 : lookup_face ((F), FACE_FROM_ID ((F), (ID))->lface, (CHARSET)))
1330
1331/* The default registry and encoding to use. */
1332
1333extern Lisp_Object Vface_default_registry;
1334
1335/* Non-zero means face attributes have been changed since the last
1336 redisplay. Used in redisplay_internal. */
1337
1338extern int face_change_count;
1339
1340
1341
1342\f
1343/***********************************************************************
1344 Display Iterator
1345 ***********************************************************************/
1346
1347/* Iteration over things to display in current_buffer or in a string.
1348
1349 The iterator handles:
1350
1351 1. Overlay strings (after-string, before-string).
1352 2. Face properties.
1353 3. Invisible text properties.
1354 4. Selective display.
1355 5. Translation of characters via display tables.
1356 6. Translation of control characters to the forms `\003' or `^C'.
1357 7. `glyph' and `space-width' properties.
1358
1359 Iterators are initialized by calling init_iterator or one of the
1360 equivalent functions below. A call to get_next_display_element
1361 loads the iterator structure with information about what next to
1362 display. A call to set_iterator_to_next increments the iterator's
1363 position.
1364
1365 Characters from overlay strings, display table entries or control
1366 character translations are returned one at a time. For example, if
1367 we have a text of `a\x01' where `a' has a display table definition
1368 of `cd' and the control character is displayed with a leading
1369 arrow, then the iterator will return:
1370
1371 Call Return Source Call next
1372 -----------------------------------------------------------------
1373 next c display table move
1374 next d display table move
1375 next ^ control char move
1376 next A control char move
1377
1378 The same mechanism is also used to return characters for ellipses
1379 displayed at the end of invisible text.
1380
1381 CAVEAT: Under some circumstances, move_.* functions can be called
1382 asynchronously, e.g. when computing a buffer position from an x and
1383 y pixel position. This means that these functions and functions
1384 called from them SHOULD NOT USE xmalloc and alike. See also the
1385 comment at the start of xdisp.c. */
1386
1387/* Enumeration describing what kind of display element an iterator is
1388 loaded with after a call to get_next_display_element. */
1389
1390enum display_element_type
1391{
1392 /* A normal character. */
1393 IT_CHARACTER,
1394
1395 /* An image. */
1396 IT_IMAGE,
1397
1398 /* A flexible width and height space. */
1399 IT_STRETCH,
1400
1401 /* End of buffer or string. */
1402 IT_EOB,
1403
1404 /* Truncation glyphs. Never returned by get_next_display_element.
1405 Used to get display information about truncation glyphs via
1406 produce_glyphs. */
1407 IT_TRUNCATION,
1408
1409 /* Continuation glyphs. See the comment for IT_TRUNCATION. */
1410 IT_CONTINUATION
1411};
1412
1413
1414/* An enumerator for each text property that has a meaning for display
1415 purposes. */
1416
1417enum prop_idx
1418{
1419 FONTIFIED_PROP_IDX,
1420 FACE_PROP_IDX,
1421 INVISIBLE_PROP_IDX,
1422 DISPLAY_PROP_IDX,
1423
1424 /* Not a property. Used to indicate changes in overlays. */
1425 OVERLAY_PROP_IDX,
1426
1427 /* Sentinel. */
1428 LAST_PROP_IDX
1429};
1430
1431
1432struct it
1433{
1434 /* The window in which we iterate over current_buffer (or a string). */
1435 Lisp_Object window;
1436 struct window *w;
1437
1438 /* The window's frame. */
1439 struct frame *f;
1440
1441 /* Function to call to load this structure with the next display
1442 element. */
1443 int (* method) P_ ((struct it *it));
1444
1445 /* The next position at which to check for face changes, invisible
1446 text, overlay strings, end of text etc., which see. */
1447 int stop_charpos;
1448
1449 /* Maximum string or buffer position + 1. ZV when iterating over
1450 current_buffer. */
1451 int end_charpos;
1452
1453 /* C string to iterate over. Non-null means get characters from
1454 this string, otherwise characters are read from current_buffer
1455 or it->string. */
1456 unsigned char *s;
1457
1458 /* Number of characters in the string (s, or it->string) we iterate
1459 over. */
1460 int string_nchars;
1461
1462 /* Start and end of a visible region; -1 if the region is not
1463 visible in the window. */
1464 int region_beg_charpos, region_end_charpos;
1465
1466 /* Position at which redisplay end trigger functions should be run. */
1467 int redisplay_end_trigger_charpos;
1468
1469 /* 1 means multibyte characters are enabled. */
1470 unsigned multibyte_p : 1;
1471
5f5c8ee5
GM
1472 /* 1 means window has a mode line at its top. */
1473 unsigned top_line_p : 1;
1474
1475 /* 1 means `string' is the value of a `display' property.
1476 Don't handle some `display' properties in these strings. */
1477 unsigned string_from_display_prop_p : 1;
1478
1479 /* Display table in effect or null for none. */
1480 struct Lisp_Char_Table *dp;
1481
1482 /* Current display table vector to return characters from and its
1483 end. dpvec null means we are not returning characters from a
1484 display table entry; current.dpvec_index gives the current index
1485 into dpvec. This same mechanism is also used to return
1486 characters from translated control characters, i.e. `\003' or
1487 `^C'. */
1488 Lisp_Object *dpvec, *dpend;
1489
1490 /* Length in bytes of the char that filled dpvec. A value of zero
1491 means that no character such character is involved. */
1492 int dpvec_char_len;
1493
1494 /* Face id of the iterator saved in case a glyph from dpvec contains
1495 a face. The face is restored when all glyphs from dpvec have
1496 been delivered. */
1497 int saved_face_id;
1498
1499 /* Vector of glyphs for control character translation. The pointer
1500 dpvec is set to ctl_chars when a control character is translated. */
1501 Lisp_Object ctl_chars[4];
1502
1503 /* Current buffer or string position of the iterator, including
1504 position in overlay strings etc. */
1505 struct display_pos current;
1506
1507 /* Vector of overlays to process. Overlay strings are processed
1508 OVERLAY_STRING_CHUNK_SIZE at a time. */
1509#define OVERLAY_STRING_CHUNK_SIZE 3
1510 Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE];
1511
1512 /* Total number of overlay strings to process. This can be >
1513 OVERLAY_STRING_CHUNK_SIZE. */
1514 int n_overlay_strings;
1515
1516 /* If non-nil, a Lisp string being processed. If
1517 current.overlay_string_index >= 0, this is an overlay string from
1518 pos. */
1519 Lisp_Object string;
1520
1521 /* Stack of saved values. New entries are pushed when we begin to
1522 process an overlay string or a string from a `glyph' property.
1523 Entries are popped when we return to deliver display elements
1524 from what we previously had. */
1525 struct iterator_stack_entry
9f2279ad 1526 {
5f5c8ee5
GM
1527 int stop_charpos;
1528 int face_id;
1529 Lisp_Object string;
1530 struct display_pos pos;
1531 int end_charpos;
1532 int string_nchars;
1533 enum glyph_row_area area;
1534 unsigned multibyte_p : 1;
1535 unsigned string_from_display_prop_p : 1;
1536 Lisp_Object space_width;
1537 short voffset;
1538 Lisp_Object font_height;
1539 }
1540 stack[2];
dfbb1e90 1541
5f5c8ee5
GM
1542 /* Stack pointer. */
1543 int sp;
1544
1545 /* Setting of buffer-local variable selective-display-ellipsis. */
1546 unsigned selective_display_ellipsis_p : 1;
1547
1548 /* 1 means control characters are translated into the form `^C'
1549 where the `^' can be replaced by a display table entry. */
1550 unsigned ctl_arrow_p : 1;
1551
1552 /* -1 means selective display hides everything between a \r and the
1553 next newline; > 0 means hide lines indented more than that value. */
1554 int selective;
1555
1556 /* An enumeration describing what the next display element is
1557 after a call to get_next_display_element. */
1558 enum display_element_type what;
dfbb1e90 1559
5f5c8ee5
GM
1560 /* Face to use. */
1561 int face_id;
1562
1563 /* Non-zero means that the current face has a box. */
1564 unsigned face_box_p : 1;
1565
1566 /* Non-null means that the current character is the first in a run
1567 of characters with box face. */
1568 unsigned start_of_box_run_p : 1;
9f2279ad 1569
5f5c8ee5
GM
1570 /* Non-zero means that the current character is the last in a run
1571 of characters with box face. */
1572 unsigned end_of_box_run_p : 1;
1573
1574 /* 1 means overlay strings at end_charpos have been processed. */
1575 unsigned overlay_strings_at_end_processed_p : 1;
1576
1577 /* The ID of the default face to use. One of DEFAULT_FACE_ID,
1578 MODE_LINE_FACE_ID, or TOOLBAR_FACE_ID, depending on what we
1579 are displaying. */
1580 int base_face_id;
1581
1582 /* If what == IT_CHARACTER, character and length in bytes. This is
1583 a character from a buffer or string. It may be different from
1584 the character displayed in case that
1585 unibyte_display_via_language_environment is set. */
1586 int c, len;
1587
1588 /* The character to display, possibly translated to multibyte
1589 if unibyte_display_via_language_environment is set. This
1590 is set after x_produce_glyphs has been called. */
1591 int char_to_display;
1592
1593 /* Charset for which face_id was computed. This is the charset
1594 of char_to_display after x_produce_glyphs has been called. */
1595 int charset;
1596
1597 /* If what == IT_IMAGE, the id of the image to display. */
1598 int image_id;
1599
1600 /* Value of the `space-width' property, if any; nil if none. */
1601 Lisp_Object space_width;
1602
1603 /* Computed from the value of the `raise' property. */
1604 short voffset;
1605
1606 /* Value of the `height' property, if any; nil if none. */
1607 Lisp_Object font_height;
1608
1609 /* Object and position where the current display element came from.
1610 Object can be a Lisp string in case the current display element
1611 comes from an overlay string, or it is buffer. Position is
1612 a position in object. */
1613 Lisp_Object object;
1614 struct text_pos position;
1615
1616 /* 1 means lines are truncated. */
1617 unsigned truncate_lines_p : 1;
1618
1619 /* Number of columns per \t. */
1620 short tab_width;
1621
1622 /* Width in pixels of truncation and continuation glyphs. */
1623 short truncation_pixel_width, continuation_pixel_width;
1624
1625 /* First and last visible x-position in the display area. If window
1626 is hscrolled by n columns, first_visible_x == n * CANON_X_UNIT
1627 (f), and last_visible_x == pixel width of W + first_visible_x. */
1628 int first_visible_x, last_visible_x;
1629
1630 /* Last visible y-position + 1 in the display area without a mode
1631 line, if the window has one. */
1632 int last_visible_y;
1633
1634 /* Width of a prompt in front of the line. Used to perform tab
1635 calculations. The x on which tab calculations are based is
1636 current_x - prompt_width + continuation_lines_width. */
1637 int prompt_width;
1638
1639 /* If non-null, glyphs are produced in glyph_row with each call to
1640 produce_glyphs. */
1641 struct glyph_row *glyph_row;
1642
1643 /* The area of glyph_row to which glyphs are added. */
1644 enum glyph_row_area area;
1645
1646 /* Number of glyphs needed for the last character requested via
1647 produce_glyphs. This is 1 except for tabs. */
1648 int nglyphs;
1649
1650 /* Width of the display element in pixels. Result of
1651 produce_glyphs. */
1652 int pixel_width;
1653
2febf6e0
GM
1654 /* Current, maximum logical, and maximum physical line height
1655 information. Result of produce_glyphs. */
5f5c8ee5 1656 int ascent, descent, max_ascent, max_descent;
2febf6e0 1657 int phys_ascent, phys_descent, max_phys_ascent, max_phys_descent;
5f5c8ee5
GM
1658
1659 /* Current x pixel position within the display line. This value
1660 does not include the width of continuation lines in front of the
1661 line. The value of current_x is automatically incremented by
1662 pixel_width with each call to produce_glyphs. */
1663 int current_x;
1664
1665 /* Accumulated width of continuation lines. If > 0, this means we
1666 are currently in a continuation line. This is initially zero and
1667 incremented/reset by display_line, move_it_to etc. */
1668 int continuation_lines_width;
1669
1670 /* Current y-position. Automatically incremented by the height of
1671 glyph_row in move_it_to and display_line. */
1672 int current_y;
1673
1674 /* Current vertical matrix position, or line number. Automatically
1675 incremented by move_it_to and display_line. */
1676 int vpos;
1677
1678 /* Horizontal matrix position reached in move_it_in_display_line.
1679 Only set there, not in display_line. */
1680 int hpos;
1681};
1682
1683
1684/* Access to positions of iterator IT. */
1685
1686#define IT_CHARPOS(IT) CHARPOS ((IT).current.pos)
1687#define IT_BYTEPOS(IT) BYTEPOS ((IT).current.pos)
1688#define IT_STRING_CHARPOS(IT) CHARPOS ((IT).current.string_pos)
1689#define IT_STRING_BYTEPOS(IT) BYTEPOS ((IT).current.string_pos)
1690
1691/* Test if IT has reached the end of its buffer or string. This will
1692 only work after get_next_display_element has been called. */
1693
1694#define ITERATOR_AT_END_P(IT) ((IT)->what == IT_EOB)
1695
1696/* Non-zero means IT is at the end of a line. This is the case if it
1697 is either on a newline or on a carriage return and selective
1698 display hides the rest of the line. */
1699
1700#define ITERATOR_AT_END_OF_LINE_P(IT) \
1701 ((IT)->what == IT_CHARACTER \
1702 && ((IT)->c == '\n' \
1703 || ((IT)->c == '\r' && (IT)->selective)))
1704
1705/* Call produce_glyphs or produce_glyphs_hook, if set. Shortcut to
1706 avoid the function call overhead. */
1707
1708#define PRODUCE_GLYPHS(IT) \
1709 (rif \
1710 ? rif->produce_glyphs ((IT)) \
1711 : produce_glyphs ((IT)))
1712
1713/* Bit-flags indicating what operation move_it_to should perform. */
1714
1715enum move_operation_enum
1716{
1717 /* Stop if specified x-position is reached. */
1718 MOVE_TO_X = 0x01,
1719
1720 /* Stop if specified y-position is reached. */
1721 MOVE_TO_Y = 0x02,
1722
1723 /* Stop if specified vpos is reached. */
1724 MOVE_TO_VPOS = 0x04,
1725
1726 /* Stop if specified buffer or string position is reached. */
1727 MOVE_TO_POS = 0x08
1728};
1729
1730
1731\f
1732/***********************************************************************
1733 Window-based redisplay interface
1734 ***********************************************************************/
1735
1736/* Structure used to describe runs of lines that must be scrolled. */
1737
1738struct run
1739{
1740 /* Source and destination y pixel position. */
1741 int desired_y, current_y;
1742
1743 /* Source and destination vpos in matrix. */
1744 int desired_vpos, current_vpos;
1745
1746 /* Height in pixels, number of glyph rows. */
1747 int height, nrows;
1748};
1749
1750
1751/* Structure holding system-dependent interface functions needed
1752 for window-based redisplay. */
1753
1754struct redisplay_interface
1755{
1756 /* Produce glyphs/get display metrics for the display element IT is
1757 loaded with. */
1758 void (*produce_glyphs) P_ ((struct it *it));
9f2279ad 1759
5f5c8ee5
GM
1760 /* Write or insert LEN glyphs from STRING at the nominal output
1761 position. */
1762 void (*write_glyphs) P_ ((struct glyph *string, int len));
1763 void (*insert_glyphs) P_ ((struct glyph *start, int len));
1764
1765 /* Clear from nominal output position to X. X < 0 means clear
1766 to right end of display. */
1767 void (*clear_end_of_line) P_ ((int x));
9f2279ad 1768
5f5c8ee5
GM
1769 /* Function to call to scroll the display as described by RUN on
1770 window W. */
1771 void (*scroll_run_hook) P_ ((struct window *w, struct run *run));
1772
1773 /* Function to call after a line in a display has been completely
1774 updated. Used to draw truncation marks and alike. DESIRED_ROW
1775 is the desired row which has been updated. */
1776 void (*after_update_window_line_hook) P_ ((struct glyph_row *desired_row));
42087301 1777
5f5c8ee5
GM
1778 /* Function to call before beginning to update window W in
1779 window-based redisplay. */
1780 void (*update_window_begin_hook) P_ ((struct window *w));
1781
1782 /* Function to call after window W has been updated in window-based
1783 redisplay. CURSOR_ON_P non-zero means switch cursor on. */
1784 void (*update_window_end_hook) P_ ((struct window *w, int cursor_on_p));
9f2279ad 1785
5f5c8ee5
GM
1786 /* Move cursor to row/column position VPOS/HPOS, pixel coordinates
1787 Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
1788 are window-relative pixel positions. */
1789 void (*cursor_to) P_ ((int vpos, int hpos, int y, int x));
1790
1791 /* Flush the display of frame F. For X, this is XFlush. */
1792 void (*flush_display) P_ ((struct frame *f));
1793
1794 /* Set *LEFT and *RIGHT to the left and right overhang of GLYPH on
1795 frame F. */
1796 void (*get_glyph_overhangs) P_ ((struct glyph *glyph, struct frame *f,
1797 int *left, int *right));
2febf6e0
GM
1798
1799 /* Fix the display of AREA of ROW in window W for overlapping rows.
1800 This function is called from redraw_overlapping_rows after
1801 desired rows have been made current. */
1802 void (*fix_overlapping_area) P_ ((struct window *w, struct glyph_row *row,
1803 enum glyph_row_area area));
5f5c8ee5
GM
1804};
1805
1806/* The current interface for window-based redisplay. */
1807
1808extern struct redisplay_interface *rif;
1809
1810/* Hook to call in estimate_mode_line_height. */
1811
1812extern int (* estimate_mode_line_height_hook) P_ ((struct frame *,
1813 enum face_id));
1814
1815\f
1816/***********************************************************************
1817 Images
1818 ***********************************************************************/
1819
1820#ifdef HAVE_X_WINDOWS
1821
1822/* Structure forward declarations. */
1823
1824struct image;
1825
1826
1827/* Each image format (JPEG, IIFF, ...) supported is described by
1828 a structure of the type below. */
1829
1830struct image_type
1831{
1832 /* A symbol uniquely identifying the image type, .e.g `jpeg'. */
1833 Lisp_Object *type;
1834
1835 /* Check that SPEC is a valid image specification for the given
1836 image type. Value is non-zero if SPEC is valid. */
1837 int (* valid_p) P_ ((Lisp_Object spec));
1838
1839 /* Load IMG which is used on frame F from information contained in
1840 IMG->spec. Value is non-zero if successful. */
1841 int (* load) P_ ((struct frame *f, struct image *img));
1842
1843 /* Free resources of image IMG which is used on frame F. */
1844 void (* free) P_ ((struct frame *f, struct image *img));
9f2279ad 1845
5f5c8ee5
GM
1846 /* Next in list of all supported image types. */
1847 struct image_type *next;
1848};
9f2279ad 1849
9f2279ad 1850
5f5c8ee5
GM
1851/* Structure describing an image. Specific image formats like XBM are
1852 converted into this form, so that display only has to deal with
1853 this type of image. */
9f2279ad 1854
5f5c8ee5
GM
1855struct image
1856{
1857 /* The time in seconds at which the image was last displayed. Set
1858 in prepare_image_for_display. */
1859 unsigned long timestamp;
9f2279ad 1860
5f5c8ee5
GM
1861 /* Pixmaps of the image. */
1862 Pixmap pixmap, mask;
9f2279ad 1863
5f5c8ee5
GM
1864 /* Colors allocated for this image, if any. Allocated via xmalloc. */
1865 unsigned long *colors;
1866 int ncolors;
9f2279ad 1867
5f5c8ee5
GM
1868 /* Width and height of the image. */
1869 int width, height;
87485d6f 1870
5f5c8ee5
GM
1871 /* These values are used for the rectangles displayed for images
1872 that can't be loaded. */
1873#define DEFAULT_IMAGE_WIDTH 30
1874#define DEFAULT_IMAGE_HEIGHT 30
9f2279ad 1875
5f5c8ee5
GM
1876 /* Percent of image height used as ascent. */
1877 int ascent;
1878#define DEFAULT_IMAGE_ASCENT 50
c22ca93b 1879
5f5c8ee5
GM
1880 /* Lisp specification of this image. */
1881 Lisp_Object spec;
c22ca93b 1882
5f5c8ee5
GM
1883 /* Relief to draw around the image. */
1884 int relief;
c22ca93b 1885
5f5c8ee5
GM
1886 /* Optional margin around the image. This includes the relief. */
1887 int margin;
1888
1889 /* Reference to the type of the image. */
1890 struct image_type *type;
1891
1892 /* A place for image types to store additional data. The member
1893 data.lisp_val is marked during GC, so it's safe to store Lisp data
1894 there. Image types should free this data when their `free'
1895 function is called. */
1896 struct
c22ca93b 1897 {
5f5c8ee5
GM
1898 int int_val;
1899 void *ptr_val;
1900 Lisp_Object lisp_val;
1901 } data;
c22ca93b 1902
5f5c8ee5
GM
1903 /* Hash value of image specification to speed up comparisons. */
1904 unsigned hash;
1905
1906 /* Image id of this image. */
1907 int id;
1908
1909 /* Hash collision chain. */
1910 struct image *next, *prev;
1911};
1912
1913
1914/* Cache of images. Each frame has a cache. X frames with the same
1915 x_display_info share their caches. */
1916
1917struct image_cache
1918{
1919 /* Hash table of images. */
1920 struct image **buckets;
1921
1922 /* Vector mapping image ids to images. */
1923 struct image **images;
1924
1925 /* Allocated size of `images'. */
1926 unsigned size;
1927
1928 /* Number of images in the cache. */
1929 unsigned used;
1930
1931 /* Reference count (number of frames sharing this cache). */
1932 int refcount;
1933};
1934
1935
1936/* Value is the ascent of image IMG. */
1937
1938#define IMAGE_ASCENT(IMG) \
1939 (((IMG)->height + (IMG)->margin) * (IMG)->ascent / 100.0)
1940
1941/* Value is a pointer to the image with id ID on frame F, or null if
1942 no image with that id exists. */
1943
1944#define IMAGE_FROM_ID(F, ID) \
1945 (((ID) >= 0 && (ID) < (FRAME_X_IMAGE_CACHE (F)->used)) \
1946 ? FRAME_X_IMAGE_CACHE (F)->images[ID] \
1947 : NULL)
1948
1949/* Size of bucket vector of image caches. Should be prime. */
1950
1951#define IMAGE_CACHE_BUCKETS_SIZE 1001
1952
1953#endif /* HAVE_X_WINDOWS */
1954
1955
1956\f
1957/***********************************************************************
1958 Toolbars
1959 ***********************************************************************/
1960
1961/* Enumeration defining where to find toolbar item information in
1962 toolbar items vectors stored with frames. Each toolbar item
1963 occupies TOOLBAR_ITEM_NSLOTS elements in such a vector. */
1964
1965enum toolbar_item_idx
1966{
1967 /* The key of the toolbar item. Used to remove items when a binding
1968 for `undefined' is found. */
1969 TOOLBAR_ITEM_KEY,
1970
1971 /* Non-nil if item is enabled. */
1972 TOOLBAR_ITEM_ENABLED_P,
1973
1974 /* Non-nil if item is selected (pressed). */
1975 TOOLBAR_ITEM_SELECTED_P,
1976
1977 /* Caption. */
1978 TOOLBAR_ITEM_CAPTION,
1979
1980 /* Image(s) to display. This is either a single image specification
1981 or a vector of specifications. */
1982 TOOLBAR_ITEM_IMAGES,
1983
1984 /* The binding. */
1985 TOOLBAR_ITEM_BINDING,
1986
1987 /* Button type. One of nil, `:radio' or `:toggle'. */
1988 TOOLBAR_ITEM_TYPE,
c22ca93b 1989
5f5c8ee5
GM
1990 /* Help string. */
1991 TOOLBAR_ITEM_HELP,
1992
1993 /* Sentinel = number of slots in toolbar_items occupied by one
1994 toolbar item. */
1995 TOOLBAR_ITEM_NSLOTS
1996};
1997
1998
1999/* An enumeration for the different images that can be specified
2000 for a toolbar item. */
2001
2002enum toolbar_item_image
2003{
2004 TOOLBAR_IMAGE_ENABLED_SELECTED,
2005 TOOLBAR_IMAGE_ENABLED_DESELECTED,
2006 TOOLBAR_IMAGE_DISABLED_SELECTED,
2007 TOOLBAR_IMAGE_DISABLED_DESELECTED
2008};
2009
2010/* Non-zero means raise toolbar buttons when the mouse moves over them. */
2011
2012extern int auto_raise_toolbar_buttons_p;
2013
2014/* Margin around toolbar buttons in pixels. */
2015
2016extern int toolbar_button_margin;
2017
2018/* Thickness of relief to draw around toolbar buttons. */
2019
2020extern int toolbar_button_relief;
2021
2022
2023\f
2024/***********************************************************************
2025 Function Prototypes
2026 ***********************************************************************/
2027
2028/* Defined in xdisp.c */
2029
2030int try_window P_ ((Lisp_Object, struct text_pos));
2031void window_box P_ ((struct window *, int, int *, int *, int *, int *));
2032int window_box_height P_ ((struct window *));
2033int window_text_bottom_y P_ ((struct window *));
2034int window_box_width P_ ((struct window *, int));
2035int window_box_left P_ ((struct window *, int));
2036int window_box_right P_ ((struct window *, int));
2037void window_box_edges P_ ((struct window *, int, int *, int *, int *, int *));
2038void mark_window_display_accurate P_ ((Lisp_Object, int));
2039void redisplay_preserve_echo_area P_ ((void));
2040void set_cursor_from_row P_ ((struct window *, struct glyph_row *,
2041 struct glyph_matrix *, int, int, int, int));
2042void init_iterator P_ ((struct it *, struct window *, int,
2043 int, struct glyph_row *, enum face_id));
2044void init_iterator_to_row_start P_ ((struct it *, struct window *,
2045 struct glyph_row *));
2046int get_next_display_element P_ ((struct it *));
2047void set_iterator_to_next P_ ((struct it *));
2048void produce_glyphs P_ ((struct it *));
2049void produce_special_glyphs P_ ((struct it *, enum display_element_type));
2050void start_display P_ ((struct it *, struct window *, struct text_pos));
2051void move_it_to P_ ((struct it *, int, int, int, int, int));
2052void move_it_vertically P_ ((struct it *, int));
2053void move_it_by_lines P_ ((struct it *, int, int));
2054int frame_mode_line_height P_ ((struct frame *));
2055void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *));
2056int toolbar_item_info P_ ((struct frame *, struct glyph *, int *));
2057extern Lisp_Object Qtoolbar;
c1ff17c5 2058extern Lisp_Object Vshow_trailing_whitespace;
5f5c8ee5
GM
2059extern int redisplaying_p;
2060
2061/* Defined in sysdep.c */
2062
2063void get_frame_size P_ ((int *, int *));
2064void request_sigio P_ ((void));
2065void unrequest_sigio P_ ((void));
2066int tabs_safe_p P_ ((void));
2067void init_baud_rate P_ ((void));
2068void init_sigio P_ ((int));
2069
2070/* Defined in xface.c */
2071
2072char *x_charset_registry P_ ((int));
2073void clear_face_cache P_ ((int));
1cc03123
EZ
2074unsigned long load_color P_ ((struct frame *, struct face *, Lisp_Object,
2075 enum lface_attribute_index));
5f5c8ee5
GM
2076void unload_color P_ ((struct frame *, unsigned long));
2077int frame_update_line_height P_ ((struct frame *));
2078int ascii_face_of_lisp_face P_ ((struct frame *, int));
2079void prepare_face_for_display P_ ((struct frame *, struct face *));
2080int face_suitable_for_iso8859_1_p P_ ((struct face *));
2081int xstricmp P_ ((unsigned char *, unsigned char *));
2082int lookup_face P_ ((struct frame *, Lisp_Object *, int));
2083int face_suitable_for_charset_p P_ ((struct face *, int));
2084int lookup_named_face P_ ((struct frame *, Lisp_Object, int));
2085int smaller_face P_ ((struct frame *, int, int));
2086int face_with_height P_ ((struct frame *, int, int));
1cc03123 2087int lookup_derived_face P_ ((struct frame *, Lisp_Object, int, int));
5f5c8ee5
GM
2088void init_frame_faces P_ ((struct frame *));
2089void free_frame_faces P_ ((struct frame *));
2090void recompute_basic_faces P_ ((struct frame *));
2091int face_at_buffer_position P_ ((struct window *, int, int, int, int *,
2092 int, int));
2093int face_at_string_position P_ ((struct window *, Lisp_Object,
2094 int, int, int, int, int *, enum face_id));
2095int compute_char_face P_ ((struct frame *, int, Lisp_Object));
2096void free_all_realized_faces P_ ((Lisp_Object));
2097extern Lisp_Object Qforeground_color, Qbackground_color;
2098
2099/* Defined in xfns.c */
2100
2101#ifdef HAVE_X_WINDOWS
2102
2103int x_screen_planes P_ ((struct frame *));
2104void x_implicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
2105struct image_cache *make_image_cache P_ ((void));
2106void free_image_cache P_ ((struct frame *));
2107void clear_image_cache P_ ((struct frame *, int));
2108void forall_images_in_image_cache P_ ((struct frame *,
2109 void (*) P_ ((struct image *))));
2110int valid_image_p P_ ((Lisp_Object));
2111void prepare_image_for_display P_ ((struct frame *, struct image *));
2112int lookup_image P_ ((struct frame *, Lisp_Object));
2113extern struct frame *tip_frame;
2114extern Window tip_window;
2115EXFUN (Fx_show_tip, 4);
2116EXFUN (Fx_hide_tip, 0);
2117EXFUN (Fx_show_busy_cursor, 0);
2118EXFUN (Fx_hide_busy_cursor, 1);
2119extern int inhibit_busy_cursor;
2120extern int display_busy_cursor_p;
2121
2122#endif /* HAVE_X_WINDOWS */
2123
2124
2125/* Defined in xmenu.c */
2126
2127int popup_activated P_ ((void));
2128
3f7267e7 2129/* Defined in dispnew.c */
5f5c8ee5 2130
3f7267e7 2131int estimate_mode_line_height P_ ((struct frame *, enum face_id));
5f5c8ee5 2132Lisp_Object mode_line_string P_ ((struct window *, int, int, int, int *));
ec5d8db7
AS
2133extern void redraw_frame P_ ((struct frame *));
2134extern void redraw_garbaged_frames P_ ((void));
ec5d8db7 2135extern void cancel_line P_ ((int, struct frame *));
ec5d8db7 2136extern void init_desired_glyphs P_ ((struct frame *));
ec5d8db7 2137extern int scroll_frame_lines P_ ((struct frame *, int, int, int, int));
ec5d8db7
AS
2138extern int direct_output_for_insert P_ ((int));
2139extern int direct_output_forward_char P_ ((int));
2140extern int update_frame P_ ((struct frame *, int, int));
ec5d8db7 2141extern int scrolling P_ ((struct frame *));
ec5d8db7 2142extern void bitch_at_user P_ ((void));
5f5c8ee5
GM
2143void adjust_glyphs P_ ((struct frame *));
2144void free_glyphs P_ ((struct frame *));
2145void free_window_matrices P_ ((struct window *));
2146void check_glyph_memory P_ ((void));
2147void mirrored_line_dance P_ ((struct glyph_matrix *, int, int, int *, char *));
2148void clear_glyph_matrix P_ ((struct glyph_matrix *));
2149void clear_current_matrices P_ ((struct frame *f));
2150void clear_desired_matrices P_ ((struct frame *));
2151void shift_glyph_matrix P_ ((struct window *, struct glyph_matrix *,
2152 int, int, int));
2153void rotate_matrix P_ ((struct glyph_matrix *, int, int, int));
2154void increment_glyph_matrix_buffer_positions P_ ((struct glyph_matrix *,
2155 int, int, int, int));
2156void blank_row P_ ((struct window *, struct glyph_row *, int));
2157void increment_glyph_row_buffer_positions P_ ((struct glyph_row *, int, int));
2158void enable_glyph_matrix_rows P_ ((struct glyph_matrix *, int, int, int));
2159void clear_glyph_row P_ ((struct glyph_row *));
2160void prepare_desired_row P_ ((struct glyph_row *));
2161int line_hash_code P_ ((struct glyph_row *));
2162void set_window_update_flags P_ ((struct window *, int));
2163void write_glyphs P_ ((struct glyph *, int));
2164void insert_glyphs P_ ((struct glyph *, int));
2165void redraw_frame P_ ((struct frame *));
2166void redraw_garbaged_frames P_ ((void));
2167int scroll_cost P_ ((struct frame *, int, int, int));
2168int direct_output_for_insert P_ ((int));
2169int direct_output_forward_char P_ ((int));
2170int update_frame P_ ((struct frame *, int, int));
2171void update_single_window P_ ((struct window *, int));
2172int scrolling P_ ((struct frame *));
2173int buffer_posn_from_coords P_ ((struct window *, int *, int *));
3f7267e7
GM
2174void do_pending_window_change P_ ((int));
2175void change_frame_size P_ ((struct frame *, int, int, int, int, int));
5f5c8ee5
GM
2176void bitch_at_user P_ ((void));
2177Lisp_Object sit_for P_ ((int, int, int, int, int));
2178void init_display P_ ((void));
2179void syms_of_display P_ ((void));
ec5d8db7
AS
2180
2181/* Defined in term.c */
5f5c8ee5 2182
ec5d8db7
AS
2183extern void ring_bell P_ ((void));
2184extern void set_terminal_modes P_ ((void));
2185extern void reset_terminal_modes P_ ((void));
2186extern void update_begin P_ ((struct frame *));
2187extern void update_end P_ ((struct frame *));
2188extern void set_terminal_window P_ ((int));
2189extern void set_scroll_region P_ ((int, int));
2190extern void turn_off_insert P_ ((void));
2191extern void turn_off_highlight P_ ((void));
2192extern void background_highlight P_ ((void));
2193extern void reassert_line_highlight P_ ((int, int));
ec5d8db7
AS
2194extern void clear_frame P_ ((void));
2195extern void clear_end_of_line P_ ((int));
2196extern void clear_end_of_line_raw P_ ((int));
ec5d8db7
AS
2197extern void delete_glyphs P_ ((int));
2198extern void ins_del_lines P_ ((int, int));
2199extern int string_cost P_ ((char *));
2200extern int per_line_cost P_ ((char *));
2201extern void calculate_costs P_ ((struct frame *));
2202extern void term_init P_ ((char *));
2203extern void fatal P_ ((/* char *, ... */));
5f5c8ee5
GM
2204void cursor_to P_ ((int, int));
2205void change_line_highlight P_ ((int, int, int, int));
ec5d8db7
AS
2206
2207/* Defined in scroll.c */
5f5c8ee5 2208
ec5d8db7
AS
2209extern int scrolling_max_lines_saved P_ ((int, int, int *, int *, int *));
2210extern int scroll_cost P_ ((struct frame *, int, int, int));
2211extern void do_line_insertion_deletion_costs P_ ((struct frame *, char *,
2212 char *, char *, char *,
2213 char *, char *, int));
5f5c8ee5
GM
2214void scrolling_1 P_ ((struct frame *, int, int, int, int *, int *, int *,
2215 int *, int));
87485d6f 2216
5f5c8ee5 2217#endif /* not DISPEXTERN_H_INCLUDED */