(update_frame_line): When writing a whole line, make
[bpt/emacs.git] / src / dispnew.c
1 /* Updating of data structures for redisplay.
2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 97, 98, 1999
3 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include <config.h>
23 #include <signal.h>
24 #include <stdio.h>
25 #include <ctype.h>
26
27 #ifdef HAVE_UNISTD_H
28 #include <unistd.h>
29 #endif
30
31 #include "lisp.h"
32 #include "termchar.h"
33 #include "termopts.h"
34 #include "termhooks.h"
35 /* cm.h must come after dispextern.h on Windows. */
36 #include "dispextern.h"
37 #include "cm.h"
38 #include "buffer.h"
39 #include "charset.h"
40 #include "frame.h"
41 #include "window.h"
42 #include "commands.h"
43 #include "disptab.h"
44 #include "indent.h"
45 #include "intervals.h"
46 #include "blockinput.h"
47 #include "process.h"
48 #include "keyboard.h"
49
50 /* I don't know why DEC Alpha OSF1 fail to compile this file if we
51 include the following file. */
52 /* #include "systty.h" */
53 #include "syssignal.h"
54
55 #ifdef HAVE_X_WINDOWS
56 #include "xterm.h"
57 #endif /* HAVE_X_WINDOWS */
58
59 #ifdef HAVE_NTGUI
60 #include "w32term.h"
61 #endif /* HAVE_NTGUI */
62
63 /* Include systime.h after xterm.h to avoid double inclusion of time.h. */
64
65 #include "systime.h"
66 #include <errno.h>
67
68 /* To get the prototype for `sleep'. */
69
70 #ifdef HAVE_UNISTD_H
71 #include <unistd.h>
72 #endif
73
74 #define max(a, b) ((a) > (b) ? (a) : (b))
75 #define min(a, b) ((a) < (b) ? (a) : (b))
76
77 /* Get number of chars of output now in the buffer of a stdio stream.
78 This ought to be built in in stdio, but it isn't. Some s- files
79 override this because their stdio internals differ. */
80
81 #ifdef __GNU_LIBRARY__
82
83 /* The s- file might have overridden the definition with one that
84 works for the system's C library. But we are using the GNU C
85 library, so this is the right definition for every system. */
86
87 #ifdef GNU_LIBRARY_PENDING_OUTPUT_COUNT
88 #define PENDING_OUTPUT_COUNT GNU_LIBRARY_PENDING_OUTPUT_COUNT
89 #else
90 #undef PENDING_OUTPUT_COUNT
91 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->__bufp - (FILE)->__buffer)
92 #endif
93 #else /* not __GNU_LIBRARY__ */
94 #if !defined (PENDING_OUTPUT_COUNT) && HAVE_STDIO_EXT_H && HAVE___FPENDING
95 #include <stdio_ext.h>
96 #define PENDING_OUTPUT_COUNT(FILE) __fpending (FILE)
97 #endif
98 #ifndef PENDING_OUTPUT_COUNT
99 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_ptr - (FILE)->_base)
100 #endif
101 #endif /* not __GNU_LIBRARY__ */
102
103 \f
104 /* Structure to pass dimensions around. Used for character bounding
105 boxes, glyph matrix dimensions and alike. */
106
107 struct dim
108 {
109 int width;
110 int height;
111 };
112
113 \f
114 /* Function prototypes. */
115
116 static void redraw_overlapping_rows P_ ((struct window *, int));
117 static void redraw_overlapped_rows P_ ((struct window *, int));
118 static int count_blanks P_ ((struct glyph *, int));
119 static int count_match P_ ((struct glyph *, struct glyph *,
120 struct glyph *, struct glyph *));
121 static unsigned line_draw_cost P_ ((struct glyph_matrix *, int));
122 static void update_frame_line P_ ((struct frame *, int));
123 static struct dim allocate_matrices_for_frame_redisplay
124 P_ ((Lisp_Object, int, int, struct dim, int, int *));
125 static void allocate_matrices_for_window_redisplay P_ ((struct window *,
126 struct dim));
127 static int realloc_glyph_pool P_ ((struct glyph_pool *, struct dim));
128 static void adjust_frame_glyphs P_ ((struct frame *));
129 struct glyph_matrix *new_glyph_matrix P_ ((struct glyph_pool *));
130 static void free_glyph_matrix P_ ((struct glyph_matrix *));
131 static void adjust_glyph_matrix P_ ((struct window *, struct glyph_matrix *,
132 int, int, struct dim));
133 static void change_frame_size_1 P_ ((struct frame *, int, int, int, int, int));
134 static void swap_glyphs_in_rows P_ ((struct glyph_row *, struct glyph_row *));
135 static void swap_glyph_pointers P_ ((struct glyph_row *, struct glyph_row *));
136 static int glyph_row_slice_p P_ ((struct glyph_row *, struct glyph_row *));
137 static void fill_up_frame_row_with_spaces P_ ((struct glyph_row *, int));
138 static void build_frame_matrix_from_window_tree P_ ((struct glyph_matrix *,
139 struct window *));
140 static void build_frame_matrix_from_leaf_window P_ ((struct glyph_matrix *,
141 struct window *));
142 static struct glyph_pool *new_glyph_pool P_ ((void));
143 static void free_glyph_pool P_ ((struct glyph_pool *));
144 static void adjust_frame_glyphs_initially P_ ((void));
145 static void adjust_frame_message_buffer P_ ((struct frame *));
146 static void adjust_decode_mode_spec_buffer P_ ((struct frame *));
147 static void fill_up_glyph_row_with_spaces P_ ((struct glyph_row *));
148 static void build_frame_matrix P_ ((struct frame *));
149 void clear_current_matrices P_ ((struct frame *));
150 void scroll_glyph_matrix_range P_ ((struct glyph_matrix *, int, int,
151 int, int));
152 static void clear_window_matrices P_ ((struct window *, int));
153 static void fill_up_glyph_row_area_with_spaces P_ ((struct glyph_row *, int));
154 static int scrolling_window P_ ((struct window *, int));
155 static int update_window_line P_ ((struct window *, int));
156 static void update_marginal_area P_ ((struct window *, int, int));
157 static int update_text_area P_ ((struct window *, int));
158 static void make_current P_ ((struct glyph_matrix *, struct glyph_matrix *,
159 int));
160 static void mirror_make_current P_ ((struct window *, int));
161 void check_window_matrix_pointers P_ ((struct window *));
162 #if GLYPH_DEBUG
163 static void check_matrix_pointers P_ ((struct glyph_matrix *,
164 struct glyph_matrix *));
165 #endif
166 static void mirror_line_dance P_ ((struct window *, int, int, int *, char *));
167 static int update_window_tree P_ ((struct window *, int));
168 static int update_window P_ ((struct window *, int));
169 static int update_frame_1 P_ ((struct frame *, int, int));
170 static void set_window_cursor_after_update P_ ((struct window *));
171 static int row_equal_p P_ ((struct window *, struct glyph_row *,
172 struct glyph_row *));
173 static void adjust_frame_glyphs_for_window_redisplay P_ ((struct frame *));
174 static void adjust_frame_glyphs_for_frame_redisplay P_ ((struct frame *));
175 static void reverse_rows P_ ((struct glyph_matrix *, int, int));
176 static int margin_glyphs_to_reserve P_ ((struct window *, int, Lisp_Object));
177 static void sync_window_with_frame_matrix_rows P_ ((struct window *));
178 struct window *frame_row_to_window P_ ((struct window *, int));
179
180
181 \f
182 /* Non-zero means don't pause redisplay for pending input. (This is
183 for debugging and for a future implementation of EDT-like
184 scrolling. */
185
186 int redisplay_dont_pause;
187
188 /* Nonzero upon entry to redisplay means do not assume anything about
189 current contents of actual terminal frame; clear and redraw it. */
190
191 int frame_garbaged;
192
193 /* Nonzero means last display completed. Zero means it was preempted. */
194
195 int display_completed;
196
197 /* Lisp variable visible-bell; enables use of screen-flash instead of
198 audible bell. */
199
200 int visible_bell;
201
202 /* Invert the color of the whole frame, at a low level. */
203
204 int inverse_video;
205
206 /* Line speed of the terminal. */
207
208 int baud_rate;
209
210 /* Either nil or a symbol naming the window system under which Emacs
211 is running. */
212
213 Lisp_Object Vwindow_system;
214
215 /* Version number of X windows: 10, 11 or nil. */
216
217 Lisp_Object Vwindow_system_version;
218
219 /* Vector of glyph definitions. Indexed by glyph number, the contents
220 are a string which is how to output the glyph.
221
222 If Vglyph_table is nil, a glyph is output by using its low 8 bits
223 as a character code.
224
225 This is an obsolete feature that is no longer used. The variable
226 is retained for compatibility. */
227
228 Lisp_Object Vglyph_table;
229
230 /* Display table to use for vectors that don't specify their own. */
231
232 Lisp_Object Vstandard_display_table;
233
234 /* Nonzero means reading single-character input with prompt so put
235 cursor on mini-buffer after the prompt. positive means at end of
236 text in echo area; negative means at beginning of line. */
237
238 int cursor_in_echo_area;
239
240 Lisp_Object Qdisplay_table;
241
242 \f
243 /* The currently selected frame. In a single-frame version, this
244 variable always equals the_only_frame. */
245
246 Lisp_Object selected_frame;
247
248 /* A frame which is not just a mini-buffer, or 0 if there are no such
249 frames. This is usually the most recent such frame that was
250 selected. In a single-frame version, this variable always holds
251 the address of the_only_frame. */
252
253 struct frame *last_nonminibuf_frame;
254
255 /* Stdio stream being used for copy of all output. */
256
257 FILE *termscript;
258
259 /* Structure for info on cursor positioning. */
260
261 struct cm Wcm;
262
263 /* 1 means SIGWINCH happened when not safe. */
264
265 int delayed_size_change;
266
267 /* 1 means glyph initialization has been completed at startup. */
268
269 static int glyphs_initialized_initially_p;
270
271 /* Updated window if != 0. Set by update_window. */
272
273 struct window *updated_window;
274
275 /* Glyph row updated in update_window_line, and area that is updated. */
276
277 struct glyph_row *updated_row;
278 int updated_area;
279
280 /* A glyph for a space. */
281
282 struct glyph space_glyph;
283
284 /* Non-zero means update has been performed directly, so that there's
285 no need for redisplay_internal to do much work. Set by
286 direct_output_for_insert. */
287
288 int redisplay_performed_directly_p;
289
290 /* Counts of allocated structures. These counts serve to diagnose
291 memory leaks and double frees. */
292
293 int glyph_matrix_count;
294 int glyph_pool_count;
295
296 /* If non-null, the frame whose frame matrices are manipulated. If
297 null, window matrices are worked on. */
298
299 static struct frame *frame_matrix_frame;
300
301 /* Current interface for window-based redisplay. Set from init_xterm.
302 A null value means we are not using window-based redisplay. */
303
304 struct redisplay_interface *rif;
305
306 /* Non-zero means that fonts have been loaded since the last glyph
307 matrix adjustments. Redisplay must stop, and glyph matrices must
308 be adjusted when this flag becomes non-zero during display. The
309 reason fonts can be loaded so late is that fonts of fontsets are
310 loaded on demand. */
311
312 int fonts_changed_p;
313
314 /* Convert vpos and hpos from frame to window and vice versa.
315 This may only be used for terminal frames. */
316
317 #if GLYPH_DEBUG
318
319 static int window_to_frame_vpos P_ ((struct window *, int));
320 static int window_to_frame_hpos P_ ((struct window *, int));
321 #define WINDOW_TO_FRAME_VPOS(W, VPOS) window_to_frame_vpos ((W), (VPOS))
322 #define WINDOW_TO_FRAME_HPOS(W, HPOS) window_to_frame_hpos ((W), (HPOS))
323
324 #else /* GLYPH_DEBUG == 0 */
325
326 #define WINDOW_TO_FRAME_VPOS(W, VPOS) ((VPOS) + XFASTINT ((W)->top))
327 #define WINDOW_TO_FRAME_HPOS(W, HPOS) ((HPOS) + XFASTINT ((W)->left))
328
329 #endif /* GLYPH_DEBUG == 0 */
330
331
332 /* Like bcopy except never gets confused by overlap. Let this be the
333 first function defined in this file, or change emacs.c where the
334 address of this function is used. */
335
336 void
337 safe_bcopy (from, to, size)
338 char *from, *to;
339 int size;
340 {
341 if (size <= 0 || from == to)
342 return;
343
344 /* If the source and destination don't overlap, then bcopy can
345 handle it. If they do overlap, but the destination is lower in
346 memory than the source, we'll assume bcopy can handle that. */
347 if (to < from || from + size <= to)
348 bcopy (from, to, size);
349
350 /* Otherwise, we'll copy from the end. */
351 else
352 {
353 register char *endf = from + size;
354 register char *endt = to + size;
355
356 /* If TO - FROM is large, then we should break the copy into
357 nonoverlapping chunks of TO - FROM bytes each. However, if
358 TO - FROM is small, then the bcopy function call overhead
359 makes this not worth it. The crossover point could be about
360 anywhere. Since I don't think the obvious copy loop is too
361 bad, I'm trying to err in its favor. */
362 if (to - from < 64)
363 {
364 do
365 *--endt = *--endf;
366 while (endf != from);
367 }
368 else
369 {
370 for (;;)
371 {
372 endt -= (to - from);
373 endf -= (to - from);
374
375 if (endt < to)
376 break;
377
378 bcopy (endf, endt, to - from);
379 }
380
381 /* If SIZE wasn't a multiple of TO - FROM, there will be a
382 little left over. The amount left over is (endt + (to -
383 from)) - to, which is endt - from. */
384 bcopy (from, to, endt - from);
385 }
386 }
387 }
388
389
390 \f
391 /***********************************************************************
392 Glyph Matrices
393 ***********************************************************************/
394
395 /* Allocate and return a glyph_matrix structure. POOL is the glyph
396 pool from which memory for the matrix should be allocated, or null
397 for window-based redisplay where no glyph pools are used. The
398 member `pool' of the glyph matrix structure returned is set to
399 POOL, the structure is otherwise zeroed. */
400
401 struct glyph_matrix *
402 new_glyph_matrix (pool)
403 struct glyph_pool *pool;
404 {
405 struct glyph_matrix *result;
406
407 /* Allocate and clear. */
408 result = (struct glyph_matrix *) xmalloc (sizeof *result);
409 bzero (result, sizeof *result);
410
411 /* Increment number of allocated matrices. This count is used
412 to detect memory leaks. */
413 ++glyph_matrix_count;
414
415 /* Set pool and return. */
416 result->pool = pool;
417 return result;
418 }
419
420
421 /* Free glyph matrix MATRIX. Passing in a null MATRIX is allowed.
422
423 The global counter glyph_matrix_count is decremented when a matrix
424 is freed. If the count gets negative, more structures were freed
425 than allocated, i.e. one matrix was freed more than once or a bogus
426 pointer was passed to this function.
427
428 If MATRIX->pool is null, this means that the matrix manages its own
429 glyph memory---this is done for matrices on X frames. Freeing the
430 matrix also frees the glyph memory in this case. */
431
432 static void
433 free_glyph_matrix (matrix)
434 struct glyph_matrix *matrix;
435 {
436 if (matrix)
437 {
438 int i;
439
440 /* Detect the case that more matrices are freed than were
441 allocated. */
442 if (--glyph_matrix_count < 0)
443 abort ();
444
445 /* Free glyph memory if MATRIX owns it. */
446 if (matrix->pool == NULL)
447 for (i = 0; i < matrix->rows_allocated; ++i)
448 xfree (matrix->rows[i].glyphs[LEFT_MARGIN_AREA]);
449
450 /* Free row structures and the matrix itself. */
451 xfree (matrix->rows);
452 xfree (matrix);
453 }
454 }
455
456
457 /* Return the number of glyphs to reserve for a marginal area of
458 window W. TOTAL_GLYPHS is the number of glyphs in a complete
459 display line of window W. MARGIN gives the width of the marginal
460 area in canonical character units. MARGIN should be an integer
461 or a float. */
462
463 static int
464 margin_glyphs_to_reserve (w, total_glyphs, margin)
465 struct window *w;
466 int total_glyphs;
467 Lisp_Object margin;
468 {
469 int n;
470
471 if (NUMBERP (margin))
472 {
473 int width = XFASTINT (w->width);
474 double d = max (0, XFLOATINT (margin));
475 d = min (width / 2 - 1, d);
476 n = (int) ((double) total_glyphs / width * d);
477 }
478 else
479 n = 0;
480
481 return n;
482 }
483
484
485 /* Adjust glyph matrix MATRIX on window W or on a frame to changed
486 window sizes.
487
488 W is null if the function is called for a frame glyph matrix.
489 Otherwise it is the window MATRIX is a member of. X and Y are the
490 indices of the first column and row of MATRIX within the frame
491 matrix, if such a matrix exists. They are zero for purely
492 window-based redisplay. DIM is the needed size of the matrix.
493
494 In window-based redisplay, where no frame matrices exist, glyph
495 matrices manage their own glyph storage. Otherwise, they allocate
496 storage from a common frame glyph pool which can be found in
497 MATRIX->pool.
498
499 The reason for this memory management strategy is to avoid complete
500 frame redraws if possible. When we allocate from a common pool, a
501 change of the location or size of a sub-matrix within the pool
502 requires a complete redisplay of the frame because we cannot easily
503 make sure that the current matrices of all windows still agree with
504 what is displayed on the screen. While this is usually fast, it
505 leads to screen flickering. */
506
507 static void
508 adjust_glyph_matrix (w, matrix, x, y, dim)
509 struct window *w;
510 struct glyph_matrix *matrix;
511 int x, y;
512 struct dim dim;
513 {
514 int i;
515 int new_rows;
516 int marginal_areas_changed_p = 0;
517 int header_line_changed_p = 0;
518 int header_line_p = 0;
519 int left = -1, right = -1;
520 int window_x, window_y, window_width, window_height;
521
522 /* See if W had a top line that has disappeared now, or vice versa. */
523 if (w)
524 {
525 header_line_p = WINDOW_WANTS_HEADER_LINE_P (w);
526 header_line_changed_p = header_line_p != matrix->header_line_p;
527 }
528 matrix->header_line_p = header_line_p;
529
530 /* Do nothing if MATRIX' size, position, vscroll, and marginal areas
531 haven't changed. This optimization is important because preserving
532 the matrix means preventing redisplay. */
533 if (matrix->pool == NULL)
534 {
535 window_box (w, -1, &window_x, &window_y, &window_width, &window_height);
536 left = margin_glyphs_to_reserve (w, dim.width, w->left_margin_width);
537 right = margin_glyphs_to_reserve (w, dim.width, w->right_margin_width);
538 xassert (left >= 0 && right >= 0);
539 marginal_areas_changed_p = (left != matrix->left_margin_glyphs
540 || right != matrix->right_margin_glyphs);
541
542 if (!marginal_areas_changed_p
543 && !fonts_changed_p
544 && !header_line_changed_p
545 && matrix->window_top_y == XFASTINT (w->top)
546 && matrix->window_height == window_height
547 && matrix->window_vscroll == w->vscroll
548 && matrix->window_width == window_width)
549 return;
550 }
551
552 /* Enlarge MATRIX->rows if necessary. New rows are cleared. */
553 if (matrix->rows_allocated < dim.height)
554 {
555 int size = dim.height * sizeof (struct glyph_row);
556 new_rows = dim.height - matrix->rows_allocated;
557 matrix->rows = (struct glyph_row *) xrealloc (matrix->rows, size);
558 bzero (matrix->rows + matrix->rows_allocated,
559 new_rows * sizeof *matrix->rows);
560 matrix->rows_allocated = dim.height;
561 }
562 else
563 new_rows = 0;
564
565 /* If POOL is not null, MATRIX is a frame matrix or a window matrix
566 on a frame not using window-based redisplay. Set up pointers for
567 each row into the glyph pool. */
568 if (matrix->pool)
569 {
570 xassert (matrix->pool->glyphs);
571
572 if (w)
573 {
574 left = margin_glyphs_to_reserve (w, dim.width,
575 w->left_margin_width);
576 right = margin_glyphs_to_reserve (w, dim.width,
577 w->right_margin_width);
578 }
579 else
580 left = right = 0;
581
582 for (i = 0; i < dim.height; ++i)
583 {
584 struct glyph_row *row = &matrix->rows[i];
585
586 row->glyphs[LEFT_MARGIN_AREA]
587 = (matrix->pool->glyphs
588 + (y + i) * matrix->pool->ncolumns
589 + x);
590
591 if (w == NULL
592 || row == matrix->rows + dim.height - 1
593 || (row == matrix->rows && matrix->header_line_p))
594 {
595 row->glyphs[TEXT_AREA]
596 = row->glyphs[LEFT_MARGIN_AREA];
597 row->glyphs[RIGHT_MARGIN_AREA]
598 = row->glyphs[TEXT_AREA] + dim.width;
599 row->glyphs[LAST_AREA]
600 = row->glyphs[RIGHT_MARGIN_AREA];
601 }
602 else
603 {
604 row->glyphs[TEXT_AREA]
605 = row->glyphs[LEFT_MARGIN_AREA] + left;
606 row->glyphs[RIGHT_MARGIN_AREA]
607 = row->glyphs[TEXT_AREA] + dim.width - left - right;
608 row->glyphs[LAST_AREA]
609 = row->glyphs[LEFT_MARGIN_AREA] + dim.width;
610 }
611 }
612
613 matrix->left_margin_glyphs = left;
614 matrix->right_margin_glyphs = right;
615 }
616 else
617 {
618 /* If MATRIX->pool is null, MATRIX is responsible for managing
619 its own memory. Allocate glyph memory from the heap. */
620 if (dim.width > matrix->matrix_w
621 || new_rows
622 || header_line_changed_p
623 || marginal_areas_changed_p)
624 {
625 struct glyph_row *row = matrix->rows;
626 struct glyph_row *end = row + matrix->rows_allocated;
627
628 while (row < end)
629 {
630 row->glyphs[LEFT_MARGIN_AREA]
631 = (struct glyph *) xrealloc (row->glyphs[LEFT_MARGIN_AREA],
632 (dim.width
633 * sizeof (struct glyph)));
634
635 /* The mode line never has marginal areas. */
636 if (row == matrix->rows + dim.height - 1
637 || (row == matrix->rows && matrix->header_line_p))
638 {
639 row->glyphs[TEXT_AREA]
640 = row->glyphs[LEFT_MARGIN_AREA];
641 row->glyphs[RIGHT_MARGIN_AREA]
642 = row->glyphs[TEXT_AREA] + dim.width;
643 row->glyphs[LAST_AREA]
644 = row->glyphs[RIGHT_MARGIN_AREA];
645 }
646 else
647 {
648 row->glyphs[TEXT_AREA]
649 = row->glyphs[LEFT_MARGIN_AREA] + left;
650 row->glyphs[RIGHT_MARGIN_AREA]
651 = row->glyphs[TEXT_AREA] + dim.width - left - right;
652 row->glyphs[LAST_AREA]
653 = row->glyphs[LEFT_MARGIN_AREA] + dim.width;
654 }
655 ++row;
656 }
657 }
658
659 xassert (left >= 0 && right >= 0);
660 matrix->left_margin_glyphs = left;
661 matrix->right_margin_glyphs = right;
662 }
663
664 /* Number of rows to be used by MATRIX. */
665 matrix->nrows = dim.height;
666
667 /* Mark rows in a current matrix of a window as not having valid
668 contents. It's important to not do this for desired matrices.
669 When Emacs starts, it may already be building desired matrices
670 when this function runs. */
671 if (w && matrix == w->current_matrix)
672 {
673 /* Optimize the case that only the height has changed (C-x 2,
674 upper window). Invalidate all rows that are no longer part
675 of the window. */
676 if (!marginal_areas_changed_p
677 && matrix->window_top_y == XFASTINT (w->top)
678 && matrix->window_width == window_width)
679 {
680 i = 0;
681 while (matrix->rows[i].enabled_p
682 && (MATRIX_ROW_BOTTOM_Y (matrix->rows + i)
683 < matrix->window_height))
684 ++i;
685
686 /* Window end is invalid, if inside of the rows that
687 are invalidated. */
688 if (INTEGERP (w->window_end_vpos)
689 && XFASTINT (w->window_end_vpos) >= i)
690 w->window_end_valid = Qnil;
691
692 while (i < matrix->nrows)
693 matrix->rows[i++].enabled_p = 0;
694 }
695 else
696 {
697 for (i = 0; i < matrix->nrows; ++i)
698 matrix->rows[i].enabled_p = 0;
699 }
700 }
701
702 /* Remember last values to be able to optimize frame redraws. */
703 matrix->matrix_x = x;
704 matrix->matrix_y = y;
705 matrix->matrix_w = dim.width;
706 matrix->matrix_h = dim.height;
707
708 /* Record the top y location and height of W at the time the matrix
709 was last adjusted. This is used to optimize redisplay above. */
710 if (w)
711 {
712 matrix->window_top_y = XFASTINT (w->top);
713 matrix->window_height = window_height;
714 matrix->window_width = window_width;
715 matrix->window_vscroll = w->vscroll;
716 }
717 }
718
719
720 /* Reverse the contents of rows in MATRIX between START and END. The
721 contents of the row at END - 1 end up at START, END - 2 at START +
722 1 etc. This is part of the implementation of rotate_matrix (see
723 below). */
724
725 static void
726 reverse_rows (matrix, start, end)
727 struct glyph_matrix *matrix;
728 int start, end;
729 {
730 int i, j;
731
732 for (i = start, j = end - 1; i < j; ++i, --j)
733 {
734 /* Non-ISO HP/UX compiler doesn't like auto struct
735 initialization. */
736 struct glyph_row temp;
737 temp = matrix->rows[i];
738 matrix->rows[i] = matrix->rows[j];
739 matrix->rows[j] = temp;
740 }
741 }
742
743
744 /* Rotate the contents of rows in MATRIX in the range FIRST .. LAST -
745 1 by BY positions. BY < 0 means rotate left, i.e. towards lower
746 indices. (Note: this does not copy glyphs, only glyph pointers in
747 row structures are moved around).
748
749 The algorithm used for rotating the vector was, I believe, first
750 described by Kernighan. See the vector R as consisting of two
751 sub-vectors AB, where A has length BY for BY >= 0. The result
752 after rotating is then BA. Reverse both sub-vectors to get ArBr
753 and reverse the result to get (ArBr)r which is BA. Similar for
754 rotating right. */
755
756 void
757 rotate_matrix (matrix, first, last, by)
758 struct glyph_matrix *matrix;
759 int first, last, by;
760 {
761 if (by < 0)
762 {
763 /* Up (rotate left, i.e. towards lower indices). */
764 by = -by;
765 reverse_rows (matrix, first, first + by);
766 reverse_rows (matrix, first + by, last);
767 reverse_rows (matrix, first, last);
768 }
769 else if (by > 0)
770 {
771 /* Down (rotate right, i.e. towards higher indices). */
772 reverse_rows (matrix, last - by, last);
773 reverse_rows (matrix, first, last - by);
774 reverse_rows (matrix, first, last);
775 }
776 }
777
778
779 /* Increment buffer positions in glyph rows of MATRIX. Do it for rows
780 with indices START <= index < END. Increment positions by DELTA/
781 DELTA_BYTES. */
782
783 void
784 increment_glyph_matrix_buffer_positions (matrix, start, end, delta,
785 delta_bytes)
786 struct glyph_matrix *matrix;
787 int start, end, delta, delta_bytes;
788 {
789 /* Check that START and END are reasonable values. */
790 xassert (start >= 0 && start <= matrix->nrows);
791 xassert (end >= 0 && end <= matrix->nrows);
792 xassert (start <= end);
793
794 for (; start < end; ++start)
795 increment_glyph_row_buffer_positions (matrix->rows + start,
796 delta, delta_bytes);
797 }
798
799
800 /* Enable a range of rows in glyph matrix MATRIX. START and END are
801 the row indices of the first and last + 1 row to enable. If
802 ENABLED_P is non-zero, enabled_p flags in rows will be set to 1. */
803
804 void
805 enable_glyph_matrix_rows (matrix, start, end, enabled_p)
806 struct glyph_matrix *matrix;
807 int start, end;
808 int enabled_p;
809 {
810 xassert (start <= end);
811 xassert (start >= 0 && start < matrix->nrows);
812 xassert (end >= 0 && end <= matrix->nrows);
813
814 for (; start < end; ++start)
815 matrix->rows[start].enabled_p = enabled_p != 0;
816 }
817
818
819 /* Clear MATRIX.
820
821 This empties all rows in MATRIX by setting the enabled_p flag for
822 all rows of the matrix to zero. The function prepare_desired_row
823 will eventually really clear a row when it sees one with a zero
824 enabled_p flag.
825
826 Resets update hints to defaults value. The only update hint
827 currently present is the flag MATRIX->no_scrolling_p. */
828
829 void
830 clear_glyph_matrix (matrix)
831 struct glyph_matrix *matrix;
832 {
833 if (matrix)
834 {
835 enable_glyph_matrix_rows (matrix, 0, matrix->nrows, 0);
836 matrix->no_scrolling_p = 0;
837 }
838 }
839
840
841 /* Shift part of the glyph matrix MATRIX of window W up or down.
842 Increment y-positions in glyph rows between START and END by DY,
843 and recompute their visible height. */
844
845 void
846 shift_glyph_matrix (w, matrix, start, end, dy)
847 struct window *w;
848 struct glyph_matrix *matrix;
849 int start, end, dy;
850 {
851 int min_y, max_y;
852
853 xassert (start <= end);
854 xassert (start >= 0 && start < matrix->nrows);
855 xassert (end >= 0 && end <= matrix->nrows);
856
857 min_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w);
858 max_y = WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE (w);
859
860 for (; start < end; ++start)
861 {
862 struct glyph_row *row = &matrix->rows[start];
863
864 row->y += dy;
865
866 if (row->y < min_y)
867 row->visible_height = row->height - (min_y - row->y);
868 else if (row->y + row->height > max_y)
869 row->visible_height = row->height - (row->y + row->height - max_y);
870 else
871 row->visible_height = row->height;
872 }
873 }
874
875
876 /* Mark all rows in current matrices of frame F as invalid. Marking
877 invalid is done by setting enabled_p to zero for all rows in a
878 current matrix. */
879
880 void
881 clear_current_matrices (f)
882 register struct frame *f;
883 {
884 /* Clear frame current matrix, if we have one. */
885 if (f->current_matrix)
886 clear_glyph_matrix (f->current_matrix);
887
888 /* Clear the matrix of the menu bar window, if such a window exists.
889 The menu bar window is currently used to display menus on X when
890 no toolkit support is compiled in. */
891 if (WINDOWP (f->menu_bar_window))
892 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix);
893
894 /* Clear the matrix of the tool-bar window, if any. */
895 if (WINDOWP (f->tool_bar_window))
896 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix);
897
898 /* Clear current window matrices. */
899 xassert (WINDOWP (FRAME_ROOT_WINDOW (f)));
900 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 0);
901 }
902
903
904 /* Clear out all display lines of F for a coming redisplay. */
905
906 void
907 clear_desired_matrices (f)
908 register struct frame *f;
909 {
910 if (f->desired_matrix)
911 clear_glyph_matrix (f->desired_matrix);
912
913 if (WINDOWP (f->menu_bar_window))
914 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->desired_matrix);
915
916 if (WINDOWP (f->tool_bar_window))
917 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->desired_matrix);
918
919 /* Do it for window matrices. */
920 xassert (WINDOWP (FRAME_ROOT_WINDOW (f)));
921 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 1);
922 }
923
924
925 /* Clear matrices in window tree rooted in W. If DESIRED_P is
926 non-zero clear desired matrices, otherwise clear current matrices. */
927
928 static void
929 clear_window_matrices (w, desired_p)
930 struct window *w;
931 int desired_p;
932 {
933 while (w)
934 {
935 if (!NILP (w->hchild))
936 {
937 xassert (WINDOWP (w->hchild));
938 clear_window_matrices (XWINDOW (w->hchild), desired_p);
939 }
940 else if (!NILP (w->vchild))
941 {
942 xassert (WINDOWP (w->vchild));
943 clear_window_matrices (XWINDOW (w->vchild), desired_p);
944 }
945 else
946 {
947 if (desired_p)
948 clear_glyph_matrix (w->desired_matrix);
949 else
950 {
951 clear_glyph_matrix (w->current_matrix);
952 w->window_end_valid = Qnil;
953 }
954 }
955
956 w = NILP (w->next) ? 0 : XWINDOW (w->next);
957 }
958 }
959
960
961 \f
962 /***********************************************************************
963 Glyph Rows
964
965 See dispextern.h for an overall explanation of glyph rows.
966 ***********************************************************************/
967
968 /* Clear glyph row ROW. Do it in a way that makes it robust against
969 changes in the glyph_row structure, i.e. addition or removal of
970 structure members. */
971
972 void
973 clear_glyph_row (row)
974 struct glyph_row *row;
975 {
976 struct glyph *p[1 + LAST_AREA];
977 static struct glyph_row null_row;
978
979 /* Save pointers. */
980 p[LEFT_MARGIN_AREA] = row->glyphs[LEFT_MARGIN_AREA];
981 p[TEXT_AREA] = row->glyphs[TEXT_AREA];
982 p[RIGHT_MARGIN_AREA] = row->glyphs[RIGHT_MARGIN_AREA];
983 p[LAST_AREA] = row->glyphs[LAST_AREA];
984
985 /* Clear. */
986 *row = null_row;
987
988 /* Restore pointers. */
989 row->glyphs[LEFT_MARGIN_AREA] = p[LEFT_MARGIN_AREA];
990 row->glyphs[TEXT_AREA] = p[TEXT_AREA];
991 row->glyphs[RIGHT_MARGIN_AREA] = p[RIGHT_MARGIN_AREA];
992 row->glyphs[LAST_AREA] = p[LAST_AREA];
993 }
994
995
996 /* Make ROW an empty, enabled row of canonical character height,
997 in window W starting at y-position Y. */
998
999 void
1000 blank_row (w, row, y)
1001 struct window *w;
1002 struct glyph_row *row;
1003 int y;
1004 {
1005 int min_y, max_y;
1006
1007 min_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w);
1008 max_y = WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE (w);
1009
1010 clear_glyph_row (row);
1011 row->y = y;
1012 row->ascent = row->phys_ascent = 0;
1013 row->height = row->phys_height = CANON_Y_UNIT (XFRAME (w->frame));
1014
1015 if (row->y < min_y)
1016 row->visible_height = row->height - (min_y - row->y);
1017 else if (row->y + row->height > max_y)
1018 row->visible_height = row->height - (row->y + row->height - max_y);
1019 else
1020 row->visible_height = row->height;
1021
1022 row->enabled_p = 1;
1023 }
1024
1025
1026 /* Increment buffer positions in glyph row ROW. DELTA and DELTA_BYTES
1027 are the amounts by which to change positions. Note that the first
1028 glyph of the text area of a row can have a buffer position even if
1029 the used count of the text area is zero. Such rows display line
1030 ends. */
1031
1032 void
1033 increment_glyph_row_buffer_positions (row, delta, delta_bytes)
1034 struct glyph_row *row;
1035 int delta, delta_bytes;
1036 {
1037 int area, i;
1038
1039 /* Increment start and end positions. */
1040 MATRIX_ROW_START_CHARPOS (row) += delta;
1041 MATRIX_ROW_START_BYTEPOS (row) += delta_bytes;
1042 MATRIX_ROW_END_CHARPOS (row) += delta;
1043 MATRIX_ROW_END_BYTEPOS (row) += delta_bytes;
1044
1045 /* Increment positions in glyphs. */
1046 for (area = 0; area < LAST_AREA; ++area)
1047 for (i = 0; i < row->used[area]; ++i)
1048 if (BUFFERP (row->glyphs[area][i].object)
1049 && row->glyphs[area][i].charpos > 0)
1050 row->glyphs[area][i].charpos += delta;
1051
1052 /* Capture the case of rows displaying a line end. */
1053 if (row->used[TEXT_AREA] == 0
1054 && MATRIX_ROW_DISPLAYS_TEXT_P (row))
1055 row->glyphs[TEXT_AREA]->charpos += delta;
1056 }
1057
1058
1059 /* Swap glyphs between two glyph rows A and B. This exchanges glyph
1060 contents, i.e. glyph structure contents are exchanged between A and
1061 B without changing glyph pointers in A and B. */
1062
1063 static void
1064 swap_glyphs_in_rows (a, b)
1065 struct glyph_row *a, *b;
1066 {
1067 int area;
1068
1069 for (area = 0; area < LAST_AREA; ++area)
1070 {
1071 /* Number of glyphs to swap. */
1072 int max_used = max (a->used[area], b->used[area]);
1073
1074 /* Start of glyphs in area of row A. */
1075 struct glyph *glyph_a = a->glyphs[area];
1076
1077 /* End + 1 of glyphs in area of row A. */
1078 struct glyph *glyph_a_end = a->glyphs[max_used];
1079
1080 /* Start of glyphs in area of row B. */
1081 struct glyph *glyph_b = b->glyphs[area];
1082
1083 while (glyph_a < glyph_a_end)
1084 {
1085 /* Non-ISO HP/UX compiler doesn't like auto struct
1086 initialization. */
1087 struct glyph temp;
1088 temp = *glyph_a;
1089 *glyph_a = *glyph_b;
1090 *glyph_b = temp;
1091 ++glyph_a;
1092 ++glyph_b;
1093 }
1094 }
1095 }
1096
1097
1098 /* Exchange pointers to glyph memory between glyph rows A and B. */
1099
1100 static INLINE void
1101 swap_glyph_pointers (a, b)
1102 struct glyph_row *a, *b;
1103 {
1104 int i;
1105 for (i = 0; i < LAST_AREA + 1; ++i)
1106 {
1107 struct glyph *temp = a->glyphs[i];
1108 a->glyphs[i] = b->glyphs[i];
1109 b->glyphs[i] = temp;
1110 }
1111 }
1112
1113
1114 /* Copy glyph row structure FROM to glyph row structure TO, except
1115 that glyph pointers in the structures are left unchanged. */
1116
1117 INLINE void
1118 copy_row_except_pointers (to, from)
1119 struct glyph_row *to, *from;
1120 {
1121 struct glyph *pointers[1 + LAST_AREA];
1122
1123 /* Save glyph pointers of TO. */
1124 bcopy (to->glyphs, pointers, sizeof to->glyphs);
1125
1126 /* Do a structure assignment. */
1127 *to = *from;
1128
1129 /* Restore original pointers of TO. */
1130 bcopy (pointers, to->glyphs, sizeof to->glyphs);
1131 }
1132
1133
1134 /* Copy contents of glyph row FROM to glyph row TO. Glyph pointers in
1135 TO and FROM are left unchanged. Glyph contents are copied from the
1136 glyph memory of FROM to the glyph memory of TO. Increment buffer
1137 positions in row TO by DELTA/ DELTA_BYTES. */
1138
1139 void
1140 copy_glyph_row_contents (to, from, delta, delta_bytes)
1141 struct glyph_row *to, *from;
1142 int delta, delta_bytes;
1143 {
1144 int area;
1145
1146 /* This is like a structure assignment TO = FROM, except that
1147 glyph pointers in the rows are left unchanged. */
1148 copy_row_except_pointers (to, from);
1149
1150 /* Copy glyphs from FROM to TO. */
1151 for (area = 0; area < LAST_AREA; ++area)
1152 if (from->used[area])
1153 bcopy (from->glyphs[area], to->glyphs[area],
1154 from->used[area] * sizeof (struct glyph));
1155
1156 /* Increment buffer positions in TO by DELTA. */
1157 increment_glyph_row_buffer_positions (to, delta, delta_bytes);
1158 }
1159
1160
1161 /* Assign glyph row FROM to glyph row TO. This works like a structure
1162 assignment TO = FROM, except that glyph pointers are not copied but
1163 exchanged between TO and FROM. Pointers must be exchanged to avoid
1164 a memory leak. */
1165
1166 static INLINE void
1167 assign_row (to, from)
1168 struct glyph_row *to, *from;
1169 {
1170 swap_glyph_pointers (to, from);
1171 copy_row_except_pointers (to, from);
1172 }
1173
1174
1175 /* Test whether the glyph memory of the glyph row WINDOW_ROW, which is
1176 a row in a window matrix, is a slice of the glyph memory of the
1177 glyph row FRAME_ROW which is a row in a frame glyph matrix. Value
1178 is non-zero if the glyph memory of WINDOW_ROW is part of the glyph
1179 memory of FRAME_ROW. */
1180
1181 static int
1182 glyph_row_slice_p (window_row, frame_row)
1183 struct glyph_row *window_row, *frame_row;
1184 {
1185 struct glyph *window_glyph_start = window_row->glyphs[0];
1186 struct glyph *frame_glyph_start = frame_row->glyphs[0];
1187 struct glyph *frame_glyph_end = frame_row->glyphs[LAST_AREA];
1188
1189 return (frame_glyph_start <= window_glyph_start
1190 && window_glyph_start < frame_glyph_end);
1191 }
1192
1193
1194 /* Find the row in the window glyph matrix WINDOW_MATRIX being a slice
1195 of ROW in the frame matrix FRAME_MATRIX. Value is null if no row
1196 in WINDOW_MATRIX is found satisfying the condition. */
1197
1198 static struct glyph_row *
1199 find_glyph_row_slice (window_matrix, frame_matrix, row)
1200 struct glyph_matrix *window_matrix, *frame_matrix;
1201 int row;
1202 {
1203 int i;
1204
1205 xassert (row >= 0 && row < frame_matrix->nrows);
1206
1207 for (i = 0; i < window_matrix->nrows; ++i)
1208 if (glyph_row_slice_p (window_matrix->rows + i,
1209 frame_matrix->rows + row))
1210 break;
1211
1212 return i < window_matrix->nrows ? window_matrix->rows + i : 0;
1213 }
1214
1215
1216 /* Prepare ROW for display. Desired rows are cleared lazily,
1217 i.e. they are only marked as to be cleared by setting their
1218 enabled_p flag to zero. When a row is to be displayed, a prior
1219 call to this function really clears it. */
1220
1221 void
1222 prepare_desired_row (row)
1223 struct glyph_row *row;
1224 {
1225 if (!row->enabled_p)
1226 {
1227 clear_glyph_row (row);
1228 row->enabled_p = 1;
1229 }
1230 }
1231
1232
1233 /* Return a hash code for glyph row ROW. */
1234
1235 int
1236 line_hash_code (row)
1237 struct glyph_row *row;
1238 {
1239 int hash = 0;
1240
1241 if (row->enabled_p)
1242 {
1243 if (row->inverse_p)
1244 {
1245 /* Give all highlighted lines the same hash code
1246 so as to encourage scrolling to leave them in place. */
1247 hash = -1;
1248 }
1249 else
1250 {
1251 struct glyph *glyph = row->glyphs[TEXT_AREA];
1252 struct glyph *end = glyph + row->used[TEXT_AREA];
1253
1254 while (glyph < end)
1255 {
1256 int c = glyph->u.ch;
1257 int face_id = glyph->face_id;
1258 if (must_write_spaces)
1259 c -= SPACEGLYPH;
1260 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + c;
1261 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + face_id;
1262 ++glyph;
1263 }
1264
1265 if (hash == 0)
1266 hash = 1;
1267 }
1268 }
1269
1270 return hash;
1271 }
1272
1273
1274 /* Return the cost of drawing line VPOS In MATRIX. The cost equals
1275 the number of characters in the line. If must_write_spaces is
1276 zero, leading and trailing spaces are ignored. */
1277
1278 static unsigned int
1279 line_draw_cost (matrix, vpos)
1280 struct glyph_matrix *matrix;
1281 int vpos;
1282 {
1283 struct glyph_row *row = matrix->rows + vpos;
1284 struct glyph *beg = row->glyphs[TEXT_AREA];
1285 struct glyph *end = beg + row->used[TEXT_AREA];
1286 int len;
1287 Lisp_Object *glyph_table_base = GLYPH_TABLE_BASE;
1288 int glyph_table_len = GLYPH_TABLE_LENGTH;
1289
1290 /* Ignore trailing and leading spaces if we can. */
1291 if (!must_write_spaces)
1292 {
1293 /* Skip from the end over trailing spaces. */
1294 while (end != beg && CHAR_GLYPH_SPACE_P (*end))
1295 --end;
1296
1297 /* All blank line. */
1298 if (end == beg)
1299 return 0;
1300
1301 /* Skip over leading spaces. */
1302 while (CHAR_GLYPH_SPACE_P (*beg))
1303 ++beg;
1304 }
1305
1306 /* If we don't have a glyph-table, each glyph is one character,
1307 so return the number of glyphs. */
1308 if (glyph_table_base == 0)
1309 len = end - beg;
1310 else
1311 {
1312 /* Otherwise, scan the glyphs and accumulate their total length
1313 in LEN. */
1314 len = 0;
1315 while (beg < end)
1316 {
1317 GLYPH g = GLYPH_FROM_CHAR_GLYPH (*beg);
1318
1319 if (g < 0
1320 || GLYPH_SIMPLE_P (glyph_table_base, glyph_table_len, g))
1321 len += 1;
1322 else
1323 len += GLYPH_LENGTH (glyph_table_base, g);
1324
1325 ++beg;
1326 }
1327 }
1328
1329 return len;
1330 }
1331
1332
1333 /* Test two glyph rows A and B for equality. Value is non-zero if A
1334 and B have equal contents. W is the window to which the glyphs
1335 rows A and B belong. It is needed here to test for partial row
1336 visibility. */
1337
1338 static INLINE int
1339 row_equal_p (w, a, b)
1340 struct window *w;
1341 struct glyph_row *a, *b;
1342 {
1343 if (a == b)
1344 return 1;
1345 else if (a->hash != b->hash)
1346 return 0;
1347 else
1348 {
1349 struct glyph *a_glyph, *b_glyph, *a_end;
1350 int area;
1351
1352 /* Compare glyphs. */
1353 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
1354 {
1355 if (a->used[area] != b->used[area])
1356 return 0;
1357
1358 a_glyph = a->glyphs[area];
1359 a_end = a_glyph + a->used[area];
1360 b_glyph = b->glyphs[area];
1361
1362 while (a_glyph < a_end
1363 && GLYPH_EQUAL_P (a_glyph, b_glyph))
1364 ++a_glyph, ++b_glyph;
1365
1366 if (a_glyph != a_end)
1367 return 0;
1368 }
1369
1370 if (a->truncated_on_left_p != b->truncated_on_left_p
1371 || a->inverse_p != b->inverse_p
1372 || a->fill_line_p != b->fill_line_p
1373 || a->truncated_on_right_p != b->truncated_on_right_p
1374 || a->overlay_arrow_p != b->overlay_arrow_p
1375 || a->continued_p != b->continued_p
1376 || a->indicate_empty_line_p != b->indicate_empty_line_p
1377 || a->overlapped_p != b->overlapped_p
1378 || (MATRIX_ROW_CONTINUATION_LINE_P (a)
1379 != MATRIX_ROW_CONTINUATION_LINE_P (b))
1380 /* Different partially visible characters on left margin. */
1381 || a->x != b->x
1382 /* Different height. */
1383 || a->ascent != b->ascent
1384 || a->phys_ascent != b->phys_ascent
1385 || a->phys_height != b->phys_height
1386 || a->visible_height != b->visible_height)
1387 return 0;
1388 }
1389
1390 return 1;
1391 }
1392
1393
1394 \f
1395 /***********************************************************************
1396 Glyph Pool
1397
1398 See dispextern.h for an overall explanation of glyph pools.
1399 ***********************************************************************/
1400
1401 /* Allocate a glyph_pool structure. The structure returned is
1402 initialized with zeros. The global variable glyph_pool_count is
1403 incremented for each pool allocated. */
1404
1405 static struct glyph_pool *
1406 new_glyph_pool ()
1407 {
1408 struct glyph_pool *result;
1409
1410 /* Allocate a new glyph_pool and clear it. */
1411 result = (struct glyph_pool *) xmalloc (sizeof *result);
1412 bzero (result, sizeof *result);
1413
1414 /* For memory leak and double deletion checking. */
1415 ++glyph_pool_count;
1416
1417 return result;
1418 }
1419
1420
1421 /* Free a glyph_pool structure POOL. The function may be called with
1422 a null POOL pointer. The global variable glyph_pool_count is
1423 decremented with every pool structure freed. If this count gets
1424 negative, more structures were freed than allocated, i.e. one
1425 structure must have been freed more than once or a bogus pointer
1426 was passed to free_glyph_pool. */
1427
1428 static void
1429 free_glyph_pool (pool)
1430 struct glyph_pool *pool;
1431 {
1432 if (pool)
1433 {
1434 /* More freed than allocated? */
1435 --glyph_pool_count;
1436 xassert (glyph_pool_count >= 0);
1437
1438 xfree (pool->glyphs);
1439 xfree (pool);
1440 }
1441 }
1442
1443
1444 /* Enlarge a glyph pool POOL. MATRIX_DIM gives the number of rows and
1445 columns we need. This function never shrinks a pool. The only
1446 case in which this would make sense, would be when a frame's size
1447 is changed from a large value to a smaller one. But, if someone
1448 does it once, we can expect that he will do it again.
1449
1450 Value is non-zero if the pool changed in a way which makes
1451 re-adjusting window glyph matrices necessary. */
1452
1453 static int
1454 realloc_glyph_pool (pool, matrix_dim)
1455 struct glyph_pool *pool;
1456 struct dim matrix_dim;
1457 {
1458 int needed;
1459 int changed_p;
1460
1461 changed_p = (pool->glyphs == 0
1462 || matrix_dim.height != pool->nrows
1463 || matrix_dim.width != pool->ncolumns);
1464
1465 /* Enlarge the glyph pool. */
1466 needed = matrix_dim.width * matrix_dim.height;
1467 if (needed > pool->nglyphs)
1468 {
1469 int size = needed * sizeof (struct glyph);
1470
1471 if (pool->glyphs)
1472 pool->glyphs = (struct glyph *) xrealloc (pool->glyphs, size);
1473 else
1474 {
1475 pool->glyphs = (struct glyph *) xmalloc (size);
1476 bzero (pool->glyphs, size);
1477 }
1478
1479 pool->nglyphs = needed;
1480 }
1481
1482 /* Remember the number of rows and columns because (a) we use then
1483 to do sanity checks, and (b) the number of columns determines
1484 where rows in the frame matrix start---this must be available to
1485 determine pointers to rows of window sub-matrices. */
1486 pool->nrows = matrix_dim.height;
1487 pool->ncolumns = matrix_dim.width;
1488
1489 return changed_p;
1490 }
1491
1492
1493 \f
1494 /***********************************************************************
1495 Debug Code
1496 ***********************************************************************/
1497
1498 #if GLYPH_DEBUG
1499
1500
1501 /* Flush standard output. This is sometimes useful to call from
1502 the debugger. */
1503
1504 void
1505 flush_stdout ()
1506 {
1507 fflush (stdout);
1508 }
1509
1510
1511 /* Check that no glyph pointers have been lost in MATRIX. If a
1512 pointer has been lost, e.g. by using a structure assignment between
1513 rows, at least one pointer must occur more than once in the rows of
1514 MATRIX. */
1515
1516 void
1517 check_matrix_pointer_lossage (matrix)
1518 struct glyph_matrix *matrix;
1519 {
1520 int i, j;
1521
1522 for (i = 0; i < matrix->nrows; ++i)
1523 for (j = 0; j < matrix->nrows; ++j)
1524 xassert (i == j
1525 || (matrix->rows[i].glyphs[TEXT_AREA]
1526 != matrix->rows[j].glyphs[TEXT_AREA]));
1527 }
1528
1529
1530 /* Get a pointer to glyph row ROW in MATRIX, with bounds checks. */
1531
1532 struct glyph_row *
1533 matrix_row (matrix, row)
1534 struct glyph_matrix *matrix;
1535 int row;
1536 {
1537 xassert (matrix && matrix->rows);
1538 xassert (row >= 0 && row < matrix->nrows);
1539
1540 /* That's really too slow for normal testing because this function
1541 is called almost everywhere. Although---it's still astonishingly
1542 fast, so it is valuable to have for debugging purposes. */
1543 #if 0
1544 check_matrix_pointer_lossage (matrix);
1545 #endif
1546
1547 return matrix->rows + row;
1548 }
1549
1550
1551 #if 0 /* This function makes invalid assumptions when text is
1552 partially invisible. But it might come handy for debugging
1553 nevertheless. */
1554
1555 /* Check invariants that must hold for an up to date current matrix of
1556 window W. */
1557
1558 static void
1559 check_matrix_invariants (w)
1560 struct window *w;
1561 {
1562 struct glyph_matrix *matrix = w->current_matrix;
1563 int yb = window_text_bottom_y (w);
1564 struct glyph_row *row = matrix->rows;
1565 struct glyph_row *last_text_row = NULL;
1566 struct buffer *saved = current_buffer;
1567 struct buffer *buffer = XBUFFER (w->buffer);
1568 int c;
1569
1570 /* This can sometimes happen for a fresh window. */
1571 if (matrix->nrows < 2)
1572 return;
1573
1574 set_buffer_temp (buffer);
1575
1576 /* Note: last row is always reserved for the mode line. */
1577 while (MATRIX_ROW_DISPLAYS_TEXT_P (row)
1578 && MATRIX_ROW_BOTTOM_Y (row) < yb)
1579 {
1580 struct glyph_row *next = row + 1;
1581
1582 if (MATRIX_ROW_DISPLAYS_TEXT_P (row))
1583 last_text_row = row;
1584
1585 /* Check that character and byte positions are in sync. */
1586 xassert (MATRIX_ROW_START_BYTEPOS (row)
1587 == CHAR_TO_BYTE (MATRIX_ROW_START_CHARPOS (row)));
1588
1589 /* CHAR_TO_BYTE aborts when invoked for a position > Z. We can
1590 have such a position temporarily in case of a minibuffer
1591 displaying something like `[Sole completion]' at its end. */
1592 if (MATRIX_ROW_END_CHARPOS (row) < BUF_ZV (current_buffer))
1593 xassert (MATRIX_ROW_END_BYTEPOS (row)
1594 == CHAR_TO_BYTE (MATRIX_ROW_END_CHARPOS (row)));
1595
1596 /* Check that end position of `row' is equal to start position
1597 of next row. */
1598 if (next->enabled_p && MATRIX_ROW_DISPLAYS_TEXT_P (next))
1599 {
1600 xassert (MATRIX_ROW_END_CHARPOS (row)
1601 == MATRIX_ROW_START_CHARPOS (next));
1602 xassert (MATRIX_ROW_END_BYTEPOS (row)
1603 == MATRIX_ROW_START_BYTEPOS (next));
1604 }
1605 row = next;
1606 }
1607
1608 xassert (w->current_matrix->nrows == w->desired_matrix->nrows);
1609 xassert (w->desired_matrix->rows != NULL);
1610 set_buffer_temp (saved);
1611 }
1612
1613 #endif /* 0 */
1614
1615 #endif /* GLYPH_DEBUG != 0 */
1616
1617
1618 \f
1619 /**********************************************************************
1620 Allocating/ Adjusting Glyph Matrices
1621 **********************************************************************/
1622
1623 /* Allocate glyph matrices over a window tree for a frame-based
1624 redisplay
1625
1626 X and Y are column/row within the frame glyph matrix where
1627 sub-matrices for the window tree rooted at WINDOW must be
1628 allocated. CH_DIM contains the dimensions of the smallest
1629 character that could be used during display. DIM_ONLY_P non-zero
1630 means that the caller of this function is only interested in the
1631 result matrix dimension, and matrix adjustments should not be
1632 performed.
1633
1634 The function returns the total width/height of the sub-matrices of
1635 the window tree. If called on a frame root window, the computation
1636 will take the mini-buffer window into account.
1637
1638 *WINDOW_CHANGE_FLAGS is set to a bit mask with bits
1639
1640 NEW_LEAF_MATRIX set if any window in the tree did not have a
1641 glyph matrices yet, and
1642
1643 CHANGED_LEAF_MATRIX set if the dimension or location of a matrix of
1644 any window in the tree will be changed or have been changed (see
1645 DIM_ONLY_P).
1646
1647 *WINDOW_CHANGE_FLAGS must be initialized by the caller of this
1648 function.
1649
1650 Windows are arranged into chains of windows on the same level
1651 through the next fields of window structures. Such a level can be
1652 either a sequence of horizontally adjacent windows from left to
1653 right, or a sequence of vertically adjacent windows from top to
1654 bottom. Each window in a horizontal sequence can be either a leaf
1655 window or a vertical sequence; a window in a vertical sequence can
1656 be either a leaf or a horizontal sequence. All windows in a
1657 horizontal sequence have the same height, and all windows in a
1658 vertical sequence have the same width.
1659
1660 This function uses, for historical reasons, a more general
1661 algorithm to determine glyph matrix dimensions that would be
1662 necessary.
1663
1664 The matrix height of a horizontal sequence is determined by the
1665 maximum height of any matrix in the sequence. The matrix width of
1666 a horizontal sequence is computed by adding up matrix widths of
1667 windows in the sequence.
1668
1669 |<------- result width ------->|
1670 +---------+----------+---------+ ---
1671 | | | | |
1672 | | | |
1673 +---------+ | | result height
1674 | +---------+
1675 | | |
1676 +----------+ ---
1677
1678 The matrix width of a vertical sequence is the maximum matrix width
1679 of any window in the sequence. Its height is computed by adding up
1680 matrix heights of windows in the sequence.
1681
1682 |<---- result width -->|
1683 +---------+ ---
1684 | | |
1685 | | |
1686 +---------+--+ |
1687 | | |
1688 | | result height
1689 | |
1690 +------------+---------+ |
1691 | | |
1692 | | |
1693 +------------+---------+ --- */
1694
1695 /* Bit indicating that a new matrix will be allocated or has been
1696 allocated. */
1697
1698 #define NEW_LEAF_MATRIX (1 << 0)
1699
1700 /* Bit indicating that a matrix will or has changed its location or
1701 size. */
1702
1703 #define CHANGED_LEAF_MATRIX (1 << 1)
1704
1705 static struct dim
1706 allocate_matrices_for_frame_redisplay (window, x, y, ch_dim,
1707 dim_only_p, window_change_flags)
1708 Lisp_Object window;
1709 int x, y;
1710 struct dim ch_dim;
1711 int dim_only_p;
1712 int *window_change_flags;
1713 {
1714 struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
1715 int x0 = x, y0 = y;
1716 int wmax = 0, hmax = 0;
1717 struct dim total;
1718 struct dim dim;
1719 struct window *w;
1720 int in_horz_combination_p;
1721
1722 /* What combination is WINDOW part of? Compute this once since the
1723 result is the same for all windows in the `next' chain. The
1724 special case of a root window (parent equal to nil) is treated
1725 like a vertical combination because a root window's `next'
1726 points to the mini-buffer window, if any, which is arranged
1727 vertically below other windows. */
1728 in_horz_combination_p
1729 = (!NILP (XWINDOW (window)->parent)
1730 && !NILP (XWINDOW (XWINDOW (window)->parent)->hchild));
1731
1732 /* For WINDOW and all windows on the same level. */
1733 do
1734 {
1735 w = XWINDOW (window);
1736
1737 /* Get the dimension of the window sub-matrix for W, depending
1738 on whether this a combination or a leaf window. */
1739 if (!NILP (w->hchild))
1740 dim = allocate_matrices_for_frame_redisplay (w->hchild, x, y, ch_dim,
1741 dim_only_p,
1742 window_change_flags);
1743 else if (!NILP (w->vchild))
1744 dim = allocate_matrices_for_frame_redisplay (w->vchild, x, y, ch_dim,
1745 dim_only_p,
1746 window_change_flags);
1747 else
1748 {
1749 /* If not already done, allocate sub-matrix structures. */
1750 if (w->desired_matrix == NULL)
1751 {
1752 w->desired_matrix = new_glyph_matrix (f->desired_pool);
1753 w->current_matrix = new_glyph_matrix (f->current_pool);
1754 *window_change_flags |= NEW_LEAF_MATRIX;
1755 }
1756
1757 /* Width and height MUST be chosen so that there are no
1758 holes in the frame matrix. */
1759 dim.width = XINT (w->width);
1760 dim.height = XINT (w->height);
1761
1762 /* Will matrix be re-allocated? */
1763 if (x != w->desired_matrix->matrix_x
1764 || y != w->desired_matrix->matrix_y
1765 || dim.width != w->desired_matrix->matrix_w
1766 || dim.height != w->desired_matrix->matrix_h
1767 || (margin_glyphs_to_reserve (w, dim.width,
1768 w->right_margin_width)
1769 != w->desired_matrix->left_margin_glyphs)
1770 || (margin_glyphs_to_reserve (w, dim.width,
1771 w->left_margin_width)
1772 != w->desired_matrix->right_margin_glyphs))
1773 *window_change_flags |= CHANGED_LEAF_MATRIX;
1774
1775 /* Actually change matrices, if allowed. Do not consider
1776 CHANGED_LEAF_MATRIX computed above here because the pool
1777 may have been changed which we don't now here. We trust
1778 that we only will be called with DIM_ONLY_P != 0 when
1779 necessary. */
1780 if (!dim_only_p)
1781 {
1782 adjust_glyph_matrix (w, w->desired_matrix, x, y, dim);
1783 adjust_glyph_matrix (w, w->current_matrix, x, y, dim);
1784 }
1785 }
1786
1787 /* If we are part of a horizontal combination, advance x for
1788 windows to the right of W; otherwise advance y for windows
1789 below W. */
1790 if (in_horz_combination_p)
1791 x += dim.width;
1792 else
1793 y += dim.height;
1794
1795 /* Remember maximum glyph matrix dimensions. */
1796 wmax = max (wmax, dim.width);
1797 hmax = max (hmax, dim.height);
1798
1799 /* Next window on same level. */
1800 window = w->next;
1801 }
1802 while (!NILP (window));
1803
1804 /* Set `total' to the total glyph matrix dimension of this window
1805 level. In a vertical combination, the width is the width of the
1806 widest window; the height is the y we finally reached, corrected
1807 by the y we started with. In a horizontal combination, the total
1808 height is the height of the tallest window, and the width is the
1809 x we finally reached, corrected by the x we started with. */
1810 if (in_horz_combination_p)
1811 {
1812 total.width = x - x0;
1813 total.height = hmax;
1814 }
1815 else
1816 {
1817 total.width = wmax;
1818 total.height = y - y0;
1819 }
1820
1821 return total;
1822 }
1823
1824
1825 /* Allocate window matrices for window-based redisplay. W is the
1826 window whose matrices must be allocated/reallocated. CH_DIM is the
1827 size of the smallest character that could potentially be used on W. */
1828
1829 static void
1830 allocate_matrices_for_window_redisplay (w, ch_dim)
1831 struct window *w;
1832 struct dim ch_dim;
1833 {
1834 struct frame *f = XFRAME (w->frame);
1835
1836 while (w)
1837 {
1838 if (!NILP (w->vchild))
1839 allocate_matrices_for_window_redisplay (XWINDOW (w->vchild), ch_dim);
1840 else if (!NILP (w->hchild))
1841 allocate_matrices_for_window_redisplay (XWINDOW (w->hchild), ch_dim);
1842 else
1843 {
1844 /* W is a leaf window. */
1845 int window_pixel_width = XFLOATINT (w->width) * CANON_X_UNIT (f);
1846 int window_pixel_height = window_box_height (w) + abs (w->vscroll);
1847 struct dim dim;
1848
1849 /* If matrices are not yet allocated, allocate them now. */
1850 if (w->desired_matrix == NULL)
1851 {
1852 w->desired_matrix = new_glyph_matrix (NULL);
1853 w->current_matrix = new_glyph_matrix (NULL);
1854 }
1855
1856 /* Compute number of glyphs needed in a glyph row. */
1857 dim.width = (((window_pixel_width + ch_dim.width - 1)
1858 / ch_dim.width)
1859 /* 2 partially visible columns in the text area. */
1860 + 2
1861 /* One partially visible column at the right
1862 edge of each marginal area. */
1863 + 1 + 1);
1864
1865 /* Compute number of glyph rows needed. */
1866 dim.height = (((window_pixel_height + ch_dim.height - 1)
1867 / ch_dim.height)
1868 /* One partially visible line at the top and
1869 bottom of the window. */
1870 + 2
1871 /* 2 for top and mode line. */
1872 + 2);
1873
1874 /* Change matrices. */
1875 adjust_glyph_matrix (w, w->desired_matrix, 0, 0, dim);
1876 adjust_glyph_matrix (w, w->current_matrix, 0, 0, dim);
1877 }
1878
1879 w = NILP (w->next) ? NULL : XWINDOW (w->next);
1880 }
1881 }
1882
1883
1884 /* Re-allocate/ re-compute glyph matrices on frame F. If F is null,
1885 do it for all frames; otherwise do it just for the given frame.
1886 This function must be called when a new frame is created, its size
1887 changes, or its window configuration changes. */
1888
1889 void
1890 adjust_glyphs (f)
1891 struct frame *f;
1892 {
1893 /* Block input so that expose events and other events that access
1894 glyph matrices are not processed while we are changing them. */
1895 BLOCK_INPUT;
1896
1897 if (f)
1898 adjust_frame_glyphs (f);
1899 else
1900 {
1901 Lisp_Object tail, lisp_frame;
1902
1903 FOR_EACH_FRAME (tail, lisp_frame)
1904 adjust_frame_glyphs (XFRAME (lisp_frame));
1905 }
1906
1907 UNBLOCK_INPUT;
1908 }
1909
1910
1911 /* Adjust frame glyphs when Emacs is initialized.
1912
1913 To be called from init_display.
1914
1915 We need a glyph matrix because redraw will happen soon.
1916 Unfortunately, window sizes on selected_frame are not yet set to
1917 meaningful values. I believe we can assume that there are only two
1918 windows on the frame---the mini-buffer and the root window. Frame
1919 height and width seem to be correct so far. So, set the sizes of
1920 windows to estimated values. */
1921
1922 static void
1923 adjust_frame_glyphs_initially ()
1924 {
1925 struct frame *sf = SELECTED_FRAME ();
1926 struct window *root = XWINDOW (sf->root_window);
1927 struct window *mini = XWINDOW (root->next);
1928 int frame_height = FRAME_HEIGHT (sf);
1929 int frame_width = FRAME_WIDTH (sf);
1930 int top_margin = FRAME_TOP_MARGIN (sf);
1931
1932 /* Do it for the root window. */
1933 XSETFASTINT (root->top, top_margin);
1934 XSETFASTINT (root->width, frame_width);
1935 set_window_height (sf->root_window, frame_height - 1 - top_margin, 0);
1936
1937 /* Do it for the mini-buffer window. */
1938 XSETFASTINT (mini->top, frame_height - 1);
1939 XSETFASTINT (mini->width, frame_width);
1940 set_window_height (root->next, 1, 0);
1941
1942 adjust_frame_glyphs (sf);
1943 glyphs_initialized_initially_p = 1;
1944 }
1945
1946
1947 /* Allocate/reallocate glyph matrices of a single frame F. */
1948
1949 static void
1950 adjust_frame_glyphs (f)
1951 struct frame *f;
1952 {
1953 if (FRAME_WINDOW_P (f))
1954 adjust_frame_glyphs_for_window_redisplay (f);
1955 else
1956 adjust_frame_glyphs_for_frame_redisplay (f);
1957
1958 /* Don't forget the message buffer and the buffer for
1959 decode_mode_spec. */
1960 adjust_frame_message_buffer (f);
1961 adjust_decode_mode_spec_buffer (f);
1962
1963 f->glyphs_initialized_p = 1;
1964 }
1965
1966
1967 /* Allocate/reallocate glyph matrices of a single frame F for
1968 frame-based redisplay. */
1969
1970 static void
1971 adjust_frame_glyphs_for_frame_redisplay (f)
1972 struct frame *f;
1973 {
1974 struct dim ch_dim;
1975 struct dim matrix_dim;
1976 int pool_changed_p;
1977 int window_change_flags;
1978 int top_window_y;
1979
1980 if (!FRAME_LIVE_P (f))
1981 return;
1982
1983 /* Determine the smallest character in any font for F. On
1984 console windows, all characters have dimension (1, 1). */
1985 ch_dim.width = ch_dim.height = 1;
1986
1987 top_window_y = FRAME_TOP_MARGIN (f);
1988
1989 /* Allocate glyph pool structures if not already done. */
1990 if (f->desired_pool == NULL)
1991 {
1992 f->desired_pool = new_glyph_pool ();
1993 f->current_pool = new_glyph_pool ();
1994 }
1995
1996 /* Allocate frames matrix structures if needed. */
1997 if (f->desired_matrix == NULL)
1998 {
1999 f->desired_matrix = new_glyph_matrix (f->desired_pool);
2000 f->current_matrix = new_glyph_matrix (f->current_pool);
2001 }
2002
2003 /* Compute window glyph matrices. (This takes the mini-buffer
2004 window into account). The result is the size of the frame glyph
2005 matrix needed. The variable window_change_flags is set to a bit
2006 mask indicating whether new matrices will be allocated or
2007 existing matrices change their size or location within the frame
2008 matrix. */
2009 window_change_flags = 0;
2010 matrix_dim
2011 = allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f),
2012 0, top_window_y,
2013 ch_dim, 1,
2014 &window_change_flags);
2015
2016 /* Add in menu bar lines, if any. */
2017 matrix_dim.height += top_window_y;
2018
2019 /* Enlarge pools as necessary. */
2020 pool_changed_p = realloc_glyph_pool (f->desired_pool, matrix_dim);
2021 realloc_glyph_pool (f->current_pool, matrix_dim);
2022
2023 /* Set up glyph pointers within window matrices. Do this only if
2024 absolutely necessary since it requires a frame redraw. */
2025 if (pool_changed_p || window_change_flags)
2026 {
2027 /* Do it for window matrices. */
2028 allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f),
2029 0, top_window_y, ch_dim, 0,
2030 &window_change_flags);
2031
2032 /* Size of frame matrices must equal size of frame. Note
2033 that we are called for X frames with window widths NOT equal
2034 to the frame width (from CHANGE_FRAME_SIZE_1). */
2035 xassert (matrix_dim.width == FRAME_WIDTH (f)
2036 && matrix_dim.height == FRAME_HEIGHT (f));
2037
2038 /* Resize frame matrices. */
2039 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim);
2040 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim);
2041
2042 /* Since location and size of sub-matrices within the pool may
2043 have changed, and current matrices don't have meaningful
2044 contents anymore, mark the frame garbaged. */
2045 SET_FRAME_GARBAGED (f);
2046 }
2047 }
2048
2049
2050 /* Allocate/reallocate glyph matrices of a single frame F for
2051 window-based redisplay. */
2052
2053 static void
2054 adjust_frame_glyphs_for_window_redisplay (f)
2055 struct frame *f;
2056 {
2057 struct dim ch_dim;
2058 struct window *w;
2059
2060 xassert (FRAME_WINDOW_P (f) && FRAME_LIVE_P (f));
2061
2062 /* Get minimum sizes. */
2063 #ifdef HAVE_WINDOW_SYSTEM
2064 ch_dim.width = FRAME_SMALLEST_CHAR_WIDTH (f);
2065 ch_dim.height = FRAME_SMALLEST_FONT_HEIGHT (f);
2066 #else
2067 ch_dim.width = ch_dim.height = 1;
2068 #endif
2069
2070 /* Allocate/reallocate window matrices. */
2071 allocate_matrices_for_window_redisplay (XWINDOW (FRAME_ROOT_WINDOW (f)),
2072 ch_dim);
2073
2074 /* Allocate/ reallocate matrices of the dummy window used to display
2075 the menu bar under X when no X toolkit support is available. */
2076 #ifndef USE_X_TOOLKIT
2077 {
2078 /* Allocate a dummy window if not already done. */
2079 if (NILP (f->menu_bar_window))
2080 {
2081 f->menu_bar_window = make_window ();
2082 w = XWINDOW (f->menu_bar_window);
2083 XSETFRAME (w->frame, f);
2084 w->pseudo_window_p = 1;
2085 }
2086 else
2087 w = XWINDOW (f->menu_bar_window);
2088
2089 /* Set window dimensions to frame dimensions and allocate or
2090 adjust glyph matrices of W. */
2091 XSETFASTINT (w->top, 0);
2092 XSETFASTINT (w->left, 0);
2093 XSETFASTINT (w->height, FRAME_MENU_BAR_LINES (f));
2094 XSETFASTINT (w->width, FRAME_WINDOW_WIDTH (f));
2095 allocate_matrices_for_window_redisplay (w, ch_dim);
2096 }
2097 #endif /* not USE_X_TOOLKIT */
2098
2099 /* Allocate/ reallocate matrices of the tool bar window. If we
2100 don't have a tool bar window yet, make one. */
2101 if (NILP (f->tool_bar_window))
2102 {
2103 f->tool_bar_window = make_window ();
2104 w = XWINDOW (f->tool_bar_window);
2105 XSETFRAME (w->frame, f);
2106 w->pseudo_window_p = 1;
2107 }
2108 else
2109 w = XWINDOW (f->tool_bar_window);
2110
2111 XSETFASTINT (w->top, FRAME_MENU_BAR_LINES (f));
2112 XSETFASTINT (w->left, 0);
2113 XSETFASTINT (w->height, FRAME_TOOL_BAR_LINES (f));
2114 XSETFASTINT (w->width, FRAME_WINDOW_WIDTH (f));
2115 allocate_matrices_for_window_redisplay (w, ch_dim);
2116 }
2117
2118
2119 /* Adjust/ allocate message buffer of frame F.
2120
2121 Note that the message buffer is never freed. Since I could not
2122 find a free in 19.34, I assume that freeing it would be
2123 problematic in some way and don't do it either.
2124
2125 (Implementation note: It should be checked if we can free it
2126 eventually without causing trouble). */
2127
2128 static void
2129 adjust_frame_message_buffer (f)
2130 struct frame *f;
2131 {
2132 int size = FRAME_MESSAGE_BUF_SIZE (f) + 1;
2133
2134 if (FRAME_MESSAGE_BUF (f))
2135 {
2136 char *buffer = FRAME_MESSAGE_BUF (f);
2137 char *new_buffer = (char *) xrealloc (buffer, size);
2138 FRAME_MESSAGE_BUF (f) = new_buffer;
2139 }
2140 else
2141 FRAME_MESSAGE_BUF (f) = (char *) xmalloc (size);
2142 }
2143
2144
2145 /* Re-allocate buffer for decode_mode_spec on frame F. */
2146
2147 static void
2148 adjust_decode_mode_spec_buffer (f)
2149 struct frame *f;
2150 {
2151 f->decode_mode_spec_buffer
2152 = (char *) xrealloc (f->decode_mode_spec_buffer,
2153 FRAME_MESSAGE_BUF_SIZE (f) + 1);
2154 }
2155
2156
2157 \f
2158 /**********************************************************************
2159 Freeing Glyph Matrices
2160 **********************************************************************/
2161
2162 /* Free glyph memory for a frame F. F may be null. This function can
2163 be called for the same frame more than once. The root window of
2164 F may be nil when this function is called. This is the case when
2165 the function is called when F is destroyed. */
2166
2167 void
2168 free_glyphs (f)
2169 struct frame *f;
2170 {
2171 if (f && f->glyphs_initialized_p)
2172 {
2173 /* Block interrupt input so that we don't get surprised by an X
2174 event while we're in an inconsistent state. */
2175 BLOCK_INPUT;
2176 f->glyphs_initialized_p = 0;
2177
2178 /* Release window sub-matrices. */
2179 if (!NILP (f->root_window))
2180 free_window_matrices (XWINDOW (f->root_window));
2181
2182 /* Free the dummy window for menu bars without X toolkit and its
2183 glyph matrices. */
2184 if (!NILP (f->menu_bar_window))
2185 {
2186 struct window *w = XWINDOW (f->menu_bar_window);
2187 free_glyph_matrix (w->desired_matrix);
2188 free_glyph_matrix (w->current_matrix);
2189 w->desired_matrix = w->current_matrix = NULL;
2190 f->menu_bar_window = Qnil;
2191 }
2192
2193 /* Free the tool bar window and its glyph matrices. */
2194 if (!NILP (f->tool_bar_window))
2195 {
2196 struct window *w = XWINDOW (f->tool_bar_window);
2197 free_glyph_matrix (w->desired_matrix);
2198 free_glyph_matrix (w->current_matrix);
2199 w->desired_matrix = w->current_matrix = NULL;
2200 f->tool_bar_window = Qnil;
2201 }
2202
2203 /* Release frame glyph matrices. Reset fields to zero in
2204 case we are called a second time. */
2205 if (f->desired_matrix)
2206 {
2207 free_glyph_matrix (f->desired_matrix);
2208 free_glyph_matrix (f->current_matrix);
2209 f->desired_matrix = f->current_matrix = NULL;
2210 }
2211
2212 /* Release glyph pools. */
2213 if (f->desired_pool)
2214 {
2215 free_glyph_pool (f->desired_pool);
2216 free_glyph_pool (f->current_pool);
2217 f->desired_pool = f->current_pool = NULL;
2218 }
2219
2220 UNBLOCK_INPUT;
2221 }
2222 }
2223
2224
2225 /* Free glyph sub-matrices in the window tree rooted at W. This
2226 function may be called with a null pointer, and it may be called on
2227 the same tree more than once. */
2228
2229 void
2230 free_window_matrices (w)
2231 struct window *w;
2232 {
2233 while (w)
2234 {
2235 if (!NILP (w->hchild))
2236 free_window_matrices (XWINDOW (w->hchild));
2237 else if (!NILP (w->vchild))
2238 free_window_matrices (XWINDOW (w->vchild));
2239 else
2240 {
2241 /* This is a leaf window. Free its memory and reset fields
2242 to zero in case this function is called a second time for
2243 W. */
2244 free_glyph_matrix (w->current_matrix);
2245 free_glyph_matrix (w->desired_matrix);
2246 w->current_matrix = w->desired_matrix = NULL;
2247 }
2248
2249 /* Next window on same level. */
2250 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2251 }
2252 }
2253
2254
2255 /* Check glyph memory leaks. This function is called from
2256 shut_down_emacs. Note that frames are not destroyed when Emacs
2257 exits. We therefore free all glyph memory for all active frames
2258 explicitly and check that nothing is left allocated. */
2259
2260 void
2261 check_glyph_memory ()
2262 {
2263 Lisp_Object tail, frame;
2264
2265 /* Free glyph memory for all frames. */
2266 FOR_EACH_FRAME (tail, frame)
2267 free_glyphs (XFRAME (frame));
2268
2269 /* Check that nothing is left allocated. */
2270 if (glyph_matrix_count)
2271 abort ();
2272 if (glyph_pool_count)
2273 abort ();
2274 }
2275
2276
2277 \f
2278 /**********************************************************************
2279 Building a Frame Matrix
2280 **********************************************************************/
2281
2282 /* Most of the redisplay code works on glyph matrices attached to
2283 windows. This is a good solution most of the time, but it is not
2284 suitable for terminal code. Terminal output functions cannot rely
2285 on being able to set an arbitrary terminal window. Instead they
2286 must be provided with a view of the whole frame, i.e. the whole
2287 screen. We build such a view by constructing a frame matrix from
2288 window matrices in this section.
2289
2290 Windows that must be updated have their must_be_update_p flag set.
2291 For all such windows, their desired matrix is made part of the
2292 desired frame matrix. For other windows, their current matrix is
2293 made part of the desired frame matrix.
2294
2295 +-----------------+----------------+
2296 | desired | desired |
2297 | | |
2298 +-----------------+----------------+
2299 | current |
2300 | |
2301 +----------------------------------+
2302
2303 Desired window matrices can be made part of the frame matrix in a
2304 cheap way: We exploit the fact that the desired frame matrix and
2305 desired window matrices share their glyph memory. This is not
2306 possible for current window matrices. Their glyphs are copied to
2307 the desired frame matrix. The latter is equivalent to
2308 preserve_other_columns in the old redisplay.
2309
2310 Used glyphs counters for frame matrix rows are the result of adding
2311 up glyph lengths of the window matrices. A line in the frame
2312 matrix is enabled, if a corresponding line in a window matrix is
2313 enabled.
2314
2315 After building the desired frame matrix, it will be passed to
2316 terminal code, which will manipulate both the desired and current
2317 frame matrix. Changes applied to the frame's current matrix have
2318 to be visible in current window matrices afterwards, of course.
2319
2320 This problem is solved like this:
2321
2322 1. Window and frame matrices share glyphs. Window matrices are
2323 constructed in a way that their glyph contents ARE the glyph
2324 contents needed in a frame matrix. Thus, any modification of
2325 glyphs done in terminal code will be reflected in window matrices
2326 automatically.
2327
2328 2. Exchanges of rows in a frame matrix done by terminal code are
2329 intercepted by hook functions so that corresponding row operations
2330 on window matrices can be performed. This is necessary because we
2331 use pointers to glyphs in glyph row structures. To satisfy the
2332 assumption of point 1 above that glyphs are updated implicitly in
2333 window matrices when they are manipulated via the frame matrix,
2334 window and frame matrix must of course agree where to find the
2335 glyphs for their rows. Possible manipulations that must be
2336 mirrored are assignments of rows of the desired frame matrix to the
2337 current frame matrix and scrolling the current frame matrix. */
2338
2339 /* Build frame F's desired matrix from window matrices. Only windows
2340 which have the flag must_be_updated_p set have to be updated. Menu
2341 bar lines of a frame are not covered by window matrices, so make
2342 sure not to touch them in this function. */
2343
2344 static void
2345 build_frame_matrix (f)
2346 struct frame *f;
2347 {
2348 int i;
2349
2350 /* F must have a frame matrix when this function is called. */
2351 xassert (!FRAME_WINDOW_P (f));
2352
2353 /* Clear all rows in the frame matrix covered by window matrices.
2354 Menu bar lines are not covered by windows. */
2355 for (i = FRAME_TOP_MARGIN (f); i < f->desired_matrix->nrows; ++i)
2356 clear_glyph_row (MATRIX_ROW (f->desired_matrix, i));
2357
2358 /* Build the matrix by walking the window tree. */
2359 build_frame_matrix_from_window_tree (f->desired_matrix,
2360 XWINDOW (FRAME_ROOT_WINDOW (f)));
2361 }
2362
2363
2364 /* Walk a window tree, building a frame matrix MATRIX from window
2365 matrices. W is the root of a window tree. */
2366
2367 static void
2368 build_frame_matrix_from_window_tree (matrix, w)
2369 struct glyph_matrix *matrix;
2370 struct window *w;
2371 {
2372 while (w)
2373 {
2374 if (!NILP (w->hchild))
2375 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->hchild));
2376 else if (!NILP (w->vchild))
2377 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->vchild));
2378 else
2379 build_frame_matrix_from_leaf_window (matrix, w);
2380
2381 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2382 }
2383 }
2384
2385
2386 /* Add a window's matrix to a frame matrix. FRAME_MATRIX is the
2387 desired frame matrix built. W is a leaf window whose desired or
2388 current matrix is to be added to FRAME_MATRIX. W's flag
2389 must_be_updated_p determines which matrix it contributes to
2390 FRAME_MATRIX. If must_be_updated_p is non-zero, W's desired matrix
2391 is added to FRAME_MATRIX, otherwise W's current matrix is added.
2392 Adding a desired matrix means setting up used counters and such in
2393 frame rows, while adding a current window matrix to FRAME_MATRIX
2394 means copying glyphs. The latter case corresponds to
2395 preserve_other_columns in the old redisplay. */
2396
2397 static void
2398 build_frame_matrix_from_leaf_window (frame_matrix, w)
2399 struct glyph_matrix *frame_matrix;
2400 struct window *w;
2401 {
2402 struct glyph_matrix *window_matrix;
2403 int window_y, frame_y;
2404 /* If non-zero, a glyph to insert at the right border of W. */
2405 GLYPH right_border_glyph = 0;
2406
2407 /* Set window_matrix to the matrix we have to add to FRAME_MATRIX. */
2408 if (w->must_be_updated_p)
2409 {
2410 window_matrix = w->desired_matrix;
2411
2412 /* Decide whether we want to add a vertical border glyph. */
2413 if (!WINDOW_RIGHTMOST_P (w))
2414 {
2415 struct Lisp_Char_Table *dp = window_display_table (w);
2416 right_border_glyph = (dp && INTEGERP (DISP_BORDER_GLYPH (dp))
2417 ? XINT (DISP_BORDER_GLYPH (dp))
2418 : '|');
2419 }
2420 }
2421 else
2422 window_matrix = w->current_matrix;
2423
2424 /* For all rows in the window matrix and corresponding rows in the
2425 frame matrix. */
2426 window_y = 0;
2427 frame_y = window_matrix->matrix_y;
2428 while (window_y < window_matrix->nrows)
2429 {
2430 struct glyph_row *frame_row = frame_matrix->rows + frame_y;
2431 struct glyph_row *window_row = window_matrix->rows + window_y;
2432
2433 /* Fill up the frame row with spaces up to the left margin of the
2434 window row. */
2435 fill_up_frame_row_with_spaces (frame_row, window_matrix->matrix_x);
2436
2437 /* Fill up areas in the window matrix row with spaces. */
2438 fill_up_glyph_row_with_spaces (window_row);
2439
2440 if (window_matrix == w->current_matrix)
2441 {
2442 /* We have to copy W's current matrix. Copy window
2443 row to frame row. */
2444 bcopy (window_row->glyphs[0],
2445 frame_row->glyphs[TEXT_AREA] + window_matrix->matrix_x,
2446 window_matrix->matrix_w * sizeof (struct glyph));
2447 }
2448 else
2449 {
2450 /* Copy W's desired matrix. */
2451
2452 /* Maybe insert a vertical border between horizontally adjacent
2453 windows. */
2454 if (right_border_glyph)
2455 {
2456 struct glyph *border = window_row->glyphs[LAST_AREA] - 1;
2457 SET_CHAR_GLYPH_FROM_GLYPH (*border, right_border_glyph);
2458 }
2459
2460 #if 0 /* This shouldn't be necessary. Let's check it. */
2461 /* Due to hooks installed, it normally doesn't happen that
2462 window rows and frame rows of the same matrix are out of
2463 sync, i.e. have a different understanding of where to
2464 find glyphs for the row. The following is a safety-belt
2465 that doesn't cost much and makes absolutely sure that
2466 window and frame matrices are in sync. */
2467 if (!glyph_row_slice_p (window_row, frame_row))
2468 {
2469 /* Find the row in the window being a slice. There
2470 should exist one from program logic. */
2471 struct glyph_row *slice_row
2472 = find_glyph_row_slice (window_matrix, frame_matrix, frame_y);
2473 xassert (slice_row != 0);
2474
2475 /* Exchange glyphs between both window rows. */
2476 swap_glyphs_in_rows (window_row, slice_row);
2477
2478 /* Exchange pointers between both rows. */
2479 swap_glyph_pointers (window_row, slice_row);
2480 }
2481 #endif
2482
2483 /* Window row window_y must be a slice of frame row
2484 frame_y. */
2485 xassert (glyph_row_slice_p (window_row, frame_row));
2486
2487 /* If rows are in sync, we don't have to copy glyphs because
2488 frame and window share glyphs. */
2489
2490 #if GLYPH_DEBUG
2491 strcpy (w->current_matrix->method, w->desired_matrix->method);
2492 #endif
2493 }
2494
2495 /* Set number of used glyphs in the frame matrix. Since we fill
2496 up with spaces, and visit leaf windows from left to right it
2497 can be done simply. */
2498 frame_row->used[TEXT_AREA]
2499 = window_matrix->matrix_x + window_matrix->matrix_w;
2500
2501 /* Or in flags. */
2502 frame_row->enabled_p |= window_row->enabled_p;
2503 frame_row->inverse_p |= window_row->inverse_p;
2504
2505 /* Next row. */
2506 ++window_y;
2507 ++frame_y;
2508 }
2509 }
2510
2511
2512 /* Add spaces to a glyph row ROW in a window matrix.
2513
2514 Each row has the form:
2515
2516 +---------+-----------------------------+------------+
2517 | left | text | right |
2518 +---------+-----------------------------+------------+
2519
2520 Left and right marginal areas are optional. This function adds
2521 spaces to areas so that there are no empty holes between areas.
2522 In other words: If the right area is not empty, the text area
2523 is filled up with spaces up to the right area. If the text area
2524 is not empty, the left area is filled up.
2525
2526 To be called for frame-based redisplay, only. */
2527
2528 static void
2529 fill_up_glyph_row_with_spaces (row)
2530 struct glyph_row *row;
2531 {
2532 fill_up_glyph_row_area_with_spaces (row, LEFT_MARGIN_AREA);
2533 fill_up_glyph_row_area_with_spaces (row, TEXT_AREA);
2534 fill_up_glyph_row_area_with_spaces (row, RIGHT_MARGIN_AREA);
2535 }
2536
2537
2538 /* Fill area AREA of glyph row ROW with spaces. To be called for
2539 frame-based redisplay only. */
2540
2541 static void
2542 fill_up_glyph_row_area_with_spaces (row, area)
2543 struct glyph_row *row;
2544 int area;
2545 {
2546 if (row->glyphs[area] < row->glyphs[area + 1])
2547 {
2548 struct glyph *end = row->glyphs[area + 1];
2549 struct glyph *text = row->glyphs[area] + row->used[area];
2550
2551 while (text < end)
2552 *text++ = space_glyph;
2553 row->used[area] = text - row->glyphs[area];
2554 }
2555 }
2556
2557
2558 /* Add spaces to the end of ROW in a frame matrix until index UPTO is
2559 reached. In frame matrices only one area, TEXT_AREA, is used. */
2560
2561 static void
2562 fill_up_frame_row_with_spaces (row, upto)
2563 struct glyph_row *row;
2564 int upto;
2565 {
2566 int i = row->used[TEXT_AREA];
2567 struct glyph *glyph = row->glyphs[TEXT_AREA];
2568
2569 while (i < upto)
2570 glyph[i++] = space_glyph;
2571
2572 row->used[TEXT_AREA] = i;
2573 }
2574
2575
2576 \f
2577 /**********************************************************************
2578 Mirroring operations on frame matrices in window matrices
2579 **********************************************************************/
2580
2581 /* Set frame being updated via frame-based redisplay to F. This
2582 function must be called before updates to make explicit that we are
2583 working on frame matrices or not. */
2584
2585 static INLINE void
2586 set_frame_matrix_frame (f)
2587 struct frame *f;
2588 {
2589 frame_matrix_frame = f;
2590 }
2591
2592
2593 /* Make sure glyph row ROW in CURRENT_MATRIX is up to date.
2594 DESIRED_MATRIX is the desired matrix corresponding to
2595 CURRENT_MATRIX. The update is done by exchanging glyph pointers
2596 between rows in CURRENT_MATRIX and DESIRED_MATRIX. If
2597 frame_matrix_frame is non-null, this indicates that the exchange is
2598 done in frame matrices, and that we have to perform analogous
2599 operations in window matrices of frame_matrix_frame. */
2600
2601 static INLINE void
2602 make_current (desired_matrix, current_matrix, row)
2603 struct glyph_matrix *desired_matrix, *current_matrix;
2604 int row;
2605 {
2606 struct glyph_row *current_row = MATRIX_ROW (current_matrix, row);
2607 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, row);
2608
2609 /* Do current_row = desired_row. This exchanges glyph pointers
2610 between both rows, and does a structure assignment otherwise. */
2611 assign_row (current_row, desired_row);
2612
2613 /* Enable current_row to mark it as valid. */
2614 current_row->enabled_p = 1;
2615
2616 /* If we are called on frame matrices, perform analogous operations
2617 for window matrices. */
2618 if (frame_matrix_frame)
2619 mirror_make_current (XWINDOW (frame_matrix_frame->root_window), row);
2620 }
2621
2622
2623 /* W is the root of a window tree. FRAME_ROW is the index of a row in
2624 W's frame which has been made current (by swapping pointers between
2625 current and desired matrix). Perform analogous operations in the
2626 matrices of leaf windows in the window tree rooted at W. */
2627
2628 static void
2629 mirror_make_current (w, frame_row)
2630 struct window *w;
2631 int frame_row;
2632 {
2633 while (w)
2634 {
2635 if (!NILP (w->hchild))
2636 mirror_make_current (XWINDOW (w->hchild), frame_row);
2637 else if (!NILP (w->vchild))
2638 mirror_make_current (XWINDOW (w->vchild), frame_row);
2639 else
2640 {
2641 /* Row relative to window W. Don't use FRAME_TO_WINDOW_VPOS
2642 here because the checks performed in debug mode there
2643 will not allow the conversion. */
2644 int row = frame_row - w->desired_matrix->matrix_y;
2645
2646 /* If FRAME_ROW is within W, assign the desired row to the
2647 current row (exchanging glyph pointers). */
2648 if (row >= 0 && row < w->desired_matrix->matrix_h)
2649 {
2650 struct glyph_row *current_row
2651 = MATRIX_ROW (w->current_matrix, row);
2652 struct glyph_row *desired_row
2653 = MATRIX_ROW (w->desired_matrix, row);
2654
2655 if (desired_row->enabled_p)
2656 assign_row (current_row, desired_row);
2657 else
2658 swap_glyph_pointers (desired_row, current_row);
2659 current_row->enabled_p = 1;
2660 }
2661 }
2662
2663 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2664 }
2665 }
2666
2667
2668 /* Perform row dance after scrolling. We are working on the range of
2669 lines UNCHANGED_AT_TOP + 1 to UNCHANGED_AT_TOP + NLINES (not
2670 including) in MATRIX. COPY_FROM is a vector containing, for each
2671 row I in the range 0 <= I < NLINES, the index of the original line
2672 to move to I. This index is relative to the row range, i.e. 0 <=
2673 index < NLINES. RETAINED_P is a vector containing zero for each
2674 row 0 <= I < NLINES which is empty.
2675
2676 This function is called from do_scrolling and do_direct_scrolling. */
2677
2678 void
2679 mirrored_line_dance (matrix, unchanged_at_top, nlines, copy_from,
2680 retained_p)
2681 struct glyph_matrix *matrix;
2682 int unchanged_at_top, nlines;
2683 int *copy_from;
2684 char *retained_p;
2685 {
2686 /* A copy of original rows. */
2687 struct glyph_row *old_rows;
2688
2689 /* Rows to assign to. */
2690 struct glyph_row *new_rows = MATRIX_ROW (matrix, unchanged_at_top);
2691
2692 int i;
2693
2694 /* Make a copy of the original rows. */
2695 old_rows = (struct glyph_row *) alloca (nlines * sizeof *old_rows);
2696 bcopy (new_rows, old_rows, nlines * sizeof *old_rows);
2697
2698 /* Assign new rows, maybe clear lines. */
2699 for (i = 0; i < nlines; ++i)
2700 {
2701 int enabled_before_p = new_rows[i].enabled_p;
2702
2703 xassert (i + unchanged_at_top < matrix->nrows);
2704 xassert (unchanged_at_top + copy_from[i] < matrix->nrows);
2705 new_rows[i] = old_rows[copy_from[i]];
2706 new_rows[i].enabled_p = enabled_before_p;
2707
2708 /* RETAINED_P is zero for empty lines. */
2709 if (!retained_p[copy_from[i]])
2710 new_rows[i].enabled_p = 0;
2711 }
2712
2713 /* Do the same for window matrices, if MATRIX Is a frame matrix. */
2714 if (frame_matrix_frame)
2715 mirror_line_dance (XWINDOW (frame_matrix_frame->root_window),
2716 unchanged_at_top, nlines, copy_from, retained_p);
2717 }
2718
2719
2720 /* Synchronize glyph pointers in the current matrix of window W with
2721 the current frame matrix. W must be full-width, and be on a tty
2722 frame. */
2723
2724 static void
2725 sync_window_with_frame_matrix_rows (w)
2726 struct window *w;
2727 {
2728 struct frame *f = XFRAME (w->frame);
2729 struct glyph_row *window_row, *window_row_end, *frame_row;
2730
2731 /* Preconditions: W must be a leaf window and full-width. Its frame
2732 must have a frame matrix. */
2733 xassert (NILP (w->hchild) && NILP (w->vchild));
2734 xassert (WINDOW_FULL_WIDTH_P (w));
2735 xassert (!FRAME_WINDOW_P (f));
2736
2737 /* If W is a full-width window, glyph pointers in W's current matrix
2738 have, by definition, to be the same as glyph pointers in the
2739 corresponding frame matrix. */
2740 window_row = w->current_matrix->rows;
2741 window_row_end = window_row + w->current_matrix->nrows;
2742 frame_row = f->current_matrix->rows + XFASTINT (w->top);
2743 while (window_row < window_row_end)
2744 {
2745 int area;
2746
2747 for (area = LEFT_MARGIN_AREA; area <= LAST_AREA; ++area)
2748 window_row->glyphs[area] = frame_row->glyphs[area];
2749
2750 ++window_row, ++frame_row;
2751 }
2752 }
2753
2754
2755 /* Return the window in the window tree rooted in W containing frame
2756 row ROW. Value is null if none is found. */
2757
2758 struct window *
2759 frame_row_to_window (w, row)
2760 struct window *w;
2761 int row;
2762 {
2763 struct window *found = NULL;
2764
2765 while (w && !found)
2766 {
2767 if (!NILP (w->hchild))
2768 found = frame_row_to_window (XWINDOW (w->hchild), row);
2769 else if (!NILP (w->vchild))
2770 found = frame_row_to_window (XWINDOW (w->vchild), row);
2771 else if (row >= XFASTINT (w->top)
2772 && row < XFASTINT (w->top) + XFASTINT (w->height))
2773 found = w;
2774
2775 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2776 }
2777
2778 return found;
2779 }
2780
2781
2782 /* Perform a line dance in the window tree rooted at W, after
2783 scrolling a frame matrix in mirrored_line_dance.
2784
2785 We are working on the range of lines UNCHANGED_AT_TOP + 1 to
2786 UNCHANGED_AT_TOP + NLINES (not including) in W's frame matrix.
2787 COPY_FROM is a vector containing, for each row I in the range 0 <=
2788 I < NLINES, the index of the original line to move to I. This
2789 index is relative to the row range, i.e. 0 <= index < NLINES.
2790 RETAINED_P is a vector containing zero for each row 0 <= I < NLINES
2791 which is empty. */
2792
2793 static void
2794 mirror_line_dance (w, unchanged_at_top, nlines, copy_from, retained_p)
2795 struct window *w;
2796 int unchanged_at_top, nlines;
2797 int *copy_from;
2798 char *retained_p;
2799 {
2800 while (w)
2801 {
2802 if (!NILP (w->hchild))
2803 mirror_line_dance (XWINDOW (w->hchild), unchanged_at_top,
2804 nlines, copy_from, retained_p);
2805 else if (!NILP (w->vchild))
2806 mirror_line_dance (XWINDOW (w->vchild), unchanged_at_top,
2807 nlines, copy_from, retained_p);
2808 else
2809 {
2810 /* W is a leaf window, and we are working on its current
2811 matrix m. */
2812 struct glyph_matrix *m = w->current_matrix;
2813 int i, sync_p = 0;
2814 struct glyph_row *old_rows;
2815
2816 /* Make a copy of the original rows of matrix m. */
2817 old_rows = (struct glyph_row *) alloca (m->nrows * sizeof *old_rows);
2818 bcopy (m->rows, old_rows, m->nrows * sizeof *old_rows);
2819
2820 for (i = 0; i < nlines; ++i)
2821 {
2822 /* Frame relative line assigned to. */
2823 int frame_to = i + unchanged_at_top;
2824
2825 /* Frame relative line assigned. */
2826 int frame_from = copy_from[i] + unchanged_at_top;
2827
2828 /* Window relative line assigned to. */
2829 int window_to = frame_to - m->matrix_y;
2830
2831 /* Window relative line assigned. */
2832 int window_from = frame_from - m->matrix_y;
2833
2834 /* Is assigned line inside window? */
2835 int from_inside_window_p
2836 = window_from >= 0 && window_from < m->matrix_h;
2837
2838 /* Is assigned to line inside window? */
2839 int to_inside_window_p
2840 = window_to >= 0 && window_to < m->matrix_h;
2841
2842 if (from_inside_window_p && to_inside_window_p)
2843 {
2844 /* Enabled setting before assignment. */
2845 int enabled_before_p;
2846
2847 /* Do the assignment. The enabled_p flag is saved
2848 over the assignment because the old redisplay did
2849 that. */
2850 enabled_before_p = m->rows[window_to].enabled_p;
2851 m->rows[window_to] = old_rows[window_from];
2852 m->rows[window_to].enabled_p = enabled_before_p;
2853
2854 /* If frame line is empty, window line is empty, too. */
2855 if (!retained_p[copy_from[i]])
2856 m->rows[window_to].enabled_p = 0;
2857 }
2858 else if (to_inside_window_p)
2859 {
2860 /* A copy between windows. This is an infrequent
2861 case not worth optimizing. */
2862 struct frame *f = XFRAME (w->frame);
2863 struct window *root = XWINDOW (FRAME_ROOT_WINDOW (f));
2864 struct window *w2;
2865 struct glyph_matrix *m2;
2866 int m2_from;
2867
2868 w2 = frame_row_to_window (root, frame_to);
2869 m2 = w2->current_matrix;
2870 m2_from = frame_from - m2->matrix_y;
2871 copy_row_except_pointers (m->rows + window_to,
2872 m2->rows + m2_from);
2873
2874 /* If frame line is empty, window line is empty, too. */
2875 if (!retained_p[copy_from[i]])
2876 m->rows[window_to].enabled_p = 0;
2877 sync_p = 1;
2878 }
2879 else if (from_inside_window_p)
2880 sync_p = 1;
2881 }
2882
2883 /* If there was a copy between windows, make sure glyph
2884 pointers are in sync with the frame matrix. */
2885 if (sync_p)
2886 sync_window_with_frame_matrix_rows (w);
2887
2888 /* Check that no pointers are lost. */
2889 CHECK_MATRIX (m);
2890 }
2891
2892 /* Next window on same level. */
2893 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2894 }
2895 }
2896
2897
2898 #if GLYPH_DEBUG
2899
2900 /* Check that window and frame matrices agree about their
2901 understanding where glyphs of the rows are to find. For each
2902 window in the window tree rooted at W, check that rows in the
2903 matrices of leaf window agree with their frame matrices about
2904 glyph pointers. */
2905
2906 void
2907 check_window_matrix_pointers (w)
2908 struct window *w;
2909 {
2910 while (w)
2911 {
2912 if (!NILP (w->hchild))
2913 check_window_matrix_pointers (XWINDOW (w->hchild));
2914 else if (!NILP (w->vchild))
2915 check_window_matrix_pointers (XWINDOW (w->vchild));
2916 else
2917 {
2918 struct frame *f = XFRAME (w->frame);
2919 check_matrix_pointers (w->desired_matrix, f->desired_matrix);
2920 check_matrix_pointers (w->current_matrix, f->current_matrix);
2921 }
2922
2923 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2924 }
2925 }
2926
2927
2928 /* Check that window rows are slices of frame rows. WINDOW_MATRIX is
2929 a window and FRAME_MATRIX is the corresponding frame matrix. For
2930 each row in WINDOW_MATRIX check that it's a slice of the
2931 corresponding frame row. If it isn't, abort. */
2932
2933 static void
2934 check_matrix_pointers (window_matrix, frame_matrix)
2935 struct glyph_matrix *window_matrix, *frame_matrix;
2936 {
2937 /* Row number in WINDOW_MATRIX. */
2938 int i = 0;
2939
2940 /* Row number corresponding to I in FRAME_MATRIX. */
2941 int j = window_matrix->matrix_y;
2942
2943 /* For all rows check that the row in the window matrix is a
2944 slice of the row in the frame matrix. If it isn't we didn't
2945 mirror an operation on the frame matrix correctly. */
2946 while (i < window_matrix->nrows)
2947 {
2948 if (!glyph_row_slice_p (window_matrix->rows + i,
2949 frame_matrix->rows + j))
2950 abort ();
2951 ++i, ++j;
2952 }
2953 }
2954
2955 #endif /* GLYPH_DEBUG != 0 */
2956
2957
2958 \f
2959 /**********************************************************************
2960 VPOS and HPOS translations
2961 **********************************************************************/
2962
2963 #if GLYPH_DEBUG
2964
2965 /* Translate vertical position VPOS which is relative to window W to a
2966 vertical position relative to W's frame. */
2967
2968 static int
2969 window_to_frame_vpos (w, vpos)
2970 struct window *w;
2971 int vpos;
2972 {
2973 struct frame *f = XFRAME (w->frame);
2974
2975 xassert (!FRAME_WINDOW_P (f));
2976 xassert (vpos >= 0 && vpos <= w->desired_matrix->nrows);
2977 vpos += XFASTINT (w->top);
2978 xassert (vpos >= 0 && vpos <= FRAME_HEIGHT (f));
2979 return vpos;
2980 }
2981
2982
2983 /* Translate horizontal position HPOS which is relative to window W to
2984 a vertical position relative to W's frame. */
2985
2986 static int
2987 window_to_frame_hpos (w, hpos)
2988 struct window *w;
2989 int hpos;
2990 {
2991 struct frame *f = XFRAME (w->frame);
2992
2993 xassert (!FRAME_WINDOW_P (f));
2994 hpos += XFASTINT (w->left);
2995 return hpos;
2996 }
2997
2998 #endif /* GLYPH_DEBUG */
2999
3000
3001 \f
3002 /**********************************************************************
3003 Redrawing Frames
3004 **********************************************************************/
3005
3006 DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0,
3007 "Clear frame FRAME and output again what is supposed to appear on it.")
3008 (frame)
3009 Lisp_Object frame;
3010 {
3011 struct frame *f;
3012
3013 CHECK_LIVE_FRAME (frame, 0);
3014 f = XFRAME (frame);
3015
3016 /* Ignore redraw requests, if frame has no glyphs yet.
3017 (Implementation note: It still has to be checked why we are
3018 called so early here). */
3019 if (!glyphs_initialized_initially_p)
3020 return Qnil;
3021
3022 update_begin (f);
3023 if (FRAME_MSDOS_P (f))
3024 set_terminal_modes ();
3025 clear_frame ();
3026 clear_current_matrices (f);
3027 update_end (f);
3028 fflush (stdout);
3029 windows_or_buffers_changed++;
3030 /* Mark all windows as inaccurate, so that every window will have
3031 its redisplay done. */
3032 mark_window_display_accurate (FRAME_ROOT_WINDOW (f), 0);
3033 set_window_update_flags (XWINDOW (FRAME_ROOT_WINDOW (f)), 1);
3034 f->garbaged = 0;
3035 return Qnil;
3036 }
3037
3038
3039 /* Redraw frame F. This is nothing more than a call to the Lisp
3040 function redraw-frame. */
3041
3042 void
3043 redraw_frame (f)
3044 struct frame *f;
3045 {
3046 Lisp_Object frame;
3047 XSETFRAME (frame, f);
3048 Fredraw_frame (frame);
3049 }
3050
3051
3052 DEFUN ("redraw-display", Fredraw_display, Sredraw_display, 0, 0, "",
3053 "Clear and redisplay all visible frames.")
3054 ()
3055 {
3056 Lisp_Object tail, frame;
3057
3058 FOR_EACH_FRAME (tail, frame)
3059 if (FRAME_VISIBLE_P (XFRAME (frame)))
3060 Fredraw_frame (frame);
3061
3062 return Qnil;
3063 }
3064
3065
3066 /* This is used when frame_garbaged is set. Call Fredraw_frame on all
3067 visible frames marked as garbaged. */
3068
3069 void
3070 redraw_garbaged_frames ()
3071 {
3072 Lisp_Object tail, frame;
3073
3074 FOR_EACH_FRAME (tail, frame)
3075 if (FRAME_VISIBLE_P (XFRAME (frame))
3076 && FRAME_GARBAGED_P (XFRAME (frame)))
3077 Fredraw_frame (frame);
3078 }
3079
3080
3081 \f
3082 /***********************************************************************
3083 Direct Operations
3084 ***********************************************************************/
3085
3086 /* Try to update display and current glyph matrix directly.
3087
3088 This function is called after a character G has been inserted into
3089 current_buffer. It tries to update the current glyph matrix and
3090 perform appropriate screen output to reflect the insertion. If it
3091 succeeds, the global flag redisplay_performed_directly_p will be
3092 set to 1, and thereby prevent the more costly general redisplay
3093 from running (see redisplay_internal).
3094
3095 This function is not called for `hairy' character insertions.
3096 In particular, it is not called when after or before change
3097 functions exist, like they are used by font-lock. See keyboard.c
3098 for details where this function is called. */
3099
3100 int
3101 direct_output_for_insert (g)
3102 int g;
3103 {
3104 register struct frame *f = SELECTED_FRAME ();
3105 struct window *w = XWINDOW (selected_window);
3106 struct it it, it2;
3107 struct glyph_row *glyph_row;
3108 struct glyph *glyphs, *glyph, *end;
3109 int n;
3110 /* Non-null means that Redisplay of W is based on window matrices. */
3111 int window_redisplay_p = FRAME_WINDOW_P (f);
3112 /* Non-null means we are in overwrite mode. */
3113 int overwrite_p = !NILP (current_buffer->overwrite_mode);
3114 int added_width;
3115 struct text_pos pos;
3116 int delta, delta_bytes;
3117
3118 /* Not done directly. */
3119 redisplay_performed_directly_p = 0;
3120
3121 /* Quickly give up for some common cases. */
3122 if (cursor_in_echo_area
3123 /* Give up if fonts have changed. */
3124 || fonts_changed_p
3125 /* Give up if face attributes have been changed. */
3126 || face_change_count
3127 /* Give up if cursor position not really known. */
3128 || !display_completed
3129 /* Give up if buffer appears in two places. */
3130 || buffer_shared > 1
3131 /* Give up if w is mini-buffer and a message is being displayed there */
3132 || (MINI_WINDOW_P (w) && !NILP (echo_area_buffer[0]))
3133 /* Give up for hscrolled mini-buffer because display of the prompt
3134 is handled specially there (see display_line). */
3135 || (MINI_WINDOW_P (w) && XFASTINT (w->hscroll))
3136 /* Give up if overwriting in the middle of a line. */
3137 || (overwrite_p
3138 && PT != ZV
3139 && FETCH_BYTE (PT) != '\n')
3140 /* Give up for tabs and line ends. */
3141 || g == '\t'
3142 || g == '\n'
3143 || g == '\r'
3144 /* Give up if unable to display the cursor in the window. */
3145 || w->cursor.vpos < 0
3146 || (glyph_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos),
3147 /* Can't do it in a continued line because continuation
3148 lines would change. */
3149 (glyph_row->continued_p
3150 /* Can't use this method if the line overlaps others or is
3151 overlapped by others because these other lines would
3152 have to be redisplayed. */
3153 || glyph_row->overlapping_p
3154 || glyph_row->overlapped_p))
3155 /* Can't do it for partial width windows on terminal frames
3156 because we can't clear to eol in such a window. */
3157 || (!window_redisplay_p && !WINDOW_FULL_WIDTH_P (w)))
3158 return 0;
3159
3160 /* Set up a display iterator structure for W. Glyphs will be
3161 produced in scratch_glyph_row. Current position is W's cursor
3162 position. */
3163 clear_glyph_row (&scratch_glyph_row);
3164 SET_TEXT_POS (pos, PT, PT_BYTE);
3165 DEC_TEXT_POS (pos, !NILP (current_buffer->enable_multibyte_characters));
3166 init_iterator (&it, w, CHARPOS (pos), BYTEPOS (pos), &scratch_glyph_row,
3167 DEFAULT_FACE_ID);
3168
3169 glyph_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos);
3170
3171 /* Give up if highlighting trailing whitespace and we have trailing
3172 whitespace in glyph_row. We would have to remove the trailing
3173 whitespace face in that case. */
3174 if (!NILP (Vshow_trailing_whitespace)
3175 && glyph_row->used[TEXT_AREA])
3176 {
3177 struct glyph *last;
3178
3179 last = glyph_row->glyphs[TEXT_AREA] + glyph_row->used[TEXT_AREA] - 1;
3180 if (last->type == STRETCH_GLYPH
3181 || (last->type == CHAR_GLYPH
3182 && last->u.ch == ' '))
3183 return 0;
3184 }
3185
3186 /* Give up if there are overlay strings at pos. This would fail
3187 if the overlay string has newlines in it. */
3188 if (STRINGP (it.string))
3189 return 0;
3190
3191 it.hpos = w->cursor.hpos;
3192 it.vpos = w->cursor.vpos;
3193 it.current_x = w->cursor.x + it.first_visible_x;
3194 it.current_y = w->cursor.y;
3195 it.end_charpos = PT;
3196 it.stop_charpos = min (PT, it.stop_charpos);
3197
3198 /* More than one display element may be returned for PT - 1 if
3199 (i) it's a control character which is translated into `\003' or
3200 `^C', or (ii) it has a display table entry, or (iii) it's a
3201 combination of both. */
3202 delta = delta_bytes = 0;
3203 while (get_next_display_element (&it))
3204 {
3205 PRODUCE_GLYPHS (&it);
3206
3207 /* Give up if glyph doesn't fit completely on the line. */
3208 if (it.current_x >= it.last_visible_x)
3209 return 0;
3210
3211 /* Give up if new glyph has different ascent or descent than
3212 the original row, or if it is not a character glyph. */
3213 if (glyph_row->ascent != it.ascent
3214 || glyph_row->height != it.ascent + it.descent
3215 || glyph_row->phys_ascent != it.phys_ascent
3216 || glyph_row->phys_height != it.phys_ascent + it.phys_descent
3217 || it.what != IT_CHARACTER)
3218 return 0;
3219
3220 delta += 1;
3221 delta_bytes += it.len;
3222 set_iterator_to_next (&it);
3223 }
3224
3225 /* Give up if we hit the right edge of the window. We would have
3226 to insert truncation or continuation glyphs. */
3227 added_width = it.current_x - (w->cursor.x + it.first_visible_x);
3228 if (glyph_row->pixel_width + added_width >= it.last_visible_x)
3229 return 0;
3230
3231 /* Give up if there is a \t following in the line. */
3232 it2 = it;
3233 it2.end_charpos = ZV;
3234 it2.stop_charpos = min (it2.stop_charpos, ZV);
3235 while (get_next_display_element (&it2)
3236 && !ITERATOR_AT_END_OF_LINE_P (&it2))
3237 {
3238 if (it2.c == '\t')
3239 return 0;
3240 set_iterator_to_next (&it2);
3241 }
3242
3243 /* Number of new glyphs produced. */
3244 n = it.glyph_row->used[TEXT_AREA];
3245
3246 /* Start and end of glyphs in original row. */
3247 glyphs = glyph_row->glyphs[TEXT_AREA] + w->cursor.hpos;
3248 end = glyph_row->glyphs[1 + TEXT_AREA];
3249
3250 /* Make room for new glyphs, then insert them. */
3251 xassert (end - glyphs - n >= 0);
3252 safe_bcopy ((char *) glyphs, (char *) (glyphs + n),
3253 (end - glyphs - n) * sizeof (*end));
3254 bcopy (it.glyph_row->glyphs[TEXT_AREA], glyphs, n * sizeof *glyphs);
3255 glyph_row->used[TEXT_AREA] = min (glyph_row->used[TEXT_AREA] + n,
3256 end - glyph_row->glyphs[TEXT_AREA]);
3257
3258 /* Compute new line width. */
3259 glyph = glyph_row->glyphs[TEXT_AREA];
3260 end = glyph + glyph_row->used[TEXT_AREA];
3261 glyph_row->pixel_width = glyph_row->x;
3262 while (glyph < end)
3263 {
3264 glyph_row->pixel_width += glyph->pixel_width;
3265 ++glyph;
3266 }
3267
3268 /* Increment buffer positions for glyphs following the newly
3269 inserted ones. */
3270 for (glyph = glyphs + n; glyph < end; ++glyph)
3271 if (glyph->charpos > 0 && BUFFERP (glyph->object))
3272 glyph->charpos += delta;
3273
3274 if (MATRIX_ROW_END_CHARPOS (glyph_row) > 0)
3275 {
3276 MATRIX_ROW_END_CHARPOS (glyph_row) += delta;
3277 MATRIX_ROW_END_BYTEPOS (glyph_row) += delta_bytes;
3278 }
3279
3280 /* Adjust positions in lines following the one we are in. */
3281 increment_glyph_matrix_buffer_positions (w->current_matrix,
3282 w->cursor.vpos + 1,
3283 w->current_matrix->nrows,
3284 delta, delta_bytes);
3285
3286 glyph_row->contains_overlapping_glyphs_p
3287 |= it.glyph_row->contains_overlapping_glyphs_p;
3288
3289 glyph_row->displays_text_p = 1;
3290 w->window_end_vpos = make_number (max (w->cursor.vpos,
3291 XFASTINT (w->window_end_vpos)));
3292
3293 if (!NILP (Vshow_trailing_whitespace))
3294 highlight_trailing_whitespace (it.f, glyph_row);
3295
3296 /* Write glyphs. If at end of row, we can simply call write_glyphs.
3297 In the middle, we have to insert glyphs. Note that this is now
3298 implemented for X frames. The implementation uses updated_window
3299 and updated_row. */
3300 updated_row = glyph_row;
3301 update_begin (f);
3302 if (rif)
3303 {
3304 rif->update_window_begin_hook (w);
3305
3306 if (glyphs == end - n)
3307 rif->write_glyphs (glyphs, n);
3308 else
3309 rif->insert_glyphs (glyphs, n);
3310 }
3311 else
3312 {
3313 if (glyphs == end - n)
3314 write_glyphs (glyphs, n);
3315 else
3316 insert_glyphs (glyphs, n);
3317 }
3318
3319 w->cursor.hpos += n;
3320 w->cursor.x = it.current_x - it.first_visible_x;
3321 xassert (w->cursor.hpos >= 0
3322 && w->cursor.hpos < w->desired_matrix->matrix_w);
3323
3324 /* How to set the cursor differs depending on whether we are
3325 using a frame matrix or a window matrix. Note that when
3326 a frame matrix is used, cursor_to expects frame coordinates,
3327 and the X and Y parameters are not used. */
3328 if (window_redisplay_p)
3329 rif->cursor_to (w->cursor.vpos, w->cursor.hpos,
3330 w->cursor.y, w->cursor.x);
3331 else
3332 {
3333 int x, y;
3334 x = (WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos)
3335 + (INTEGERP (w->left_margin_width)
3336 ? XFASTINT (w->left_margin_width)
3337 : 0));
3338 y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos);
3339 cursor_to (y, x);
3340 }
3341
3342 if (rif)
3343 rif->update_window_end_hook (w, 1);
3344 update_end (f);
3345 updated_row = NULL;
3346 fflush (stdout);
3347
3348 TRACE ((stderr, "direct output for insert\n"));
3349
3350 UNCHANGED_MODIFIED = MODIFF;
3351 BEG_UNCHANGED = GPT - BEG;
3352 XSETFASTINT (w->last_point, PT);
3353 w->last_cursor = w->cursor;
3354 XSETFASTINT (w->last_modified, MODIFF);
3355 XSETFASTINT (w->last_overlay_modified, OVERLAY_MODIFF);
3356
3357 redisplay_performed_directly_p = 1;
3358 return 1;
3359 }
3360
3361
3362 /* Perform a direct display update for moving PT by N positions
3363 left or right. N < 0 means a movement backwards. This function
3364 is currently only called for N == 1 or N == -1. */
3365
3366 int
3367 direct_output_forward_char (n)
3368 int n;
3369 {
3370 struct frame *f = SELECTED_FRAME ();
3371 struct window *w = XWINDOW (selected_window);
3372 struct glyph_row *row;
3373
3374 /* Give up if point moved out of or into a composition. */
3375 if (check_point_in_composition (current_buffer, XINT (w->last_point),
3376 current_buffer, PT))
3377 return 0;
3378
3379 /* Give up if face attributes have been changed. */
3380 if (face_change_count)
3381 return 0;
3382
3383 /* Give up if current matrix is not up to date or we are
3384 displaying a message. */
3385 if (!display_completed || cursor_in_echo_area)
3386 return 0;
3387
3388 /* Give up if the buffer's direction is reversed. */
3389 if (!NILP (XBUFFER (w->buffer)->direction_reversed))
3390 return 0;
3391
3392 /* Can't use direct output if highlighting a region. */
3393 if (!NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active))
3394 return 0;
3395
3396 /* Can't use direct output if highlighting trailing whitespace. */
3397 if (!NILP (Vshow_trailing_whitespace))
3398 return 0;
3399
3400 /* Give up if we are showing a message or just cleared the message
3401 because we might need to resize the echo area window. */
3402 if (!NILP (echo_area_buffer[0]) || !NILP (echo_area_buffer[1]))
3403 return 0;
3404
3405 /* Give up if we don't know where the cursor is. */
3406 if (w->cursor.vpos < 0)
3407 return 0;
3408
3409 row = MATRIX_ROW (w->current_matrix, w->cursor.vpos);
3410
3411 if (PT <= MATRIX_ROW_START_BYTEPOS (row)
3412 || PT >= MATRIX_ROW_END_BYTEPOS (row))
3413 return 0;
3414
3415 set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0);
3416 w->last_cursor = w->cursor;
3417 XSETFASTINT (w->last_point, PT);
3418
3419 xassert (w->cursor.hpos >= 0
3420 && w->cursor.hpos < w->desired_matrix->matrix_w);
3421
3422 if (FRAME_WINDOW_P (f))
3423 rif->cursor_to (w->cursor.vpos, w->cursor.hpos,
3424 w->cursor.y, w->cursor.x);
3425 else
3426 {
3427 int x, y;
3428 x = (WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos)
3429 + (INTEGERP (w->left_margin_width)
3430 ? XFASTINT (w->left_margin_width)
3431 : 0));
3432 y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos);
3433 cursor_to (y, x);
3434 }
3435
3436 fflush (stdout);
3437 redisplay_performed_directly_p = 1;
3438 return 1;
3439 }
3440
3441
3442 \f
3443 /***********************************************************************
3444 Frame Update
3445 ***********************************************************************/
3446
3447 /* Update frame F based on the data in desired matrices.
3448
3449 If FORCE_P is non-zero, don't let redisplay be stopped by detecting
3450 pending input. If INHIBIT_HAIRY_ID_P is non-zero, don't try
3451 scrolling.
3452
3453 Value is non-zero if redisplay was stopped due to pending input. */
3454
3455 int
3456 update_frame (f, force_p, inhibit_hairy_id_p)
3457 struct frame *f;
3458 int force_p;
3459 int inhibit_hairy_id_p;
3460 {
3461 /* 1 means display has been paused because of pending input. */
3462 int paused_p;
3463 struct window *root_window = XWINDOW (f->root_window);
3464
3465 if (FRAME_WINDOW_P (f))
3466 {
3467 /* We are working on window matrix basis. All windows whose
3468 flag must_be_updated_p is set have to be updated. */
3469
3470 /* Record that we are not working on frame matrices. */
3471 set_frame_matrix_frame (NULL);
3472
3473 /* Update all windows in the window tree of F, maybe stopping
3474 when pending input is detected. */
3475 update_begin (f);
3476
3477 /* Update the menu bar on X frames that don't have toolkit
3478 support. */
3479 if (WINDOWP (f->menu_bar_window))
3480 update_window (XWINDOW (f->menu_bar_window), 1);
3481
3482 /* Update the tool-bar window, if present. */
3483 if (WINDOWP (f->tool_bar_window))
3484 {
3485 Lisp_Object tem;
3486 struct window *w = XWINDOW (f->tool_bar_window);
3487
3488 /* Update tool-bar window. */
3489 if (w->must_be_updated_p)
3490 {
3491 update_window (w, 1);
3492 w->must_be_updated_p = 0;
3493
3494 /* Swap tool-bar strings. We swap because we want to
3495 reuse strings. */
3496 tem = f->current_tool_bar_string;
3497 f->current_tool_bar_string = f->desired_tool_bar_string;
3498 f->desired_tool_bar_string = tem;
3499 f->n_current_tool_bar_items = f->n_desired_tool_bar_items;
3500
3501 /* Swap tool-bar items. We swap because we want to
3502 reuse vectors. */
3503 tem = f->current_tool_bar_items;
3504 f->current_tool_bar_items = f->desired_tool_bar_items;
3505 f->desired_tool_bar_items = tem;
3506 }
3507 }
3508
3509
3510 /* Update windows. */
3511 paused_p = update_window_tree (root_window, force_p);
3512 update_end (f);
3513 display_completed = !paused_p;
3514
3515 /* The flush is a performance bottleneck under X. */
3516 #if 0
3517 rif->flush_display (f);
3518 #endif
3519 }
3520 else
3521 {
3522 /* We are working on frame matrix basis. Set the frame on whose
3523 frame matrix we operate. */
3524 set_frame_matrix_frame (f);
3525
3526 /* Build F's desired matrix from window matrices. For windows
3527 whose must_be_updated_p flag is set, desired matrices are
3528 made part of the desired frame matrix. For other windows,
3529 the current matrix is copied. */
3530 build_frame_matrix (f);
3531
3532 /* Do the update on the frame desired matrix. */
3533 paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p);
3534
3535 /* Check window matrices for lost pointers. */
3536 IF_DEBUG (check_window_matrix_pointers (root_window));
3537 }
3538
3539 /* Reset flags indicating that a window should be updated. */
3540 set_window_update_flags (root_window, 0);
3541 return paused_p;
3542 }
3543
3544
3545 \f
3546 /************************************************************************
3547 Window-based updates
3548 ************************************************************************/
3549
3550 /* Perform updates in window tree rooted at W. FORCE_P non-zero means
3551 don't stop updating when input is pending. */
3552
3553 static int
3554 update_window_tree (w, force_p)
3555 struct window *w;
3556 int force_p;
3557 {
3558 int paused_p = 0;
3559
3560 while (w && !paused_p)
3561 {
3562 if (!NILP (w->hchild))
3563 paused_p |= update_window_tree (XWINDOW (w->hchild), force_p);
3564 else if (!NILP (w->vchild))
3565 paused_p |= update_window_tree (XWINDOW (w->vchild), force_p);
3566 else if (w->must_be_updated_p)
3567 paused_p |= update_window (w, force_p);
3568
3569 w = NILP (w->next) ? 0 : XWINDOW (w->next);
3570 }
3571
3572 return paused_p;
3573 }
3574
3575
3576 /* Update window W if its flag must_be_updated_p is non-zero. If
3577 FORCE_P is non-zero, don't stop updating if input is pending. */
3578
3579 void
3580 update_single_window (w, force_p)
3581 struct window *w;
3582 int force_p;
3583 {
3584 if (w->must_be_updated_p)
3585 {
3586 struct frame *f = XFRAME (WINDOW_FRAME (w));
3587
3588 /* Record that this is not a frame-based redisplay. */
3589 set_frame_matrix_frame (NULL);
3590
3591 /* Update W. */
3592 update_begin (f);
3593 update_window (w, force_p);
3594 update_end (f);
3595
3596 /* Reset flag in W. */
3597 w->must_be_updated_p = 0;
3598 }
3599 }
3600
3601
3602 /* Redraw lines from the current matrix of window W that are
3603 overlapped by other rows. YB is bottom-most y-position in W. */
3604
3605 static void
3606 redraw_overlapped_rows (w, yb)
3607 struct window *w;
3608 int yb;
3609 {
3610 int i, bottom_y;
3611 struct glyph_row *row;
3612
3613 /* If rows overlapping others have been changed, the rows being
3614 overlapped have to be redrawn. This won't draw lines that have
3615 already been drawn in update_window_line because overlapped_p in
3616 desired rows is 0, so after row assignment overlapped_p in
3617 current rows is 0. */
3618 for (i = 0; i < w->current_matrix->nrows; ++i)
3619 {
3620 row = w->current_matrix->rows + i;
3621
3622 if (!row->enabled_p)
3623 break;
3624 else if (row->mode_line_p)
3625 continue;
3626
3627 if (row->overlapped_p)
3628 {
3629 enum glyph_row_area area;
3630
3631 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
3632 {
3633 updated_row = row;
3634 updated_area = area;
3635 rif->cursor_to (i, 0, row->y, area == TEXT_AREA ? row->x : 0);
3636 if (row->used[area])
3637 rif->write_glyphs (row->glyphs[area], row->used[area]);
3638 rif->clear_end_of_line (-1);
3639 }
3640
3641 row->overlapped_p = 0;
3642 }
3643
3644 bottom_y = MATRIX_ROW_BOTTOM_Y (row);
3645 if (bottom_y >= yb)
3646 break;
3647 }
3648 }
3649
3650
3651 /* Redraw lines from the current matrix of window W that overlap
3652 others. YB is bottom-most y-position in W. */
3653
3654 static void
3655 redraw_overlapping_rows (w, yb)
3656 struct window *w;
3657 int yb;
3658 {
3659 int i, bottom_y;
3660 struct glyph_row *row;
3661
3662 for (i = 0; i < w->current_matrix->nrows; ++i)
3663 {
3664 row = w->current_matrix->rows + i;
3665
3666 if (!row->enabled_p)
3667 break;
3668 else if (row->mode_line_p)
3669 continue;
3670
3671 bottom_y = MATRIX_ROW_BOTTOM_Y (row);
3672
3673 if (row->overlapping_p && i > 0 && bottom_y < yb)
3674 {
3675 if (row->used[LEFT_MARGIN_AREA])
3676 rif->fix_overlapping_area (w, row, LEFT_MARGIN_AREA);
3677
3678 if (row->used[TEXT_AREA])
3679 rif->fix_overlapping_area (w, row, TEXT_AREA);
3680
3681 if (row->used[RIGHT_MARGIN_AREA])
3682 rif->fix_overlapping_area (w, row, RIGHT_MARGIN_AREA);
3683
3684 /* Record in neighbor rows that ROW overwrites part of their
3685 display. */
3686 if (row->phys_ascent > row->ascent && i > 0)
3687 MATRIX_ROW (w->current_matrix, i - 1)->overlapped_p = 1;
3688 if ((row->phys_height - row->phys_ascent
3689 > row->height - row->ascent)
3690 && bottom_y < yb)
3691 MATRIX_ROW (w->current_matrix, i + 1)->overlapped_p = 1;
3692 }
3693
3694 if (bottom_y >= yb)
3695 break;
3696 }
3697 }
3698
3699
3700 /* Update display of window W. FORCE_P non-zero means that we should
3701 not stop when detecting pending input. */
3702
3703 static int
3704 update_window (w, force_p)
3705 struct window *w;
3706 int force_p;
3707 {
3708 struct glyph_matrix *desired_matrix = w->desired_matrix;
3709 int paused_p;
3710 int preempt_count = baud_rate / 2400 + 1;
3711 extern int input_pending;
3712 #if GLYPH_DEBUG
3713 struct frame *f = XFRAME (WINDOW_FRAME (w));
3714 extern struct frame *updating_frame;
3715 #endif
3716
3717 /* Check that W's frame doesn't have glyph matrices. */
3718 xassert (FRAME_WINDOW_P (f));
3719 xassert (updating_frame != NULL);
3720
3721 /* Check pending input the first time so that we can quickly return. */
3722 if (redisplay_dont_pause)
3723 force_p = 1;
3724 else
3725 detect_input_pending ();
3726
3727 /* If forced to complete the update, or if no input is pending, do
3728 the update. */
3729 if (force_p || !input_pending)
3730 {
3731 struct glyph_row *row, *end;
3732 struct glyph_row *mode_line_row;
3733 struct glyph_row *header_line_row = NULL;
3734 int yb, changed_p = 0;
3735
3736 rif->update_window_begin_hook (w);
3737 yb = window_text_bottom_y (w);
3738
3739 /* If window has a top line, update it before everything else.
3740 Adjust y-positions of other rows by the top line height. */
3741 row = desired_matrix->rows;
3742 end = row + desired_matrix->nrows - 1;
3743 if (row->mode_line_p)
3744 header_line_row = row++;
3745
3746 /* Update the mode line, if necessary. */
3747 mode_line_row = MATRIX_MODE_LINE_ROW (desired_matrix);
3748 if (mode_line_row->mode_line_p && mode_line_row->enabled_p)
3749 {
3750 mode_line_row->y = yb;
3751 update_window_line (w, MATRIX_ROW_VPOS (mode_line_row,
3752 desired_matrix));
3753 changed_p = 1;
3754 }
3755
3756 /* Find first enabled row. Optimizations in redisplay_internal
3757 may lead to an update with only one row enabled. There may
3758 be also completely empty matrices. */
3759 while (row < end && !row->enabled_p)
3760 ++row;
3761
3762 /* Try reusing part of the display by inserting/deleting lines. */
3763 if (row < end && !desired_matrix->no_scrolling_p)
3764 {
3765 int rc = scrolling_window (w, header_line_row != NULL);
3766 if (rc < 0)
3767 {
3768 /* All rows were found to be equal. */
3769 paused_p = 0;
3770 goto set_cursor;
3771 }
3772 else if (rc > 0)
3773 force_p = 1;
3774 changed_p = 1;
3775 }
3776
3777 /* Update the top mode line after scrolling because a new top
3778 line would otherwise overwrite lines at the top of the window
3779 that can be scrolled. */
3780 if (header_line_row && header_line_row->enabled_p)
3781 {
3782 header_line_row->y = 0;
3783 update_window_line (w, 0);
3784 changed_p = 1;
3785 }
3786
3787 /* Update the rest of the lines. */
3788 for (; row < end && (force_p || !input_pending); ++row)
3789 if (row->enabled_p
3790 /* A row can be completely invisible in case a desired
3791 matrix was built with a vscroll and then
3792 make_cursor_line_fully_visible shifts the matrix. */
3793 && row->visible_height > 0)
3794 {
3795 int vpos = MATRIX_ROW_VPOS (row, desired_matrix);
3796 int i;
3797
3798 /* We'll Have to play a little bit with when to
3799 detect_input_pending. If it's done too often,
3800 scrolling large windows with repeated scroll-up
3801 commands will too quickly pause redisplay. */
3802 if (!force_p && vpos % preempt_count == 0)
3803 detect_input_pending ();
3804
3805 changed_p |= update_window_line (w, vpos);
3806
3807 /* Mark all rows below the last visible one in the current
3808 matrix as invalid. This is necessary because of
3809 variable line heights. Consider the case of three
3810 successive redisplays, where the first displays 5
3811 lines, the second 3 lines, and the third 5 lines again.
3812 If the second redisplay wouldn't mark rows in the
3813 current matrix invalid, the third redisplay might be
3814 tempted to optimize redisplay based on lines displayed
3815 in the first redisplay. */
3816 if (MATRIX_ROW_BOTTOM_Y (row) >= yb)
3817 for (i = vpos + 1; i < w->current_matrix->nrows - 1; ++i)
3818 MATRIX_ROW (w->current_matrix, i)->enabled_p = 0;
3819 }
3820
3821 /* Was display preempted? */
3822 paused_p = row < end;
3823
3824 set_cursor:
3825
3826 /* Fix the appearance of overlapping(overlapped rows. */
3827 if (rif->fix_overlapping_area
3828 && !w->pseudo_window_p
3829 && changed_p
3830 && !paused_p)
3831 {
3832 redraw_overlapped_rows (w, yb);
3833 redraw_overlapping_rows (w, yb);
3834 }
3835
3836 if (!paused_p && !w->pseudo_window_p)
3837 {
3838 /* Make cursor visible at cursor position of W. */
3839 set_window_cursor_after_update (w);
3840
3841 #if 0
3842 /* Check that current matrix invariants are satisfied. This
3843 is for debugging only. See the comment around
3844 check_matrix_invariants. */
3845 IF_DEBUG (check_matrix_invariants (w));
3846 #endif
3847 }
3848
3849 #if GLYPH_DEBUG
3850 /* Remember the redisplay method used to display the matrix. */
3851 strcpy (w->current_matrix->method, w->desired_matrix->method);
3852 #endif
3853
3854 /* End of update of window W. */
3855 rif->update_window_end_hook (w, 1);
3856
3857 }
3858 else
3859 paused_p = 1;
3860
3861 clear_glyph_matrix (desired_matrix);
3862
3863 return paused_p;
3864 }
3865
3866
3867 /* Update the display of area AREA in window W, row number VPOS.
3868 AREA can be either LEFT_MARGIN_AREA or RIGHT_MARGIN_AREA. */
3869
3870 static void
3871 update_marginal_area (w, area, vpos)
3872 struct window *w;
3873 int area, vpos;
3874 {
3875 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
3876
3877 /* Let functions in xterm.c know what area subsequent X positions
3878 will be relative to. */
3879 updated_area = area;
3880
3881 /* Set cursor to start of glyphs, write them, and clear to the end
3882 of the area. I don't think that something more sophisticated is
3883 necessary here, since marginal areas will not be the default. */
3884 rif->cursor_to (vpos, 0, desired_row->y, 0);
3885 if (desired_row->used[area])
3886 rif->write_glyphs (desired_row->glyphs[area], desired_row->used[area]);
3887 rif->clear_end_of_line (-1);
3888 }
3889
3890
3891 /* Update the display of the text area of row VPOS in window W.
3892 Value is non-zero if display has changed. */
3893
3894 static int
3895 update_text_area (w, vpos)
3896 struct window *w;
3897 int vpos;
3898 {
3899 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos);
3900 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
3901 int changed_p = 0;
3902
3903 /* Let functions in xterm.c know what area subsequent X positions
3904 will be relative to. */
3905 updated_area = TEXT_AREA;
3906
3907 /* If rows are at different X or Y, or rows have different height,
3908 or the current row is marked invalid, write the entire line. */
3909 if (!current_row->enabled_p
3910 || desired_row->y != current_row->y
3911 || desired_row->ascent != current_row->ascent
3912 || desired_row->phys_ascent != current_row->phys_ascent
3913 || desired_row->phys_height != current_row->phys_height
3914 || desired_row->visible_height != current_row->visible_height
3915 || current_row->overlapped_p
3916 || current_row->x != desired_row->x)
3917 {
3918 rif->cursor_to (vpos, 0, desired_row->y, desired_row->x);
3919
3920 if (desired_row->used[TEXT_AREA])
3921 rif->write_glyphs (desired_row->glyphs[TEXT_AREA],
3922 desired_row->used[TEXT_AREA]);
3923
3924 /* Clear to end of window. */
3925 rif->clear_end_of_line (-1);
3926 changed_p = 1;
3927 }
3928 else
3929 {
3930 int stop, i, x;
3931 struct glyph *current_glyph = current_row->glyphs[TEXT_AREA];
3932 struct glyph *desired_glyph = desired_row->glyphs[TEXT_AREA];
3933
3934 /* If the desired row extends its face to the text area end,
3935 make sure we write at least one glyph, so that the face
3936 extension actually takes place. */
3937 int desired_stop_pos = (desired_row->used[TEXT_AREA]
3938 - (MATRIX_ROW_EXTENDS_FACE_P (desired_row)
3939 ? 1 : 0));
3940
3941 stop = min (current_row->used[TEXT_AREA], desired_stop_pos);
3942 i = 0;
3943 x = desired_row->x;
3944
3945 while (i < stop)
3946 {
3947 /* Skip over glyphs that both rows have in common. These
3948 don't have to be written. */
3949 while (i < stop
3950 && GLYPH_EQUAL_P (desired_glyph, current_glyph))
3951 {
3952 x += desired_glyph->pixel_width;
3953 ++desired_glyph, ++current_glyph, ++i;
3954 }
3955
3956 /* Consider the case that the current row contains "xxx ppp
3957 ggg" in italic Courier font, and the desired row is "xxx
3958 ggg". The character `p' has lbearing, `g' has not. The
3959 loop above will stop in front of the first `p' in the
3960 current row. If we would start writing glyphs there, we
3961 wouldn't erase the lbearing of the `p'. The rest of the
3962 lbearing problem is then taken care of by x_draw_glyphs. */
3963 if (current_row->contains_overlapping_glyphs_p
3964 && i > 0
3965 && i < current_row->used[TEXT_AREA]
3966 && current_row->used[TEXT_AREA] != desired_row->used[TEXT_AREA])
3967 {
3968 int left, right;
3969 rif->get_glyph_overhangs (current_glyph, XFRAME (w->frame),
3970 &left, &right);
3971 while (left > 0 && i > 0)
3972 {
3973 --i, --desired_glyph, --current_glyph;
3974 x -= desired_glyph->pixel_width;
3975 left -= desired_glyph->pixel_width;
3976 }
3977 }
3978
3979 /* Try to avoid writing the entire rest of the desired row
3980 by looking for a resync point. This mainly prevents
3981 mode line flickering in the case the mode line is in
3982 fixed-pitch font, which it usually will be. */
3983 if (i < desired_row->used[TEXT_AREA])
3984 {
3985 int start_x = x, start_hpos = i;
3986 struct glyph *start = desired_glyph;
3987 int current_x = x;
3988
3989 /* Find the next glyph that's equal again. */
3990 while (i < stop
3991 && !GLYPH_EQUAL_P (desired_glyph, current_glyph)
3992 && x == current_x)
3993 {
3994 x += desired_glyph->pixel_width;
3995 current_x += current_glyph->pixel_width;
3996 ++desired_glyph, ++current_glyph, ++i;
3997 }
3998
3999 if (i == start_hpos || x != current_x)
4000 {
4001 i = start_hpos;
4002 x = start_x;
4003 desired_glyph = start;
4004 break;
4005 }
4006
4007 rif->cursor_to (vpos, start_hpos, desired_row->y, start_x);
4008 rif->write_glyphs (start, i - start_hpos);
4009 changed_p = 1;
4010 }
4011 }
4012
4013 /* Write the rest. */
4014 if (i < desired_row->used[TEXT_AREA])
4015 {
4016 rif->cursor_to (vpos, i, desired_row->y, x);
4017 rif->write_glyphs (desired_glyph, desired_row->used[TEXT_AREA] - i);
4018 changed_p = 1;
4019 }
4020
4021 /* Maybe clear to end of line. */
4022 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row))
4023 {
4024 /* If new row extends to the end of the text area, nothing
4025 has to be cleared, if and only if we did a write_glyphs
4026 above. This is made sure by setting desired_stop_pos
4027 appropriately above. */
4028 xassert (i < desired_row->used[TEXT_AREA]);
4029 }
4030 else if (MATRIX_ROW_EXTENDS_FACE_P (current_row))
4031 {
4032 /* If old row extends to the end of the text area, clear. */
4033 if (i >= desired_row->used[TEXT_AREA])
4034 rif->cursor_to (vpos, i, desired_row->y,
4035 desired_row->x + desired_row->pixel_width);
4036 rif->clear_end_of_line (-1);
4037 changed_p = 1;
4038 }
4039 else if (desired_row->pixel_width < current_row->pixel_width)
4040 {
4041 /* Otherwise clear to the end of the old row. Everything
4042 after that position should be clear already. */
4043 int x;
4044
4045 if (i >= desired_row->used[TEXT_AREA])
4046 rif->cursor_to (vpos, i, desired_row->y,
4047 desired_row->x + desired_row->pixel_width);
4048
4049 /* If cursor is displayed at the end of the line, make sure
4050 it's cleared. Nowadays we don't have a phys_cursor_glyph
4051 with which to erase the cursor (because this method
4052 doesn't work with lbearing/rbearing), so we must do it
4053 this way. */
4054 if (vpos == w->phys_cursor.vpos
4055 && w->phys_cursor.hpos >= desired_row->used[TEXT_AREA])
4056 {
4057 w->phys_cursor_on_p = 0;
4058 x = -1;
4059 }
4060 else
4061 x = current_row->x + current_row->pixel_width;
4062 rif->clear_end_of_line (x);
4063 changed_p = 1;
4064 }
4065 }
4066
4067 return changed_p;
4068 }
4069
4070
4071 /* Update row VPOS in window W. Value is non-zero if display has been
4072 changed. */
4073
4074 static int
4075 update_window_line (w, vpos)
4076 struct window *w;
4077 int vpos;
4078 {
4079 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos);
4080 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
4081 int changed_p = 0;
4082
4083 xassert (desired_row->enabled_p);
4084
4085 /* Set the row being updated. This is important to let xterm.c
4086 know what line height values are in effect. */
4087 updated_row = desired_row;
4088
4089 /* Update display of the left margin area, if there is one. */
4090 if (!desired_row->full_width_p
4091 && !NILP (w->left_margin_width))
4092 {
4093 update_marginal_area (w, LEFT_MARGIN_AREA, vpos);
4094 changed_p = 1;
4095 }
4096
4097 /* Update the display of the text area. */
4098 changed_p |= update_text_area (w, vpos);
4099
4100 /* Update display of the right margin area, if there is one. */
4101 if (!desired_row->full_width_p
4102 && !NILP (w->right_margin_width))
4103 {
4104 changed_p = 1;
4105 update_marginal_area (w, RIGHT_MARGIN_AREA, vpos);
4106 }
4107
4108 /* Draw truncation marks etc. */
4109 if (!current_row->enabled_p
4110 || desired_row->y != current_row->y
4111 || desired_row->visible_height != current_row->visible_height
4112 || desired_row->overlay_arrow_p != current_row->overlay_arrow_p
4113 || desired_row->truncated_on_left_p != current_row->truncated_on_left_p
4114 || desired_row->truncated_on_right_p != current_row->truncated_on_right_p
4115 || desired_row->continued_p != current_row->continued_p
4116 || desired_row->mode_line_p != current_row->mode_line_p
4117 || (desired_row->indicate_empty_line_p
4118 != current_row->indicate_empty_line_p)
4119 || (MATRIX_ROW_CONTINUATION_LINE_P (desired_row)
4120 != MATRIX_ROW_CONTINUATION_LINE_P (current_row)))
4121 rif->after_update_window_line_hook (desired_row);
4122
4123 /* Update current_row from desired_row. */
4124 make_current (w->desired_matrix, w->current_matrix, vpos);
4125 updated_row = NULL;
4126 return changed_p;
4127 }
4128
4129
4130 /* Set the cursor after an update of window W. This function may only
4131 be called from update_window. */
4132
4133 static void
4134 set_window_cursor_after_update (w)
4135 struct window *w;
4136 {
4137 struct frame *f = XFRAME (w->frame);
4138 int cx, cy, vpos, hpos;
4139
4140 /* Not intended for frame matrix updates. */
4141 xassert (FRAME_WINDOW_P (f));
4142
4143 if (cursor_in_echo_area
4144 && !NILP (echo_area_buffer[0])
4145 /* If we are showing a message instead of the mini-buffer,
4146 show the cursor for the message instead. */
4147 && XWINDOW (minibuf_window) == w
4148 && EQ (minibuf_window, echo_area_window)
4149 /* These cases apply only to the frame that contains
4150 the active mini-buffer window. */
4151 && FRAME_HAS_MINIBUF_P (f)
4152 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window))
4153 {
4154 cx = cy = vpos = hpos = 0;
4155
4156 if (cursor_in_echo_area >= 0)
4157 {
4158 /* If the mini-buffer is several lines high, find the last
4159 line that has any text on it. Note: either all lines
4160 are enabled or none. Otherwise we wouldn't be able to
4161 determine Y. */
4162 struct glyph_row *row, *last_row;
4163 struct glyph *glyph;
4164 int yb = window_text_bottom_y (w);
4165
4166 last_row = NULL;
4167 for (row = MATRIX_ROW (w->current_matrix, 0);
4168 row->enabled_p;
4169 ++row)
4170 {
4171 if (row->used[TEXT_AREA]
4172 && row->glyphs[TEXT_AREA][0].charpos >= 0)
4173 last_row = row;
4174
4175 if (MATRIX_ROW_BOTTOM_Y (row) >= yb)
4176 break;
4177 }
4178
4179 if (last_row)
4180 {
4181 struct glyph *start = row->glyphs[TEXT_AREA];
4182 struct glyph *last = start + row->used[TEXT_AREA] - 1;
4183
4184 while (last > start && last->charpos < 0)
4185 --last;
4186
4187 for (glyph = start; glyph < last; ++glyph)
4188 {
4189 cx += glyph->pixel_width;
4190 ++hpos;
4191 }
4192
4193 cy = last_row->y;
4194 vpos = MATRIX_ROW_VPOS (last_row, w->current_matrix);
4195 }
4196 }
4197 }
4198 else
4199 {
4200 cx = w->cursor.x;
4201 cy = w->cursor.y;
4202 hpos = w->cursor.hpos;
4203 vpos = w->cursor.vpos;
4204 }
4205
4206 /* Window cursor can be out of sync for horizontally split windows. */
4207 hpos = max (0, hpos);
4208 hpos = min (w->current_matrix->matrix_w - 1, hpos);
4209 vpos = max (0, vpos);
4210 vpos = min (w->current_matrix->nrows - 1, vpos);
4211 rif->cursor_to (vpos, hpos, cy, cx);
4212 }
4213
4214
4215 /* Try to reuse part of the current display of W by scrolling lines.
4216 HEADER_LINE_P non-zero means W has a top mode line.
4217
4218 The algorithm is taken from Communications of the ACM, Apr78 "A
4219 Technique for Isolating Differences Between Files." It should take
4220 O(N) time.
4221
4222 A short outline of the steps of the algorithm
4223
4224 1. Skip lines equal at the start and end of both matrices.
4225
4226 2. Enter rows in the current and desired matrix into a symbol
4227 table, counting how often they appear in both matrices.
4228
4229 3. Rows that appear exactly once in both matrices serve as anchors,
4230 i.e. we assume that such lines are likely to have been moved.
4231
4232 4. Starting from anchor lines, extend regions to be scrolled both
4233 forward and backward.
4234
4235 Value is
4236
4237 -1 if all rows were found to be equal.
4238 0 to indicate that we did not scroll the display, or
4239 1 if we did scroll. */
4240
4241 static int
4242 scrolling_window (w, header_line_p)
4243 struct window *w;
4244 int header_line_p;
4245 {
4246 struct symbol
4247 {
4248 /* Number of occurrences of this line in old and new matrix. */
4249 short old_uses, new_uses;
4250
4251 /* Vpos of line in new matrix. */
4252 short new_line_number;
4253
4254 /* The line itself. */
4255 struct glyph_row *row;
4256
4257 /* Hash collision chain. */
4258 struct symbol *next;
4259 };
4260
4261 int SYMBOL_TABLE_SIZE = 101;
4262 struct symbol **table;
4263 struct symbol **old_line_syms, **new_line_syms;
4264 int i, j, first_old, first_new, last_old, last_new;
4265 struct symbol *sym;
4266 struct run **runs;
4267 int nruns;
4268 struct glyph_matrix *desired_matrix = w->desired_matrix;
4269 struct glyph_matrix *current_matrix = w->current_matrix;
4270 int yb = window_text_bottom_y (w);
4271
4272 /* Skip over rows equal at the start. */
4273 i = header_line_p ? 1 : 0;
4274 while (i < current_matrix->nrows - 1
4275 && MATRIX_ROW_ENABLED_P (current_matrix, i)
4276 && MATRIX_ROW_ENABLED_P (desired_matrix, i)
4277 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (desired_matrix, i)) < yb
4278 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (current_matrix, i)) < yb
4279 && row_equal_p (w,
4280 MATRIX_ROW (desired_matrix, i),
4281 MATRIX_ROW (current_matrix, i)))
4282 {
4283 assign_row (MATRIX_ROW (current_matrix, i),
4284 MATRIX_ROW (desired_matrix, i));
4285 MATRIX_ROW (desired_matrix, i)->enabled_p = 0;
4286 ++i;
4287 }
4288
4289 /* Give up if some rows in the desired matrix are not enabled. */
4290 if (!MATRIX_ROW (desired_matrix, i)->enabled_p)
4291 return -1;
4292
4293 first_old = first_new = i;
4294
4295 /* Set last_new to the index + 1 of the last enabled row in the
4296 desired matrix. */
4297 i = first_new + 1;
4298 while (i < desired_matrix->nrows - 1
4299 && MATRIX_ROW (desired_matrix, i)->enabled_p
4300 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (desired_matrix, i)) < yb)
4301 ++i;
4302
4303 if (!MATRIX_ROW (desired_matrix, i)->enabled_p)
4304 return 0;
4305
4306 last_new = i;
4307
4308 /* Set last_old to the index + 1 of the last enabled row in the
4309 current matrix. We don't look at the enabled flag here because
4310 we plan to reuse part of the display even if other parts are
4311 disabled. */
4312 i = first_old + 1;
4313 while (i < current_matrix->nrows - 1
4314 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (current_matrix, i)) < yb)
4315 ++i;
4316 last_old = i;
4317
4318 /* Skip over rows equal at the bottom. */
4319 i = last_new;
4320 j = last_old;
4321 while (i - 1 > first_new
4322 && j - 1 > first_old
4323 && MATRIX_ROW (current_matrix, i - 1)->enabled_p
4324 && (MATRIX_ROW (current_matrix, i - 1)->y
4325 == MATRIX_ROW (desired_matrix, j - 1)->y)
4326 && row_equal_p (w,
4327 MATRIX_ROW (desired_matrix, i - 1),
4328 MATRIX_ROW (current_matrix, j - 1)))
4329 --i, --j;
4330 last_new = i;
4331 last_old = j;
4332
4333 /* Nothing to do if all rows are equal. */
4334 if (last_new == first_new)
4335 return 0;
4336
4337 /* Allocate a hash table in which all rows will be inserted. */
4338 table = (struct symbol **) alloca (SYMBOL_TABLE_SIZE * sizeof *table);
4339 bzero (table, SYMBOL_TABLE_SIZE * sizeof *table);
4340
4341 /* For each row in the current matrix, record the symbol belonging
4342 to the row in OLD_LINE_SYMS. */
4343 old_line_syms = (struct symbol **) alloca (current_matrix->nrows
4344 * sizeof *old_line_syms);
4345 new_line_syms = (struct symbol **) alloca (desired_matrix->nrows
4346 * sizeof *new_line_syms);
4347
4348 #define ADDSYM(ROW) \
4349 do \
4350 { \
4351 struct glyph_row *row_ = (ROW); \
4352 int i_ = row_->hash % SYMBOL_TABLE_SIZE; \
4353 sym = table[i_]; \
4354 while (sym && !row_equal_p (w, sym->row, row_)) \
4355 sym = sym->next; \
4356 if (sym == NULL) \
4357 { \
4358 sym = (struct symbol *) alloca (sizeof *sym); \
4359 sym->row = row_; \
4360 sym->old_uses = sym->new_uses = 0; \
4361 sym->next = table[i_]; \
4362 table[i_] = sym; \
4363 } \
4364 } \
4365 while (0)
4366
4367 /* Add current rows to the symbol table. */
4368 for (i = first_old; i < last_old; ++i)
4369 {
4370 if (MATRIX_ROW (current_matrix, i)->enabled_p)
4371 {
4372 ADDSYM (MATRIX_ROW (current_matrix, i));
4373 old_line_syms[i] = sym;
4374 ++sym->old_uses;
4375 }
4376 else
4377 old_line_syms[i] = NULL;
4378 }
4379
4380 /* Add desired rows to the symbol table. */
4381 for (i = first_new; i < last_new; ++i)
4382 {
4383 xassert (MATRIX_ROW_ENABLED_P (desired_matrix, i));
4384 ADDSYM (MATRIX_ROW (desired_matrix, i));
4385 ++sym->new_uses;
4386 new_line_syms[i] = sym;
4387 sym->new_line_number = i;
4388 }
4389
4390 #undef ADDSYM
4391
4392 /* Record in runs which moves were found, ordered by pixel
4393 height of copied areas. */
4394 nruns = 0;
4395 runs = (struct run **) alloca (desired_matrix->nrows * sizeof *runs);
4396
4397 /* Identify moves based on lines that are unique and equal
4398 in both matrices. */
4399 for (i = first_old; i < last_old;)
4400 if (old_line_syms[i]
4401 && old_line_syms[i]->old_uses == 1
4402 && old_line_syms[i]->new_uses == 1)
4403 {
4404 int j, k;
4405 int new_line = old_line_syms[i]->new_line_number;
4406 struct run *run = (struct run *) alloca (sizeof *run);
4407
4408 /* Record move. */
4409 run->current_vpos = i;
4410 run->current_y = MATRIX_ROW (current_matrix, i)->y;
4411 run->desired_vpos = new_line;
4412 run->desired_y = MATRIX_ROW (desired_matrix, new_line)->y;
4413 run->nrows = 1;
4414 run->height = MATRIX_ROW (current_matrix, i)->height;
4415
4416 /* Extend backward. */
4417 j = i - 1;
4418 k = new_line - 1;
4419 while (j > first_old
4420 && k > first_new
4421 && old_line_syms[j] == new_line_syms[k])
4422 {
4423 int h = MATRIX_ROW (current_matrix, j)->height;
4424 --run->current_vpos;
4425 --run->desired_vpos;
4426 ++run->nrows;
4427 run->height += h;
4428 run->desired_y -= h;
4429 run->current_y -= h;
4430 --j, --k;
4431 }
4432
4433 /* Extend forward. */
4434 j = i + 1;
4435 k = new_line + 1;
4436 while (j < last_old
4437 && k < last_new
4438 && old_line_syms[j] == new_line_syms[k])
4439 {
4440 int h = MATRIX_ROW (current_matrix, j)->height;
4441 ++run->nrows;
4442 run->height += h;
4443 ++j, ++k;
4444 }
4445
4446 /* Insert run into list of all runs. Order runs by copied
4447 pixel lines. Note that we record runs that don't have to
4448 be copied because they are already in place. This is done
4449 because we can avoid calling update_window_line in this
4450 case. */
4451 for (j = 0; j < nruns && runs[j]->height > run->height; ++j)
4452 ;
4453 for (k = nruns; k >= j; --k)
4454 runs[k] = runs[k - 1];
4455 runs[j] = run;
4456 ++nruns;
4457
4458 i += run->nrows;
4459 }
4460 else
4461 ++i;
4462
4463 /* Do the moves. Do it in a way that we don't overwrite something
4464 we want to copy later on. This is not solvable in general
4465 because there is only one display and we don't have a way to
4466 exchange areas on this display. Example:
4467
4468 +-----------+ +-----------+
4469 | A | | B |
4470 +-----------+ --> +-----------+
4471 | B | | A |
4472 +-----------+ +-----------+
4473
4474 Instead, prefer bigger moves, and invalidate moves that would
4475 copy from where we copied to. */
4476
4477 for (i = 0; i < nruns; ++i)
4478 if (runs[i]->nrows > 0)
4479 {
4480 struct run *r = runs[i];
4481
4482 /* Copy on the display. */
4483 if (r->current_y != r->desired_y)
4484 {
4485 rif->scroll_run_hook (w, r);
4486
4487 /* Invalidate runs that copy from where we copied to. */
4488 for (j = i + 1; j < nruns; ++j)
4489 {
4490 struct run *p = runs[j];
4491
4492 if ((p->current_y >= r->desired_y
4493 && p->current_y < r->desired_y + r->height)
4494 || (p->current_y + p->height >= r->desired_y
4495 && (p->current_y + p->height
4496 < r->desired_y + r->height)))
4497 p->nrows = 0;
4498 }
4499 }
4500
4501 /* Assign matrix rows. */
4502 for (j = 0; j < r->nrows; ++j)
4503 {
4504 struct glyph_row *from, *to;
4505 int to_overlapped_p;
4506
4507 to = MATRIX_ROW (current_matrix, r->desired_vpos + j);
4508 to_overlapped_p = to->overlapped_p;
4509 from = MATRIX_ROW (desired_matrix, r->desired_vpos + j);
4510 assign_row (to, from);
4511 to->enabled_p = 1, from->enabled_p = 0;
4512 to->overlapped_p = to_overlapped_p;
4513 }
4514 }
4515
4516 /* Value is non-zero to indicate that we scrolled the display. */
4517 return 1;
4518 }
4519
4520
4521 /* Set WINDOW->must_be_updated_p TO ON_P for all windows WINDOW in the
4522 window tree rooted at W. */
4523
4524 void
4525 set_window_update_flags (w, on_p)
4526 struct window *w;
4527 int on_p;
4528 {
4529 while (w)
4530 {
4531 if (!NILP (w->hchild))
4532 set_window_update_flags (XWINDOW (w->hchild), on_p);
4533 else if (!NILP (w->vchild))
4534 set_window_update_flags (XWINDOW (w->vchild), on_p);
4535 else
4536 w->must_be_updated_p = on_p;
4537
4538 w = NILP (w->next) ? 0 : XWINDOW (w->next);
4539 }
4540 }
4541
4542
4543 \f
4544 /************************************************************************
4545 Frame-Based Updates
4546 ************************************************************************/
4547
4548 /* Update the desired frame matrix of frame F.
4549
4550 FORCE_P non-zero means that the update should not be stopped by
4551 pending input. INHIBIT_HAIRY_ID_P non-zero means that scrolling
4552 should not be tried.
4553
4554 Value is non-zero if update was stopped due to pending input. */
4555
4556 static int
4557 update_frame_1 (f, force_p, inhibit_id_p)
4558 struct frame *f;
4559 int force_p;
4560 int inhibit_id_p;
4561 {
4562 /* Frame matrices to work on. */
4563 struct glyph_matrix *current_matrix = f->current_matrix;
4564 struct glyph_matrix *desired_matrix = f->desired_matrix;
4565 int i;
4566 int pause;
4567 int preempt_count = baud_rate / 2400 + 1;
4568 extern int input_pending;
4569
4570 xassert (current_matrix && desired_matrix);
4571
4572 if (baud_rate != FRAME_COST_BAUD_RATE (f))
4573 calculate_costs (f);
4574
4575 if (preempt_count <= 0)
4576 preempt_count = 1;
4577
4578 detect_input_pending ();
4579 if (input_pending && !force_p)
4580 {
4581 pause = 1;
4582 goto do_pause;
4583 }
4584
4585 update_begin (f);
4586
4587 /* If we cannot insert/delete lines, it's no use trying it. */
4588 if (!line_ins_del_ok)
4589 inhibit_id_p = 1;
4590
4591 /* See if any of the desired lines are enabled; don't compute for
4592 i/d line if just want cursor motion. */
4593 for (i = 0; i < desired_matrix->nrows; i++)
4594 if (MATRIX_ROW_ENABLED_P (desired_matrix, i))
4595 break;
4596
4597 /* Try doing i/d line, if not yet inhibited. */
4598 if (!inhibit_id_p && i < desired_matrix->nrows)
4599 force_p |= scrolling (f);
4600
4601 /* Update the individual lines as needed. Do bottom line first. */
4602 if (MATRIX_ROW_ENABLED_P (desired_matrix, desired_matrix->nrows - 1))
4603 update_frame_line (f, desired_matrix->nrows - 1);
4604
4605 /* Now update the rest of the lines. */
4606 for (i = 0; i < desired_matrix->nrows - 1 && (force_p || !input_pending); i++)
4607 {
4608 if (MATRIX_ROW_ENABLED_P (desired_matrix, i))
4609 {
4610 if (FRAME_TERMCAP_P (f))
4611 {
4612 /* Flush out every so many lines.
4613 Also flush out if likely to have more than 1k buffered
4614 otherwise. I'm told that some telnet connections get
4615 really screwed by more than 1k output at once. */
4616 int outq = PENDING_OUTPUT_COUNT (stdout);
4617 if (outq > 900
4618 || (outq > 20 && ((i - 1) % preempt_count == 0)))
4619 {
4620 fflush (stdout);
4621 if (preempt_count == 1)
4622 {
4623 #ifdef EMACS_OUTQSIZE
4624 if (EMACS_OUTQSIZE (0, &outq) < 0)
4625 /* Probably not a tty. Ignore the error and reset
4626 * the outq count. */
4627 outq = PENDING_OUTPUT_COUNT (stdout);
4628 #endif
4629 outq *= 10;
4630 if (baud_rate <= outq && baud_rate > 0)
4631 sleep (outq / baud_rate);
4632 }
4633 }
4634 }
4635
4636 if ((i - 1) % preempt_count == 0)
4637 detect_input_pending ();
4638
4639 update_frame_line (f, i);
4640 }
4641 }
4642
4643 pause = (i < FRAME_HEIGHT (f) - 1) ? i : 0;
4644
4645 /* Now just clean up termcap drivers and set cursor, etc. */
4646 if (!pause)
4647 {
4648 if ((cursor_in_echo_area
4649 /* If we are showing a message instead of the mini-buffer,
4650 show the cursor for the message instead of for the
4651 (now hidden) mini-buffer contents. */
4652 || (EQ (minibuf_window, selected_window)
4653 && EQ (minibuf_window, echo_area_window)
4654 && !NILP (echo_area_buffer[0])))
4655 /* These cases apply only to the frame that contains
4656 the active mini-buffer window. */
4657 && FRAME_HAS_MINIBUF_P (f)
4658 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window))
4659 {
4660 int top = XINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top);
4661 int row, col;
4662
4663 if (cursor_in_echo_area < 0)
4664 {
4665 /* Negative value of cursor_in_echo_area means put
4666 cursor at beginning of line. */
4667 row = top;
4668 col = 0;
4669 }
4670 else
4671 {
4672 /* Positive value of cursor_in_echo_area means put
4673 cursor at the end of the prompt. If the mini-buffer
4674 is several lines high, find the last line that has
4675 any text on it. */
4676 row = FRAME_HEIGHT (f);
4677 do
4678 {
4679 --row;
4680 col = 0;
4681
4682 if (MATRIX_ROW_ENABLED_P (current_matrix, row))
4683 {
4684 /* Frame rows are filled up with spaces that
4685 must be ignored here. */
4686 struct glyph_row *r = MATRIX_ROW (current_matrix,
4687 row);
4688 struct glyph *start = r->glyphs[TEXT_AREA];
4689 struct glyph *last = start + r->used[TEXT_AREA];
4690
4691 while (last > start
4692 && (last - 1)->charpos < 0)
4693 --last;
4694
4695 col = last - start;
4696 }
4697 }
4698 while (row > top && col == 0);
4699
4700 /* Make sure COL is not out of range. */
4701 if (col >= FRAME_CURSOR_X_LIMIT (f))
4702 {
4703 /* If we have another row, advance cursor into it. */
4704 if (row < FRAME_HEIGHT (f) - 1)
4705 {
4706 col = FRAME_LEFT_SCROLL_BAR_WIDTH (f);
4707 row++;
4708 }
4709 /* Otherwise move it back in range. */
4710 else
4711 col = FRAME_CURSOR_X_LIMIT (f) - 1;
4712 }
4713 }
4714
4715 cursor_to (row, col);
4716 }
4717 else
4718 {
4719 /* We have only one cursor on terminal frames. Use it to
4720 display the cursor of the selected window. */
4721 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
4722 if (w->cursor.vpos >= 0)
4723 {
4724 int x = WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos);
4725 int y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos);
4726
4727 if (INTEGERP (w->left_margin_width))
4728 x += XFASTINT (w->left_margin_width);
4729
4730 /* x = max (min (x, FRAME_WINDOW_WIDTH (f) - 1), 0); */
4731 cursor_to (y, x);
4732 }
4733 }
4734 }
4735
4736 update_end (f);
4737
4738 if (termscript)
4739 fflush (termscript);
4740 fflush (stdout);
4741
4742 do_pause:
4743
4744 display_completed = !pause;
4745 clear_desired_matrices (f);
4746 return pause;
4747 }
4748
4749
4750 /* Do line insertions/deletions on frame F for frame-based redisplay. */
4751
4752 int
4753 scrolling (frame)
4754 struct frame *frame;
4755 {
4756 int unchanged_at_top, unchanged_at_bottom;
4757 int window_size;
4758 int changed_lines;
4759 int *old_hash = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int));
4760 int *new_hash = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int));
4761 int *draw_cost = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int));
4762 int *old_draw_cost = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int));
4763 register int i;
4764 int free_at_end_vpos = FRAME_HEIGHT (frame);
4765 struct glyph_matrix *current_matrix = frame->current_matrix;
4766 struct glyph_matrix *desired_matrix = frame->desired_matrix;
4767
4768 if (!current_matrix)
4769 abort ();
4770
4771 /* Compute hash codes of all the lines. Also calculate number of
4772 changed lines, number of unchanged lines at the beginning, and
4773 number of unchanged lines at the end. */
4774 changed_lines = 0;
4775 unchanged_at_top = 0;
4776 unchanged_at_bottom = FRAME_HEIGHT (frame);
4777 for (i = 0; i < FRAME_HEIGHT (frame); i++)
4778 {
4779 /* Give up on this scrolling if some old lines are not enabled. */
4780 if (!MATRIX_ROW_ENABLED_P (current_matrix, i))
4781 return 0;
4782 old_hash[i] = line_hash_code (MATRIX_ROW (current_matrix, i));
4783 if (! MATRIX_ROW_ENABLED_P (desired_matrix, i))
4784 {
4785 /* This line cannot be redrawn, so don't let scrolling mess it. */
4786 new_hash[i] = old_hash[i];
4787 #define INFINITY 1000000 /* Taken from scroll.c */
4788 draw_cost[i] = INFINITY;
4789 }
4790 else
4791 {
4792 new_hash[i] = line_hash_code (MATRIX_ROW (desired_matrix, i));
4793 draw_cost[i] = line_draw_cost (desired_matrix, i);
4794 }
4795
4796 if (old_hash[i] != new_hash[i])
4797 {
4798 changed_lines++;
4799 unchanged_at_bottom = FRAME_HEIGHT (frame) - i - 1;
4800 }
4801 else if (i == unchanged_at_top)
4802 unchanged_at_top++;
4803 old_draw_cost[i] = line_draw_cost (current_matrix, i);
4804 }
4805
4806 /* If changed lines are few, don't allow preemption, don't scroll. */
4807 if ((!scroll_region_ok && changed_lines < baud_rate / 2400)
4808 || unchanged_at_bottom == FRAME_HEIGHT (frame))
4809 return 1;
4810
4811 window_size = (FRAME_HEIGHT (frame) - unchanged_at_top
4812 - unchanged_at_bottom);
4813
4814 if (scroll_region_ok)
4815 free_at_end_vpos -= unchanged_at_bottom;
4816 else if (memory_below_frame)
4817 free_at_end_vpos = -1;
4818
4819 /* If large window, fast terminal and few lines in common between
4820 current frame and desired frame, don't bother with i/d calc. */
4821 if (!scroll_region_ok && window_size >= 18 && baud_rate > 2400
4822 && (window_size >=
4823 10 * scrolling_max_lines_saved (unchanged_at_top,
4824 FRAME_HEIGHT (frame) - unchanged_at_bottom,
4825 old_hash, new_hash, draw_cost)))
4826 return 0;
4827
4828 if (window_size < 2)
4829 return 0;
4830
4831 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom,
4832 draw_cost + unchanged_at_top - 1,
4833 old_draw_cost + unchanged_at_top - 1,
4834 old_hash + unchanged_at_top - 1,
4835 new_hash + unchanged_at_top - 1,
4836 free_at_end_vpos - unchanged_at_top);
4837
4838 return 0;
4839 }
4840
4841
4842 /* Count the number of blanks at the start of the vector of glyphs R
4843 which is LEN glyphs long. */
4844
4845 static int
4846 count_blanks (r, len)
4847 struct glyph *r;
4848 int len;
4849 {
4850 int i;
4851
4852 for (i = 0; i < len; ++i)
4853 if (!CHAR_GLYPH_SPACE_P (r[i]))
4854 break;
4855
4856 return i;
4857 }
4858
4859
4860 /* Count the number of glyphs in common at the start of the glyph
4861 vectors STR1 and STR2. END1 is the end of STR1 and END2 is the end
4862 of STR2. Value is the number of equal glyphs equal at the start. */
4863
4864 static int
4865 count_match (str1, end1, str2, end2)
4866 struct glyph *str1, *end1, *str2, *end2;
4867 {
4868 struct glyph *p1 = str1;
4869 struct glyph *p2 = str2;
4870
4871 while (p1 < end1
4872 && p2 < end2
4873 && GLYPH_CHAR_AND_FACE_EQUAL_P (p1, p2))
4874 ++p1, ++p2;
4875
4876 return p1 - str1;
4877 }
4878
4879
4880 /* Char insertion/deletion cost vector, from term.c */
4881
4882 extern int *char_ins_del_vector;
4883 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WINDOW_WIDTH((f))])
4884
4885
4886 /* Perform a frame-based update on line VPOS in frame FRAME. */
4887
4888 static void
4889 update_frame_line (frame, vpos)
4890 register struct frame *frame;
4891 int vpos;
4892 {
4893 struct glyph *obody, *nbody, *op1, *op2, *np1, *nend;
4894 int tem;
4895 int osp, nsp, begmatch, endmatch, olen, nlen;
4896 struct glyph_matrix *current_matrix = frame->current_matrix;
4897 struct glyph_matrix *desired_matrix = frame->desired_matrix;
4898 struct glyph_row *current_row = MATRIX_ROW (current_matrix, vpos);
4899 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, vpos);
4900 int must_write_whole_line_p;
4901
4902 if (desired_row->inverse_p
4903 != (current_row->enabled_p && current_row->inverse_p))
4904 {
4905 int n = current_row->enabled_p ? current_row->used[TEXT_AREA] : 0;
4906 change_line_highlight (desired_row->inverse_p, vpos, vpos, n);
4907 current_row->enabled_p = 0;
4908 }
4909 else
4910 reassert_line_highlight (desired_row->inverse_p, vpos);
4911
4912 /* Current row not enabled means it has unknown contents. We must
4913 write the whole desired line in that case. */
4914 must_write_whole_line_p = !current_row->enabled_p;
4915 if (must_write_whole_line_p)
4916 {
4917 obody = 0;
4918 olen = 0;
4919 }
4920 else
4921 {
4922 obody = MATRIX_ROW_GLYPH_START (current_matrix, vpos);
4923 olen = current_row->used[TEXT_AREA];
4924
4925 if (! current_row->inverse_p)
4926 {
4927 /* Ignore trailing spaces, if we can. */
4928 if (!must_write_spaces)
4929 while (olen > 0 && CHAR_GLYPH_SPACE_P (obody[olen-1]))
4930 olen--;
4931 }
4932 else
4933 {
4934 /* For an inverse-video line, make sure it's filled with
4935 spaces all the way to the frame edge so that the reverse
4936 video extends all the way across. */
4937 while (olen < FRAME_WIDTH (frame) - 1)
4938 obody[olen++] = space_glyph;
4939 }
4940 }
4941
4942 current_row->enabled_p = 1;
4943 current_row->used[TEXT_AREA] = desired_row->used[TEXT_AREA];
4944 current_row->inverse_p = desired_row->inverse_p;
4945
4946 /* If desired line is empty, just clear the line. */
4947 if (!desired_row->enabled_p)
4948 {
4949 nlen = 0;
4950 goto just_erase;
4951 }
4952
4953 nbody = desired_row->glyphs[TEXT_AREA];
4954 nlen = desired_row->used[TEXT_AREA];
4955 nend = nbody + nlen;
4956
4957 /* If display line has unknown contents, write the whole line. */
4958 if (must_write_whole_line_p)
4959 {
4960 /* Ignore spaces at the end, if we can. */
4961 if (!must_write_spaces)
4962 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1]))
4963 --nlen;
4964
4965 /* Write the contents of the desired line. */
4966 if (nlen)
4967 {
4968 cursor_to (vpos, 0);
4969 write_glyphs (nbody, nlen);
4970 }
4971
4972 /* Don't call clear_end_of_line if we already wrote the whole
4973 line. The cursor will not be at the right margin in that
4974 case but in the line below. */
4975 if (nlen < FRAME_WINDOW_WIDTH (frame))
4976 {
4977 cursor_to (vpos, nlen);
4978 clear_end_of_line (FRAME_WINDOW_WIDTH (frame));
4979 }
4980 else
4981 /* Make sure we are in the right row, otherwise cursor movement
4982 with cmgoto might use `ch' in the wrong row. */
4983 cursor_to (vpos, 0);
4984
4985 make_current (desired_matrix, current_matrix, vpos);
4986 return;
4987 }
4988
4989 /* Pretend trailing spaces are not there at all,
4990 unless for one reason or another we must write all spaces. */
4991 if (!desired_row->inverse_p)
4992 {
4993 if (!must_write_spaces)
4994 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1]))
4995 nlen--;
4996 }
4997 else
4998 {
4999 /* For an inverse-video line, give it extra trailing spaces all
5000 the way to the frame edge so that the reverse video extends
5001 all the way across. */
5002 while (nlen < FRAME_WIDTH (frame) - 1)
5003 nbody[nlen++] = space_glyph;
5004 }
5005
5006 /* If there's no i/d char, quickly do the best we can without it. */
5007 if (!char_ins_del_ok)
5008 {
5009 int i, j;
5010
5011 /* Find the first glyph in desired row that doesn't agree with
5012 a glyph in the current row, and write the rest from there on. */
5013 for (i = 0; i < nlen; i++)
5014 {
5015 if (i >= olen || !GLYPH_EQUAL_P (nbody + i, obody + i))
5016 {
5017 /* Find the end of the run of different glyphs. */
5018 j = i + 1;
5019 while (j < nlen
5020 && (j >= olen
5021 || !GLYPH_EQUAL_P (nbody + j, obody + j)
5022 || CHAR_GLYPH_PADDING_P (nbody[j])))
5023 ++j;
5024
5025 /* Output this run of non-matching chars. */
5026 cursor_to (vpos, i);
5027 write_glyphs (nbody + i, j - i);
5028 i = j - 1;
5029
5030 /* Now find the next non-match. */
5031 }
5032 }
5033
5034 /* Clear the rest of the line, or the non-clear part of it. */
5035 if (olen > nlen)
5036 {
5037 cursor_to (vpos, nlen);
5038 clear_end_of_line (olen);
5039 }
5040
5041 /* Make current row = desired row. */
5042 make_current (desired_matrix, current_matrix, vpos);
5043 return;
5044 }
5045
5046 /* Here when CHAR_INS_DEL_OK != 0, i.e. we can insert or delete
5047 characters in a row. */
5048
5049 if (!olen)
5050 {
5051 /* If current line is blank, skip over initial spaces, if
5052 possible, and write the rest. */
5053 if (must_write_spaces || desired_row->inverse_p)
5054 nsp = 0;
5055 else
5056 nsp = count_blanks (nbody, nlen);
5057
5058 if (nlen > nsp)
5059 {
5060 cursor_to (vpos, nsp);
5061 write_glyphs (nbody + nsp, nlen - nsp);
5062 }
5063
5064 /* Exchange contents between current_frame and new_frame. */
5065 make_current (desired_matrix, current_matrix, vpos);
5066 return;
5067 }
5068
5069 /* Compute number of leading blanks in old and new contents. */
5070 osp = count_blanks (obody, olen);
5071 nsp = desired_row->inverse_p ? 0 : count_blanks (nbody, nlen);
5072
5073 /* Compute number of matching chars starting with first non-blank. */
5074 begmatch = count_match (obody + osp, obody + olen,
5075 nbody + nsp, nbody + nlen);
5076
5077 /* Spaces in new match implicit space past the end of old. */
5078 /* A bug causing this to be a no-op was fixed in 18.29. */
5079 if (!must_write_spaces && osp + begmatch == olen)
5080 {
5081 np1 = nbody + nsp;
5082 while (np1 + begmatch < nend && CHAR_GLYPH_SPACE_P (np1[begmatch]))
5083 ++begmatch;
5084 }
5085
5086 /* Avoid doing insert/delete char
5087 just cause number of leading spaces differs
5088 when the following text does not match. */
5089 if (begmatch == 0 && osp != nsp)
5090 osp = nsp = min (osp, nsp);
5091
5092 /* Find matching characters at end of line */
5093 op1 = obody + olen;
5094 np1 = nbody + nlen;
5095 op2 = op1 + begmatch - min (olen - osp, nlen - nsp);
5096 while (op1 > op2
5097 && GLYPH_EQUAL_P (op1 - 1, np1 - 1))
5098 {
5099 op1--;
5100 np1--;
5101 }
5102 endmatch = obody + olen - op1;
5103
5104 /* tem gets the distance to insert or delete.
5105 endmatch is how many characters we save by doing so.
5106 Is it worth it? */
5107
5108 tem = (nlen - nsp) - (olen - osp);
5109 if (endmatch && tem
5110 && (!char_ins_del_ok || endmatch <= char_ins_del_cost (frame)[tem]))
5111 endmatch = 0;
5112
5113 /* nsp - osp is the distance to insert or delete.
5114 If that is nonzero, begmatch is known to be nonzero also.
5115 begmatch + endmatch is how much we save by doing the ins/del.
5116 Is it worth it? */
5117
5118 if (nsp != osp
5119 && (!char_ins_del_ok
5120 || begmatch + endmatch <= char_ins_del_cost (frame)[nsp - osp]))
5121 {
5122 begmatch = 0;
5123 endmatch = 0;
5124 osp = nsp = min (osp, nsp);
5125 }
5126
5127 /* Now go through the line, inserting, writing and
5128 deleting as appropriate. */
5129
5130 if (osp > nsp)
5131 {
5132 cursor_to (vpos, nsp);
5133 delete_glyphs (osp - nsp);
5134 }
5135 else if (nsp > osp)
5136 {
5137 /* If going to delete chars later in line
5138 and insert earlier in the line,
5139 must delete first to avoid losing data in the insert */
5140 if (endmatch && nlen < olen + nsp - osp)
5141 {
5142 cursor_to (vpos, nlen - endmatch + osp - nsp);
5143 delete_glyphs (olen + nsp - osp - nlen);
5144 olen = nlen - (nsp - osp);
5145 }
5146 cursor_to (vpos, osp);
5147 insert_glyphs (0, nsp - osp);
5148 }
5149 olen += nsp - osp;
5150
5151 tem = nsp + begmatch + endmatch;
5152 if (nlen != tem || olen != tem)
5153 {
5154 cursor_to (vpos, nsp + begmatch);
5155 if (!endmatch || nlen == olen)
5156 {
5157 /* If new text being written reaches right margin,
5158 there is no need to do clear-to-eol at the end.
5159 (and it would not be safe, since cursor is not
5160 going to be "at the margin" after the text is done) */
5161 if (nlen == FRAME_WINDOW_WIDTH (frame))
5162 olen = 0;
5163 write_glyphs (nbody + nsp + begmatch, nlen - tem);
5164 }
5165 else if (nlen > olen)
5166 {
5167 /* Here, we used to have the following simple code:
5168 ----------------------------------------
5169 write_glyphs (nbody + nsp + begmatch, olen - tem);
5170 insert_glyphs (nbody + nsp + begmatch + olen - tem, nlen - olen);
5171 ----------------------------------------
5172 but it doesn't work if nbody[nsp + begmatch + olen - tem]
5173 is a padding glyph. */
5174 int out = olen - tem; /* Columns to be overwritten originally. */
5175 int del;
5176
5177 /* Calculate columns we can actually overwrite. */
5178 while (CHAR_GLYPH_PADDING_P (nbody[nsp + begmatch + out])) out--;
5179 write_glyphs (nbody + nsp + begmatch, out);
5180 /* If we left columns to be overwritten, we must delete them. */
5181 del = olen - tem - out;
5182 if (del > 0) delete_glyphs (del);
5183 /* At last, we insert columns not yet written out. */
5184 insert_glyphs (nbody + nsp + begmatch + out, nlen - olen + del);
5185 olen = nlen;
5186 }
5187 else if (olen > nlen)
5188 {
5189 write_glyphs (nbody + nsp + begmatch, nlen - tem);
5190 delete_glyphs (olen - nlen);
5191 olen = nlen;
5192 }
5193 }
5194
5195 just_erase:
5196 /* If any unerased characters remain after the new line, erase them. */
5197 if (olen > nlen)
5198 {
5199 cursor_to (vpos, nlen);
5200 clear_end_of_line (olen);
5201 }
5202
5203 /* Exchange contents between current_frame and new_frame. */
5204 make_current (desired_matrix, current_matrix, vpos);
5205 }
5206
5207
5208 \f
5209 /***********************************************************************
5210 X/Y Position -> Buffer Position
5211 ***********************************************************************/
5212
5213 /* Return the character position of the character at window relative
5214 pixel position (*X, *Y). *X and *Y are adjusted to character
5215 boundaries. */
5216
5217 int
5218 buffer_posn_from_coords (w, x, y)
5219 struct window *w;
5220 int *x, *y;
5221 {
5222 struct it it;
5223 struct buffer *old_current_buffer = current_buffer;
5224 struct text_pos startp;
5225 int left_area_width;
5226
5227 current_buffer = XBUFFER (w->buffer);
5228 SET_TEXT_POS_FROM_MARKER (startp, w->start);
5229 CHARPOS (startp) = min (ZV, max (BEGV, CHARPOS (startp)));
5230 BYTEPOS (startp) = min (ZV_BYTE, max (BEGV_BYTE, BYTEPOS (startp)));
5231 start_display (&it, w, startp);
5232
5233 left_area_width = WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH (w);
5234 move_it_to (&it, -1, *x + it.first_visible_x - left_area_width, *y, -1,
5235 MOVE_TO_X | MOVE_TO_Y);
5236
5237 *x = it.current_x - it.first_visible_x + left_area_width;
5238 *y = it.current_y;
5239 current_buffer = old_current_buffer;
5240 return IT_CHARPOS (it);
5241 }
5242
5243
5244 /* Value is the string under window-relative coordinates X/Y in the
5245 mode or top line of window W, or nil if none. MODE_LINE_P non-zero
5246 means look at the mode line. *CHARPOS is set to the position in
5247 the string returned. */
5248
5249 Lisp_Object
5250 mode_line_string (w, x, y, mode_line_p, charpos)
5251 struct window *w;
5252 int x, y;
5253 int *charpos;
5254 {
5255 struct glyph_row *row;
5256 struct glyph *glyph, *end;
5257 struct frame *f = XFRAME (w->frame);
5258 int x0;
5259 Lisp_Object string = Qnil;
5260
5261 if (mode_line_p)
5262 row = MATRIX_MODE_LINE_ROW (w->current_matrix);
5263 else
5264 row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
5265
5266 if (row->mode_line_p && row->enabled_p)
5267 {
5268 /* The mode lines are displayed over scroll bars and bitmap
5269 areas, and X is window-relative. Correct X by the scroll bar
5270 and bitmap area width. */
5271 if (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f))
5272 x += FRAME_SCROLL_BAR_COLS (f) * CANON_X_UNIT (f);
5273 x += FRAME_LEFT_FLAGS_AREA_WIDTH (f);
5274
5275 /* Find the glyph under X. If we find one with a string object,
5276 it's the one we were looking for. */
5277 glyph = row->glyphs[TEXT_AREA];
5278 end = glyph + row->used[TEXT_AREA];
5279 for (x0 = 0; glyph < end; x0 += glyph->pixel_width, ++glyph)
5280 if (x >= x0 && x < x0 + glyph->pixel_width)
5281 {
5282 string = glyph->object;
5283 *charpos = glyph->charpos;
5284 break;
5285 }
5286 }
5287
5288 return string;
5289 }
5290
5291
5292 /***********************************************************************
5293 Changing Frame Sizes
5294 ***********************************************************************/
5295
5296 #ifdef SIGWINCH
5297
5298 SIGTYPE
5299 window_change_signal (signalnum) /* If we don't have an argument, */
5300 int signalnum; /* some compilers complain in signal calls. */
5301 {
5302 int width, height;
5303 extern int errno;
5304 int old_errno = errno;
5305
5306 get_frame_size (&width, &height);
5307
5308 /* The frame size change obviously applies to a termcap-controlled
5309 frame. Find such a frame in the list, and assume it's the only
5310 one (since the redisplay code always writes to stdout, not a
5311 FILE * specified in the frame structure). Record the new size,
5312 but don't reallocate the data structures now. Let that be done
5313 later outside of the signal handler. */
5314
5315 {
5316 Lisp_Object tail, frame;
5317
5318 FOR_EACH_FRAME (tail, frame)
5319 {
5320 if (FRAME_TERMCAP_P (XFRAME (frame)))
5321 {
5322 change_frame_size (XFRAME (frame), height, width, 0, 1, 0);
5323 break;
5324 }
5325 }
5326 }
5327
5328 signal (SIGWINCH, window_change_signal);
5329 errno = old_errno;
5330 }
5331 #endif /* SIGWINCH */
5332
5333
5334 /* Do any change in frame size that was requested by a signal. SAFE
5335 non-zero means this function is called from a place where it is
5336 safe to change frame sizes while a redisplay is in progress. */
5337
5338 void
5339 do_pending_window_change (safe)
5340 int safe;
5341 {
5342 /* If window_change_signal should have run before, run it now. */
5343 if (redisplaying_p && !safe)
5344 return;
5345
5346 while (delayed_size_change)
5347 {
5348 Lisp_Object tail, frame;
5349
5350 delayed_size_change = 0;
5351
5352 FOR_EACH_FRAME (tail, frame)
5353 {
5354 struct frame *f = XFRAME (frame);
5355
5356 int height = FRAME_NEW_HEIGHT (f);
5357 int width = FRAME_NEW_WIDTH (f);
5358
5359 if (height != 0 || width != 0)
5360 change_frame_size (f, height, width, 0, 0, safe);
5361 }
5362 }
5363 }
5364
5365
5366 /* Change the frame height and/or width. Values may be given as zero to
5367 indicate no change is to take place.
5368
5369 If DELAY is non-zero, then assume we're being called from a signal
5370 handler, and queue the change for later - perhaps the next
5371 redisplay. Since this tries to resize windows, we can't call it
5372 from a signal handler.
5373
5374 SAFE non-zero means this function is called from a place where it's
5375 safe to change frame sizes while a redisplay is in progress. */
5376
5377 void
5378 change_frame_size (f, newheight, newwidth, pretend, delay, safe)
5379 register struct frame *f;
5380 int newheight, newwidth, pretend, delay, safe;
5381 {
5382 Lisp_Object tail, frame;
5383
5384 if (! FRAME_WINDOW_P (f))
5385 {
5386 /* When using termcap, or on MS-DOS, all frames use
5387 the same screen, so a change in size affects all frames. */
5388 FOR_EACH_FRAME (tail, frame)
5389 if (! FRAME_WINDOW_P (XFRAME (frame)))
5390 change_frame_size_1 (XFRAME (frame), newheight, newwidth,
5391 pretend, delay, safe);
5392 }
5393 else
5394 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe);
5395 }
5396
5397 static void
5398 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe)
5399 register struct frame *f;
5400 int newheight, newwidth, pretend, delay, safe;
5401 {
5402 int new_frame_window_width;
5403 int count = specpdl_ptr - specpdl;
5404
5405 /* If we can't deal with the change now, queue it for later. */
5406 if (delay || (redisplaying_p && !safe))
5407 {
5408 FRAME_NEW_HEIGHT (f) = newheight;
5409 FRAME_NEW_WIDTH (f) = newwidth;
5410 delayed_size_change = 1;
5411 return;
5412 }
5413
5414 /* This size-change overrides any pending one for this frame. */
5415 FRAME_NEW_HEIGHT (f) = 0;
5416 FRAME_NEW_WIDTH (f) = 0;
5417
5418 /* If an argument is zero, set it to the current value. */
5419 if (newheight == 0)
5420 newheight = FRAME_HEIGHT (f);
5421 if (newwidth == 0)
5422 newwidth = FRAME_WIDTH (f);
5423
5424 /* Compute width of windows in F.
5425 This is the width of the frame without vertical scroll bars. */
5426 new_frame_window_width = FRAME_WINDOW_WIDTH_ARG (f, newwidth);
5427
5428 /* Round up to the smallest acceptable size. */
5429 check_frame_size (f, &newheight, &newwidth);
5430
5431 /* If we're not changing the frame size, quit now. */
5432 if (newheight == FRAME_HEIGHT (f)
5433 && new_frame_window_width == FRAME_WINDOW_WIDTH (f))
5434 return;
5435
5436 BLOCK_INPUT;
5437
5438 #ifdef MSDOS
5439 /* We only can set screen dimensions to certain values supported
5440 by our video hardware. Try to find the smallest size greater
5441 or equal to the requested dimensions. */
5442 dos_set_window_size (&newheight, &newwidth);
5443 #endif
5444
5445 if (newheight != FRAME_HEIGHT (f))
5446 {
5447 if (FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))
5448 {
5449 /* Frame has both root and mini-buffer. */
5450 XSETFASTINT (XWINDOW (FRAME_ROOT_WINDOW (f))->top,
5451 FRAME_TOP_MARGIN (f));
5452 set_window_height (FRAME_ROOT_WINDOW (f),
5453 (newheight
5454 - 1
5455 - FRAME_TOP_MARGIN (f)),
5456 0);
5457 XSETFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top,
5458 newheight - 1);
5459 set_window_height (FRAME_MINIBUF_WINDOW (f), 1, 0);
5460 }
5461 else
5462 /* Frame has just one top-level window. */
5463 set_window_height (FRAME_ROOT_WINDOW (f),
5464 newheight - FRAME_TOP_MARGIN (f), 0);
5465
5466 if (FRAME_TERMCAP_P (f) && !pretend)
5467 FrameRows = newheight;
5468 }
5469
5470 if (new_frame_window_width != FRAME_WINDOW_WIDTH (f))
5471 {
5472 set_window_width (FRAME_ROOT_WINDOW (f), new_frame_window_width, 0);
5473 if (FRAME_HAS_MINIBUF_P (f))
5474 set_window_width (FRAME_MINIBUF_WINDOW (f), new_frame_window_width, 0);
5475
5476 if (FRAME_TERMCAP_P (f) && !pretend)
5477 FrameCols = newwidth;
5478
5479 if (WINDOWP (f->tool_bar_window))
5480 XSETFASTINT (XWINDOW (f->tool_bar_window)->width, newwidth);
5481 }
5482
5483 FRAME_HEIGHT (f) = newheight;
5484 SET_FRAME_WIDTH (f, newwidth);
5485
5486 {
5487 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
5488 int text_area_x, text_area_y, text_area_width, text_area_height;
5489
5490 window_box (w, TEXT_AREA, &text_area_x, &text_area_y, &text_area_width,
5491 &text_area_height);
5492 if (w->cursor.x >= text_area_x + text_area_width)
5493 w->cursor.hpos = w->cursor.x = 0;
5494 if (w->cursor.y >= text_area_y + text_area_height)
5495 w->cursor.vpos = w->cursor.y = 0;
5496 }
5497
5498 adjust_glyphs (f);
5499 SET_FRAME_GARBAGED (f);
5500 calculate_costs (f);
5501
5502 UNBLOCK_INPUT;
5503
5504 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
5505
5506 /* This isn't quite a no-op: it runs window-configuration-change-hook. */
5507 Fset_window_buffer (FRAME_SELECTED_WINDOW (f),
5508 XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer);
5509
5510 unbind_to (count, Qnil);
5511 }
5512
5513
5514 \f
5515 /***********************************************************************
5516 Terminal Related Lisp Functions
5517 ***********************************************************************/
5518
5519 DEFUN ("open-termscript", Fopen_termscript, Sopen_termscript,
5520 1, 1, "FOpen termscript file: ",
5521 "Start writing all terminal output to FILE as well as the terminal.\n\
5522 FILE = nil means just close any termscript file currently open.")
5523 (file)
5524 Lisp_Object file;
5525 {
5526 if (termscript != 0) fclose (termscript);
5527 termscript = 0;
5528
5529 if (! NILP (file))
5530 {
5531 file = Fexpand_file_name (file, Qnil);
5532 termscript = fopen (XSTRING (file)->data, "w");
5533 if (termscript == 0)
5534 report_file_error ("Opening termscript", Fcons (file, Qnil));
5535 }
5536 return Qnil;
5537 }
5538
5539
5540 DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
5541 Ssend_string_to_terminal, 1, 1, 0,
5542 "Send STRING to the terminal without alteration.\n\
5543 Control characters in STRING will have terminal-dependent effects.")
5544 (string)
5545 Lisp_Object string;
5546 {
5547 /* ??? Perhaps we should do something special for multibyte strings here. */
5548 CHECK_STRING (string, 0);
5549 fwrite (XSTRING (string)->data, 1, STRING_BYTES (XSTRING (string)), stdout);
5550 fflush (stdout);
5551 if (termscript)
5552 {
5553 fwrite (XSTRING (string)->data, 1, STRING_BYTES (XSTRING (string)),
5554 termscript);
5555 fflush (termscript);
5556 }
5557 return Qnil;
5558 }
5559
5560
5561 DEFUN ("ding", Fding, Sding, 0, 1, 0,
5562 "Beep, or flash the screen.\n\
5563 Also, unless an argument is given,\n\
5564 terminate any keyboard macro currently executing.")
5565 (arg)
5566 Lisp_Object arg;
5567 {
5568 if (!NILP (arg))
5569 {
5570 if (noninteractive)
5571 putchar (07);
5572 else
5573 ring_bell ();
5574 fflush (stdout);
5575 }
5576 else
5577 bitch_at_user ();
5578
5579 return Qnil;
5580 }
5581
5582 void
5583 bitch_at_user ()
5584 {
5585 if (noninteractive)
5586 putchar (07);
5587 else if (!INTERACTIVE) /* Stop executing a keyboard macro. */
5588 error ("Keyboard macro terminated by a command ringing the bell");
5589 else
5590 ring_bell ();
5591 fflush (stdout);
5592 }
5593
5594
5595 \f
5596 /***********************************************************************
5597 Sleeping, Waiting
5598 ***********************************************************************/
5599
5600 DEFUN ("sleep-for", Fsleep_for, Ssleep_for, 1, 2, 0,
5601 "Pause, without updating display, for SECONDS seconds.\n\
5602 SECONDS may be a floating-point value, meaning that you can wait for a\n\
5603 fraction of a second. Optional second arg MILLISECONDS specifies an\n\
5604 additional wait period, in milliseconds; this may be useful if your\n\
5605 Emacs was built without floating point support.\n\
5606 \(Not all operating systems support waiting for a fraction of a second.)")
5607 (seconds, milliseconds)
5608 Lisp_Object seconds, milliseconds;
5609 {
5610 int sec, usec;
5611
5612 if (NILP (milliseconds))
5613 XSETINT (milliseconds, 0);
5614 else
5615 CHECK_NUMBER (milliseconds, 1);
5616 usec = XINT (milliseconds) * 1000;
5617
5618 {
5619 double duration = extract_float (seconds);
5620 sec = (int) duration;
5621 usec += (duration - sec) * 1000000;
5622 }
5623
5624 #ifndef EMACS_HAS_USECS
5625 if (sec == 0 && usec != 0)
5626 error ("millisecond `sleep-for' not supported on %s", SYSTEM_TYPE);
5627 #endif
5628
5629 /* Assure that 0 <= usec < 1000000. */
5630 if (usec < 0)
5631 {
5632 /* We can't rely on the rounding being correct if user is negative. */
5633 if (-1000000 < usec)
5634 sec--, usec += 1000000;
5635 else
5636 sec -= -usec / 1000000, usec = 1000000 - (-usec % 1000000);
5637 }
5638 else
5639 sec += usec / 1000000, usec %= 1000000;
5640
5641 if (sec < 0 || (sec == 0 && usec == 0))
5642 return Qnil;
5643
5644 {
5645 Lisp_Object zero;
5646
5647 XSETFASTINT (zero, 0);
5648 wait_reading_process_input (sec, usec, zero, 0);
5649 }
5650
5651 /* We should always have wait_reading_process_input; we have a dummy
5652 implementation for systems which don't support subprocesses. */
5653 #if 0
5654 /* No wait_reading_process_input */
5655 immediate_quit = 1;
5656 QUIT;
5657
5658 #ifdef VMS
5659 sys_sleep (sec);
5660 #else /* not VMS */
5661 /* The reason this is done this way
5662 (rather than defined (H_S) && defined (H_T))
5663 is because the VMS preprocessor doesn't grok `defined' */
5664 #ifdef HAVE_SELECT
5665 EMACS_GET_TIME (end_time);
5666 EMACS_SET_SECS_USECS (timeout, sec, usec);
5667 EMACS_ADD_TIME (end_time, end_time, timeout);
5668
5669 while (1)
5670 {
5671 EMACS_GET_TIME (timeout);
5672 EMACS_SUB_TIME (timeout, end_time, timeout);
5673 if (EMACS_TIME_NEG_P (timeout)
5674 || !select (1, 0, 0, 0, &timeout))
5675 break;
5676 }
5677 #else /* not HAVE_SELECT */
5678 sleep (sec);
5679 #endif /* HAVE_SELECT */
5680 #endif /* not VMS */
5681
5682 immediate_quit = 0;
5683 #endif /* no subprocesses */
5684
5685 return Qnil;
5686 }
5687
5688
5689 /* This is just like wait_reading_process_input, except that
5690 it does the redisplay.
5691
5692 It's also much like Fsit_for, except that it can be used for
5693 waiting for input as well. */
5694
5695 Lisp_Object
5696 sit_for (sec, usec, reading, display, initial_display)
5697 int sec, usec, reading, display, initial_display;
5698 {
5699 Lisp_Object read_kbd;
5700
5701 swallow_events (display);
5702
5703 if (detect_input_pending_run_timers (display))
5704 return Qnil;
5705
5706 if (initial_display)
5707 redisplay_preserve_echo_area ();
5708
5709 if (sec == 0 && usec == 0)
5710 return Qt;
5711
5712 #ifdef SIGIO
5713 gobble_input (0);
5714 #endif
5715
5716 XSETINT (read_kbd, reading ? -1 : 1);
5717 wait_reading_process_input (sec, usec, read_kbd, display);
5718
5719 return detect_input_pending () ? Qnil : Qt;
5720 }
5721
5722
5723 DEFUN ("sit-for", Fsit_for, Ssit_for, 1, 3, 0,
5724 "Perform redisplay, then wait for SECONDS seconds or until input is available.\n\
5725 SECONDS may be a floating-point value, meaning that you can wait for a\n\
5726 fraction of a second. Optional second arg MILLISECONDS specifies an\n\
5727 additional wait period, in milliseconds; this may be useful if your\n\
5728 Emacs was built without floating point support.\n\
5729 \(Not all operating systems support waiting for a fraction of a second.)\n\
5730 Optional third arg NODISP non-nil means don't redisplay, just wait for input.\n\
5731 Redisplay is preempted as always if input arrives, and does not happen\n\
5732 if input is available before it starts.\n\
5733 Value is t if waited the full time with no input arriving.")
5734 (seconds, milliseconds, nodisp)
5735 Lisp_Object seconds, milliseconds, nodisp;
5736 {
5737 int sec, usec;
5738
5739 if (NILP (milliseconds))
5740 XSETINT (milliseconds, 0);
5741 else
5742 CHECK_NUMBER (milliseconds, 1);
5743 usec = XINT (milliseconds) * 1000;
5744
5745 {
5746 double duration = extract_float (seconds);
5747 sec = (int) duration;
5748 usec += (duration - sec) * 1000000;
5749 }
5750
5751 #ifndef EMACS_HAS_USECS
5752 if (usec != 0 && sec == 0)
5753 error ("millisecond `sit-for' not supported on %s", SYSTEM_TYPE);
5754 #endif
5755
5756 return sit_for (sec, usec, 0, NILP (nodisp), NILP (nodisp));
5757 }
5758
5759
5760 \f
5761 /***********************************************************************
5762 Other Lisp Functions
5763 ***********************************************************************/
5764
5765 /* A vector of size >= 2 * NFRAMES + 3 * NBUFFERS + 1, containing the
5766 session's frames, frame names, buffers, buffer-read-only flags, and
5767 buffer-modified-flags, and a trailing sentinel (so we don't need to
5768 add length checks). */
5769
5770 static Lisp_Object frame_and_buffer_state;
5771
5772
5773 DEFUN ("frame-or-buffer-changed-p", Fframe_or_buffer_changed_p,
5774 Sframe_or_buffer_changed_p, 0, 0, 0,
5775 "Return non-nil if the frame and buffer state appears to have changed.\n\
5776 The state variable is an internal vector containing all frames and buffers,\n\
5777 aside from buffers whose names start with space,\n\
5778 along with the buffers' read-only and modified flags, which allows a fast\n\
5779 check to see whether the menu bars might need to be recomputed.\n\
5780 If this function returns non-nil, it updates the internal vector to reflect\n\
5781 the current state.\n")
5782 ()
5783 {
5784 Lisp_Object tail, frame, buf;
5785 Lisp_Object *vecp;
5786 int n;
5787
5788 vecp = XVECTOR (frame_and_buffer_state)->contents;
5789 FOR_EACH_FRAME (tail, frame)
5790 {
5791 if (!EQ (*vecp++, frame))
5792 goto changed;
5793 if (!EQ (*vecp++, XFRAME (frame)->name))
5794 goto changed;
5795 }
5796 /* Check that the buffer info matches.
5797 No need to test for the end of the vector
5798 because the last element of the vector is lambda
5799 and that will always cause a mismatch. */
5800 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
5801 {
5802 buf = XCDR (XCAR (tail));
5803 /* Ignore buffers that aren't included in buffer lists. */
5804 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
5805 continue;
5806 if (!EQ (*vecp++, buf))
5807 goto changed;
5808 if (!EQ (*vecp++, XBUFFER (buf)->read_only))
5809 goto changed;
5810 if (!EQ (*vecp++, Fbuffer_modified_p (buf)))
5811 goto changed;
5812 }
5813 /* Detect deletion of a buffer at the end of the list. */
5814 if (EQ (*vecp, Qlambda))
5815 return Qnil;
5816 changed:
5817 /* Start with 1 so there is room for at least one lambda at the end. */
5818 n = 1;
5819 FOR_EACH_FRAME (tail, frame)
5820 n += 2;
5821 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
5822 n += 3;
5823 /* Reallocate the vector if it's grown, or if it's shrunk a lot. */
5824 if (n > XVECTOR (frame_and_buffer_state)->size
5825 || n + 20 < XVECTOR (frame_and_buffer_state)->size / 2)
5826 /* Add 20 extra so we grow it less often. */
5827 frame_and_buffer_state = Fmake_vector (make_number (n + 20), Qlambda);
5828 vecp = XVECTOR (frame_and_buffer_state)->contents;
5829 FOR_EACH_FRAME (tail, frame)
5830 {
5831 *vecp++ = frame;
5832 *vecp++ = XFRAME (frame)->name;
5833 }
5834 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
5835 {
5836 buf = XCDR (XCAR (tail));
5837 /* Ignore buffers that aren't included in buffer lists. */
5838 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ')
5839 continue;
5840 *vecp++ = buf;
5841 *vecp++ = XBUFFER (buf)->read_only;
5842 *vecp++ = Fbuffer_modified_p (buf);
5843 }
5844 /* Fill up the vector with lambdas (always at least one). */
5845 *vecp++ = Qlambda;
5846 while (vecp - XVECTOR (frame_and_buffer_state)->contents
5847 < XVECTOR (frame_and_buffer_state)->size)
5848 *vecp++ = Qlambda;
5849 /* Make sure we didn't overflow the vector. */
5850 if (vecp - XVECTOR (frame_and_buffer_state)->contents
5851 > XVECTOR (frame_and_buffer_state)->size)
5852 abort ();
5853 return Qt;
5854 }
5855
5856
5857 \f
5858 /***********************************************************************
5859 Initialization
5860 ***********************************************************************/
5861
5862 char *terminal_type;
5863
5864 /* Initialization done when Emacs fork is started, before doing stty.
5865 Determine terminal type and set terminal_driver. Then invoke its
5866 decoding routine to set up variables in the terminal package. */
5867
5868 void
5869 init_display ()
5870 {
5871 #ifdef HAVE_X_WINDOWS
5872 extern int display_arg;
5873 #endif
5874
5875 /* Construct the space glyph. */
5876 space_glyph.type = CHAR_GLYPH;
5877 SET_CHAR_GLYPH_FROM_GLYPH (space_glyph, ' ');
5878 space_glyph.charpos = -1;
5879
5880 meta_key = 0;
5881 inverse_video = 0;
5882 cursor_in_echo_area = 0;
5883 terminal_type = (char *) 0;
5884
5885 /* Now is the time to initialize this; it's used by init_sys_modes
5886 during startup. */
5887 Vwindow_system = Qnil;
5888
5889 /* If the user wants to use a window system, we shouldn't bother
5890 initializing the terminal. This is especially important when the
5891 terminal is so dumb that emacs gives up before and doesn't bother
5892 using the window system.
5893
5894 If the DISPLAY environment variable is set and nonempty,
5895 try to use X, and die with an error message if that doesn't work. */
5896
5897 #ifdef HAVE_X_WINDOWS
5898 if (! display_arg)
5899 {
5900 char *display;
5901 #ifdef VMS
5902 display = getenv ("DECW$DISPLAY");
5903 #else
5904 display = getenv ("DISPLAY");
5905 #endif
5906
5907 display_arg = (display != 0 && *display != 0);
5908 }
5909
5910 if (!inhibit_window_system && display_arg
5911 #ifndef CANNOT_DUMP
5912 && initialized
5913 #endif
5914 )
5915 {
5916 Vwindow_system = intern ("x");
5917 #ifdef HAVE_X11
5918 Vwindow_system_version = make_number (11);
5919 #else
5920 Vwindow_system_version = make_number (10);
5921 #endif
5922 #if defined (LINUX) && defined (HAVE_LIBNCURSES)
5923 /* In some versions of ncurses,
5924 tputs crashes if we have not called tgetent.
5925 So call tgetent. */
5926 { char b[2044]; tgetent (b, "xterm");}
5927 #endif
5928 adjust_frame_glyphs_initially ();
5929 return;
5930 }
5931 #endif /* HAVE_X_WINDOWS */
5932
5933 #ifdef HAVE_NTGUI
5934 if (!inhibit_window_system)
5935 {
5936 Vwindow_system = intern ("w32");
5937 Vwindow_system_version = make_number (1);
5938 adjust_frame_glyphs_initially ();
5939 return;
5940 }
5941 #endif /* HAVE_NTGUI */
5942
5943 /* If no window system has been specified, try to use the terminal. */
5944 if (! isatty (0))
5945 {
5946 fatal ("standard input is not a tty");
5947 exit (1);
5948 }
5949
5950 /* Look at the TERM variable */
5951 terminal_type = (char *) getenv ("TERM");
5952 if (!terminal_type)
5953 {
5954 #ifdef VMS
5955 fprintf (stderr, "Please specify your terminal type.\n\
5956 For types defined in VMS, use set term /device=TYPE.\n\
5957 For types not defined in VMS, use define emacs_term \"TYPE\".\n\
5958 \(The quotation marks are necessary since terminal types are lower case.)\n");
5959 #else
5960 fprintf (stderr, "Please set the environment variable TERM; see tset(1).\n");
5961 #endif
5962 exit (1);
5963 }
5964
5965 #ifdef VMS
5966 /* VMS DCL tends to up-case things, so down-case term type.
5967 Hardly any uppercase letters in terminal types; should be none. */
5968 {
5969 char *new = (char *) xmalloc (strlen (terminal_type) + 1);
5970 char *p;
5971
5972 strcpy (new, terminal_type);
5973
5974 for (p = new; *p; p++)
5975 if (isupper (*p))
5976 *p = tolower (*p);
5977
5978 terminal_type = new;
5979 }
5980 #endif /* VMS */
5981
5982 term_init (terminal_type);
5983
5984 {
5985 struct frame *sf = SELECTED_FRAME ();
5986 int width = FRAME_WINDOW_WIDTH (sf);
5987 int height = FRAME_HEIGHT (sf);
5988
5989 unsigned int total_glyphs = height * (width + 2) * sizeof (struct glyph);
5990
5991 /* If these sizes are so big they cause overflow, just ignore the
5992 change. It's not clear what better we could do. */
5993 if (total_glyphs / sizeof (struct glyph) / height != width + 2)
5994 fatal ("screen size %dx%d too big", width, height);
5995 }
5996
5997 adjust_frame_glyphs_initially ();
5998 calculate_costs (XFRAME (selected_frame));
5999
6000 #ifdef SIGWINCH
6001 #ifndef CANNOT_DUMP
6002 if (initialized)
6003 #endif /* CANNOT_DUMP */
6004 signal (SIGWINCH, window_change_signal);
6005 #endif /* SIGWINCH */
6006
6007 /* Set up faces of the initial terminal frame of a dumped Emacs. */
6008 if (initialized
6009 && !noninteractive
6010 #ifdef MSDOS
6011 /* The MSDOS terminal turns on its ``window system'' relatively
6012 late into the startup, so we cannot do the frame faces'
6013 initialization just yet. It will be done later by pc-win.el
6014 and internal_terminal_init. */
6015 && (strcmp (terminal_type, "internal") != 0 || inhibit_window_system)
6016 #endif
6017 && NILP (Vwindow_system))
6018 {
6019 /* For the initial frame, we don't have any way of knowing what
6020 are the foreground and background colors of the terminal. */
6021 struct frame *sf = SELECTED_FRAME();
6022
6023 FRAME_FOREGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_FG_COLOR;
6024 FRAME_BACKGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_BG_COLOR;
6025 call0 (intern ("tty-set-up-initial-frame-faces"));
6026 }
6027 }
6028
6029
6030 \f
6031 /***********************************************************************
6032 Blinking cursor
6033 ***********************************************************************/
6034
6035 DEFUN ("internal-show-cursor", Finternal_show_cursor,
6036 Sinternal_show_cursor, 2, 2, 0,
6037 "Set the cursor-visibility flag of WINDOW to SHOW.\n\
6038 WINDOW nil means use the selected window. SHOW non-nil means\n\
6039 show a cursor in WINDOW in the next redisplay. SHOW nil means\n\
6040 don't show a cursor.")
6041 (window, show)
6042 Lisp_Object window, show;
6043 {
6044 /* Don't change cursor state while redisplaying. This could confuse
6045 output routines. */
6046 if (!redisplaying_p)
6047 {
6048 if (NILP (window))
6049 window = selected_window;
6050 else
6051 CHECK_WINDOW (window, 2);
6052
6053 XWINDOW (window)->cursor_off_p = NILP (show);
6054 }
6055
6056 return Qnil;
6057 }
6058
6059
6060 DEFUN ("internal-show-cursor-p", Finternal_show_cursor_p,
6061 Sinternal_show_cursor_p, 0, 1, 0,
6062 "Value is non-nil if next redisplay will display a cursor in WINDOW.\n\
6063 WINDOW nil or omitted means report on the selected window.")
6064 (window)
6065 Lisp_Object window;
6066 {
6067 struct window *w;
6068
6069 if (NILP (window))
6070 window = selected_window;
6071 else
6072 CHECK_WINDOW (window, 2);
6073
6074 w = XWINDOW (window);
6075 return w->cursor_off_p ? Qnil : Qt;
6076 }
6077
6078 \f
6079 /***********************************************************************
6080 Initialization
6081 ***********************************************************************/
6082
6083 void
6084 syms_of_display ()
6085 {
6086 defsubr (&Sredraw_frame);
6087 defsubr (&Sredraw_display);
6088 defsubr (&Sframe_or_buffer_changed_p);
6089 defsubr (&Sopen_termscript);
6090 defsubr (&Sding);
6091 defsubr (&Ssit_for);
6092 defsubr (&Ssleep_for);
6093 defsubr (&Ssend_string_to_terminal);
6094 defsubr (&Sinternal_show_cursor);
6095 defsubr (&Sinternal_show_cursor_p);
6096
6097 frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda);
6098 staticpro (&frame_and_buffer_state);
6099
6100 Qdisplay_table = intern ("display-table");
6101 staticpro (&Qdisplay_table);
6102
6103 DEFVAR_INT ("baud-rate", &baud_rate,
6104 "*The output baud rate of the terminal.\n\
6105 On most systems, changing this value will affect the amount of padding\n\
6106 and the other strategic decisions made during redisplay.");
6107
6108 DEFVAR_BOOL ("inverse-video", &inverse_video,
6109 "*Non-nil means invert the entire frame display.\n\
6110 This means everything is in inverse video which otherwise would not be.");
6111
6112 DEFVAR_BOOL ("visible-bell", &visible_bell,
6113 "*Non-nil means try to flash the frame to represent a bell.");
6114
6115 DEFVAR_BOOL ("no-redraw-on-reenter", &no_redraw_on_reenter,
6116 "*Non-nil means no need to redraw entire frame after suspending.\n\
6117 A non-nil value is useful if the terminal can automatically preserve\n\
6118 Emacs's frame display when you reenter Emacs.\n\
6119 It is up to you to set this variable if your terminal can do that.");
6120
6121 DEFVAR_LISP ("window-system", &Vwindow_system,
6122 "A symbol naming the window-system under which Emacs is running\n\
6123 \(such as `x'), or nil if emacs is running on an ordinary terminal.");
6124
6125 DEFVAR_LISP ("window-system-version", &Vwindow_system_version,
6126 "The version number of the window system in use.\n\
6127 For X windows, this is 10 or 11.");
6128
6129 DEFVAR_BOOL ("cursor-in-echo-area", &cursor_in_echo_area,
6130 "Non-nil means put cursor in minibuffer, at end of any message there.");
6131
6132 DEFVAR_LISP ("glyph-table", &Vglyph_table,
6133 "Table defining how to output a glyph code to the frame.\n\
6134 If not nil, this is a vector indexed by glyph code to define the glyph.\n\
6135 Each element can be:\n\
6136 integer: a glyph code which this glyph is an alias for.\n\
6137 string: output this glyph using that string (not impl. in X windows).\n\
6138 nil: this glyph mod 256 is char code to output,\n\
6139 and this glyph / 256 is face code for X windows (see `face-id').");
6140 Vglyph_table = Qnil;
6141
6142 DEFVAR_LISP ("standard-display-table", &Vstandard_display_table,
6143 "Display table to use for buffers that specify none.\n\
6144 See `buffer-display-table' for more information.");
6145 Vstandard_display_table = Qnil;
6146
6147 DEFVAR_BOOL ("redisplay-dont-pause", &redisplay_dont_pause,
6148 "*Non-nil means update isn't paused when input is detected.");
6149 redisplay_dont_pause = 0;
6150
6151 /* Initialize `window-system', unless init_display already decided it. */
6152 #ifdef CANNOT_DUMP
6153 if (noninteractive)
6154 #endif
6155 {
6156 Vwindow_system = Qnil;
6157 Vwindow_system_version = Qnil;
6158 }
6159 }