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