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