Reflect mouse-highlight redesign in term.c
[bpt/emacs.git] / src / dispextern.h
CommitLineData
c22ca93b 1/* Interface definitions for display code.
0b5538bd 2 Copyright (C) 1985, 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
114f9c96 3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
8cabe764 4 Free Software Foundation, Inc.
c22ca93b
JB
5
6This file is part of GNU Emacs.
7
b9b1cc14 8GNU Emacs is free software: you can redistribute it and/or modify
c22ca93b 9it under the terms of the GNU General Public License as published by
b9b1cc14
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
c22ca93b
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
b9b1cc14 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
c22ca93b 20
4d2036e4 21/* New redisplay written by Gerd Moellmann <gerd@gnu.org>. */
87485d6f 22
5f5c8ee5
GM
23#ifndef DISPEXTERN_H_INCLUDED
24#define DISPEXTERN_H_INCLUDED
c22ca93b
JB
25
26#ifdef HAVE_X_WINDOWS
94e32607 27
9f2279ad 28#include <X11/Xlib.h>
8317e104
GM
29#ifdef USE_X_TOOLKIT
30#include <X11/Intrinsic.h>
31#endif /* USE_X_TOOLKIT */
94e32607
JB
32
33#else /* !HAVE_X_WINDOWS */
34
35/* X-related stuff used by non-X gui code. */
36
37typedef struct {
38 unsigned long pixel;
39 unsigned short red, green, blue;
40 char flags;
41 char pad;
42} XColor;
43
8317e104 44#endif /* HAVE_X_WINDOWS */
87485d6f 45
7ea692f6
EZ
46#ifdef MSDOS
47#include "msdos.h"
48#endif
49
d74b2553
KS
50#ifdef HAVE_X_WINDOWS
51typedef struct x_display_info Display_Info;
6b61353c
KH
52typedef XImage * XImagePtr;
53typedef XImagePtr XImagePtr_or_DC;
d74b2553
KS
54#define NativeRectangle XRectangle
55#endif
56
497fbd42 57#ifdef HAVE_NTGUI
c0ac470c 58#include "w32gui.h"
d74b2553 59typedef struct w32_display_info Display_Info;
6b61353c
KH
60typedef XImage *XImagePtr;
61typedef HDC XImagePtr_or_DC;
497fbd42
GV
62#endif
63
edfda783
AR
64#ifdef HAVE_NS
65#include "nsgui.h"
66/* following typedef needed to accomodate the MSDOS port, believe it or not */
67typedef struct ns_display_info Display_Info;
68typedef Pixmap XImagePtr;
69typedef XImagePtr XImagePtr_or_DC;
70#endif
71
7ea692f6 72#ifndef HAVE_WINDOW_SYSTEM
d009ae66
EZ
73typedef int Cursor;
74#define No_Cursor (0)
75#endif
76
dfbe5d05
KS
77#ifndef NativeRectangle
78#define NativeRectangle int
79#endif
80
5f5c8ee5
GM
81/* Structure forward declarations. Some are here because function
82 prototypes below reference structure types before their definition
83 in this file. Some are here because not every file including
84 dispextern.h also includes frame.h and windows.h. */
85
86struct glyph;
87struct glyph_row;
88struct glyph_matrix;
89struct glyph_pool;
90struct frame;
91struct window;
92
93
d74b2553
KS
94/* Values returned from coordinates_in_window. */
95
96enum window_part
97{
98 ON_NOTHING,
99 ON_TEXT,
100 ON_MODE_LINE,
101 ON_VERTICAL_BORDER,
102 ON_HEADER_LINE,
103 ON_LEFT_FRINGE,
104 ON_RIGHT_FRINGE,
105 ON_LEFT_MARGIN,
ab431b61
RS
106 ON_RIGHT_MARGIN,
107 ON_SCROLL_BAR
d74b2553
KS
108};
109
6b61353c 110/* Number of bits allocated to store fringe bitmap numbers. */
b3b08f03 111#define FRINGE_ID_BITS 16
6b61353c 112
5a874e95
YM
113/* Number of bits allocated to store fringe bitmap height. */
114#define FRINGE_HEIGHT_BITS 8
d74b2553 115
5f5c8ee5 116\f
5f5c8ee5
GM
117/***********************************************************************
118 Debugging
119 ***********************************************************************/
120
121/* If GLYPH_DEBUG is non-zero, additional checks are activated. Turn
122 it off by defining the macro GLYPH_DEBUG to zero. */
123
124#ifndef GLYPH_DEBUG
125#define GLYPH_DEBUG 0
126#endif
127
139c65cf
KS
128/* If XASSERTS is non-zero, additional consistency checks are activated.
129 Turn it off by defining the macro XASSERTS to zero. */
130
131#ifndef XASSERTS
132#define XASSERTS 0
133#endif
134
5f5c8ee5
GM
135/* Macros to include code only if GLYPH_DEBUG != 0. */
136
137#if GLYPH_DEBUG
138#define IF_DEBUG(X) X
5f5c8ee5
GM
139#else
140#define IF_DEBUG(X) (void) 0
5f5c8ee5
GM
141#endif
142
139c65cf 143#if XASSERTS
d78f30b8 144#define xassert(X) do {if (!(X)) abort ();} while (0)
139c65cf
KS
145#else
146#define xassert(X) (void) 0
147#endif
d78f30b8 148
5f5c8ee5
GM
149/* Macro for displaying traces of redisplay. If Emacs was compiled
150 with GLYPH_DEBUG != 0, the variable trace_redisplay_p can be set to
151 a non-zero value in debugging sessions to activate traces. */
152
153#if GLYPH_DEBUG
154
155extern int trace_redisplay_p;
156#include <stdio.h>
157
158#define TRACE(X) \
159 if (trace_redisplay_p) \
160 fprintf X; \
161 else \
162 (void) 0
163
164#else /* GLYPH_DEBUG == 0 */
165
166#define TRACE(X) (void) 0
167
168#endif /* GLYPH_DEBUG == 0 */
169
177c0ea7 170
5f5c8ee5
GM
171\f
172/***********************************************************************
173 Text positions
174 ***********************************************************************/
175
176/* Starting with Emacs 20.3, characters from strings and buffers have
177 both a character and a byte position associated with them. The
178 following structure holds such a pair of positions. */
177c0ea7 179
5f5c8ee5
GM
180struct text_pos
181{
182 /* Character position. */
05fe33ff 183 EMACS_INT charpos;
5f5c8ee5
GM
184
185 /* Corresponding byte position. */
05fe33ff 186 EMACS_INT bytepos;
5f5c8ee5
GM
187};
188
189/* Access character and byte position of POS in a functional form. */
190
191#define BYTEPOS(POS) (POS).bytepos
192#define CHARPOS(POS) (POS).charpos
193
194/* Set character position of POS to CHARPOS, byte position to BYTEPOS. */
195
196#define SET_TEXT_POS(POS, CHARPOS, BYTEPOS) \
197 ((POS).charpos = (CHARPOS), (POS).bytepos = BYTEPOS)
198
199/* Increment text position POS. */
200
7bed37e4 201#define INC_TEXT_POS(POS, MULTIBYTE_P) \
5f5c8ee5
GM
202 do \
203 { \
204 ++(POS).charpos; \
7bed37e4
GM
205 if (MULTIBYTE_P) \
206 INC_POS ((POS).bytepos); \
207 else \
208 ++(POS).bytepos; \
5f5c8ee5
GM
209 } \
210 while (0)
211
212/* Decrement text position POS. */
213
7bed37e4 214#define DEC_TEXT_POS(POS, MULTIBYTE_P) \
5f5c8ee5
GM
215 do \
216 { \
217 --(POS).charpos; \
7bed37e4
GM
218 if (MULTIBYTE_P) \
219 DEC_POS ((POS).bytepos); \
220 else \
221 --(POS).bytepos; \
5f5c8ee5
GM
222 } \
223 while (0)
224
225/* Set text position POS from marker MARKER. */
226
227#define SET_TEXT_POS_FROM_MARKER(POS, MARKER) \
228 (CHARPOS (POS) = marker_position ((MARKER)), \
229 BYTEPOS (POS) = marker_byte_position ((MARKER)))
230
231/* Set marker MARKER from text position POS. */
232
233#define SET_MARKER_FROM_TEXT_POS(MARKER, POS) \
234 set_marker_both ((MARKER), Qnil, CHARPOS ((POS)), BYTEPOS ((POS)))
177c0ea7 235
5f5c8ee5
GM
236/* Value is non-zero if character and byte positions of POS1 and POS2
237 are equal. */
238
239#define TEXT_POS_EQUAL_P(POS1, POS2) \
240 ((POS1).charpos == (POS2).charpos \
241 && (POS1).bytepos == (POS2).bytepos)
242
243/* When rendering glyphs, redisplay scans string or buffer text,
244 overlay strings in that text, and does display table or control
245 character translations. The following structure captures a
246 position taking all this into account. */
247
248struct display_pos
249{
250 /* Buffer or string position. */
251 struct text_pos pos;
252
253 /* If this is a position in an overlay string, overlay_string_index
254 is the index of that overlay string in the sequence of overlay
255 strings at `pos' in the order redisplay processes them. A value
256 < 0 means that this is not a position in an overlay string. */
257 int overlay_string_index;
258
259 /* If this is a position in an overlay string, string_pos is the
260 position within that string. */
261 struct text_pos string_pos;
262
263 /* If the character at the position above is a control character or
264 has a display table entry, dpvec_index is an index in the display
265 table or control character translation of that character. A
266 value < 0 means this is not a position in such a translation. */
267 int dpvec_index;
268};
269
270
271\f
272/***********************************************************************
273 Glyphs
274 ***********************************************************************/
275
276/* Enumeration of glyph types. Glyph structures contain a type field
277 containing one of the enumerators defined here. */
278
279enum glyph_type
280{
281 /* Glyph describes a character. */
177c0ea7 282 CHAR_GLYPH,
5f5c8ee5 283
a88c7fcd 284 /* Glyph describes a static composition. */
a90fbbf6
KH
285 COMPOSITE_GLYPH,
286
5f5c8ee5
GM
287 /* Glyph describes an image. */
288 IMAGE_GLYPH,
289
290 /* Glyph is a space of fractional width and/or height. */
291 STRETCH_GLYPH
292};
293
294
0633d52c
KS
295/* Structure describing how to use partial glyphs (images slicing) */
296
297struct glyph_slice
298{
299 unsigned x : 16;
300 unsigned y : 16;
301 unsigned width : 16;
302 unsigned height : 16;
303};
304
305
827503c6
GM
306/* Glyphs.
307
308 Be extra careful when changing this structure! Esp. make sure that
d5cc60b8 309 functions producing glyphs, like append_glyph, fill ALL of the
827503c6
GM
310 glyph structure, and that GLYPH_EQUAL_P compares all
311 display-relevant members of glyphs (not to imply that these are the
312 only things to check when you add a member). */
5f5c8ee5
GM
313
314struct glyph
315{
316 /* Position from which this glyph was drawn. If `object' below is a
317 Lisp string, this is a position in that string. If it is a
318 buffer, this is a position in that buffer. A value of -1
319 together with a null object means glyph is a truncation glyph at
320 the start of a row. */
05fe33ff 321 EMACS_INT charpos;
5f5c8ee5
GM
322
323 /* Lisp object source of this glyph. Currently either a buffer or
177c0ea7 324 a string, if the glyph was produced from characters which came from
f920e581
GM
325 a buffer or a string; or 0 if the glyph was inserted by redisplay
326 for its own purposes such as padding. */
5f5c8ee5
GM
327 Lisp_Object object;
328
329 /* Width in pixels. */
330 short pixel_width;
331
6b61353c
KH
332 /* Ascent and descent in pixels. */
333 short ascent, descent;
334
5f5c8ee5
GM
335 /* Vertical offset. If < 0, the glyph is displayed raised, if > 0
336 the glyph is displayed lowered. */
337 short voffset;
338
339 /* Which kind of glyph this is---character, image etc. Value
340 should be an enumerator of type enum glyph_type. */
341 unsigned type : 2;
342
343 /* 1 means this glyph was produced from multibyte text. Zero
344 means it was produced from unibyte text, i.e. charsets aren't
345 applicable, and encoding is not performed. */
346 unsigned multibyte_p : 1;
347
348 /* Non-zero means draw a box line at the left or right side of this
349 glyph. This is part of the implementation of the face attribute
350 `:box'. */
351 unsigned left_box_line_p : 1;
352 unsigned right_box_line_p : 1;
353
2febf6e0
GM
354 /* Non-zero means this glyph's physical ascent or descent is greater
355 than its logical ascent/descent, i.e. it may potentially overlap
356 glyphs above or below it. */
357 unsigned overlaps_vertically_p : 1;
358
ae185452
KH
359 /* For terminal frames, 1 means glyph is a padding glyph. Padding
360 glyphs are used for characters whose visual shape consists of
361 more than one glyph (e.g. Asian characters). All but the first
362 glyph of such a glyph sequence have the padding_p flag set. This
363 flag is used only to minimize code changes. A better way would
364 probably be to use the width field of glyphs to express padding.
365
366 For graphic frames, 1 means the pixel width of the glyph in a
367 font is 0, but 1-pixel is padded on displaying for correct cursor
368 displaying. The member `pixel_width' above is set to 1. */
3305fc6a
KH
369 unsigned padding_p : 1;
370
f920e581
GM
371 /* 1 means the actual glyph is not available, draw a box instead.
372 This can happen when a font couldn't be loaded, or a character
373 doesn't have a glyph in a font. */
b3091a23
KH
374 unsigned glyph_not_available_p : 1;
375
c4f4682b
MB
376
377 /* Non-zero means don't display cursor here. */
378 unsigned avoid_cursor_p : 1;
379
e69a9370 380 /* Resolved bidirectional level of this character [0..63]. */
29e3d8d1 381 unsigned resolved_level : 5;
5e65aec0
EZ
382
383 /* Resolved bidirectional type of this character, see enum
29e3d8d1
EZ
384 bidi_type_t below. Note that according to UAX#9, only some
385 values (STRONG_L, STRONG_R, WEAK_AN, WEAK_EN, WEAK_BN, and
386 NEUTRAL_B) can appear in the resolved type, so we only reserve
387 space for those that can. */
388 unsigned bidi_type : 3;
5e65aec0 389
c4f4682b 390#define FACE_ID_BITS 20
6b61353c 391
c68b9c2f
RS
392 /* Face of the glyph. This is a realized face ID,
393 an index in the face cache of the frame. */
6b61353c 394 unsigned face_id : FACE_ID_BITS;
3305fc6a 395
d5cc60b8 396 /* Type of font used to display the character glyph. May be used to
b40b05b6 397 determine which set of functions to use to obtain font metrics
d5cc60b8
KS
398 for the glyph. On W32, value should be an enumerator of the type
399 w32_char_font_type. Otherwise it equals FONT_TYPE_UNKNOWN. */
400 unsigned font_type : 3;
b40b05b6 401
4be9765d
KH
402 /* A union of sub-structures for different glyph types. */
403 union
404 {
405 /* Metrics of a partial glyph of an image (type == IMAGE_GLYPH). */
406 struct glyph_slice img;
407 /* Start and end indices of glyphs of a graphme cluster of a
408 composition (type == COMPOSITE_GLYPH). */
409 struct { int from, to; } cmp;
410 } slice;
0633d52c 411
5f5c8ee5
GM
412 /* A union of sub-structures for different glyph types. */
413 union
414 {
3305fc6a
KH
415 /* Character code for character glyphs (type == CHAR_GLYPH). */
416 unsigned ch;
5f5c8ee5 417
4be9765d 418 /* Sub-structures for type == COMPOSITE_GLYPH. */
a88c7fcd
KH
419 struct
420 {
421 /* Flag to tell if the composition is automatic or not. */
422 unsigned automatic : 1;
423 /* ID of the composition. */
4be9765d 424 unsigned id : 31;
a88c7fcd 425 } cmp;
a90fbbf6 426
3305fc6a
KH
427 /* Image ID for image glyphs (type == IMAGE_GLYPH). */
428 unsigned img_id;
5f5c8ee5
GM
429
430 /* Sub-structure for type == STRETCH_GLYPH. */
431 struct
432 {
433 /* The height of the glyph. */
3305fc6a 434 unsigned height : 16;
5f5c8ee5
GM
435
436 /* The ascent of the glyph. */
3305fc6a 437 unsigned ascent : 16;
5f5c8ee5
GM
438 }
439 stretch;
177c0ea7 440
5f5c8ee5
GM
441 /* Used to compare all bit-fields above in one step. */
442 unsigned val;
443 } u;
444};
445
446
d5cc60b8
KS
447/* Default value of the glyph font_type field. */
448
449#define FONT_TYPE_UNKNOWN 0
450
5f5c8ee5
GM
451/* Is GLYPH a space? */
452
453#define CHAR_GLYPH_SPACE_P(GLYPH) \
98329671 454 ((GLYPH).u.ch == SPACEGLYPH && (GLYPH).face_id == DEFAULT_FACE_ID)
5f5c8ee5 455
4be9765d
KH
456/* Are glyph slices of glyphs *X and *Y equal? It assumes that both
457 glyphs have the same type.
458
459 Note: for composition glyphs, we don't have to compare slice.cmp.to
460 because they should be the same if and only if slice.cmp.from are
461 the same. */
462
463#define GLYPH_SLICE_EQUAL_P(X, Y) \
464 ((X)->type == IMAGE_GLYPH \
465 ? ((X)->slice.img.x == (Y)->slice.img.x \
466 && (X)->slice.img.y == (Y)->slice.img.y \
467 && (X)->slice.img.width == (Y)->slice.img.width \
468 && (X)->slice.img.height == (Y)->slice.img.height) \
469 : ((X)->type != COMPOSITE_GLYPH \
470 || (X)->slice.cmp.from == (Y)->slice.cmp.from))
0633d52c 471
827503c6 472/* Are glyphs *X and *Y displayed equal? */
177c0ea7 473
5f5c8ee5
GM
474#define GLYPH_EQUAL_P(X, Y) \
475 ((X)->type == (Y)->type \
476 && (X)->u.val == (Y)->u.val \
0633d52c 477 && GLYPH_SLICE_EQUAL_P (X, Y) \
3305fc6a
KH
478 && (X)->face_id == (Y)->face_id \
479 && (X)->padding_p == (Y)->padding_p \
5f5c8ee5
GM
480 && (X)->left_box_line_p == (Y)->left_box_line_p \
481 && (X)->right_box_line_p == (Y)->right_box_line_p \
726950c4
GM
482 && (X)->voffset == (Y)->voffset \
483 && (X)->pixel_width == (Y)->pixel_width)
5f5c8ee5 484
3305fc6a
KH
485/* Are character codes, faces, padding_ps of glyphs *X and *Y equal? */
486
487#define GLYPH_CHAR_AND_FACE_EQUAL_P(X, Y) \
488 ((X)->u.ch == (Y)->u.ch \
489 && (X)->face_id == (Y)->face_id \
490 && (X)->padding_p == (Y)->padding_p)
491
5f5c8ee5
GM
492/* Fill a character glyph GLYPH. CODE, FACE_ID, PADDING_P correspond
493 to the bits defined for the typedef `GLYPH' in lisp.h. */
177c0ea7 494
5f5c8ee5
GM
495#define SET_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P) \
496 do \
497 { \
3305fc6a
KH
498 (GLYPH).u.ch = (CODE); \
499 (GLYPH).face_id = (FACE_ID); \
500 (GLYPH).padding_p = (PADDING_P); \
5f5c8ee5
GM
501 } \
502 while (0)
503
504/* Fill a character type glyph GLYPH from a glyph typedef FROM as
505 defined in lisp.h. */
177c0ea7 506
5f5c8ee5
GM
507#define SET_CHAR_GLYPH_FROM_GLYPH(GLYPH, FROM) \
508 SET_CHAR_GLYPH ((GLYPH), \
652df850
KS
509 GLYPH_CHAR ((FROM)), \
510 GLYPH_FACE ((FROM)), \
3305fc6a 511 0)
5f5c8ee5 512
3305fc6a
KH
513/* Construct a glyph code from a character glyph GLYPH. If the
514 character is multibyte, return -1 as we can't use glyph table for a
54bff0bd 515 multibyte character. */
177c0ea7 516
652df850
KS
517#define SET_GLYPH_FROM_CHAR_GLYPH(G, GLYPH) \
518 do \
519 { \
520 if ((GLYPH).u.ch < 256) \
521 SET_GLYPH ((G), (GLYPH).u.ch, ((GLYPH).face_id)); \
522 else \
523 SET_GLYPH ((G), -1, 0); \
524 } \
525 while (0)
526
527#define GLYPH_INVALID_P(GLYPH) (GLYPH_CHAR (GLYPH) < 0)
5f5c8ee5
GM
528
529/* Is GLYPH a padding glyph? */
177c0ea7 530
3305fc6a 531#define CHAR_GLYPH_PADDING_P(GLYPH) (GLYPH).padding_p
5f5c8ee5
GM
532
533
534
535\f
536/***********************************************************************
537 Glyph Pools
538 ***********************************************************************/
539
540/* Glyph Pool.
541
542 Glyph memory for frame-based redisplay is allocated from the heap
543 in one vector kept in a glyph pool structure which is stored with
544 the frame. The size of the vector is made large enough to cover
545 all windows on the frame.
546
547 Both frame and window glyph matrices reference memory from a glyph
548 pool in frame-based redisplay.
549
550 In window-based redisplay, no glyphs pools exist; windows allocate
551 and free their glyph memory themselves. */
552
553struct glyph_pool
554{
555 /* Vector of glyphs allocated from the heap. */
556 struct glyph *glyphs;
557
558 /* Allocated size of `glyphs'. */
559 int nglyphs;
560
561 /* Number of rows and columns in a matrix. */
562 int nrows, ncolumns;
563};
564
565
566\f
567/***********************************************************************
568 Glyph Matrix
569 ***********************************************************************/
570
571/* Glyph Matrix.
572
573 Three kinds of glyph matrices exist:
574
575 1. Frame glyph matrices. These are used for terminal frames whose
576 redisplay needs a view of the whole screen due to limited terminal
577 capabilities. Frame matrices are used only in the update phase
578 of redisplay. They are built in update_frame and not used after
579 the update has been performed.
580
581 2. Window glyph matrices on frames having frame glyph matrices.
582 Such matrices are sub-matrices of their corresponding frame matrix,
583 i.e. frame glyph matrices and window glyph matrices share the same
584 glyph memory which is allocated in form of a glyph_pool structure.
585 Glyph rows in such a window matrix are slices of frame matrix rows.
586
587 2. Free-standing window glyph matrices managing their own glyph
588 storage. This form is used in window-based redisplay which
589 includes variable width and height fonts etc.
590
591 The size of a window's row vector depends on the height of fonts
592 defined on its frame. It is chosen so that the vector is large
593 enough to describe all lines in a window when it is displayed in
594 the smallest possible character size. When new fonts are loaded,
595 or window sizes change, the row vector is adjusted accordingly. */
596
597struct glyph_matrix
598{
599 /* The pool from which glyph memory is allocated, if any. This is
600 null for frame matrices and for window matrices managing their
601 own storage. */
602 struct glyph_pool *pool;
603
604 /* Vector of glyph row structures. The row at nrows - 1 is reserved
605 for the mode line. */
606 struct glyph_row *rows;
607
608 /* Number of elements allocated for the vector rows above. */
609 int rows_allocated;
610
611 /* The number of rows used by the window if all lines were displayed
612 with the smallest possible character height. */
613 int nrows;
614
615 /* Origin within the frame matrix if this is a window matrix on a
616 frame having a frame matrix. Both values are zero for
617 window-based redisplay. */
618 int matrix_x, matrix_y;
619
620 /* Width and height of the matrix in columns and rows. */
621 int matrix_w, matrix_h;
622
6df72db9 623 /* If this structure describes a window matrix of window W,
87388f9d
KS
624 window_left_col is the value of W->left_col, window_top_line the
625 value of W->top_line, window_height and window_width are width and
626 height of W, as returned by window_box, and window_vscroll is the
627 value of W->vscroll at the time the matrix was last adjusted.
628 Only set for window-based redisplay. */
629 int window_left_col, window_top_line;
630 int window_height, window_width;
631 int window_vscroll;
5f5c8ee5
GM
632
633 /* Number of glyphs reserved for left and right marginal areas when
634 the matrix was last adjusted. */
635 int left_margin_glyphs, right_margin_glyphs;
636
637 /* Flag indicating that scrolling should not be tried in
638 update_window. This flag is set by functions like try_window_id
639 which do their own scrolling. */
640 unsigned no_scrolling_p : 1;
641
642 /* Non-zero means window displayed in this matrix has a top mode
643 line. */
045dee35 644 unsigned header_line_p : 1;
5f5c8ee5
GM
645
646#ifdef GLYPH_DEBUG
647 /* A string identifying the method used to display the matrix. */
648 char method[512];
649#endif
2201e367 650
a36d22d2
GM
651 /* The buffer this matrix displays. Set in
652 mark_window_display_accurate_1. */
2201e367
GM
653 struct buffer *buffer;
654
a36d22d2
GM
655 /* Values of BEGV and ZV as of last redisplay. Set in
656 mark_window_display_accurate_1. */
2201e367 657 int begv, zv;
5f5c8ee5
GM
658};
659
660
661/* Check that glyph pointers stored in glyph rows of MATRIX are okay.
662 This aborts if any pointer is found twice. */
663
664#if GLYPH_DEBUG
383e0970 665void check_matrix_pointer_lossage (struct glyph_matrix *);
5f5c8ee5
GM
666#define CHECK_MATRIX(MATRIX) check_matrix_pointer_lossage ((MATRIX))
667#else
668#define CHECK_MATRIX(MATRIX) (void) 0
669#endif
670
671
672\f
673/***********************************************************************
674 Glyph Rows
675 ***********************************************************************/
676
677/* Area in window glyph matrix. If values are added or removed, the
678 function mark_object in alloc.c has to be changed. */
679
680enum glyph_row_area
681{
682 LEFT_MARGIN_AREA,
683 TEXT_AREA,
684 RIGHT_MARGIN_AREA,
685 LAST_AREA
686};
687
688
689/* Rows of glyphs in a windows or frame glyph matrix.
690
691 Each row is partitioned into three areas. The start and end of
692 each area is recorded in a pointer as shown below.
177c0ea7 693
5f5c8ee5
GM
694 +--------------------+-------------+---------------------+
695 | left margin area | text area | right margin area |
696 +--------------------+-------------+---------------------+
697 | | | |
698 glyphs[LEFT_MARGIN_AREA] glyphs[RIGHT_MARGIN_AREA]
699 | |
700 glyphs[TEXT_AREA] |
177c0ea7 701 glyphs[LAST_AREA]
5f5c8ee5
GM
702
703 Rows in frame matrices reference glyph memory allocated in a frame
704 glyph pool (see the description of struct glyph_pool). Rows in
705 window matrices on frames having frame matrices reference slices of
706 the glyphs of corresponding rows in the frame matrix.
177c0ea7 707
5f5c8ee5
GM
708 Rows in window matrices on frames having no frame matrices point to
709 glyphs allocated from the heap via xmalloc;
710 glyphs[LEFT_MARGIN_AREA] is the start address of the allocated
711 glyph structure array. */
712
713struct glyph_row
714{
715 /* Pointers to beginnings of areas. The end of an area A is found at
716 A + 1 in the vector. The last element of the vector is the end
717 of the whole row.
718
719 Kludge alert: Even if used[TEXT_AREA] == 0, glyphs[TEXT_AREA][0]'s
720 position field is used. It is -1 if this row does not correspond
721 to any text; it is some buffer position if the row corresponds to
722 an empty display line that displays a line end. This is what old
723 redisplay used to do. (Except in code for terminal frames, this
54bff0bd 724 kludge is no longer used, I believe. --gerd).
5f5c8ee5
GM
725
726 See also start, end, displays_text_p and ends_at_zv_p for cleaner
727 ways to do it. The special meaning of positions 0 and -1 will be
728 removed some day, so don't use it in new code. */
729 struct glyph *glyphs[1 + LAST_AREA];
730
731 /* Number of glyphs actually filled in areas. */
732 short used[LAST_AREA];
733
734 /* Window-relative x and y-position of the top-left corner of this
1ea40aa2 735 row. If y < 0, this means that eabs (y) pixels of the row are
5f5c8ee5 736 invisible because it is partially visible at the top of a window.
1ea40aa2 737 If x < 0, this means that eabs (x) pixels of the first glyph of
5f5c8ee5
GM
738 the text area of the row are invisible because the glyph is
739 partially visible. */
740 int x, y;
741
742 /* Width of the row in pixels without taking face extension at the
6332ca8a
GM
743 end of the row into account, and without counting truncation
744 and continuation glyphs at the end of a row on ttys. */
5f5c8ee5
GM
745 int pixel_width;
746
2febf6e0
GM
747 /* Logical ascent/height of this line. The value of ascent is zero
748 and height is 1 on terminal frames. */
5f5c8ee5
GM
749 int ascent, height;
750
2febf6e0
GM
751 /* Physical ascent/height of this line. If max_ascent > ascent,
752 this line overlaps the line above it on the display. Otherwise,
753 if max_height > height, this line overlaps the line beneath it. */
754 int phys_ascent, phys_height;
755
5f5c8ee5
GM
756 /* Portion of row that is visible. Partially visible rows may be
757 found at the top and bottom of a window. This is 1 for tty
758 frames. It may be < 0 in case of completely invisible rows. */
759 int visible_height;
760
db0c5a7d
KS
761 /* Extra line spacing added after this row. Do not consider this
762 in last row when checking if row is fully visible. */
763 int extra_line_spacing;
764
5f5c8ee5
GM
765 /* Hash code. This hash code is available as soon as the row
766 is constructed, i.e. after a call to display_line. */
767 unsigned hash;
768
769 /* First position in this row. This is the text position, including
770 overlay position information etc, where the display of this row
d36fe237
EZ
771 started, and can thus be less than the position of the first
772 glyph (e.g. due to invisible text or horizontal scrolling).
773 BIDI Note: In R2L rows, that have its reversed_p flag set, this
774 position is at or beyond the right edge of the row. */
5f5c8ee5
GM
775 struct display_pos start;
776
777 /* Text position at the end of this row. This is the position after
778 the last glyph on this row. It can be greater than the last
d36fe237
EZ
779 glyph position + 1, due to a newline that ends the line,
780 truncation, invisible text etc. In an up-to-date display, this
781 should always be equal to the start position of the next row.
782 BIDI Note: In R2L rows, this position is at or beyond the left
783 edge of the row. */
5f5c8ee5
GM
784 struct display_pos end;
785
d36fe237
EZ
786 /* The smallest and the largest buffer positions that contributed to
787 glyphs in this row. Note that due to bidi reordering, these are
788 in general different from the text positions stored in `start'
789 and `end' members above, and also different from the buffer
790 positions recorded in the glyphs displayed the leftmost and
791 rightmost on the screen. */
792 struct text_pos minpos, maxpos;
793
e937c046
KS
794 /* Non-zero means the overlay arrow bitmap is on this line.
795 -1 means use default overlay arrow bitmap, else
796 it specifies actual fringe bitmap number. */
797 int overlay_arrow_bitmap;
798
6b61353c
KH
799 /* Left fringe bitmap number (enum fringe_bitmap_type). */
800 unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
801
6b61353c
KH
802 /* Right fringe bitmap number (enum fringe_bitmap_type). */
803 unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
804
6b61353c
KH
805 /* Left fringe bitmap number (enum fringe_bitmap_type). */
806 unsigned left_fringe_bitmap : FRINGE_ID_BITS;
807
6b61353c
KH
808 /* Right fringe bitmap number (enum fringe_bitmap_type). */
809 unsigned right_fringe_bitmap : FRINGE_ID_BITS;
810
b3b08f03
KS
811 /* Face of the left fringe glyph. */
812 unsigned left_user_fringe_face_id : FACE_ID_BITS;
813
814 /* Face of the right fringe glyph. */
815 unsigned right_user_fringe_face_id : FACE_ID_BITS;
816
817 /* Face of the left fringe glyph. */
818 unsigned left_fringe_face_id : FACE_ID_BITS;
819
6b61353c
KH
820 /* Face of the right fringe glyph. */
821 unsigned right_fringe_face_id : FACE_ID_BITS;
822
5a874e95
YM
823 /* Vertical offset of the left fringe bitmap. */
824 signed left_fringe_offset : FRINGE_HEIGHT_BITS;
825
826 /* Vertical offset of the right fringe bitmap. */
827 signed right_fringe_offset : FRINGE_HEIGHT_BITS;
828
6b61353c
KH
829 /* 1 means that we must draw the bitmaps of this row. */
830 unsigned redraw_fringe_bitmaps_p : 1;
831
5f5c8ee5
GM
832 /* In a desired matrix, 1 means that this row must be updated. In a
833 current matrix, 0 means that the row has been invalidated, i.e.
834 the row's contents do not agree with what is visible on the
835 screen. */
836 unsigned enabled_p : 1;
837
5f5c8ee5
GM
838 /* 1 means row displays a text line that is truncated on the left or
839 right side. */
840 unsigned truncated_on_left_p : 1;
841 unsigned truncated_on_right_p : 1;
842
5f5c8ee5
GM
843 /* 1 means that this row displays a continued line, i.e. it has a
844 continuation mark at the right side. */
845 unsigned continued_p : 1;
846
847 /* 0 means that this row does not contain any text, i.e. it is
848 a blank line at the window and buffer end. */
849 unsigned displays_text_p : 1;
850
851 /* 1 means that this line ends at ZV. */
852 unsigned ends_at_zv_p : 1;
853
854 /* 1 means the face of the last glyph in the text area is drawn to
855 the right end of the window. This flag is used in
856 update_text_area to optimize clearing to the end of the area. */
857 unsigned fill_line_p : 1;
858
859 /* Non-zero means display a bitmap on X frames indicating that this
860 line contains no text and ends in ZV. */
861 unsigned indicate_empty_line_p : 1;
862
863 /* 1 means this row contains glyphs that overlap each other because
864 of lbearing or rbearing. */
865 unsigned contains_overlapping_glyphs_p : 1;
866
54bff0bd 867 /* 1 means this row is as wide as the window it is displayed in, including
afb7aabb 868 scroll bars, fringes, and internal borders. This also
5f5c8ee5
GM
869 implies that the row doesn't have marginal areas. */
870 unsigned full_width_p : 1;
871
54bff0bd 872 /* Non-zero means row is a mode or header-line. */
5f5c8ee5
GM
873 unsigned mode_line_p : 1;
874
2febf6e0
GM
875 /* 1 in a current row means this row is overlapped by another row. */
876 unsigned overlapped_p : 1;
877
666852af
GM
878 /* 1 means this line ends in the middle of a character consisting
879 of more than one glyph. Some glyphs have been put in this row,
880 the rest are put in rows below this one. */
881 unsigned ends_in_middle_of_char_p : 1;
177c0ea7 882
666852af
GM
883 /* 1 means this line starts in the middle of a character consisting
884 of more than one glyph. Some glyphs have been put in the
54bff0bd 885 previous row, the rest are put in this row. */
666852af
GM
886 unsigned starts_in_middle_of_char_p : 1;
887
2febf6e0
GM
888 /* 1 in a current row means this row overlaps others. */
889 unsigned overlapping_p : 1;
890
48b509fe
GM
891 /* 1 means some glyphs in this row are displayed in mouse-face. */
892 unsigned mouse_face_p : 1;
893
257e3f57
GM
894 /* 1 means this row was ended by a newline from a string. */
895 unsigned ends_in_newline_from_string_p : 1;
896
6b61353c
KH
897 /* 1 means this row width is exactly the width of the window, and the
898 final newline character is hidden in the right fringe. */
899 unsigned exact_window_width_line_p : 1;
900
901 /* 1 means this row currently shows the cursor in the right fringe. */
902 unsigned cursor_in_fringe_p : 1;
903
b437860a
RS
904 /* 1 means the last glyph in the row is part of an ellipsis. */
905 unsigned ends_in_ellipsis_p : 1;
906
6b61353c
KH
907 /* Non-zero means display a bitmap on X frames indicating that this
908 the first line of the buffer. */
909 unsigned indicate_bob_p : 1;
910
911 /* Non-zero means display a bitmap on X frames indicating that this
912 the top line of the window, but not start of the buffer. */
913 unsigned indicate_top_line_p : 1;
914
915 /* Non-zero means display a bitmap on X frames indicating that this
916 the last line of the buffer. */
917 unsigned indicate_eob_p : 1;
918
919 /* Non-zero means display a bitmap on X frames indicating that this
920 the bottom line of the window, but not end of the buffer. */
921 unsigned indicate_bottom_line_p : 1;
922
c143c213
EZ
923 /* Non-zero means the row was reversed to display text in a
924 right-to-left paragraph. */
925 unsigned reversed_p : 1;
926
5f5c8ee5
GM
927 /* Continuation lines width at the start of the row. */
928 int continuation_lines_width;
7cd30fff 929
3e88ae62 930#ifdef HAVE_WINDOW_SYSTEM
7cd30fff
KH
931 /* Non-NULL means the current clipping area. This is temporarily
932 set while exposing a region. Coordinates are frame-relative. */
933 XRectangle *clip;
3e88ae62 934#endif
5f5c8ee5
GM
935};
936
937
938/* Get a pointer to row number ROW in matrix MATRIX. If GLYPH_DEBUG
939 is defined to a non-zero value, the function matrix_row checks that
940 we don't try to access rows that are out of bounds. */
941
942#if GLYPH_DEBUG
383e0970 943struct glyph_row *matrix_row (struct glyph_matrix *, int);
5f5c8ee5
GM
944#define MATRIX_ROW(MATRIX, ROW) matrix_row ((MATRIX), (ROW))
945#else
946#define MATRIX_ROW(MATRIX, ROW) ((MATRIX)->rows + (ROW))
947#endif
948
177c0ea7 949/* Return a pointer to the row reserved for the mode line in MATRIX.
5f5c8ee5
GM
950 Row MATRIX->nrows - 1 is always reserved for the mode line. */
951
952#define MATRIX_MODE_LINE_ROW(MATRIX) \
953 ((MATRIX)->rows + (MATRIX)->nrows - 1)
954
54bff0bd 955/* Return a pointer to the row reserved for the header line in MATRIX.
5f5c8ee5
GM
956 This is always the first row in MATRIX because that's the only
957 way that works in frame-based redisplay. */
958
045dee35 959#define MATRIX_HEADER_LINE_ROW(MATRIX) (MATRIX)->rows
5f5c8ee5
GM
960
961/* Return a pointer to first row in MATRIX used for text display. */
962
963#define MATRIX_FIRST_TEXT_ROW(MATRIX) \
964 ((MATRIX)->rows->mode_line_p ? (MATRIX)->rows + 1 : (MATRIX)->rows)
965
966/* Return a pointer to the first glyph in the text area of a row.
967 MATRIX is the glyph matrix accessed, and ROW is the row index in
968 MATRIX. */
969
970#define MATRIX_ROW_GLYPH_START(MATRIX, ROW) \
971 (MATRIX_ROW ((MATRIX), (ROW))->glyphs[TEXT_AREA])
972
973/* Return the number of used glyphs in the text area of a row. */
177c0ea7 974
5f5c8ee5
GM
975#define MATRIX_ROW_USED(MATRIX, ROW) \
976 (MATRIX_ROW ((MATRIX), (ROW))->used[TEXT_AREA])
977
978/* Return the character/ byte position at which the display of ROW
9c82e145
EZ
979 starts. BIDI Note: this is the smallest character/byte position
980 among characters in ROW, i.e. the first logical-order character
981 displayed by ROW, which is not necessarily the smallest horizontal
982 position. */
177c0ea7 983
d36fe237
EZ
984#define MATRIX_ROW_START_CHARPOS(ROW) ((ROW)->minpos.charpos)
985#define MATRIX_ROW_START_BYTEPOS(ROW) ((ROW)->minpos.bytepos)
5f5c8ee5 986
9c82e145
EZ
987/* Return the character/ byte position at which ROW ends. BIDI Note:
988 this is the largest character/byte position among characters in
989 ROW, i.e. the last logical-order character displayed by ROW, which
990 is not necessarily the largest horizontal position. */
177c0ea7 991
d36fe237
EZ
992#define MATRIX_ROW_END_CHARPOS(ROW) ((ROW)->maxpos.charpos)
993#define MATRIX_ROW_END_BYTEPOS(ROW) ((ROW)->maxpos.bytepos)
5f5c8ee5
GM
994
995/* Return the vertical position of ROW in MATRIX. */
177c0ea7 996
5f5c8ee5
GM
997#define MATRIX_ROW_VPOS(ROW, MATRIX) ((ROW) - (MATRIX)->rows)
998
999/* Return the last glyph row + 1 in MATRIX on window W reserved for
1000 text. If W has a mode line, the last row in the matrix is reserved
1001 for it. */
177c0ea7 1002
5f5c8ee5
GM
1003#define MATRIX_BOTTOM_TEXT_ROW(MATRIX, W) \
1004 ((MATRIX)->rows \
1005 + (MATRIX)->nrows \
1006 - (WINDOW_WANTS_MODELINE_P ((W)) ? 1 : 0))
1007
1008/* Non-zero if the face of the last glyph in ROW's text area has
1009 to be drawn to the end of the text area. */
177c0ea7 1010
5f5c8ee5
GM
1011#define MATRIX_ROW_EXTENDS_FACE_P(ROW) ((ROW)->fill_line_p)
1012
1013/* Set and query the enabled_p flag of glyph row ROW in MATRIX. */
177c0ea7 1014
5f5c8ee5
GM
1015#define SET_MATRIX_ROW_ENABLED_P(MATRIX, ROW, VALUE) \
1016 (MATRIX_ROW ((MATRIX), (ROW))->enabled_p = (VALUE) != 0)
177c0ea7 1017
5f5c8ee5
GM
1018#define MATRIX_ROW_ENABLED_P(MATRIX, ROW) \
1019 (MATRIX_ROW ((MATRIX), (ROW))->enabled_p)
1020
1021/* Non-zero if ROW displays text. Value is non-zero if the row is
1022 blank but displays a line end. */
177c0ea7 1023
5f5c8ee5
GM
1024#define MATRIX_ROW_DISPLAYS_TEXT_P(ROW) ((ROW)->displays_text_p)
1025
db0c5a7d
KS
1026
1027/* Helper macros */
1028
1029#define MR_PARTIALLY_VISIBLE(ROW) \
1030 ((ROW)->height != (ROW)->visible_height)
1031
1032#define MR_PARTIALLY_VISIBLE_AT_TOP(W, ROW) \
1033 ((ROW)->y < WINDOW_HEADER_LINE_HEIGHT ((W)))
1034
1035#define MR_PARTIALLY_VISIBLE_AT_BOTTOM(W, ROW) \
1036 (((ROW)->y + (ROW)->height - (ROW)->extra_line_spacing) \
1037 > WINDOW_BOX_HEIGHT_NO_MODE_LINE ((W)))
1038
5f5c8ee5 1039/* Non-zero if ROW is not completely visible in window W. */
177c0ea7 1040
db0c5a7d
KS
1041#define MATRIX_ROW_PARTIALLY_VISIBLE_P(W, ROW) \
1042 (MR_PARTIALLY_VISIBLE ((ROW)) \
1043 && (MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)) \
1044 || MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW))))
1045
1046
5f5c8ee5
GM
1047
1048/* Non-zero if ROW is partially visible at the top of window W. */
177c0ea7 1049
5f5c8ee5 1050#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P(W, ROW) \
db0c5a7d
KS
1051 (MR_PARTIALLY_VISIBLE ((ROW)) \
1052 && MR_PARTIALLY_VISIBLE_AT_TOP ((W), (ROW)))
5f5c8ee5
GM
1053
1054/* Non-zero if ROW is partially visible at the bottom of window W. */
177c0ea7 1055
db0c5a7d
KS
1056#define MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P(W, ROW) \
1057 (MR_PARTIALLY_VISIBLE ((ROW)) \
1058 && MR_PARTIALLY_VISIBLE_AT_BOTTOM ((W), (ROW)))
5f5c8ee5
GM
1059
1060/* Return the bottom Y + 1 of ROW. */
177c0ea7 1061
5f5c8ee5
GM
1062#define MATRIX_ROW_BOTTOM_Y(ROW) ((ROW)->y + (ROW)->height)
1063
1064/* Is ROW the last visible one in the display described by the
1065 iterator structure pointed to by IT?. */
177c0ea7 1066
5f5c8ee5
GM
1067#define MATRIX_ROW_LAST_VISIBLE_P(ROW, IT) \
1068 (MATRIX_ROW_BOTTOM_Y ((ROW)) >= (IT)->last_visible_y)
1069
1070/* Non-zero if ROW displays a continuation line. */
1071
1072#define MATRIX_ROW_CONTINUATION_LINE_P(ROW) \
1073 ((ROW)->continuation_lines_width > 0)
1074
1075/* Non-zero if ROW ends in the middle of a character. This is the
1076 case for continued lines showing only part of a display table entry
1077 or a control char, or an overlay string. */
1078
1079#define MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P(ROW) \
e6fb381c 1080 ((ROW)->end.dpvec_index > 0 \
666852af
GM
1081 || (ROW)->end.overlay_string_index >= 0 \
1082 || (ROW)->ends_in_middle_of_char_p)
5f5c8ee5
GM
1083
1084/* Non-zero if ROW ends in the middle of an overlay string. */
1085
1086#define MATRIX_ROW_ENDS_IN_OVERLAY_STRING_P(ROW) \
1087 ((ROW)->end.overlay_string_index >= 0)
1088
1089/* Non-zero if ROW starts in the middle of a character. See above. */
177c0ea7 1090
5f5c8ee5 1091#define MATRIX_ROW_STARTS_IN_MIDDLE_OF_CHAR_P(ROW) \
e6fb381c 1092 ((ROW)->start.dpvec_index > 0 \
666852af 1093 || (ROW)->starts_in_middle_of_char_p \
5f5c8ee5
GM
1094 || ((ROW)->start.overlay_string_index >= 0 \
1095 && (ROW)->start.string_pos.charpos > 0))
1096
2febf6e0
GM
1097/* Non-zero means ROW overlaps its predecessor. */
1098
1099#define MATRIX_ROW_OVERLAPS_PRED_P(ROW) \
1100 ((ROW)->phys_ascent > (ROW)->ascent)
1101
1102/* Non-zero means ROW overlaps its successor. */
1103
1104#define MATRIX_ROW_OVERLAPS_SUCC_P(ROW) \
1105 ((ROW)->phys_height - (ROW)->phys_ascent \
1106 > (ROW)->height - (ROW)->ascent)
1107
5f5c8ee5
GM
1108/* Non-zero means that fonts have been loaded since the last glyph
1109 matrix adjustments. The function redisplay_internal adjusts glyph
1110 matrices when this flag is non-zero. */
1111
1112extern int fonts_changed_p;
1113
1114/* A glyph for a space. */
1115
1116extern struct glyph space_glyph;
1117
1118/* Window being updated by update_window. This is non-null as long as
856dd475 1119 update_window has not finished, and null otherwise. */
5f5c8ee5
GM
1120
1121extern struct window *updated_window;
1122
1123/* Glyph row and area updated by update_window_line. */
1124
1125extern struct glyph_row *updated_row;
1126extern int updated_area;
1127
1128/* Non-zero means reading single-character input with prompt so put
1129 cursor on mini-buffer after the prompt. Positive means at end of
1130 text in echo area; negative means at beginning of line. */
1131
1132extern int cursor_in_echo_area;
1133
1134/* Non-zero means last display completed. Zero means it was
1135 preempted. */
1136
1137extern int display_completed;
1138
5f5c8ee5
GM
1139/* A temporary storage area, including a row of glyphs. Initialized
1140 in xdisp.c. Used for various purposes, as an example see
855a0da7 1141 get_overlay_arrow_glyph_row. */
5f5c8ee5
GM
1142
1143extern struct glyph_row scratch_glyph_row;
1144
1145
1146\f
d5cc60b8
KS
1147/************************************************************************
1148 Glyph Strings
1149 ************************************************************************/
1150
1151/* Enumeration for overriding/changing the face to use for drawing
d74b2553 1152 glyphs in draw_glyphs. */
d5cc60b8
KS
1153
1154enum draw_glyphs_face
1155{
1156 DRAW_NORMAL_TEXT,
1157 DRAW_INVERSE_VIDEO,
1158 DRAW_CURSOR,
1159 DRAW_MOUSE_FACE,
1160 DRAW_IMAGE_RAISED,
1161 DRAW_IMAGE_SUNKEN
1162};
1163
79fa9e0f
KS
1164#ifdef HAVE_WINDOW_SYSTEM
1165
d5cc60b8
KS
1166/* A sequence of glyphs to be drawn in the same face. */
1167
1168struct glyph_string
1169{
1170 /* X-origin of the string. */
1171 int x;
1172
1173 /* Y-origin and y-position of the base line of this string. */
1174 int y, ybase;
1175
1176 /* The width of the string, not including a face extension. */
1177 int width;
1178
1179 /* The width of the string, including a face extension. */
1180 int background_width;
1181
1182 /* The height of this string. This is the height of the line this
1183 string is drawn in, and can be different from the height of the
1184 font the string is drawn in. */
1185 int height;
1186
1187 /* Number of pixels this string overwrites in front of its x-origin.
1188 This number is zero if the string has an lbearing >= 0; it is
1189 -lbearing, if the string has an lbearing < 0. */
1190 int left_overhang;
1191
1192 /* Number of pixels this string overwrites past its right-most
1193 nominal x-position, i.e. x + width. Zero if the string's
1194 rbearing is <= its nominal width, rbearing - width otherwise. */
1195 int right_overhang;
1196
1197 /* The frame on which the glyph string is drawn. */
1198 struct frame *f;
1199
1200 /* The window on which the glyph string is drawn. */
1201 struct window *w;
1202
1203 /* X display and window for convenience. */
1204 Display *display;
1205 Window window;
1206
1207 /* The glyph row for which this string was built. It determines the
1208 y-origin and height of the string. */
1209 struct glyph_row *row;
1210
1211 /* The area within row. */
1212 enum glyph_row_area area;
1213
1214 /* Characters to be drawn, and number of characters. */
1215 XChar2b *char2b;
1216 int nchars;
1217
1218 /* A face-override for drawing cursors, mouse face and similar. */
1219 enum draw_glyphs_face hl;
1220
1221 /* Face in which this string is to be drawn. */
1222 struct face *face;
1223
1224 /* Font in which this string is to be drawn. */
93cf902a 1225 struct font *font;
d5cc60b8 1226
a88c7fcd
KH
1227 /* Non-null means this string describes (part of) a static
1228 composition. */
d5cc60b8
KS
1229 struct composition *cmp;
1230
a88c7fcd
KH
1231 /* If not negative, this string describes a compos. */
1232 int cmp_id;
1233
1234 /* Start and end glyph indices in a glyph-string. */
1235 int cmp_from, cmp_to;
d5cc60b8
KS
1236
1237 /* 1 means this glyph strings face has to be drawn to the right end
1238 of the window's drawing area. */
1239 unsigned extends_to_end_of_line_p : 1;
1240
1241 /* 1 means the background of this string has been drawn. */
1242 unsigned background_filled_p : 1;
1243
1244 /* 1 means glyph string must be drawn with 16-bit functions. */
1245 unsigned two_byte_p : 1;
1246
1247 /* 1 means that the original font determined for drawing this glyph
1248 string could not be loaded. The member `font' has been set to
1249 the frame's default font in this case. */
1250 unsigned font_not_found_p : 1;
1251
1252 /* 1 means that the face in which this glyph string is drawn has a
1253 stipple pattern. */
1254 unsigned stippled_p : 1;
1255
10a07952
YM
1256#define OVERLAPS_PRED (1 << 0)
1257#define OVERLAPS_SUCC (1 << 1)
1258#define OVERLAPS_BOTH (OVERLAPS_PRED | OVERLAPS_SUCC)
1259#define OVERLAPS_ERASED_CURSOR (1 << 2)
1260 /* Non-zero means only the foreground of this glyph string must be
1261 drawn, and we should use the physical height of the line this
1262 glyph string appears in as clip rect. If the value is
1263 OVERLAPS_ERASED_CURSOR, the clip rect is restricted to the rect
1264 of the erased cursor. OVERLAPS_PRED and OVERLAPS_SUCC mean we
1265 draw overlaps with the preceding and the succeeding rows,
1266 respectively. */
1267 unsigned for_overlaps : 3;
d5cc60b8 1268
ae185452
KH
1269 /* 1 means that all glyphs in this glyph string has the flag
1270 padding_p set, and thus must be drawn one by one to have 1-pixel
1271 width even though the logical width in the font is zero. */
1272 unsigned padding_p : 1;
1273
d5cc60b8 1274 /* The GC to use for drawing this glyph string. */
9e2a2647 1275#if defined(HAVE_X_WINDOWS)
d5cc60b8
KS
1276 GC gc;
1277#endif
1278#if defined(HAVE_NTGUI)
1279 XGCValues *gc;
1280 HDC hdc;
1281#endif
1282
1283 /* A pointer to the first glyph in the string. This glyph
1284 corresponds to char2b[0]. Needed to draw rectangles if
1285 font_not_found_p is 1. */
1286 struct glyph *first_glyph;
1287
1288 /* Image, if any. */
1289 struct image *img;
1290
0633d52c
KS
1291 /* Slice */
1292 struct glyph_slice slice;
1293
8c2da0fa
ST
1294 /* Non-null means the horizontal clipping region starts from the
1295 left edge of *clip_head, and ends with the right edge of
1296 *clip_tail, not including their overhangs. */
1297 struct glyph_string *clip_head, *clip_tail;
1298
7cd30fff
KH
1299 /* The current clipping areas. */
1300 NativeRectangle clip[2];
1301
1302 /* Number of clipping areas. */
1303 int num_clips;
8443e69e 1304
93cf902a
KH
1305 int underline_position;
1306
1307 int underline_thickness;
1308
d5cc60b8
KS
1309 struct glyph_string *next, *prev;
1310};
1311
79fa9e0f 1312#endif /* HAVE_WINDOW_SYSTEM */
d5cc60b8
KS
1313
1314\f
5f5c8ee5
GM
1315/************************************************************************
1316 Display Dimensions
1317 ************************************************************************/
1318
1319/* Return the height of the mode line in glyph matrix MATRIX, or zero
1320 if not known. This macro is called under circumstances where
1321 MATRIX might not have been allocated yet. */
1322
1323#define MATRIX_MODE_LINE_HEIGHT(MATRIX) \
1324 ((MATRIX) && (MATRIX)->rows \
1325 ? MATRIX_MODE_LINE_ROW (MATRIX)->height \
1326 : 0)
1327
54bff0bd 1328/* Return the height of the header line in glyph matrix MATRIX, or zero
5f5c8ee5
GM
1329 if not known. This macro is called under circumstances where
1330 MATRIX might not have been allocated yet. */
1331
045dee35 1332#define MATRIX_HEADER_LINE_HEIGHT(MATRIX) \
5f5c8ee5 1333 ((MATRIX) && (MATRIX)->rows \
045dee35 1334 ? MATRIX_HEADER_LINE_ROW (MATRIX)->height \
5f5c8ee5
GM
1335 : 0)
1336
a4610492
KS
1337/* Return the desired face id for the mode line of a window, depending
1338 on whether the window is selected or not, or if the window is the
1339 scrolling window for the currently active minibuffer window.
1340
1341 Due to the way display_mode_lines manipulates with the contents of
1342 selected_window, this macro needs three arguments: SELW which is
1343 compared against the current value of selected_window, MBW which is
1344 compared against minibuf_window (if SELW doesn't match), and SCRW
5705966b 1345 which is compared against minibuf_selected_window (if MBW matches). */
a4610492
KS
1346
1347#define CURRENT_MODE_LINE_FACE_ID_3(SELW, MBW, SCRW) \
5f380a5b 1348 ((!mode_line_in_non_selected_windows \
a4610492 1349 || (SELW) == XWINDOW (selected_window) \
5f380a5b 1350 || (minibuf_level > 0 \
5705966b 1351 && !NILP (minibuf_selected_window) \
5f380a5b 1352 && (MBW) == XWINDOW (minibuf_window) \
5705966b 1353 && (SCRW) == XWINDOW (minibuf_selected_window))) \
a4610492
KS
1354 ? MODE_LINE_FACE_ID \
1355 : MODE_LINE_INACTIVE_FACE_ID)
1356
1357
1358/* Return the desired face id for the mode line of window W. */
f6911ea7
KS
1359
1360#define CURRENT_MODE_LINE_FACE_ID(W) \
a4610492 1361 (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_window), (W)))
f6911ea7 1362
5f5c8ee5 1363/* Return the current height of the mode line of window W. If not
e9e32f46
GM
1364 known from current_mode_line_height, look at W's current glyph
1365 matrix, or return a default based on the height of the font of the
1366 face `mode-line'. */
1367
1368#define CURRENT_MODE_LINE_HEIGHT(W) \
1369 (current_mode_line_height >= 0 \
1370 ? current_mode_line_height \
1371 : (MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \
1372 ? MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \
1373 : estimate_mode_line_height (XFRAME ((W)->frame), \
f6911ea7 1374 CURRENT_MODE_LINE_FACE_ID (W))))
5f5c8ee5 1375
54bff0bd 1376/* Return the current height of the header line of window W. If not
e9e32f46
GM
1377 known from current_header_line_height, look at W's current glyph
1378 matrix, or return an estimation based on the height of the font of
1379 the face `header-line'. */
1380
1381#define CURRENT_HEADER_LINE_HEIGHT(W) \
1382 (current_header_line_height >= 0 \
1383 ? current_header_line_height \
1384 : (MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \
1385 ? MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \
1386 : estimate_mode_line_height (XFRAME ((W)->frame), \
1387 HEADER_LINE_FACE_ID)))
5f5c8ee5
GM
1388
1389/* Return the height of the desired mode line of window W. */
1390
1391#define DESIRED_MODE_LINE_HEIGHT(W) \
1392 MATRIX_MODE_LINE_HEIGHT ((W)->desired_matrix)
1393
54bff0bd 1394/* Return the height of the desired header line of window W. */
5f5c8ee5 1395
045dee35
GM
1396#define DESIRED_HEADER_LINE_HEIGHT(W) \
1397 MATRIX_HEADER_LINE_HEIGHT ((W)->desired_matrix)
5f5c8ee5 1398
54bff0bd 1399/* Value is non-zero if window W wants a mode line. */
5f5c8ee5
GM
1400
1401#define WINDOW_WANTS_MODELINE_P(W) \
2e8834ed 1402 (!MINI_WINDOW_P ((W)) \
5f5c8ee5 1403 && !(W)->pseudo_window_p \
2e8834ed 1404 && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W)))) \
8801a864 1405 && BUFFERP ((W)->buffer) \
2e8834ed 1406 && !NILP (XBUFFER ((W)->buffer)->mode_line_format) \
87388f9d 1407 && WINDOW_TOTAL_LINES (W) > 1)
5f5c8ee5 1408
54bff0bd 1409/* Value is non-zero if window W wants a header line. */
5f5c8ee5 1410
045dee35 1411#define WINDOW_WANTS_HEADER_LINE_P(W) \
2e8834ed 1412 (!MINI_WINDOW_P ((W)) \
5f5c8ee5 1413 && !(W)->pseudo_window_p \
2e8834ed 1414 && FRAME_WANTS_MODELINE_P (XFRAME (WINDOW_FRAME ((W)))) \
8801a864 1415 && BUFFERP ((W)->buffer) \
2e8834ed 1416 && !NILP (XBUFFER ((W)->buffer)->header_line_format) \
87388f9d 1417 && WINDOW_TOTAL_LINES (W) > 1 + !NILP (XBUFFER ((W)->buffer)->mode_line_format))
5f5c8ee5 1418
d74b2553
KS
1419
1420/* Return proper value to be used as baseline offset of font that has
1421 ASCENT and DESCENT to draw characters by the font at the vertical
1422 center of the line of frame F.
1423
1424 Here, our task is to find the value of BOFF in the following figure;
1425
1426 -------------------------+-----------+-
1427 -+-+---------+-+ | |
1428 | | | | | |
1429 | | | | F_ASCENT F_HEIGHT
1430 | | | ASCENT | |
1431 HEIGHT | | | | |
1432 | | |-|-+------+-----------|------- baseline
1433 | | | | BOFF | |
1434 | |---------|-+-+ | |
1435 | | | DESCENT | |
1436 -+-+---------+-+ F_DESCENT |
1437 -------------------------+-----------+-
1438
1439 -BOFF + DESCENT + (F_HEIGHT - HEIGHT) / 2 = F_DESCENT
1440 BOFF = DESCENT + (F_HEIGHT - HEIGHT) / 2 - F_DESCENT
1441 DESCENT = FONT->descent
1442 HEIGHT = FONT_HEIGHT (FONT)
87388f9d 1443 F_DESCENT = (FRAME_FONT (F)->descent
6ed8eeff 1444 - F->terminal->output_data.x->baseline_offset)
d74b2553
KS
1445 F_HEIGHT = FRAME_LINE_HEIGHT (F)
1446*/
1447
1448#define VCENTER_BASELINE_OFFSET(FONT, F) \
1449 (FONT_DESCENT (FONT) \
1450 + (FRAME_LINE_HEIGHT ((F)) - FONT_HEIGHT ((FONT)) \
1451 + (FRAME_LINE_HEIGHT ((F)) > FONT_HEIGHT ((FONT)))) / 2 \
1452 - (FONT_DESCENT (FRAME_FONT (F)) - FRAME_BASELINE_OFFSET (F)))
1453
177c0ea7 1454\f
5f5c8ee5
GM
1455/***********************************************************************
1456 Faces
1457 ***********************************************************************/
177c0ea7 1458
5f5c8ee5
GM
1459/* Indices of face attributes in Lisp face vectors. Slot zero is the
1460 symbol `face'. */
1461
1462enum lface_attribute_index
1463{
1464 LFACE_FAMILY_INDEX = 1,
ff63b086 1465 LFACE_FOUNDRY_INDEX,
5f5c8ee5
GM
1466 LFACE_SWIDTH_INDEX,
1467 LFACE_HEIGHT_INDEX,
1468 LFACE_WEIGHT_INDEX,
1469 LFACE_SLANT_INDEX,
1470 LFACE_UNDERLINE_INDEX,
1471 LFACE_INVERSE_INDEX,
1472 LFACE_FOREGROUND_INDEX,
1473 LFACE_BACKGROUND_INDEX,
1474 LFACE_STIPPLE_INDEX,
1475 LFACE_OVERLINE_INDEX,
1476 LFACE_STRIKE_THROUGH_INDEX,
1477 LFACE_BOX_INDEX,
b3091a23 1478 LFACE_FONT_INDEX,
cd68bbe8 1479 LFACE_INHERIT_INDEX,
0ba42da6 1480 LFACE_FONTSET_INDEX,
5f5c8ee5
GM
1481 LFACE_VECTOR_SIZE
1482};
1483
1484
1485/* Box types of faces. */
1486
1487enum face_box_type
1488{
1489 /* No box around text. */
1490 FACE_NO_BOX,
1491
1492 /* Simple box of specified width and color. Default width is 1, and
1493 default color is the foreground color of the face. */
1494 FACE_SIMPLE_BOX,
1495
1496 /* Boxes with 3D shadows. Color equals the background color of the
1497 face. Width is specified. */
1498 FACE_RAISED_BOX,
1499 FACE_SUNKEN_BOX
1500};
1501
1502
1503/* Structure describing a realized face.
1504
1505 For each Lisp face, 0..N realized faces can exist for different
1506 frames and different charsets. Realized faces are built from Lisp
1507 faces and text properties/overlays by merging faces and adding
1508 unspecified attributes from the `default' face. */
1509
9f2279ad 1510struct face
5f5c8ee5
GM
1511{
1512 /* The id of this face. The id equals the index of this face in the
1513 vector faces_by_id of its face cache. */
1514 int id;
1515
1516#ifdef HAVE_WINDOW_SYSTEM
177c0ea7 1517
8016e514
EZ
1518 /* If non-zero, this is a GC that we can use without modification for
1519 drawing the characters in this face. */
5f5c8ee5 1520 GC gc;
177c0ea7 1521
831fefca
GM
1522 /* Background stipple or bitmap used for this face. This is
1523 an id as returned from load_pixmap. */
1524 int stipple;
5f5c8ee5
GM
1525
1526#else /* not HAVE_WINDOW_SYSTEM */
1527
1528 /* Dummy. */
1529 int stipple;
1530
1531#endif /* not HAVE_WINDOW_SYSTEM */
1532
1533 /* Pixel value of foreground color for X frames. Color index
1534 for tty frames. */
1535 unsigned long foreground;
177c0ea7 1536
5f5c8ee5
GM
1537 /* Pixel value or color index of background color. */
1538 unsigned long background;
1539
1540 /* Pixel value or color index of underline color. */
1541 unsigned long underline_color;
1542
1543 /* Pixel value or color index of overlined, strike-through, or box
1544 color. */
1545 unsigned long overline_color;
1546 unsigned long strike_through_color;
1547 unsigned long box_color;
1548
93cf902a 1549 struct font *font;
8443e69e 1550
da78062b
KH
1551 /* Fontset ID if for this face's fontset. Non-ASCII faces derived
1552 from the same ASCII face have the same fontset. */
5f5c8ee5 1553 int fontset;
177c0ea7 1554
5f5c8ee5
GM
1555 /* Pixmap width and height. */
1556 unsigned int pixmap_w, pixmap_h;
177c0ea7 1557
5f5c8ee5 1558 /* Non-zero means characters in this face have a box that thickness
08f9976f
KH
1559 around them. If it is negative, the absolute value indicates the
1560 thickness, and the horizontal lines of box (top and bottom) are
54bff0bd 1561 drawn inside of characters glyph area. The vertical lines of box
08f9976f
KH
1562 (left and right) are drawn as the same way as the case that this
1563 value is positive. */
5f5c8ee5
GM
1564 int box_line_width;
1565
1566 /* Type of box drawn. A value of FACE_NO_BOX means no box is drawn
1567 around text in this face. A value of FACE_SIMPLE_BOX means a box
1568 of width box_line_width is drawn in color box_color. A value of
1569 FACE_RAISED_BOX or FACE_SUNKEN_BOX means a 3D box is drawn with
1570 shadow colors derived from the background color of the face. */
1571 enum face_box_type box;
1572
1573 /* If `box' above specifies a 3D type, 1 means use box_color for
1574 drawing shadows. */
1575 unsigned use_box_color_for_shadows_p : 1;
1576
5f5c8ee5
GM
1577 /* Non-zero if text in this face should be underlined, overlined,
1578 strike-through or have a box drawn around it. */
1579 unsigned underline_p : 1;
1580 unsigned overline_p : 1;
1581 unsigned strike_through_p : 1;
1582
1583 /* 1 means that the colors specified for this face could not be
1584 loaded, and were replaced by default colors, so they shouldn't be
1585 freed. */
1586 unsigned foreground_defaulted_p : 1;
1587 unsigned background_defaulted_p : 1;
1588
1589 /* 1 means that either no color is specified for underlining or that
28b927d8 1590 the specified color couldn't be loaded. Use the foreground
5f5c8ee5 1591 color when drawing in that case. */
177c0ea7 1592 unsigned underline_defaulted_p : 1;
5f5c8ee5
GM
1593
1594 /* 1 means that either no color is specified for the corresponding
54bff0bd 1595 attribute or that the specified color couldn't be loaded.
5f5c8ee5
GM
1596 Use the foreground color when drawing in that case. */
1597 unsigned overline_color_defaulted_p : 1;
1598 unsigned strike_through_color_defaulted_p : 1;
1599 unsigned box_color_defaulted_p : 1;
1600
1601 /* TTY appearances. Blinking is not yet implemented. Colors are
1602 found in `lface' with empty color string meaning the default
1603 color of the TTY. */
1604 unsigned tty_bold_p : 1;
1605 unsigned tty_dim_p : 1;
1606 unsigned tty_underline_p : 1;
1607 unsigned tty_alt_charset_p : 1;
1608 unsigned tty_reverse_p : 1;
1609 unsigned tty_blinking_p : 1;
1610
dd387b25
GM
1611 /* 1 means that colors of this face may not be freed because they
1612 have been copied bitwise from a base face (see
1613 realize_x_face). */
1614 unsigned colors_copied_bitwise_p : 1;
1615
11894ceb
MB
1616 /* If non-zero, use overstrike (to simulate bold-face). */
1617 unsigned overstrike : 1;
1618
edfda783
AR
1619/* NOTE: this is not used yet, but eventually this impl should be done
1620 similarly to overstrike */
1621#ifdef HAVE_NS
1622 /* If non-zero, use geometric rotation (to simulate italic). */
1623 unsigned synth_ital : 1;
1624#endif
1625
31e0750e
DN
1626 /* The Lisp face attributes this face realizes. All attributes
1627 in this vector are non-nil. */
1628 Lisp_Object lface[LFACE_VECTOR_SIZE];
1629
1630 /* The hash value of this face. */
1631 unsigned hash;
1632
5f5c8ee5
GM
1633 /* Next and previous face in hash collision list of face cache. */
1634 struct face *next, *prev;
b3091a23 1635
da78062b
KH
1636 /* If this face is an ASCII face, this points to this face itself.
1637 Otherwise, this points to an ASCII face that has the same
1638 attributes except the font. */
b3091a23 1639 struct face *ascii_face;
8443e69e 1640
8443e69e
KH
1641 /* Extra member that a font-driver uses privately. */
1642 void *extra;
5f5c8ee5
GM
1643};
1644
1645
1646/* Color index indicating that face uses a terminal's default color. */
1647
1648#define FACE_TTY_DEFAULT_COLOR ((unsigned long) -1)
1649
f9d2fdc4
EZ
1650/* Color index indicating that face uses an unknown foreground color. */
1651
1652#define FACE_TTY_DEFAULT_FG_COLOR ((unsigned long) -2)
1653
54bff0bd 1654/* Color index indicating that face uses an unknown background color. */
f9d2fdc4
EZ
1655
1656#define FACE_TTY_DEFAULT_BG_COLOR ((unsigned long) -3)
1657
5f5c8ee5
GM
1658/* Non-zero if FACE was realized for unibyte use. */
1659
1660#define FACE_UNIBYTE_P(FACE) ((FACE)->charset < 0)
1661
1662
1663/* IDs of important faces known by the C face code. These are the IDs
1664 of the faces for CHARSET_ASCII. */
1665
1666enum face_id
1667{
1668 DEFAULT_FACE_ID,
1669 MODE_LINE_FACE_ID,
f6911ea7 1670 MODE_LINE_INACTIVE_FACE_ID,
9ea173e8 1671 TOOL_BAR_FACE_ID,
afb7aabb 1672 FRINGE_FACE_ID,
045dee35 1673 HEADER_LINE_FACE_ID,
76a6bc49
GM
1674 SCROLL_BAR_FACE_ID,
1675 BORDER_FACE_ID,
1676 CURSOR_FACE_ID,
1677 MOUSE_FACE_ID,
8317e104 1678 MENU_FACE_ID,
53abc3bf 1679 VERTICAL_BORDER_FACE_ID,
5f5c8ee5
GM
1680 BASIC_FACE_ID_SENTINEL
1681};
1682
6b61353c 1683#define MAX_FACE_ID ((1 << FACE_ID_BITS) - 1)
5f5c8ee5
GM
1684
1685/* A cache of realized faces. Each frame has its own cache because
1686 Emacs allows different frame-local face definitions. */
1687
1688struct face_cache
1689{
1690 /* Hash table of cached realized faces. */
1691 struct face **buckets;
177c0ea7 1692
5f5c8ee5
GM
1693 /* Back-pointer to the frame this cache belongs to. */
1694 struct frame *f;
1695
1696 /* A vector of faces so that faces can be referenced by an ID. */
1697 struct face **faces_by_id;
1698
1699 /* The allocated size, and number of used slots of faces_by_id. */
1700 int size, used;
90893c55
GM
1701
1702 /* Flag indicating that attributes of the `menu' face have been
1703 changed. */
1704 unsigned menu_face_changed_p : 1;
5f5c8ee5
GM
1705};
1706
1707
1708/* Prepare face FACE for use on frame F. This must be called before
1709 using X resources of FACE. */
1710
1711#define PREPARE_FACE_FOR_DISPLAY(F, FACE) \
1712 if ((FACE)->gc == 0) \
1713 prepare_face_for_display ((F), (FACE)); \
1714 else \
1715 (void) 0
1716
1717/* Return a pointer to the face with ID on frame F, or null if such a
1718 face doesn't exist. */
1719
1720#define FACE_FROM_ID(F, ID) \
c388b3c2 1721 (((unsigned) (ID) < FRAME_FACE_CACHE (F)->used) \
5f5c8ee5
GM
1722 ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \
1723 : NULL)
1724
ff1a0d8e
KH
1725#ifdef HAVE_WINDOW_SYSTEM
1726
b3091a23
KH
1727/* Non-zero if FACE is suitable for displaying character CHAR. */
1728
1729#define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) \
8f924df7 1730 (ASCII_CHAR_P (CHAR) \
b3091a23
KH
1731 ? (FACE) == (FACE)->ascii_face \
1732 : face_suitable_for_char_p ((FACE), (CHAR)))
1733
5f5c8ee5 1734/* Return the id of the realized face on frame F that is like the face
b3091a23
KH
1735 with id ID but is suitable for displaying character CHAR.
1736 This macro is only meaningful for multibyte character CHAR. */
177c0ea7 1737
83a90904 1738#define FACE_FOR_CHAR(F, FACE, CHAR, POS, OBJECT) \
d419e1d9 1739 ((ASCII_CHAR_P (CHAR) || CHAR_BYTE8_P (CHAR)) \
83a90904
KH
1740 ? (FACE)->ascii_face->id \
1741 : face_for_char ((F), (FACE), (CHAR), (POS), (OBJECT)))
5f5c8ee5 1742
ff1a0d8e 1743#else /* not HAVE_WINDOW_SYSTEM */
5f5c8ee5 1744
ff1a0d8e 1745#define FACE_SUITABLE_FOR_CHAR_P(FACE, CHAR) 1
83a90904 1746#define FACE_FOR_CHAR(F, FACE, CHAR, POS, OBJECT) ((FACE)->id)
ff1a0d8e
KH
1747
1748#endif /* not HAVE_WINDOW_SYSTEM */
5f5c8ee5
GM
1749
1750/* Non-zero means face attributes have been changed since the last
1751 redisplay. Used in redisplay_internal. */
1752
1753extern int face_change_count;
1754
e69a9370 1755/* For reordering of bidirectional text. */
b7b65b15
EZ
1756#define BIDI_MAXLEVEL 64
1757
29e3d8d1
EZ
1758/* Data type for describing the bidirectional character types. The
1759 first 7 must be at the beginning, because they are the only values
1760 valid in the `bidi_type' member of `struct glyph'; we only reserve
1761 3 bits for it, so we cannot use there values larger than 7. */
b7b65b15 1762typedef enum {
29e3d8d1 1763 UNKNOWN_BT = 0,
b7b65b15
EZ
1764 STRONG_L, /* strong left-to-right */
1765 STRONG_R, /* strong right-to-left */
29e3d8d1
EZ
1766 WEAK_EN, /* european number */
1767 WEAK_AN, /* arabic number */
1768 WEAK_BN, /* boundary neutral */
1769 NEUTRAL_B, /* paragraph separator */
b7b65b15
EZ
1770 STRONG_AL, /* arabic right-to-left letter */
1771 LRE, /* left-to-right embedding */
1772 LRO, /* left-to-right override */
1773 RLE, /* right-to-left embedding */
1774 RLO, /* right-to-left override */
1775 PDF, /* pop directional format */
b7b65b15
EZ
1776 WEAK_ES, /* european number separator */
1777 WEAK_ET, /* european number terminator */
b7b65b15
EZ
1778 WEAK_CS, /* common separator */
1779 WEAK_NSM, /* non-spacing mark */
b7b65b15
EZ
1780 NEUTRAL_S, /* segment separator */
1781 NEUTRAL_WS, /* whitespace */
1782 NEUTRAL_ON /* other neutrals */
1783} bidi_type_t;
1784
1785/* The basic directionality data type. */
1786typedef enum { NEUTRAL_DIR, L2R, R2L } bidi_dir_t;
1787
1788/* Data type for storing information about characters we need to
1789 remember. */
1790struct bidi_saved_info {
446470a9 1791 EMACS_INT bytepos, charpos; /* character's buffer position */
89d3374a
EZ
1792 bidi_type_t type; /* character's resolved bidi type */
1793 bidi_type_t type_after_w1; /* original type of the character, after W1 */
1794 bidi_type_t orig_type; /* type as we found it in the buffer */
b7b65b15
EZ
1795};
1796
1797/* Data type for keeping track of saved embedding levels and override
1798 status information. */
1799struct bidi_stack {
1800 int level;
1801 bidi_dir_t override;
1802};
1803
1804/* Data type for iterating over bidi text. */
1805struct bidi_it {
6bff6497
EZ
1806 EMACS_INT bytepos; /* iterator's position in buffer */
1807 EMACS_INT charpos;
9c82e145
EZ
1808 int ch; /* character itself */
1809 int ch_len; /* length of its multibyte sequence */
89d3374a
EZ
1810 bidi_type_t type; /* bidi type of this character, after
1811 resolving weak and neutral types */
1812 bidi_type_t type_after_w1; /* original type, after overrides and W1 */
1813 bidi_type_t orig_type; /* original type, as found in the buffer */
b7b65b15 1814 int resolved_level; /* final resolved level of this character */
9c82e145
EZ
1815 int invalid_levels; /* how many PDFs to ignore */
1816 int invalid_rl_levels; /* how many PDFs from RLE/RLO to ignore */
9c82e145
EZ
1817 int prev_was_pdf; /* if non-zero, previous char was PDF */
1818 struct bidi_saved_info prev; /* info about previous character */
b7b65b15
EZ
1819 struct bidi_saved_info last_strong; /* last-seen strong directional char */
1820 struct bidi_saved_info next_for_neutral; /* surrounding characters for... */
1821 struct bidi_saved_info prev_for_neutral; /* ...resolving neutrals */
1822 struct bidi_saved_info next_for_ws; /* character after sequence of ws */
6bff6497
EZ
1823 EMACS_INT next_en_pos; /* position of next EN char for ET */
1824 EMACS_INT ignore_bn_limit; /* position until which to ignore BNs */
b7b65b15 1825 bidi_dir_t sor; /* direction of start-of-run in effect */
d36fe237 1826 int scan_dir; /* direction of text scan, 1: forw, -1: back */
b7b65b15 1827 int stack_idx; /* index of current data on the stack */
ad55bd46 1828 /* Note: Everything from here on is not copied/saved when the bidi
e69a9370
EZ
1829 iterator state is saved, pushed, or popped. So only put here
1830 stuff that is not part of the bidi iterator's state! */
b7b65b15 1831 struct bidi_stack level_stack[BIDI_MAXLEVEL]; /* stack of embedding levels */
e69a9370
EZ
1832 int first_elt; /* if non-zero, examine current char first */
1833 bidi_dir_t paragraph_dir; /* current paragraph direction */
1834 int new_paragraph; /* if non-zero, we expect a new paragraph */
1835 EMACS_INT separator_limit; /* where paragraph separator should end */
b7b65b15
EZ
1836};
1837
e69a9370
EZ
1838/* Value is non-zero when the bidi iterator is at base paragraph
1839 embedding level. */
1840#define BIDI_AT_BASE_LEVEL(BIDI_IT) \
241ab1c1 1841 ((BIDI_IT).resolved_level == (BIDI_IT).level_stack[0].level)
5f5c8ee5
GM
1842
1843\f
f4e1400d
KS
1844/***********************************************************************
1845 Fringes
1846 ***********************************************************************/
1847
f4e1400d
KS
1848/* Structure used to describe where and how to draw a fringe bitmap.
1849 WHICH is the fringe bitmap to draw. WD and H is the (adjusted)
1850 width and height of the bitmap, DH is the height adjustment (if
1851 bitmap is periodic). X and Y are frame coordinates of the area to
1852 display the bitmap, DY is relative offset of the bitmap into that
0633d52c 1853 area. BX, NX, BY, NY specifies the area to clear if the bitmap
f4e1400d
KS
1854 does not fill the entire area. FACE is the fringe face. */
1855
1856struct draw_fringe_bitmap_params
1857{
6b61353c
KH
1858 int which; /* enum fringe_bitmap_type */
1859 unsigned short *bits;
f4e1400d
KS
1860 int wd, h, dh;
1861 int x, y;
1862 int bx, nx, by, ny;
6b61353c
KH
1863 unsigned cursor_p : 1;
1864 unsigned overlay_p : 1;
f4e1400d
KS
1865 struct face *face;
1866};
1867
6b61353c 1868#define MAX_FRINGE_BITMAPS (1<<FRINGE_ID_BITS)
f4e1400d
KS
1869
1870\f
5f5c8ee5
GM
1871/***********************************************************************
1872 Display Iterator
1873 ***********************************************************************/
1874
1875/* Iteration over things to display in current_buffer or in a string.
1876
1877 The iterator handles:
1878
1879 1. Overlay strings (after-string, before-string).
1880 2. Face properties.
1881 3. Invisible text properties.
1882 4. Selective display.
1883 5. Translation of characters via display tables.
1884 6. Translation of control characters to the forms `\003' or `^C'.
1885 7. `glyph' and `space-width' properties.
1886
1887 Iterators are initialized by calling init_iterator or one of the
1888 equivalent functions below. A call to get_next_display_element
1889 loads the iterator structure with information about what next to
1890 display. A call to set_iterator_to_next increments the iterator's
1891 position.
1892
1893 Characters from overlay strings, display table entries or control
1894 character translations are returned one at a time. For example, if
1895 we have a text of `a\x01' where `a' has a display table definition
1896 of `cd' and the control character is displayed with a leading
1897 arrow, then the iterator will return:
1898
1899 Call Return Source Call next
1900 -----------------------------------------------------------------
1901 next c display table move
1902 next d display table move
1903 next ^ control char move
1904 next A control char move
1905
1906 The same mechanism is also used to return characters for ellipses
1907 displayed at the end of invisible text.
1908
1909 CAVEAT: Under some circumstances, move_.* functions can be called
1910 asynchronously, e.g. when computing a buffer position from an x and
1911 y pixel position. This means that these functions and functions
1912 called from them SHOULD NOT USE xmalloc and alike. See also the
1913 comment at the start of xdisp.c. */
1914
1915/* Enumeration describing what kind of display element an iterator is
1916 loaded with after a call to get_next_display_element. */
1917
1918enum display_element_type
1919{
1920 /* A normal character. */
1921 IT_CHARACTER,
1922
a88c7fcd 1923 /* A composition (static and automatic). */
a90fbbf6
KH
1924 IT_COMPOSITION,
1925
5f5c8ee5
GM
1926 /* An image. */
1927 IT_IMAGE,
1928
1929 /* A flexible width and height space. */
1930 IT_STRETCH,
1931
1932 /* End of buffer or string. */
1933 IT_EOB,
1934
1935 /* Truncation glyphs. Never returned by get_next_display_element.
1936 Used to get display information about truncation glyphs via
1937 produce_glyphs. */
1938 IT_TRUNCATION,
1939
1940 /* Continuation glyphs. See the comment for IT_TRUNCATION. */
1941 IT_CONTINUATION
1942};
1943
1944
1945/* An enumerator for each text property that has a meaning for display
1946 purposes. */
1947
1948enum prop_idx
1949{
1950 FONTIFIED_PROP_IDX,
1951 FACE_PROP_IDX,
1952 INVISIBLE_PROP_IDX,
1953 DISPLAY_PROP_IDX,
a90fbbf6 1954 COMPOSITION_PROP_IDX,
5f5c8ee5
GM
1955
1956 /* Not a property. Used to indicate changes in overlays. */
1957 OVERLAY_PROP_IDX,
1958
1959 /* Sentinel. */
1960 LAST_PROP_IDX
1961};
1962
bf7a8847
CY
1963/* An enumerator for the method of wrapping long lines. */
1964
1965enum line_wrap_method
1966{
1967 TRUNCATE,
1968 WORD_WRAP,
1969 WINDOW_WRAP
1970};
5f5c8ee5 1971
0633d52c
KS
1972struct it_slice
1973{
1974 Lisp_Object x;
1975 Lisp_Object y;
1976 Lisp_Object width;
1977 Lisp_Object height;
1978};
1979
490943fe
RS
1980/* Input sources for fetching characters or data to display.
1981 The input source is found in the `method' field. */
1982
6a88f968
KS
1983enum it_method {
1984 GET_FROM_BUFFER = 0,
1985 GET_FROM_DISPLAY_VECTOR,
6a88f968
KS
1986 GET_FROM_STRING,
1987 GET_FROM_C_STRING,
1988 GET_FROM_IMAGE,
1989 GET_FROM_STRETCH,
1990 NUM_IT_METHODS
1991};
0633d52c 1992
b4bf28b7 1993/* FIXME: What is this? Why 5? */
90fcfd71 1994#define IT_STACK_SIZE 5
946a79d0 1995
a88c7fcd
KH
1996/* Iterator for composition (both for static and automatic). */
1997struct composition_it
1998{
1999 /* Next position at which to check the composition. */
2000 EMACS_INT stop_pos;
2001 /* ID number of the composition or glyph-string. If negative, we
2002 are not iterating over a composition now. */
2003 int id;
2004 /* If non-negative, character that triggers the automatic
10f72a37 2005 composition at `stop_pos', and this is an automatic composition.
6450412d
KH
2006 If negative, this is a static composition. This is set to -2
2007 temporarily if searching of composition reach a limit or a
2008 newline. */
a88c7fcd 2009 int ch;
10f72a37
KH
2010 /* If this is an automatic composition, index of a rule for making
2011 the automatic composition. Provided that ELT is an element of
2012 Vcomposition_function_table for CH, (nth ELT RULE_IDX) is the
2013 rule for the composition. */
2014 int rule_idx;
2015 /* If this is an automatic composition, how many characters to look
2016 back from the position where a character triggering the
2017 composition exists. */
cbf21103 2018 int lookback;
a88c7fcd
KH
2019 /* If non-negative, number of glyphs of the glyph-string. */
2020 int nglyphs;
10f72a37
KH
2021 /* Nonzero iff the composition is created while buffer is scanned in
2022 reverse order, and thus the grapheme clusters must be rendered
2023 from the last to the first. */
2024 int reversed_p;
2025
2026 /** The following members contain information about the current
2027 grapheme cluster. */
2028 /* Position of the first character of the current grapheme cluster. */
2029 EMACS_INT charpos;
a88c7fcd
KH
2030 /* Number of characters and bytes of the current grapheme cluster. */
2031 int nchars, nbytes;
2032 /* Indices of the glyphs for the current grapheme cluster. */
2033 int from, to;
2034 /* Width of the current grapheme cluster in units of pixels on a
2035 graphic display and in units of canonical characters on a
2036 terminal display. */
2037 int width;
2038};
2039
5f5c8ee5
GM
2040struct it
2041{
2042 /* The window in which we iterate over current_buffer (or a string). */
2043 Lisp_Object window;
2044 struct window *w;
2045
2046 /* The window's frame. */
2047 struct frame *f;
2048
6a88f968
KS
2049 /* Method to use to load this structure with the next display element. */
2050 enum it_method method;
5f5c8ee5
GM
2051
2052 /* The next position at which to check for face changes, invisible
2053 text, overlay strings, end of text etc., which see. */
05fe33ff 2054 EMACS_INT stop_charpos;
5f5c8ee5 2055
e69a9370 2056 /* Previous stop position, i.e. the last one before the current
241ab1c1 2057 iterator position in `current'. */
e69a9370
EZ
2058 EMACS_INT prev_stop;
2059
8eef7665
EZ
2060 /* Last stop position iterated across whose bidi embedding level is
2061 equal to the current paragraph's base embedding level. */
e69a9370
EZ
2062 EMACS_INT base_level_stop;
2063
5f5c8ee5
GM
2064 /* Maximum string or buffer position + 1. ZV when iterating over
2065 current_buffer. */
05fe33ff 2066 EMACS_INT end_charpos;
5f5c8ee5
GM
2067
2068 /* C string to iterate over. Non-null means get characters from
2069 this string, otherwise characters are read from current_buffer
2070 or it->string. */
675e2c69 2071 const unsigned char *s;
5f5c8ee5
GM
2072
2073 /* Number of characters in the string (s, or it->string) we iterate
2074 over. */
d585695f 2075 EMACS_INT string_nchars;
5f5c8ee5
GM
2076
2077 /* Start and end of a visible region; -1 if the region is not
2078 visible in the window. */
05fe33ff 2079 EMACS_INT region_beg_charpos, region_end_charpos;
5f5c8ee5
GM
2080
2081 /* Position at which redisplay end trigger functions should be run. */
05fe33ff 2082 EMACS_INT redisplay_end_trigger_charpos;
5f5c8ee5
GM
2083
2084 /* 1 means multibyte characters are enabled. */
2085 unsigned multibyte_p : 1;
2086
5f5c8ee5 2087 /* 1 means window has a mode line at its top. */
045dee35 2088 unsigned header_line_p : 1;
5f5c8ee5
GM
2089
2090 /* 1 means `string' is the value of a `display' property.
2091 Don't handle some `display' properties in these strings. */
2092 unsigned string_from_display_prop_p : 1;
2093
b437860a
RS
2094 /* When METHOD == next_element_from_display_vector,
2095 this is 1 if we're doing an ellipsis. Otherwise meaningless. */
2096 unsigned ellipsis_p : 1;
2097
c4f4682b
MB
2098 /* True means cursor shouldn't be displayed here. */
2099 unsigned avoid_cursor_p : 1;
2100
5f5c8ee5
GM
2101 /* Display table in effect or null for none. */
2102 struct Lisp_Char_Table *dp;
2103
2104 /* Current display table vector to return characters from and its
2105 end. dpvec null means we are not returning characters from a
2106 display table entry; current.dpvec_index gives the current index
2107 into dpvec. This same mechanism is also used to return
2108 characters from translated control characters, i.e. `\003' or
2109 `^C'. */
2110 Lisp_Object *dpvec, *dpend;
2111
2112 /* Length in bytes of the char that filled dpvec. A value of zero
54bff0bd 2113 means that no such character is involved. */
5f5c8ee5
GM
2114 int dpvec_char_len;
2115
888ca1e7
KS
2116 /* Face id to use for all characters in display vector. -1 if unused. */
2117 int dpvec_face_id;
2118
5f5c8ee5
GM
2119 /* Face id of the iterator saved in case a glyph from dpvec contains
2120 a face. The face is restored when all glyphs from dpvec have
2121 been delivered. */
2122 int saved_face_id;
2123
2124 /* Vector of glyphs for control character translation. The pointer
4659838f
KH
2125 dpvec is set to ctl_chars when a control character is translated.
2126 This vector is also used for incomplete multibyte character
8d5b986d
GM
2127 translation (e.g \222\244). Such a character is at most 4 bytes,
2128 thus we need at most 16 bytes here. */
2129 Lisp_Object ctl_chars[16];
5f5c8ee5 2130
6b61353c
KH
2131 /* Initial buffer or string position of the iterator, before skipping
2132 over display properties and invisible text. */
2133 struct display_pos start;
2134
5f5c8ee5
GM
2135 /* Current buffer or string position of the iterator, including
2136 position in overlay strings etc. */
2137 struct display_pos current;
2138
c69a28f1
RS
2139 /* Total number of overlay strings to process. This can be >
2140 OVERLAY_STRING_CHUNK_SIZE. */
2141 int n_overlay_strings;
2142
5f5c8ee5
GM
2143 /* Vector of overlays to process. Overlay strings are processed
2144 OVERLAY_STRING_CHUNK_SIZE at a time. */
e9323aed 2145#define OVERLAY_STRING_CHUNK_SIZE 16
5f5c8ee5
GM
2146 Lisp_Object overlay_strings[OVERLAY_STRING_CHUNK_SIZE];
2147
c69a28f1 2148 /* For each overlay string, the overlay it came from. */
c69a28f1 2149 Lisp_Object string_overlays[OVERLAY_STRING_CHUNK_SIZE];
5f5c8ee5
GM
2150
2151 /* If non-nil, a Lisp string being processed. If
2152 current.overlay_string_index >= 0, this is an overlay string from
2153 pos. */
2154 Lisp_Object string;
2155
c69a28f1
RS
2156 /* If non-nil, we are processing a string that came
2157 from a `display' property given by an overlay. */
2158 Lisp_Object from_overlay;
2159
5f5c8ee5
GM
2160 /* Stack of saved values. New entries are pushed when we begin to
2161 process an overlay string or a string from a `glyph' property.
2162 Entries are popped when we return to deliver display elements
2163 from what we previously had. */
2164 struct iterator_stack_entry
9f2279ad 2165 {
128ce5c6
KS
2166 Lisp_Object string;
2167 int string_nchars;
05fe33ff
EZ
2168 EMACS_INT end_charpos;
2169 EMACS_INT stop_charpos;
e69a9370
EZ
2170 EMACS_INT prev_stop;
2171 EMACS_INT base_level_stop;
a88c7fcd 2172 struct composition_it cmp_it;
5f5c8ee5 2173 int face_id;
128ce5c6
KS
2174
2175 /* Save values specific to a given method. */
fd00a1e8 2176 union {
128ce5c6 2177 /* method == GET_FROM_IMAGE */
fd00a1e8
KS
2178 struct {
2179 Lisp_Object object;
2180 struct it_slice slice;
2181 int image_id;
2182 } image;
128ce5c6 2183 /* method == GET_FROM_COMPOSITION */
fd00a1e8
KS
2184 struct {
2185 Lisp_Object object;
fd00a1e8 2186 } comp;
128ce5c6 2187 /* method == GET_FROM_STRETCH */
fd00a1e8
KS
2188 struct {
2189 Lisp_Object object;
2190 } stretch;
2191 } u;
128ce5c6
KS
2192
2193 /* current text and display positions. */
2194 struct text_pos position;
2195 struct display_pos current;
c69a28f1 2196 Lisp_Object from_overlay;
5f5c8ee5 2197 enum glyph_row_area area;
946a79d0 2198 enum it_method method;
5f5c8ee5
GM
2199 unsigned multibyte_p : 1;
2200 unsigned string_from_display_prop_p : 1;
88378b0d 2201 unsigned display_ellipsis_p : 1;
c4f4682b 2202 unsigned avoid_cursor_p : 1;
e966384d 2203 enum line_wrap_method line_wrap;
128ce5c6
KS
2204
2205 /* properties from display property that are reset by another display property. */
85c66abe 2206 short voffset;
5f5c8ee5 2207 Lisp_Object space_width;
5f5c8ee5
GM
2208 Lisp_Object font_height;
2209 }
946a79d0 2210 stack[IT_STACK_SIZE];
dfbb1e90 2211
5f5c8ee5
GM
2212 /* Stack pointer. */
2213 int sp;
177c0ea7 2214
5f5c8ee5
GM
2215 /* -1 means selective display hides everything between a \r and the
2216 next newline; > 0 means hide lines indented more than that value. */
2217 int selective;
2218
2219 /* An enumeration describing what the next display element is
2220 after a call to get_next_display_element. */
2221 enum display_element_type what;
dfbb1e90 2222
5f5c8ee5
GM
2223 /* Face to use. */
2224 int face_id;
2225
c69a28f1
RS
2226 /* Setting of buffer-local variable selective-display-ellipsis. */
2227 unsigned selective_display_ellipsis_p : 1;
2228
2229 /* 1 means control characters are translated into the form `^C'
2230 where the `^' can be replaced by a display table entry. */
2231 unsigned ctl_arrow_p : 1;
2232
5f5c8ee5
GM
2233 /* Non-zero means that the current face has a box. */
2234 unsigned face_box_p : 1;
2235
2236 /* Non-null means that the current character is the first in a run
2237 of characters with box face. */
2238 unsigned start_of_box_run_p : 1;
177c0ea7 2239
5f5c8ee5
GM
2240 /* Non-zero means that the current character is the last in a run
2241 of characters with box face. */
2242 unsigned end_of_box_run_p : 1;
2243
2244 /* 1 means overlay strings at end_charpos have been processed. */
2245 unsigned overlay_strings_at_end_processed_p : 1;
2246
fcc38f6d
KS
2247 /* 1 means to ignore overlay strings at current pos, as they have
2248 already been processed. */
2249 unsigned ignore_overlay_strings_at_pos_p : 1;
2250
b3091a23
KH
2251 /* 1 means the actual glyph is not available in the current
2252 system. */
666852af
GM
2253 unsigned glyph_not_available_p : 1;
2254
2255 /* 1 means the next line in display_line continues a character
2256 consisting of more than one glyph, and some glyphs of this
2257 character have been put on the previous line. */
2258 unsigned starts_in_middle_of_char_p : 1;
b3091a23 2259
4d2036e4
GM
2260 /* If 1, saved_face_id contains the id of the face in front of text
2261 skipped due to selective display. */
2262 unsigned face_before_selective_p : 1;
2263
0633d52c 2264 /* If 1, adjust current glyph so it does not increase current row
7293ac29 2265 descent/ascent (line-height property). Reset after this glyph. */
0633d52c
KS
2266 unsigned constrain_row_ascent_descent_p : 1;
2267
85c66abe
DN
2268 enum line_wrap_method line_wrap;
2269
5f5c8ee5 2270 /* The ID of the default face to use. One of DEFAULT_FACE_ID,
4d2036e4 2271 MODE_LINE_FACE_ID, etc, depending on what we are displaying. */
5f5c8ee5
GM
2272 int base_face_id;
2273
940afb59
EZ
2274 /* If `what' == IT_CHARACTER, the character and the length in bytes
2275 of its multibyte sequence. The character comes from a buffer or
2276 a string. It may be different from the character displayed in
2277 case that unibyte_display_via_language_environment is set.
2278
2279 If `what' == IT_COMPOSITION, the first component of a composition
2280 and length in bytes of the composition.
2281
98092630 2282 If `what' is anything else, these two are undefined (will
940afb59
EZ
2283 probably hold values for the last IT_CHARACTER or IT_COMPOSITION
2284 traversed by the iterator.
2285
2286 The values are updated by get_next_display_element, so they are
2287 out of sync with the value returned by IT_CHARPOS between the
2288 time set_iterator_to_next advances the position and the time
2289 get_next_display_element loads the new values into c and len. */
5f5c8ee5
GM
2290 int c, len;
2291
a88c7fcd
KH
2292 /* If what == IT_COMPOSITION, iterator substructure for the
2293 composition. */
2294 struct composition_it cmp_it;
a90fbbf6 2295
d419e1d9
KH
2296 /* The character to display, possibly translated to multibyte if
2297 multibyte_p is zero or unibyte_display_via_language_environment
2298 is set. This is set after get_next_display_element has been
2299 called. If we are setting it->C directly before calling
2300 PRODUCE_GLYPHS, this should be set beforehand too. */
5f5c8ee5
GM
2301 int char_to_display;
2302
5f5c8ee5
GM
2303 /* If what == IT_IMAGE, the id of the image to display. */
2304 int image_id;
2305
0633d52c
KS
2306 /* Values from `slice' property. */
2307 struct it_slice slice;
2308
5f5c8ee5
GM
2309 /* Value of the `space-width' property, if any; nil if none. */
2310 Lisp_Object space_width;
2311
2312 /* Computed from the value of the `raise' property. */
2313 short voffset;
2314
85c66abe
DN
2315 /* Number of columns per \t. */
2316 short tab_width;
2317
5f5c8ee5
GM
2318 /* Value of the `height' property, if any; nil if none. */
2319 Lisp_Object font_height;
2320
2321 /* Object and position where the current display element came from.
2322 Object can be a Lisp string in case the current display element
f38e5748
KS
2323 comes from an overlay string, or it is buffer. It may also be nil
2324 during mode-line update. Position is a position in object. */
5f5c8ee5
GM
2325 Lisp_Object object;
2326 struct text_pos position;
2327
5f5c8ee5
GM
2328 /* Width in pixels of truncation and continuation glyphs. */
2329 short truncation_pixel_width, continuation_pixel_width;
2330
2331 /* First and last visible x-position in the display area. If window
87388f9d 2332 is hscrolled by n columns, first_visible_x == n * FRAME_COLUMN_WIDTH
5f5c8ee5
GM
2333 (f), and last_visible_x == pixel width of W + first_visible_x. */
2334 int first_visible_x, last_visible_x;
2335
2336 /* Last visible y-position + 1 in the display area without a mode
2337 line, if the window has one. */
2338 int last_visible_y;
2339
db0c5a7d
KS
2340 /* Default amount of additional space in pixels between lines (for
2341 window systems only.) */
bf95c413 2342 int extra_line_spacing;
5f5c8ee5 2343
db0c5a7d
KS
2344 /* Max extra line spacing added in this row. */
2345 int max_extra_line_spacing;
2346
d956147c
KS
2347 /* Override font height information for this glyph.
2348 Used if override_ascent >= 0. Cleared after this glyph. */
2349 int override_ascent, override_descent, override_boff;
2350
5f5c8ee5
GM
2351 /* If non-null, glyphs are produced in glyph_row with each call to
2352 produce_glyphs. */
2353 struct glyph_row *glyph_row;
2354
2355 /* The area of glyph_row to which glyphs are added. */
2356 enum glyph_row_area area;
2357
2358 /* Number of glyphs needed for the last character requested via
2359 produce_glyphs. This is 1 except for tabs. */
2360 int nglyphs;
177c0ea7 2361
5f5c8ee5
GM
2362 /* Width of the display element in pixels. Result of
2363 produce_glyphs. */
2364 int pixel_width;
2365
2febf6e0
GM
2366 /* Current, maximum logical, and maximum physical line height
2367 information. Result of produce_glyphs. */
5f5c8ee5 2368 int ascent, descent, max_ascent, max_descent;
2febf6e0 2369 int phys_ascent, phys_descent, max_phys_ascent, max_phys_descent;
5f5c8ee5
GM
2370
2371 /* Current x pixel position within the display line. This value
2372 does not include the width of continuation lines in front of the
2373 line. The value of current_x is automatically incremented by
2374 pixel_width with each call to produce_glyphs. */
2375 int current_x;
2376
2377 /* Accumulated width of continuation lines. If > 0, this means we
2378 are currently in a continuation line. This is initially zero and
2379 incremented/reset by display_line, move_it_to etc. */
2380 int continuation_lines_width;
2381
8eef7665
EZ
2382 /* Buffer position that ends the buffer text line being iterated.
2383 This is normally the position after the newline at EOL. If this
2384 is the last line of the buffer and it doesn't have a newline,
2385 value is ZV/ZV_BYTE. Set and used only if IT->bidi_p, for
2386 setting the end position of glyph rows produced for continuation
2387 lines, see display_line. */
2388 struct text_pos eol_pos;
2389
5f5c8ee5
GM
2390 /* Current y-position. Automatically incremented by the height of
2391 glyph_row in move_it_to and display_line. */
2392 int current_y;
2393
6b61353c
KH
2394 /* Vertical matrix position of first text line in window. */
2395 int first_vpos;
2396
5f5c8ee5
GM
2397 /* Current vertical matrix position, or line number. Automatically
2398 incremented by move_it_to and display_line. */
2399 int vpos;
2400
2401 /* Horizontal matrix position reached in move_it_in_display_line.
2402 Only set there, not in display_line. */
2403 int hpos;
6b61353c
KH
2404
2405 /* Left fringe bitmap number (enum fringe_bitmap_type). */
2406 unsigned left_user_fringe_bitmap : FRINGE_ID_BITS;
2407
6b61353c
KH
2408 /* Right fringe bitmap number (enum fringe_bitmap_type). */
2409 unsigned right_user_fringe_bitmap : FRINGE_ID_BITS;
2410
b3b08f03
KS
2411 /* Face of the left fringe glyph. */
2412 unsigned left_user_fringe_face_id : FACE_ID_BITS;
2413
6b61353c
KH
2414 /* Face of the right fringe glyph. */
2415 unsigned right_user_fringe_face_id : FACE_ID_BITS;
b7b65b15 2416
f44e260c
EZ
2417 /* Non-zero means we need to reorder bidirectional text for display
2418 in the visual order. */
b7b65b15
EZ
2419 int bidi_p;
2420
f44e260c 2421 /* For iterating over bidirectional text. */
b7b65b15 2422 struct bidi_it bidi_it;
b44d9321 2423 bidi_dir_t paragraph_embedding;
5f5c8ee5
GM
2424};
2425
2426
2427/* Access to positions of iterator IT. */
2428
2429#define IT_CHARPOS(IT) CHARPOS ((IT).current.pos)
2430#define IT_BYTEPOS(IT) BYTEPOS ((IT).current.pos)
2431#define IT_STRING_CHARPOS(IT) CHARPOS ((IT).current.string_pos)
2432#define IT_STRING_BYTEPOS(IT) BYTEPOS ((IT).current.string_pos)
2433
2434/* Test if IT has reached the end of its buffer or string. This will
2435 only work after get_next_display_element has been called. */
2436
2437#define ITERATOR_AT_END_P(IT) ((IT)->what == IT_EOB)
2438
2439/* Non-zero means IT is at the end of a line. This is the case if it
2440 is either on a newline or on a carriage return and selective
2441 display hides the rest of the line. */
2442
2443#define ITERATOR_AT_END_OF_LINE_P(IT) \
2444 ((IT)->what == IT_CHARACTER \
2445 && ((IT)->c == '\n' \
2446 || ((IT)->c == '\r' && (IT)->selective)))
2447
e3670e00
EZ
2448/* Call produce_glyphs or FRAME_RIF->produce_glyphs, if set. Shortcut
2449 to avoid the function call overhead. */
5f5c8ee5 2450
fa971ac3
KL
2451#define PRODUCE_GLYPHS(IT) \
2452 do { \
c0546589
EZ
2453 if ((IT)->glyph_row != NULL && (IT)->bidi_p) \
2454 { \
2455 if ((IT)->bidi_it.paragraph_dir == R2L) \
2456 (IT)->glyph_row->reversed_p = 1; \
2457 else \
2458 (IT)->glyph_row->reversed_p = 0; \
2459 } \
fa971ac3
KL
2460 if (FRAME_RIF ((IT)->f) != NULL) \
2461 FRAME_RIF ((IT)->f)->produce_glyphs ((IT)); \
2462 else \
2463 produce_glyphs ((IT)); \
2464 if ((IT)->glyph_row != NULL) \
2465 inhibit_free_realized_faces = 1; \
2466 } while (0)
5f5c8ee5
GM
2467
2468/* Bit-flags indicating what operation move_it_to should perform. */
2469
2470enum move_operation_enum
2471{
2472 /* Stop if specified x-position is reached. */
2473 MOVE_TO_X = 0x01,
2474
2475 /* Stop if specified y-position is reached. */
2476 MOVE_TO_Y = 0x02,
2477
2478 /* Stop if specified vpos is reached. */
2479 MOVE_TO_VPOS = 0x04,
2480
2481 /* Stop if specified buffer or string position is reached. */
2482 MOVE_TO_POS = 0x08
2483};
2484
2485
2486\f
2487/***********************************************************************
2488 Window-based redisplay interface
2489 ***********************************************************************/
2490
2491/* Structure used to describe runs of lines that must be scrolled. */
2492
2493struct run
2494{
2495 /* Source and destination y pixel position. */
2496 int desired_y, current_y;
2497
2498 /* Source and destination vpos in matrix. */
2499 int desired_vpos, current_vpos;
2500
2501 /* Height in pixels, number of glyph rows. */
2502 int height, nrows;
2503};
2504
2505
e6b3aecd
KS
2506/* Handlers for setting frame parameters. */
2507
383e0970 2508typedef void (*frame_parm_handler) (struct frame *, Lisp_Object, Lisp_Object);
e6b3aecd
KS
2509
2510
5f5c8ee5
GM
2511/* Structure holding system-dependent interface functions needed
2512 for window-based redisplay. */
2513
2514struct redisplay_interface
2515{
e6b3aecd
KS
2516 /* Handlers for setting frame parameters. */
2517 frame_parm_handler *frame_parm_handlers;
2518
5f5c8ee5
GM
2519 /* Produce glyphs/get display metrics for the display element IT is
2520 loaded with. */
383e0970 2521 void (*produce_glyphs) (struct it *it);
177c0ea7 2522
5f5c8ee5
GM
2523 /* Write or insert LEN glyphs from STRING at the nominal output
2524 position. */
383e0970
J
2525 void (*write_glyphs) (struct glyph *string, int len);
2526 void (*insert_glyphs) (struct glyph *start, int len);
5f5c8ee5
GM
2527
2528 /* Clear from nominal output position to X. X < 0 means clear
2529 to right end of display. */
383e0970 2530 void (*clear_end_of_line) (int x);
177c0ea7 2531
5f5c8ee5
GM
2532 /* Function to call to scroll the display as described by RUN on
2533 window W. */
383e0970 2534 void (*scroll_run_hook) (struct window *w, struct run *run);
5f5c8ee5
GM
2535
2536 /* Function to call after a line in a display has been completely
2537 updated. Used to draw truncation marks and alike. DESIRED_ROW
2538 is the desired row which has been updated. */
383e0970 2539 void (*after_update_window_line_hook) (struct glyph_row *desired_row);
42087301 2540
5f5c8ee5
GM
2541 /* Function to call before beginning to update window W in
2542 window-based redisplay. */
383e0970 2543 void (*update_window_begin_hook) (struct window *w);
5f5c8ee5
GM
2544
2545 /* Function to call after window W has been updated in window-based
712eaef2
GM
2546 redisplay. CURSOR_ON_P non-zero means switch cursor on.
2547 MOUSE_FACE_OVERWRITTEN_P non-zero means that some lines in W
2548 that contained glyphs in mouse-face were overwritten, so we
54bff0bd 2549 have to update the mouse highlight. */
383e0970
J
2550 void (*update_window_end_hook) (struct window *w, int cursor_on_p,
2551 int mouse_face_overwritten_p);
177c0ea7 2552
5f5c8ee5
GM
2553 /* Move cursor to row/column position VPOS/HPOS, pixel coordinates
2554 Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
2555 are window-relative pixel positions. */
383e0970 2556 void (*cursor_to) (int vpos, int hpos, int y, int x);
5f5c8ee5
GM
2557
2558 /* Flush the display of frame F. For X, this is XFlush. */
383e0970 2559 void (*flush_display) (struct frame *f);
5f5c8ee5 2560
d74b2553
KS
2561 /* Flush the display of frame F if non-NULL. This is called
2562 during redisplay, and should be NULL on systems which flushes
2563 automatically before reading input. */
383e0970 2564 void (*flush_display_optional) (struct frame *f);
d74b2553 2565
ec68e323 2566 /* Clear the mouse hightlight in window W, if there is any. */
383e0970 2567 void (*clear_window_mouse_face) (struct window *w);
712eaef2 2568
5f5c8ee5
GM
2569 /* Set *LEFT and *RIGHT to the left and right overhang of GLYPH on
2570 frame F. */
383e0970
J
2571 void (*get_glyph_overhangs) (struct glyph *glyph, struct frame *f,
2572 int *left, int *right);
2febf6e0
GM
2573
2574 /* Fix the display of AREA of ROW in window W for overlapping rows.
2575 This function is called from redraw_overlapping_rows after
2576 desired rows have been made current. */
383e0970
J
2577 void (*fix_overlapping_area) (struct window *w, struct glyph_row *row,
2578 enum glyph_row_area area, int);
f4e1400d 2579
79fa9e0f
KS
2580#ifdef HAVE_WINDOW_SYSTEM
2581
f4e1400d 2582 /* Draw a fringe bitmap in window W of row ROW using parameters P. */
383e0970
J
2583 void (*draw_fringe_bitmap) (struct window *w, struct glyph_row *row,
2584 struct draw_fringe_bitmap_params *p);
f4e1400d 2585
6b61353c 2586 /* Define and destroy fringe bitmap no. WHICH. */
383e0970
J
2587 void (*define_fringe_bitmap) (int which, unsigned short *bits,
2588 int h, int wd);
2589 void (*destroy_fringe_bitmap) (int which);
6b61353c 2590
0633d52c 2591/* Compute left and right overhang of glyph string S.
d5cc60b8 2592 A NULL pointer if platform does not support this. */
383e0970 2593 void (*compute_glyph_string_overhangs) (struct glyph_string *s);
d5cc60b8
KS
2594
2595/* Draw a glyph string S. */
383e0970 2596 void (*draw_glyph_string) (struct glyph_string *s);
d5cc60b8 2597
d74b2553 2598/* Define cursor CURSOR on frame F. */
383e0970 2599 void (*define_frame_cursor) (struct frame *f, Cursor cursor);
5f5c8ee5 2600
d74b2553 2601/* Clear the area at (X,Y,WIDTH,HEIGHT) of frame F. */
383e0970
J
2602 void (*clear_frame_area) (struct frame *f, int x, int y,
2603 int width, int height);
5f5c8ee5 2604
e5a3b7d9
KS
2605/* Draw specified cursor CURSOR_TYPE of width CURSOR_WIDTH
2606 at row GLYPH_ROW on window W if ON_P is 1. If ON_P is
2607 0, don't draw cursor. If ACTIVE_P is 1, system caret
2608 should track this cursor (when applicable). */
383e0970
J
2609 void (*draw_window_cursor) (struct window *w,
2610 struct glyph_row *glyph_row,
2611 int x, int y,
2612 int cursor_type, int cursor_width,
2613 int on_p, int active_p);
5f5c8ee5 2614
d74b2553 2615/* Draw vertical border for window W from (X,Y0) to (X,Y1). */
383e0970
J
2616 void (*draw_vertical_window_border) (struct window *w,
2617 int x, int y0, int y1);
d5cc60b8 2618
0633d52c 2619/* Shift display of frame F to make room for inserted glyphs.
d74b2553
KS
2620 The area at pixel (X,Y) of width WIDTH and height HEIGHT is
2621 shifted right by SHIFT_BY pixels. */
383e0970
J
2622 void (*shift_glyphs_for_insert) (struct frame *f,
2623 int x, int y, int width,
2624 int height, int shift_by);
d5cc60b8 2625
d74b2553
KS
2626#endif /* HAVE_WINDOW_SYSTEM */
2627};
d5cc60b8 2628
5f5c8ee5
GM
2629\f
2630/***********************************************************************
2631 Images
2632 ***********************************************************************/
2633
4397e334 2634#ifdef HAVE_WINDOW_SYSTEM
5f5c8ee5
GM
2635
2636/* Structure forward declarations. */
2637
2638struct image;
2639
2640
54bff0bd 2641/* Each image format (JPEG, TIFF, ...) supported is described by
5f5c8ee5
GM
2642 a structure of the type below. */
2643
2644struct image_type
2645{
2646 /* A symbol uniquely identifying the image type, .e.g `jpeg'. */
2647 Lisp_Object *type;
2648
2649 /* Check that SPEC is a valid image specification for the given
2650 image type. Value is non-zero if SPEC is valid. */
383e0970 2651 int (* valid_p) (Lisp_Object spec);
5f5c8ee5
GM
2652
2653 /* Load IMG which is used on frame F from information contained in
2654 IMG->spec. Value is non-zero if successful. */
383e0970 2655 int (* load) (struct frame *f, struct image *img);
5f5c8ee5
GM
2656
2657 /* Free resources of image IMG which is used on frame F. */
383e0970 2658 void (* free) (struct frame *f, struct image *img);
9f2279ad 2659
5f5c8ee5
GM
2660 /* Next in list of all supported image types. */
2661 struct image_type *next;
2662};
9f2279ad 2663
9f2279ad 2664
5f5c8ee5
GM
2665/* Structure describing an image. Specific image formats like XBM are
2666 converted into this form, so that display only has to deal with
2667 this type of image. */
9f2279ad 2668
5f5c8ee5
GM
2669struct image
2670{
2671 /* The time in seconds at which the image was last displayed. Set
2672 in prepare_image_for_display. */
2673 unsigned long timestamp;
9f2279ad 2674
5f5c8ee5
GM
2675 /* Pixmaps of the image. */
2676 Pixmap pixmap, mask;
9f2279ad 2677
5f5c8ee5
GM
2678 /* Colors allocated for this image, if any. Allocated via xmalloc. */
2679 unsigned long *colors;
2680 int ncolors;
9f2279ad 2681
0ff7c0d4
MB
2682 /* A single `background color' for this image, for the use of anyone that
2683 cares about such a thing. Only valid if the `background_valid' field
2684 is true. This should generally be accessed by calling the accessor
2685 macro `IMAGE_BACKGROUND', which will heuristically calculate a value
2686 if necessary. */
2687 unsigned long background;
2688
f6b54648
YM
2689 /* Foreground and background colors of the frame on which the image
2690 is created. */
2691 unsigned long frame_foreground, frame_background;
2692
0ff7c0d4
MB
2693 /* True if this image has a `transparent' background -- that is, is
2694 uses an image mask. The accessor macro for this is
2695 `IMAGE_BACKGROUND_TRANSPARENT'. */
2696 unsigned background_transparent : 1;
2697
2698 /* True if the `background' and `background_transparent' fields are
2699 valid, respectively. */
2700 unsigned background_valid : 1, background_transparent_valid : 1;
2701
5f5c8ee5
GM
2702 /* Width and height of the image. */
2703 int width, height;
87485d6f 2704
5f5c8ee5
GM
2705 /* These values are used for the rectangles displayed for images
2706 that can't be loaded. */
2707#define DEFAULT_IMAGE_WIDTH 30
2708#define DEFAULT_IMAGE_HEIGHT 30
9f2279ad 2709
7b48cc13
KS
2710 /* Top/left and bottom/right corner pixel of actual image data.
2711 Used by four_corners_best to consider the real image data,
2712 rather than looking at the optional image margin. */
2713 int corners[4];
2714#define TOP_CORNER 0
2715#define LEFT_CORNER 1
2716#define BOT_CORNER 2
2717#define RIGHT_CORNER 3
2718
bdda7eb0 2719 /* Percent of image height used as ascent. A value of
54bff0bd 2720 CENTERED_IMAGE_ASCENT means draw the image centered on the
bdda7eb0 2721 line. */
5f5c8ee5
GM
2722 int ascent;
2723#define DEFAULT_IMAGE_ASCENT 50
bdda7eb0 2724#define CENTERED_IMAGE_ASCENT -1
c22ca93b 2725
5f5c8ee5
GM
2726 /* Lisp specification of this image. */
2727 Lisp_Object spec;
c22ca93b 2728
a2bc5bdd
SM
2729 /* List of "references" followed to build the image.
2730 Typically will just contain the name of the image file.
2731 Used to allow fine-grained cache flushing. */
2732 Lisp_Object dependencies;
2733
5f5c8ee5
GM
2734 /* Relief to draw around the image. */
2735 int relief;
c22ca93b 2736
f8215993
GM
2737 /* Optional margins around the image. This includes the relief. */
2738 int hmargin, vmargin;
5f5c8ee5
GM
2739
2740 /* Reference to the type of the image. */
2741 struct image_type *type;
2742
a7ac64a9
GM
2743 /* 1 means that loading the image failed. Don't try again. */
2744 unsigned load_failed_p;
2745
5f5c8ee5
GM
2746 /* A place for image types to store additional data. The member
2747 data.lisp_val is marked during GC, so it's safe to store Lisp data
2748 there. Image types should free this data when their `free'
2749 function is called. */
2750 struct
c22ca93b 2751 {
5f5c8ee5
GM
2752 int int_val;
2753 void *ptr_val;
2754 Lisp_Object lisp_val;
2755 } data;
c22ca93b 2756
5f5c8ee5
GM
2757 /* Hash value of image specification to speed up comparisons. */
2758 unsigned hash;
2759
2760 /* Image id of this image. */
2761 int id;
2762
2763 /* Hash collision chain. */
2764 struct image *next, *prev;
2765};
2766
2767
2768/* Cache of images. Each frame has a cache. X frames with the same
2769 x_display_info share their caches. */
2770
2771struct image_cache
2772{
2773 /* Hash table of images. */
2774 struct image **buckets;
2775
2776 /* Vector mapping image ids to images. */
2777 struct image **images;
2778
2779 /* Allocated size of `images'. */
2780 unsigned size;
2781
2782 /* Number of images in the cache. */
2783 unsigned used;
2784
2785 /* Reference count (number of frames sharing this cache). */
2786 int refcount;
2787};
2788
2789
5f5c8ee5
GM
2790/* Value is a pointer to the image with id ID on frame F, or null if
2791 no image with that id exists. */
2792
2793#define IMAGE_FROM_ID(F, ID) \
354884c4
SM
2794 (((ID) >= 0 && (ID) < (FRAME_IMAGE_CACHE (F)->used)) \
2795 ? FRAME_IMAGE_CACHE (F)->images[ID] \
5f5c8ee5
GM
2796 : NULL)
2797
2798/* Size of bucket vector of image caches. Should be prime. */
2799
2800#define IMAGE_CACHE_BUCKETS_SIZE 1001
2801
4397e334 2802#endif /* HAVE_WINDOW_SYSTEM */
5f5c8ee5
GM
2803
2804
2805\f
2806/***********************************************************************
9ea173e8 2807 Tool-bars
5f5c8ee5
GM
2808 ***********************************************************************/
2809
9ea173e8
GM
2810/* Enumeration defining where to find tool-bar item information in
2811 tool-bar items vectors stored with frames. Each tool-bar item
2812 occupies TOOL_BAR_ITEM_NSLOTS elements in such a vector. */
5f5c8ee5 2813
9ea173e8 2814enum tool_bar_item_idx
5f5c8ee5 2815{
9ea173e8 2816 /* The key of the tool-bar item. Used to remove items when a binding
5f5c8ee5 2817 for `undefined' is found. */
9ea173e8 2818 TOOL_BAR_ITEM_KEY,
5f5c8ee5
GM
2819
2820 /* Non-nil if item is enabled. */
9ea173e8 2821 TOOL_BAR_ITEM_ENABLED_P,
5f5c8ee5
GM
2822
2823 /* Non-nil if item is selected (pressed). */
9ea173e8 2824 TOOL_BAR_ITEM_SELECTED_P,
5f5c8ee5
GM
2825
2826 /* Caption. */
9ea173e8 2827 TOOL_BAR_ITEM_CAPTION,
5f5c8ee5
GM
2828
2829 /* Image(s) to display. This is either a single image specification
2830 or a vector of specifications. */
9ea173e8 2831 TOOL_BAR_ITEM_IMAGES,
5f5c8ee5
GM
2832
2833 /* The binding. */
9ea173e8 2834 TOOL_BAR_ITEM_BINDING,
5f5c8ee5
GM
2835
2836 /* Button type. One of nil, `:radio' or `:toggle'. */
9ea173e8 2837 TOOL_BAR_ITEM_TYPE,
c22ca93b 2838
5f5c8ee5 2839 /* Help string. */
9ea173e8 2840 TOOL_BAR_ITEM_HELP,
5f5c8ee5 2841
fface677
JD
2842 /* Icon file name of right to left image when an RTL locale is used. */
2843 TOOL_BAR_ITEM_RTL_IMAGE,
2844
f904c0f9
JD
2845 /* Label to show when text labels are enabled. */
2846 TOOL_BAR_ITEM_LABEL,
2847
9ea173e8
GM
2848 /* Sentinel = number of slots in tool_bar_items occupied by one
2849 tool-bar item. */
2850 TOOL_BAR_ITEM_NSLOTS
5f5c8ee5
GM
2851};
2852
2853
2854/* An enumeration for the different images that can be specified
9ea173e8 2855 for a tool-bar item. */
5f5c8ee5 2856
9ea173e8 2857enum tool_bar_item_image
5f5c8ee5 2858{
9ea173e8
GM
2859 TOOL_BAR_IMAGE_ENABLED_SELECTED,
2860 TOOL_BAR_IMAGE_ENABLED_DESELECTED,
2861 TOOL_BAR_IMAGE_DISABLED_SELECTED,
2862 TOOL_BAR_IMAGE_DISABLED_DESELECTED
5f5c8ee5
GM
2863};
2864
9ea173e8 2865/* Margin around tool-bar buttons in pixels. */
5f5c8ee5 2866
cc4cb755 2867extern Lisp_Object Vtool_bar_button_margin;
5f5c8ee5 2868
f904c0f9
JD
2869/* Tool bar style */
2870
2871extern Lisp_Object Vtool_bar_style;
2872
2873/* Maximum number of characters a label can have to be shown. */
2874
2875extern EMACS_INT tool_bar_max_label_size;
2876#define DEFAULT_TOOL_BAR_LABEL_SIZE 14
2877
9ea173e8 2878/* Thickness of relief to draw around tool-bar buttons. */
5f5c8ee5 2879
31ade731 2880extern EMACS_INT tool_bar_button_relief;
5f5c8ee5 2881
cc4cb755
GM
2882/* Default values of the above variables. */
2883
cfa5cf43
PJ
2884#define DEFAULT_TOOL_BAR_BUTTON_MARGIN 4
2885#define DEFAULT_TOOL_BAR_BUTTON_RELIEF 1
cc4cb755
GM
2886
2887/* The height in pixels of the default tool-bar images. */
2888
2889#define DEFAULT_TOOL_BAR_IMAGE_HEIGHT 24
5f5c8ee5
GM
2890
2891\f
2892/***********************************************************************
a0816661
MB
2893 Terminal Capabilities
2894 ***********************************************************************/
2895
8da139bc
MB
2896/* Each of these is a bit representing a terminal `capability' (bold,
2897 inverse, etc). They are or'd together to specify the set of
2898 capabilities being queried for when calling `tty_capable_p' (which
2899 returns true if the terminal supports all of them). */
f0be5454 2900
a0816661
MB
2901#define TTY_CAP_INVERSE 0x01
2902#define TTY_CAP_UNDERLINE 0x02
2903#define TTY_CAP_BOLD 0x04
2904#define TTY_CAP_DIM 0x08
2905#define TTY_CAP_BLINK 0x10
2906#define TTY_CAP_ALT_CHARSET 0x20
2907
2908\f
2909/***********************************************************************
2910 Function Prototypes
5f5c8ee5
GM
2911 ***********************************************************************/
2912
b7b65b15
EZ
2913/* Defined in bidi.c */
2914
383e0970
J
2915extern void bidi_init_it (EMACS_INT, EMACS_INT, struct bidi_it *);
2916extern void bidi_move_to_visually_next (struct bidi_it *);
bea4f10c 2917extern void bidi_paragraph_init (bidi_dir_t, struct bidi_it *, int);
383e0970 2918extern int bidi_mirror_char (int);
b7b65b15 2919
5f5c8ee5
GM
2920/* Defined in xdisp.c */
2921
d585695f 2922struct glyph_row *row_containing_pos (struct window *, EMACS_INT,
383e0970
J
2923 struct glyph_row *,
2924 struct glyph_row *, int);
2925EMACS_INT string_buffer_position (struct window *, Lisp_Object,
2926 EMACS_INT);
2927int line_bottom_y (struct it *);
2928int display_prop_intangible_p (Lisp_Object);
2929void resize_echo_area_exactly (void);
2930int resize_mini_window (struct window *, int);
2931int try_window (Lisp_Object, struct text_pos, int);
2932void window_box (struct window *, int, int *, int *, int *, int *);
2933int window_box_height (struct window *);
2934int window_text_bottom_y (struct window *);
2935int window_box_width (struct window *, int);
2936int window_box_left (struct window *, int);
2937int window_box_left_offset (struct window *, int);
2938int window_box_right (struct window *, int);
2939int window_box_right_offset (struct window *, int);
2940void window_box_edges (struct window *, int, int *, int *, int *, int *);
2941int estimate_mode_line_height (struct frame *, enum face_id);
2942void pixel_to_glyph_coords (struct frame *, int, int, int *, int *,
2943 NativeRectangle *, int);
2944int glyph_to_pixel_coords (struct window *, int, int, int *, int *);
2945void remember_mouse_glyph (struct frame *, int, int, NativeRectangle *);
2946
2947void mark_window_display_accurate (Lisp_Object, int);
2948void redisplay_preserve_echo_area (int);
2949int set_cursor_from_row (struct window *, struct glyph_row *,
ace1712c
EZ
2950 struct glyph_matrix *, EMACS_INT, EMACS_INT,
2951 int, int);
383e0970
J
2952void init_iterator (struct it *, struct window *, EMACS_INT,
2953 EMACS_INT, struct glyph_row *, enum face_id);
2954void init_iterator_to_row_start (struct it *, struct window *,
2955 struct glyph_row *);
2956int get_next_display_element (struct it *);
2957void set_iterator_to_next (struct it *, int);
2958void start_display (struct it *, struct window *, struct text_pos);
a952d5f3 2959void move_it_to (struct it *, EMACS_INT, int, int, int, int);
383e0970
J
2960void move_it_vertically (struct it *, int);
2961void move_it_vertically_backward (struct it *, int);
2962void move_it_by_lines (struct it *, int, int);
2963void move_it_past_eol (struct it *);
c876b227
SM
2964void move_it_in_display_line (struct it *it,
2965 EMACS_INT to_charpos, int to_x,
2966 enum move_operation_enum op);
383e0970
J
2967int in_display_vector_p (struct it *);
2968int frame_mode_line_height (struct frame *);
2969void highlight_trailing_whitespace (struct frame *, struct glyph_row *);
9ea173e8 2970extern Lisp_Object Qtool_bar;
c1ff17c5 2971extern Lisp_Object Vshow_trailing_whitespace;
5f380a5b 2972extern int mode_line_in_non_selected_windows;
5f5c8ee5 2973extern int redisplaying_p;
583dba75 2974extern int help_echo_showing_p;
e9e32f46 2975extern int current_mode_line_height, current_header_line_height;
d74b2553 2976extern Lisp_Object help_echo_string, help_echo_window;
0633d52c 2977extern Lisp_Object help_echo_object, previous_help_echo_string;
41118bd3 2978extern EMACS_INT help_echo_pos;
d74b2553
KS
2979extern struct frame *last_mouse_frame;
2980extern int last_tool_bar_item;
92b23323 2981extern Lisp_Object Vmouse_autoselect_window;
502b3128 2982extern int unibyte_display_via_language_environment;
2a3bd2e1 2983extern EMACS_INT underline_minimum_offset;
502b3128 2984
383e0970 2985extern void reseat_at_previous_visible_line_start (struct it *);
d74b2553 2986
383e0970
J
2987extern int calc_pixel_width_or_height (double *, struct it *, Lisp_Object,
2988 struct font *, int, int *);
6b61353c 2989
d74b2553 2990#ifdef HAVE_WINDOW_SYSTEM
5f5c8ee5 2991
d5cc60b8 2992#if GLYPH_DEBUG
383e0970 2993extern void dump_glyph_string (struct glyph_string *);
d5cc60b8
KS
2994#endif
2995
383e0970
J
2996extern void x_get_glyph_overhangs (struct glyph *, struct frame *,
2997 int *, int *);
2998extern void x_produce_glyphs (struct it *);
d5cc60b8 2999
383e0970
J
3000extern void x_write_glyphs (struct glyph *, int);
3001extern void x_insert_glyphs (struct glyph *, int len);
3002extern void x_clear_end_of_line (int);
d74b2553
KS
3003
3004extern int x_stretch_cursor_p;
3005extern struct cursor_pos output_cursor;
3006
383e0970
J
3007extern void x_fix_overlapping_area (struct window *, struct glyph_row *,
3008 enum glyph_row_area, int);
3009extern void draw_phys_cursor_glyph (struct window *,
3010 struct glyph_row *,
3011 enum draw_glyphs_face);
3012extern void get_phys_cursor_geometry (struct window *, struct glyph_row *,
3013 struct glyph *, int *, int *, int *);
3014extern void erase_phys_cursor (struct window *);
3015extern void display_and_set_cursor (struct window *,
3016 int, int, int, int, int);
3017
3018extern void set_output_cursor (struct cursor_pos *);
3019extern void x_cursor_to (int, int, int, int);
3020
3021extern void x_update_cursor (struct frame *, int);
3022extern void x_clear_cursor (struct window *);
3023extern void x_draw_vertical_border (struct window *w);
3024
383e0970
J
3025extern int get_glyph_string_clip_rects (struct glyph_string *,
3026 NativeRectangle *, int);
3027extern void get_glyph_string_clip_rect (struct glyph_string *,
3028 NativeRectangle *nr);
3029extern Lisp_Object find_hot_spot (Lisp_Object, int, int);
383e0970
J
3030
3031extern void handle_tool_bar_click (struct frame *,
3032 int, int, int, unsigned int);
d74b2553 3033
d009ae66
EZ
3034extern void expose_frame (struct frame *, int, int, int, int);
3035extern int x_intersect_rectangles (XRectangle *, XRectangle *,
3036 XRectangle *);
3037#endif /* HAVE_WINDOW_SYSTEM */
3038
3039extern void frame_to_window_pixel_xy (struct window *, int *, int *);
3040extern void note_mouse_highlight (struct frame *, int, int);
3041extern void x_clear_window_mouse_face (struct window *);
3042extern void cancel_mouse_face (struct frame *);
383e0970
J
3043extern int clear_mouse_face (Display_Info *);
3044extern void show_mouse_face (Display_Info *, enum draw_glyphs_face);
3045extern int cursor_in_mouse_face_p (struct window *w);
d009ae66
EZ
3046extern void draw_row_with_mouse_face (struct window *, int, struct glyph_row *,
3047 int, int, enum draw_glyphs_face);
d74b2553 3048
d5cc60b8 3049
6eff5c3d
YM
3050/* Flags passed to try_window. */
3051#define TRY_WINDOW_CHECK_MARGINS (1 << 0)
3052#define TRY_WINDOW_IGNORE_FONTS_CHANGE (1 << 1)
3053
6b61353c
KH
3054/* Defined in fringe.c */
3055
99f3388e 3056extern Lisp_Object Voverflow_newline_into_fringe;
e72d7335 3057int lookup_fringe_bitmap (Lisp_Object);
383e0970
J
3058void draw_fringe_bitmap (struct window *, struct glyph_row *, int);
3059void draw_row_fringe_bitmaps (struct window *, struct glyph_row *);
3060int draw_window_fringes (struct window *, int);
3061int update_window_fringes (struct window *, int);
3062void compute_fringe_widths (struct frame *, int);
6b61353c 3063
8a8ce986 3064#ifdef WINDOWSNT
383e0970
J
3065void w32_init_fringe (struct redisplay_interface *);
3066void w32_reset_fringes (void);
6b61353c 3067#endif
6b61353c
KH
3068/* Defined in image.c */
3069
3070#ifdef HAVE_WINDOW_SYSTEM
3071
383e0970
J
3072extern int x_bitmap_height (struct frame *, int);
3073extern int x_bitmap_width (struct frame *, int);
3074extern int x_bitmap_pixmap (struct frame *, int);
3075extern void x_reference_bitmap (struct frame *, int);
3076extern int x_create_bitmap_from_data (struct frame *, char *,
3077 unsigned int, unsigned int);
3078extern int x_create_bitmap_from_file (struct frame *, Lisp_Object);
516c741d 3079#if defined (HAVE_XPM) && defined (HAVE_X_WINDOWS)
383e0970 3080extern int x_create_bitmap_from_xpm_data (struct frame *f, char **bits);
516c741d 3081#endif
6b61353c 3082#ifndef x_destroy_bitmap
383e0970 3083extern void x_destroy_bitmap (struct frame *, int);
6b61353c 3084#endif
383e0970
J
3085extern void x_destroy_all_bitmaps (Display_Info *);
3086extern int x_create_bitmap_mask (struct frame * , int);
3087extern Lisp_Object x_find_image_file (Lisp_Object);
3088
3089void x_kill_gs_process (Pixmap, struct frame *);
3090struct image_cache *make_image_cache (void);
3091void free_image_cache (struct frame *);
3092void clear_image_caches (Lisp_Object);
3093void mark_image_cache (struct image_cache *);
3094int valid_image_p (Lisp_Object);
3095void prepare_image_for_display (struct frame *, struct image *);
3096int lookup_image (struct frame *, Lisp_Object);
3097
3098unsigned long image_background (struct image *, struct frame *,
3099 XImagePtr_or_DC ximg);
3100int image_background_transparent (struct image *, struct frame *,
3101 XImagePtr_or_DC mask);
3102
3103int image_ascent (struct image *, struct face *, struct glyph_slice *);
0633d52c 3104
6b61353c
KH
3105#endif
3106
5f5c8ee5
GM
3107/* Defined in sysdep.c */
3108
383e0970
J
3109void get_tty_size (int, int *, int *);
3110void request_sigio (void);
3111void unrequest_sigio (void);
3112int tabs_safe_p (int);
3113void init_baud_rate (int);
3114void init_sigio (int);
5f5c8ee5 3115
8317e104
GM
3116/* Defined in xfaces.c */
3117
2ad412d7 3118#ifdef HAVE_X_WINDOWS
383e0970 3119void x_free_colors (struct frame *, unsigned long *, int);
2ad412d7 3120#endif
5f5c8ee5 3121
383e0970
J
3122void update_face_from_frame_parameter (struct frame *, Lisp_Object,
3123 Lisp_Object);
3124Lisp_Object tty_color_name (struct frame *, int);
3125void clear_face_cache (int);
3126unsigned long load_color (struct frame *, struct face *, Lisp_Object,
3127 enum lface_attribute_index);
3128void unload_color (struct frame *, unsigned long);
3129char *choose_face_font (struct frame *, Lisp_Object *, Lisp_Object,
3130 int *);
3131int ascii_face_of_lisp_face (struct frame *, int);
3132void prepare_face_for_display (struct frame *, struct face *);
3133int xstrcasecmp (const unsigned char *, const unsigned char *);
3134int lookup_face (struct frame *, Lisp_Object *);
3135int lookup_named_face (struct frame *, Lisp_Object, int);
3136int lookup_basic_face (struct frame *, int);
3137int smaller_face (struct frame *, int, int);
3138int face_with_height (struct frame *, int, int);
3139int lookup_derived_face (struct frame *, Lisp_Object, int, int);
3140void init_frame_faces (struct frame *);
3141void free_frame_faces (struct frame *);
3142void recompute_basic_faces (struct frame *);
3143int face_at_buffer_position (struct window *w, EMACS_INT pos,
3144 EMACS_INT region_beg, EMACS_INT region_end,
3145 EMACS_INT *endptr, EMACS_INT limit,
3146 int mouse, int base_face_id);
3147int face_for_overlay_string (struct window *w, EMACS_INT pos,
3148 EMACS_INT region_beg, EMACS_INT region_end,
3149 EMACS_INT *endptr, EMACS_INT limit,
3150 int mouse, Lisp_Object overlay);
3151int face_at_string_position (struct window *w, Lisp_Object string,
3152 EMACS_INT pos, EMACS_INT bufpos,
3153 EMACS_INT region_beg, EMACS_INT region_end,
3154 EMACS_INT *endptr, enum face_id, int mouse);
3155int merge_faces (struct frame *, Lisp_Object, int, int);
3156int compute_char_face (struct frame *, int, Lisp_Object);
3157void free_all_realized_faces (Lisp_Object);
3158void free_realized_face (struct frame *, struct face *);
5f5c8ee5 3159extern Lisp_Object Qforeground_color, Qbackground_color;
9b0ad2cb 3160extern Lisp_Object Qframe_set_background_mode;
f0ba2d22 3161extern char unspecified_fg[], unspecified_bg[];
5f5c8ee5 3162
f2cec7a9
MB
3163extern Lisp_Object Vface_remapping_alist;
3164
5f5c8ee5
GM
3165/* Defined in xfns.c */
3166
4397e334 3167#ifdef HAVE_X_WINDOWS
383e0970 3168void gamma_correct (struct frame *, XColor *);
4397e334
AI
3169#endif
3170#ifdef WINDOWSNT
383e0970 3171void gamma_correct (struct frame *, COLORREF *);
4397e334
AI
3172#endif
3173
3174#ifdef HAVE_WINDOW_SYSTEM
3175
383e0970
J
3176int x_screen_planes (struct frame *);
3177void x_implicitly_set_name (struct frame *, Lisp_Object, Lisp_Object);
c26e3f6c 3178
4811586b 3179extern Lisp_Object tip_frame;
5f5c8ee5 3180extern Window tip_window;
88a19a90 3181EXFUN (Fx_show_tip, 6);
5f5c8ee5 3182EXFUN (Fx_hide_tip, 0);
383e0970
J
3183extern void start_hourglass (void);
3184extern void cancel_hourglass (void);
3185extern int hourglass_started (void);
6a2b7977 3186extern int display_hourglass_p;
1885ab29
AR
3187extern int hourglass_shown_p;
3188struct atimer; /* Defined in atimer.h. */
3189/* If non-null, an asynchronous timer that, when it expires, displays
3190 an hourglass cursor on all frames. */
3191extern struct atimer *hourglass_atimer;
3192
6fb5f7da 3193/* Each GUI implements these. FIXME: move into RIF. */
383e0970
J
3194extern void show_hourglass (struct atimer *);
3195extern void hide_hourglass (void);
5f5c8ee5 3196
0ff7c0d4
MB
3197/* Returns the background color of IMG, calculating one heuristically if
3198 necessary. If non-zero, XIMG is an existing XImage object to use for
3199 the heuristic. */
3200
3201#define IMAGE_BACKGROUND(img, f, ximg) \
3202 ((img)->background_valid \
3203 ? (img)->background \
3204 : image_background (img, f, ximg))
3205
3206/* Returns true if IMG has a `transparent' background, using heuristics
3207 to decide if necessary. If non-zero, MASK is an existing XImage
3208 object to use for the heuristic. */
3209
3210#define IMAGE_BACKGROUND_TRANSPARENT(img, f, mask) \
3211 ((img)->background_transparent_valid \
3212 ? (img)->background_transparent \
3213 : image_background_transparent (img, f, mask))
3214
4397e334 3215#endif /* HAVE_WINDOW_SYSTEM */
5f5c8ee5
GM
3216
3217
3218/* Defined in xmenu.c */
3219
383e0970 3220int popup_activated (void);
5f5c8ee5 3221
3f7267e7 3222/* Defined in dispnew.c */
5f5c8ee5 3223
283c6e3e 3224extern int inverse_video;
383e0970
J
3225extern int required_matrix_width (struct window *);
3226extern int required_matrix_height (struct window *);
3227extern Lisp_Object buffer_posn_from_coords (struct window *,
3228 int *, int *,
3229 struct display_pos *,
3230 Lisp_Object *,
3231 int *, int *, int *, int *);
3232extern Lisp_Object mode_line_string (struct window *, enum window_part,
ace1712c 3233 int *, int *, EMACS_INT *,
383e0970
J
3234 Lisp_Object *,
3235 int *, int *, int *, int *);
3236extern Lisp_Object marginal_area_string (struct window *, enum window_part,
ace1712c 3237 int *, int *, EMACS_INT *,
383e0970
J
3238 Lisp_Object *,
3239 int *, int *, int *, int *);
3240extern void redraw_frame (struct frame *);
3241extern void redraw_garbaged_frames (void);
3242extern void cancel_line (int, struct frame *);
3243extern void init_desired_glyphs (struct frame *);
3244extern int scroll_frame_lines (struct frame *, int, int, int, int);
3245extern int update_frame (struct frame *, int, int);
3246extern int scrolling (struct frame *);
3247extern void bitch_at_user (void);
3248void adjust_glyphs (struct frame *);
3249void free_glyphs (struct frame *);
3250void free_window_matrices (struct window *);
3251void check_glyph_memory (void);
3252void mirrored_line_dance (struct glyph_matrix *, int, int, int *, char *);
3253void clear_glyph_matrix (struct glyph_matrix *);
3254void clear_current_matrices (struct frame *f);
3255void clear_desired_matrices (struct frame *);
3256void shift_glyph_matrix (struct window *, struct glyph_matrix *,
3257 int, int, int);
3258void rotate_matrix (struct glyph_matrix *, int, int, int);
3259void increment_matrix_positions (struct glyph_matrix *,
ace1712c 3260 int, int, EMACS_INT, EMACS_INT);
383e0970 3261void blank_row (struct window *, struct glyph_row *, int);
ace1712c 3262void increment_row_positions (struct glyph_row *, EMACS_INT, EMACS_INT);
383e0970
J
3263void enable_glyph_matrix_rows (struct glyph_matrix *, int, int, int);
3264void clear_glyph_row (struct glyph_row *);
3265void prepare_desired_row (struct glyph_row *);
3266int line_hash_code (struct glyph_row *);
3267void set_window_update_flags (struct window *, int);
383e0970 3268void update_single_window (struct window *, int);
383e0970
J
3269void do_pending_window_change (int);
3270void change_frame_size (struct frame *, int, int, int, int, int);
383e0970
J
3271void init_display (void);
3272void syms_of_display (void);
69a7a14d 3273extern Lisp_Object Qredisplay_dont_pause;
383e0970 3274void spec_glyph_lookup_face (struct window *, GLYPH *);
ec5d8db7 3275
ed8dad6b 3276/* Defined in terminal.c */
5f5c8ee5 3277
383e0970
J
3278extern void ring_bell (struct frame *);
3279extern void update_begin (struct frame *);
3280extern void update_end (struct frame *);
3281extern void set_terminal_window (struct frame *, int);
3282extern void cursor_to (struct frame *, int, int);
3283extern void raw_cursor_to (struct frame *, int, int);
3284extern void clear_to_end (struct frame *);
3285extern void clear_frame (struct frame *);
3286extern void clear_end_of_line (struct frame *, int);
3287extern void write_glyphs (struct frame *, struct glyph *, int);
3288extern void insert_glyphs (struct frame *, struct glyph *, int);
3289extern void delete_glyphs (struct frame *, int);
3290extern void ins_del_lines (struct frame *, int, int);
ed8dad6b 3291
383e0970 3292extern struct terminal *init_initial_terminal (void);
ed8dad6b
KL
3293
3294
3295/* Defined in term.c */
3296
383e0970
J
3297extern void tty_set_terminal_modes (struct terminal *);
3298extern void tty_reset_terminal_modes (struct terminal *);
3299extern void tty_turn_off_insert (struct tty_display_info *);
3300extern void tty_turn_off_highlight (struct tty_display_info *);
8ea90aa3
DN
3301extern int string_cost (const char *);
3302extern int per_line_cost (const char *);
383e0970
J
3303extern void calculate_costs (struct frame *);
3304extern void produce_glyphs (struct it *);
3305extern void produce_special_glyphs (struct it *, enum display_element_type);
3306extern int tty_capable_p (struct tty_display_info *, unsigned, unsigned long, unsigned long);
9b2cd403 3307extern void set_tty_color_mode (struct tty_display_info *, struct frame *);
383e0970 3308extern struct terminal *get_tty_terminal (Lisp_Object, int);
8ea90aa3 3309extern struct terminal *get_named_tty (const char *);
6ed8eeff 3310EXFUN (Ftty_type, 1);
383e0970 3311extern void create_tty_output (struct frame *);
8ea90aa3 3312extern struct terminal *init_tty (const char *, const char *, int);
b2fedb04 3313
ec5d8db7
AS
3314
3315/* Defined in scroll.c */
5f5c8ee5 3316
383e0970
J
3317extern int scrolling_max_lines_saved (int, int, int *, int *, int *);
3318extern int scroll_cost (struct frame *, int, int, int);
3319extern void do_line_insertion_deletion_costs (struct frame *, char *,
3320 char *, char *, char *,
3321 char *, char *, int);
3322void scrolling_1 (struct frame *, int, int, int, int *, int *, int *,
3323 int *, int);
87485d6f 3324
e6b3aecd
KS
3325/* Defined in frame.c */
3326
3327#ifdef HAVE_WINDOW_SYSTEM
3328
3329/* Types we might convert a resource string into. */
3330enum resource_types
3331{
3332 RES_TYPE_NUMBER,
3333 RES_TYPE_FLOAT,
3334 RES_TYPE_BOOLEAN,
3335 RES_TYPE_STRING,
93318cbd
JD
3336 RES_TYPE_SYMBOL,
3337 RES_TYPE_BOOLEAN_NUMBER
e6b3aecd
KS
3338};
3339
383e0970 3340extern Lisp_Object x_get_arg (Display_Info *, Lisp_Object,
eec47d6b 3341 Lisp_Object, const char *, const char *class,
383e0970
J
3342 enum resource_types);
3343extern Lisp_Object x_frame_get_arg (struct frame *, Lisp_Object,
eec47d6b 3344 Lisp_Object, const char *, const char *,
383e0970 3345 enum resource_types);
eec47d6b
DN
3346extern Lisp_Object x_frame_get_and_record_arg (struct frame *, Lisp_Object,
3347 Lisp_Object,
3348 const char *, const char *,
383e0970
J
3349 enum resource_types);
3350extern Lisp_Object x_default_parameter (struct frame *, Lisp_Object,
3351 Lisp_Object, Lisp_Object,
eec47d6b 3352 const char *, const char *,
383e0970 3353 enum resource_types);
e6b3aecd
KS
3354
3355#endif /* HAVE_WINDOW_SYSTEM */
3356
5f5c8ee5 3357#endif /* not DISPEXTERN_H_INCLUDED */
6b61353c
KH
3358
3359/* arch-tag: c65c475f-1c1e-4534-8795-990b8509fd65
3360 (do not change this comment) */