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