Merge chages made in Gnus trunk.
[emacs.git] / src / dispnew.c
blob061058b1465d09c34e7d4a3e8979ce93a0e776ad
1 /* Updating of data structures for redisplay.
2 Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995,
3 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
22 #include <signal.h>
23 #include <stdio.h>
24 #include <ctype.h>
25 #include <setjmp.h>
26 #include <unistd.h>
28 #include "lisp.h"
29 #include "termchar.h"
30 #include "termopts.h"
31 /* cm.h must come after dispextern.h on Windows. */
32 #include "dispextern.h"
33 #include "cm.h"
34 #include "buffer.h"
35 #include "character.h"
36 #include "keyboard.h"
37 #include "frame.h"
38 #include "termhooks.h"
39 #include "window.h"
40 #include "commands.h"
41 #include "disptab.h"
42 #include "indent.h"
43 #include "intervals.h"
44 #include "blockinput.h"
45 #include "process.h"
47 #include "syssignal.h"
49 #ifdef HAVE_X_WINDOWS
50 #include "xterm.h"
51 #endif /* HAVE_X_WINDOWS */
53 #ifdef HAVE_NTGUI
54 #include "w32term.h"
55 #endif /* HAVE_NTGUI */
57 #ifdef HAVE_NS
58 #include "nsterm.h"
59 #endif
61 /* Include systime.h after xterm.h to avoid double inclusion of time.h. */
63 #include "systime.h"
64 #include <errno.h>
66 /* Get number of chars of output now in the buffer of a stdio stream.
67 This ought to be built in in stdio, but it isn't. Some s- files
68 override this because their stdio internals differ. */
70 #ifdef __GNU_LIBRARY__
72 /* The s- file might have overridden the definition with one that
73 works for the system's C library. But we are using the GNU C
74 library, so this is the right definition for every system. */
76 #ifdef GNU_LIBRARY_PENDING_OUTPUT_COUNT
77 #define PENDING_OUTPUT_COUNT GNU_LIBRARY_PENDING_OUTPUT_COUNT
78 #else
79 #undef PENDING_OUTPUT_COUNT
80 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->__bufp - (FILE)->__buffer)
81 #endif
82 #else /* not __GNU_LIBRARY__ */
83 #if !defined (PENDING_OUTPUT_COUNT) && HAVE_STDIO_EXT_H && HAVE___FPENDING
84 #include <stdio_ext.h>
85 #define PENDING_OUTPUT_COUNT(FILE) __fpending (FILE)
86 #endif
87 #ifndef PENDING_OUTPUT_COUNT
88 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_ptr - (FILE)->_base)
89 #endif
90 #endif /* not __GNU_LIBRARY__ */
92 #if defined(HAVE_TERM_H) && defined (GNU_LINUX) && defined (HAVE_LIBNCURSES)
93 #include <term.h> /* for tgetent */
94 #endif
96 /* Structure to pass dimensions around. Used for character bounding
97 boxes, glyph matrix dimensions and alike. */
99 struct dim
101 int width;
102 int height;
106 /* Function prototypes. */
108 static struct glyph_matrix *save_current_matrix (struct frame *);
109 static void restore_current_matrix (struct frame *, struct glyph_matrix *);
110 static int showing_window_margins_p (struct window *);
111 static void fake_current_matrices (Lisp_Object);
112 static void redraw_overlapping_rows (struct window *, int);
113 static void redraw_overlapped_rows (struct window *, int);
114 static int count_blanks (struct glyph *, int);
115 static int count_match (struct glyph *, struct glyph *,
116 struct glyph *, struct glyph *);
117 static unsigned line_draw_cost (struct glyph_matrix *, int);
118 static void update_frame_line (struct frame *, int);
119 static struct dim allocate_matrices_for_frame_redisplay
120 (Lisp_Object, int, int, int, int *);
121 static int required_matrix_height (struct window *);
122 static int required_matrix_width (struct window *);
123 static void allocate_matrices_for_window_redisplay (struct window *);
124 static int realloc_glyph_pool (struct glyph_pool *, struct dim);
125 static void adjust_frame_glyphs (struct frame *);
126 struct glyph_matrix *new_glyph_matrix (struct glyph_pool *);
127 static void free_glyph_matrix (struct glyph_matrix *);
128 static void adjust_glyph_matrix (struct window *, struct glyph_matrix *,
129 int, int, struct dim);
130 static void change_frame_size_1 (struct frame *, int, int, int, int, int);
131 static void swap_glyph_pointers (struct glyph_row *, struct glyph_row *);
132 #if GLYPH_DEBUG
133 static int glyph_row_slice_p (struct glyph_row *, struct glyph_row *);
134 #endif
135 static void fill_up_frame_row_with_spaces (struct glyph_row *, int);
136 static void build_frame_matrix_from_window_tree (struct glyph_matrix *,
137 struct window *);
138 static void build_frame_matrix_from_leaf_window (struct glyph_matrix *,
139 struct window *);
140 static struct glyph_pool *new_glyph_pool (void);
141 static void free_glyph_pool (struct glyph_pool *);
142 static void adjust_frame_glyphs_initially (void);
143 static void adjust_frame_message_buffer (struct frame *);
144 static void adjust_decode_mode_spec_buffer (struct frame *);
145 static void fill_up_glyph_row_with_spaces (struct glyph_row *);
146 static void build_frame_matrix (struct frame *);
147 void clear_current_matrices (struct frame *);
148 void scroll_glyph_matrix_range (struct glyph_matrix *, int, int,
149 int, int);
150 static void clear_window_matrices (struct window *, int);
151 static void fill_up_glyph_row_area_with_spaces (struct glyph_row *, int);
152 static int scrolling_window (struct window *, int);
153 static int update_window_line (struct window *, int, int *);
154 static void update_marginal_area (struct window *, int, int);
155 static int update_text_area (struct window *, int);
156 static void make_current (struct glyph_matrix *, struct glyph_matrix *,
157 int);
158 static void mirror_make_current (struct window *, int);
159 void check_window_matrix_pointers (struct window *);
160 #if GLYPH_DEBUG
161 static void check_matrix_pointers (struct glyph_matrix *,
162 struct glyph_matrix *);
163 #endif
164 static void mirror_line_dance (struct window *, int, int, int *, char *);
165 static int update_window_tree (struct window *, int);
166 static int update_window (struct window *, int);
167 static int update_frame_1 (struct frame *, int, int);
168 static void set_window_cursor_after_update (struct window *);
169 static void adjust_frame_glyphs_for_window_redisplay (struct frame *);
170 static void adjust_frame_glyphs_for_frame_redisplay (struct frame *);
173 /* Define PERIODIC_PREEMPTION_CHECKING to 1, if micro-second timers
174 are supported, so we can check for input during redisplay at
175 regular intervals. */
176 #ifdef EMACS_HAS_USECS
177 #define PERIODIC_PREEMPTION_CHECKING 1
178 #else
179 #define PERIODIC_PREEMPTION_CHECKING 0
180 #endif
182 #if PERIODIC_PREEMPTION_CHECKING
184 /* Redisplay preemption timers. */
186 static EMACS_TIME preemption_period;
187 static EMACS_TIME preemption_next_check;
189 #endif
191 /* Nonzero upon entry to redisplay means do not assume anything about
192 current contents of actual terminal frame; clear and redraw it. */
194 int frame_garbaged;
196 /* Nonzero means last display completed. Zero means it was preempted. */
198 int display_completed;
200 Lisp_Object Qdisplay_table, Qredisplay_dont_pause;
203 /* The currently selected frame. In a single-frame version, this
204 variable always equals the_only_frame. */
206 Lisp_Object selected_frame;
208 /* A frame which is not just a mini-buffer, or 0 if there are no such
209 frames. This is usually the most recent such frame that was
210 selected. In a single-frame version, this variable always holds
211 the address of the_only_frame. */
213 struct frame *last_nonminibuf_frame;
215 /* 1 means SIGWINCH happened when not safe. */
217 int delayed_size_change;
219 /* 1 means glyph initialization has been completed at startup. */
221 static int glyphs_initialized_initially_p;
223 /* Updated window if != 0. Set by update_window. */
225 struct window *updated_window;
227 /* Glyph row updated in update_window_line, and area that is updated. */
229 struct glyph_row *updated_row;
230 int updated_area;
232 /* A glyph for a space. */
234 struct glyph space_glyph;
236 /* Counts of allocated structures. These counts serve to diagnose
237 memory leaks and double frees. */
239 int glyph_matrix_count;
240 int glyph_pool_count;
242 /* If non-null, the frame whose frame matrices are manipulated. If
243 null, window matrices are worked on. */
245 static struct frame *frame_matrix_frame;
247 /* Non-zero means that fonts have been loaded since the last glyph
248 matrix adjustments. Redisplay must stop, and glyph matrices must
249 be adjusted when this flag becomes non-zero during display. The
250 reason fonts can be loaded so late is that fonts of fontsets are
251 loaded on demand. Another reason is that a line contains many
252 characters displayed by zero width or very narrow glyphs of
253 variable-width fonts. */
255 int fonts_changed_p;
257 /* Convert vpos and hpos from frame to window and vice versa.
258 This may only be used for terminal frames. */
260 #if GLYPH_DEBUG
262 static int window_to_frame_vpos (struct window *, int);
263 static int window_to_frame_hpos (struct window *, int);
264 #define WINDOW_TO_FRAME_VPOS(W, VPOS) window_to_frame_vpos ((W), (VPOS))
265 #define WINDOW_TO_FRAME_HPOS(W, HPOS) window_to_frame_hpos ((W), (HPOS))
267 /* One element of the ring buffer containing redisplay history
268 information. */
270 struct redisplay_history
272 char trace[512 + 100];
275 /* The size of the history buffer. */
277 #define REDISPLAY_HISTORY_SIZE 30
279 /* The redisplay history buffer. */
281 static struct redisplay_history redisplay_history[REDISPLAY_HISTORY_SIZE];
283 /* Next free entry in redisplay_history. */
285 static int history_idx;
287 /* A tick that's incremented each time something is added to the
288 history. */
290 static unsigned history_tick;
292 static void add_frame_display_history (struct frame *, int);
293 static void add_window_display_history (struct window *, char *, int);
295 /* Add to the redisplay history how window W has been displayed.
296 MSG is a trace containing the information how W's glyph matrix
297 has been constructed. PAUSED_P non-zero means that the update
298 has been interrupted for pending input. */
300 static void
301 add_window_display_history (struct window *w, char *msg, int paused_p)
303 char *buf;
305 if (history_idx >= REDISPLAY_HISTORY_SIZE)
306 history_idx = 0;
307 buf = redisplay_history[history_idx].trace;
308 ++history_idx;
310 sprintf (buf, "%d: window %p (`%s')%s\n",
311 history_tick++,
313 ((BUFFERP (w->buffer)
314 && STRINGP (XBUFFER (w->buffer)->name))
315 ? (char *) SDATA (XBUFFER (w->buffer)->name)
316 : "???"),
317 paused_p ? " ***paused***" : "");
318 strcat (buf, msg);
322 /* Add to the redisplay history that frame F has been displayed.
323 PAUSED_P non-zero means that the update has been interrupted for
324 pending input. */
326 static void
327 add_frame_display_history (struct frame *f, int paused_p)
329 char *buf;
331 if (history_idx >= REDISPLAY_HISTORY_SIZE)
332 history_idx = 0;
333 buf = redisplay_history[history_idx].trace;
334 ++history_idx;
336 sprintf (buf, "%d: update frame %p%s",
337 history_tick++,
338 f, paused_p ? " ***paused***" : "");
342 DEFUN ("dump-redisplay-history", Fdump_redisplay_history,
343 Sdump_redisplay_history, 0, 0, "",
344 doc: /* Dump redisplay history to stderr. */)
345 (void)
347 int i;
349 for (i = history_idx - 1; i != history_idx; --i)
351 if (i < 0)
352 i = REDISPLAY_HISTORY_SIZE - 1;
353 fprintf (stderr, "%s\n", redisplay_history[i].trace);
356 return Qnil;
360 #else /* GLYPH_DEBUG == 0 */
362 #define WINDOW_TO_FRAME_VPOS(W, VPOS) ((VPOS) + WINDOW_TOP_EDGE_LINE (W))
363 #define WINDOW_TO_FRAME_HPOS(W, HPOS) ((HPOS) + WINDOW_LEFT_EDGE_COL (W))
365 #endif /* GLYPH_DEBUG == 0 */
368 #if defined PROFILING && !HAVE___EXECUTABLE_START
369 /* FIXME: only used to find text start for profiling. */
371 void
372 safe_bcopy (const char *from, char *to, int size)
374 abort ();
376 #endif
378 /***********************************************************************
379 Glyph Matrices
380 ***********************************************************************/
382 /* Allocate and return a glyph_matrix structure. POOL is the glyph
383 pool from which memory for the matrix should be allocated, or null
384 for window-based redisplay where no glyph pools are used. The
385 member `pool' of the glyph matrix structure returned is set to
386 POOL, the structure is otherwise zeroed. */
388 struct glyph_matrix *
389 new_glyph_matrix (struct glyph_pool *pool)
391 struct glyph_matrix *result;
393 /* Allocate and clear. */
394 result = (struct glyph_matrix *) xmalloc (sizeof *result);
395 memset (result, 0, sizeof *result);
397 /* Increment number of allocated matrices. This count is used
398 to detect memory leaks. */
399 ++glyph_matrix_count;
401 /* Set pool and return. */
402 result->pool = pool;
403 return result;
407 /* Free glyph matrix MATRIX. Passing in a null MATRIX is allowed.
409 The global counter glyph_matrix_count is decremented when a matrix
410 is freed. If the count gets negative, more structures were freed
411 than allocated, i.e. one matrix was freed more than once or a bogus
412 pointer was passed to this function.
414 If MATRIX->pool is null, this means that the matrix manages its own
415 glyph memory---this is done for matrices on X frames. Freeing the
416 matrix also frees the glyph memory in this case. */
418 static void
419 free_glyph_matrix (struct glyph_matrix *matrix)
421 if (matrix)
423 int i;
425 /* Detect the case that more matrices are freed than were
426 allocated. */
427 if (--glyph_matrix_count < 0)
428 abort ();
430 /* Free glyph memory if MATRIX owns it. */
431 if (matrix->pool == NULL)
432 for (i = 0; i < matrix->rows_allocated; ++i)
433 xfree (matrix->rows[i].glyphs[LEFT_MARGIN_AREA]);
435 /* Free row structures and the matrix itself. */
436 xfree (matrix->rows);
437 xfree (matrix);
442 /* Return the number of glyphs to reserve for a marginal area of
443 window W. TOTAL_GLYPHS is the number of glyphs in a complete
444 display line of window W. MARGIN gives the width of the marginal
445 area in canonical character units. MARGIN should be an integer
446 or a float. */
448 static int
449 margin_glyphs_to_reserve (struct window *w, int total_glyphs, Lisp_Object margin)
451 int n;
453 if (NUMBERP (margin))
455 int width = XFASTINT (w->total_cols);
456 double d = max (0, XFLOATINT (margin));
457 d = min (width / 2 - 1, d);
458 n = (int) ((double) total_glyphs / width * d);
460 else
461 n = 0;
463 return n;
467 /* Adjust glyph matrix MATRIX on window W or on a frame to changed
468 window sizes.
470 W is null if the function is called for a frame glyph matrix.
471 Otherwise it is the window MATRIX is a member of. X and Y are the
472 indices of the first column and row of MATRIX within the frame
473 matrix, if such a matrix exists. They are zero for purely
474 window-based redisplay. DIM is the needed size of the matrix.
476 In window-based redisplay, where no frame matrices exist, glyph
477 matrices manage their own glyph storage. Otherwise, they allocate
478 storage from a common frame glyph pool which can be found in
479 MATRIX->pool.
481 The reason for this memory management strategy is to avoid complete
482 frame redraws if possible. When we allocate from a common pool, a
483 change of the location or size of a sub-matrix within the pool
484 requires a complete redisplay of the frame because we cannot easily
485 make sure that the current matrices of all windows still agree with
486 what is displayed on the screen. While this is usually fast, it
487 leads to screen flickering. */
489 static void
490 adjust_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int x, int y, struct dim dim)
492 int i;
493 int new_rows;
494 int marginal_areas_changed_p = 0;
495 int header_line_changed_p = 0;
496 int header_line_p = 0;
497 int left = -1, right = -1;
498 int window_width = -1, window_height = -1;
500 /* See if W had a header line that has disappeared now, or vice versa.
501 Get W's size. */
502 if (w)
504 window_box (w, -1, 0, 0, &window_width, &window_height);
506 header_line_p = WINDOW_WANTS_HEADER_LINE_P (w);
507 header_line_changed_p = header_line_p != matrix->header_line_p;
509 matrix->header_line_p = header_line_p;
511 /* If POOL is null, MATRIX is a window matrix for window-based redisplay.
512 Do nothing if MATRIX' size, position, vscroll, and marginal areas
513 haven't changed. This optimization is important because preserving
514 the matrix means preventing redisplay. */
515 if (matrix->pool == NULL)
517 left = margin_glyphs_to_reserve (w, dim.width, w->left_margin_cols);
518 right = margin_glyphs_to_reserve (w, dim.width, w->right_margin_cols);
519 xassert (left >= 0 && right >= 0);
520 marginal_areas_changed_p = (left != matrix->left_margin_glyphs
521 || right != matrix->right_margin_glyphs);
523 if (!marginal_areas_changed_p
524 && !fonts_changed_p
525 && !header_line_changed_p
526 && matrix->window_left_col == WINDOW_LEFT_EDGE_COL (w)
527 && matrix->window_top_line == WINDOW_TOP_EDGE_LINE (w)
528 && matrix->window_height == window_height
529 && matrix->window_vscroll == w->vscroll
530 && matrix->window_width == window_width)
531 return;
534 /* Enlarge MATRIX->rows if necessary. New rows are cleared. */
535 if (matrix->rows_allocated < dim.height)
537 int size = dim.height * sizeof (struct glyph_row);
538 new_rows = dim.height - matrix->rows_allocated;
539 matrix->rows = (struct glyph_row *) xrealloc (matrix->rows, size);
540 memset (matrix->rows + matrix->rows_allocated, 0,
541 new_rows * sizeof *matrix->rows);
542 matrix->rows_allocated = dim.height;
544 else
545 new_rows = 0;
547 /* If POOL is not null, MATRIX is a frame matrix or a window matrix
548 on a frame not using window-based redisplay. Set up pointers for
549 each row into the glyph pool. */
550 if (matrix->pool)
552 xassert (matrix->pool->glyphs);
554 if (w)
556 left = margin_glyphs_to_reserve (w, dim.width,
557 w->left_margin_cols);
558 right = margin_glyphs_to_reserve (w, dim.width,
559 w->right_margin_cols);
561 else
562 left = right = 0;
564 for (i = 0; i < dim.height; ++i)
566 struct glyph_row *row = &matrix->rows[i];
568 row->glyphs[LEFT_MARGIN_AREA]
569 = (matrix->pool->glyphs
570 + (y + i) * matrix->pool->ncolumns
571 + x);
573 if (w == NULL
574 || row == matrix->rows + dim.height - 1
575 || (row == matrix->rows && matrix->header_line_p))
577 row->glyphs[TEXT_AREA]
578 = row->glyphs[LEFT_MARGIN_AREA];
579 row->glyphs[RIGHT_MARGIN_AREA]
580 = row->glyphs[TEXT_AREA] + dim.width;
581 row->glyphs[LAST_AREA]
582 = row->glyphs[RIGHT_MARGIN_AREA];
584 else
586 row->glyphs[TEXT_AREA]
587 = row->glyphs[LEFT_MARGIN_AREA] + left;
588 row->glyphs[RIGHT_MARGIN_AREA]
589 = row->glyphs[TEXT_AREA] + dim.width - left - right;
590 row->glyphs[LAST_AREA]
591 = row->glyphs[LEFT_MARGIN_AREA] + dim.width;
595 matrix->left_margin_glyphs = left;
596 matrix->right_margin_glyphs = right;
598 else
600 /* If MATRIX->pool is null, MATRIX is responsible for managing
601 its own memory. It is a window matrix for window-based redisplay.
602 Allocate glyph memory from the heap. */
603 if (dim.width > matrix->matrix_w
604 || new_rows
605 || header_line_changed_p
606 || marginal_areas_changed_p)
608 struct glyph_row *row = matrix->rows;
609 struct glyph_row *end = row + matrix->rows_allocated;
611 while (row < end)
613 row->glyphs[LEFT_MARGIN_AREA]
614 = (struct glyph *) xrealloc (row->glyphs[LEFT_MARGIN_AREA],
615 (dim.width
616 * sizeof (struct glyph)));
618 /* The mode line never has marginal areas. */
619 if (row == matrix->rows + dim.height - 1
620 || (row == matrix->rows && matrix->header_line_p))
622 row->glyphs[TEXT_AREA]
623 = row->glyphs[LEFT_MARGIN_AREA];
624 row->glyphs[RIGHT_MARGIN_AREA]
625 = row->glyphs[TEXT_AREA] + dim.width;
626 row->glyphs[LAST_AREA]
627 = row->glyphs[RIGHT_MARGIN_AREA];
629 else
631 row->glyphs[TEXT_AREA]
632 = row->glyphs[LEFT_MARGIN_AREA] + left;
633 row->glyphs[RIGHT_MARGIN_AREA]
634 = row->glyphs[TEXT_AREA] + dim.width - left - right;
635 row->glyphs[LAST_AREA]
636 = row->glyphs[LEFT_MARGIN_AREA] + dim.width;
638 ++row;
642 xassert (left >= 0 && right >= 0);
643 matrix->left_margin_glyphs = left;
644 matrix->right_margin_glyphs = right;
647 /* Number of rows to be used by MATRIX. */
648 matrix->nrows = dim.height;
649 xassert (matrix->nrows >= 0);
651 if (w)
653 if (matrix == w->current_matrix)
655 /* Mark rows in a current matrix of a window as not having
656 valid contents. It's important to not do this for
657 desired matrices. When Emacs starts, it may already be
658 building desired matrices when this function runs. */
659 if (window_width < 0)
660 window_width = window_box_width (w, -1);
662 /* Optimize the case that only the height has changed (C-x 2,
663 upper window). Invalidate all rows that are no longer part
664 of the window. */
665 if (!marginal_areas_changed_p
666 && !header_line_changed_p
667 && new_rows == 0
668 && dim.width == matrix->matrix_w
669 && matrix->window_left_col == WINDOW_LEFT_EDGE_COL (w)
670 && matrix->window_top_line == WINDOW_TOP_EDGE_LINE (w)
671 && matrix->window_width == window_width)
673 /* Find the last row in the window. */
674 for (i = 0; i < matrix->nrows && matrix->rows[i].enabled_p; ++i)
675 if (MATRIX_ROW_BOTTOM_Y (matrix->rows + i) >= window_height)
677 ++i;
678 break;
681 /* Window end is invalid, if inside of the rows that
682 are invalidated below. */
683 if (INTEGERP (w->window_end_vpos)
684 && XFASTINT (w->window_end_vpos) >= i)
685 w->window_end_valid = Qnil;
687 while (i < matrix->nrows)
688 matrix->rows[i++].enabled_p = 0;
690 else
692 for (i = 0; i < matrix->nrows; ++i)
693 matrix->rows[i].enabled_p = 0;
696 else if (matrix == w->desired_matrix)
698 /* Rows in desired matrices always have to be cleared;
699 redisplay expects this is the case when it runs, so it
700 had better be the case when we adjust matrices between
701 redisplays. */
702 for (i = 0; i < matrix->nrows; ++i)
703 matrix->rows[i].enabled_p = 0;
708 /* Remember last values to be able to optimize frame redraws. */
709 matrix->matrix_x = x;
710 matrix->matrix_y = y;
711 matrix->matrix_w = dim.width;
712 matrix->matrix_h = dim.height;
714 /* Record the top y location and height of W at the time the matrix
715 was last adjusted. This is used to optimize redisplay above. */
716 if (w)
718 matrix->window_left_col = WINDOW_LEFT_EDGE_COL (w);
719 matrix->window_top_line = WINDOW_TOP_EDGE_LINE (w);
720 matrix->window_height = window_height;
721 matrix->window_width = window_width;
722 matrix->window_vscroll = w->vscroll;
727 /* Reverse the contents of rows in MATRIX between START and END. The
728 contents of the row at END - 1 end up at START, END - 2 at START +
729 1 etc. This is part of the implementation of rotate_matrix (see
730 below). */
732 static void
733 reverse_rows (struct glyph_matrix *matrix, int start, int end)
735 int i, j;
737 for (i = start, j = end - 1; i < j; ++i, --j)
739 /* Non-ISO HP/UX compiler doesn't like auto struct
740 initialization. */
741 struct glyph_row temp;
742 temp = matrix->rows[i];
743 matrix->rows[i] = matrix->rows[j];
744 matrix->rows[j] = temp;
749 /* Rotate the contents of rows in MATRIX in the range FIRST .. LAST -
750 1 by BY positions. BY < 0 means rotate left, i.e. towards lower
751 indices. (Note: this does not copy glyphs, only glyph pointers in
752 row structures are moved around).
754 The algorithm used for rotating the vector was, I believe, first
755 described by Kernighan. See the vector R as consisting of two
756 sub-vectors AB, where A has length BY for BY >= 0. The result
757 after rotating is then BA. Reverse both sub-vectors to get ArBr
758 and reverse the result to get (ArBr)r which is BA. Similar for
759 rotating right. */
761 void
762 rotate_matrix (struct glyph_matrix *matrix, int first, int last, int by)
764 if (by < 0)
766 /* Up (rotate left, i.e. towards lower indices). */
767 by = -by;
768 reverse_rows (matrix, first, first + by);
769 reverse_rows (matrix, first + by, last);
770 reverse_rows (matrix, first, last);
772 else if (by > 0)
774 /* Down (rotate right, i.e. towards higher indices). */
775 reverse_rows (matrix, last - by, last);
776 reverse_rows (matrix, first, last - by);
777 reverse_rows (matrix, first, last);
782 /* Increment buffer positions in glyph rows of MATRIX. Do it for rows
783 with indices START <= index < END. Increment positions by DELTA/
784 DELTA_BYTES. */
786 void
787 increment_matrix_positions (struct glyph_matrix *matrix, int start, int end,
788 EMACS_INT delta, EMACS_INT delta_bytes)
790 /* Check that START and END are reasonable values. */
791 xassert (start >= 0 && start <= matrix->nrows);
792 xassert (end >= 0 && end <= matrix->nrows);
793 xassert (start <= end);
795 for (; start < end; ++start)
796 increment_row_positions (matrix->rows + start, delta, delta_bytes);
800 /* Enable a range of rows in glyph matrix MATRIX. START and END are
801 the row indices of the first and last + 1 row to enable. If
802 ENABLED_P is non-zero, enabled_p flags in rows will be set to 1. */
804 void
805 enable_glyph_matrix_rows (struct glyph_matrix *matrix, int start, int end, int enabled_p)
807 xassert (start <= end);
808 xassert (start >= 0 && start < matrix->nrows);
809 xassert (end >= 0 && end <= matrix->nrows);
811 for (; start < end; ++start)
812 matrix->rows[start].enabled_p = enabled_p != 0;
816 /* Clear MATRIX.
818 This empties all rows in MATRIX by setting the enabled_p flag for
819 all rows of the matrix to zero. The function prepare_desired_row
820 will eventually really clear a row when it sees one with a zero
821 enabled_p flag.
823 Resets update hints to defaults value. The only update hint
824 currently present is the flag MATRIX->no_scrolling_p. */
826 void
827 clear_glyph_matrix (struct glyph_matrix *matrix)
829 if (matrix)
831 enable_glyph_matrix_rows (matrix, 0, matrix->nrows, 0);
832 matrix->no_scrolling_p = 0;
837 /* Shift part of the glyph matrix MATRIX of window W up or down.
838 Increment y-positions in glyph rows between START and END by DY,
839 and recompute their visible height. */
841 void
842 shift_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int start, int end, int dy)
844 int min_y, max_y;
846 xassert (start <= end);
847 xassert (start >= 0 && start < matrix->nrows);
848 xassert (end >= 0 && end <= matrix->nrows);
850 min_y = WINDOW_HEADER_LINE_HEIGHT (w);
851 max_y = WINDOW_BOX_HEIGHT_NO_MODE_LINE (w);
853 for (; start < end; ++start)
855 struct glyph_row *row = &matrix->rows[start];
857 row->y += dy;
858 row->visible_height = row->height;
860 if (row->y < min_y)
861 row->visible_height -= min_y - row->y;
862 if (row->y + row->height > max_y)
863 row->visible_height -= row->y + row->height - max_y;
868 /* Mark all rows in current matrices of frame F as invalid. Marking
869 invalid is done by setting enabled_p to zero for all rows in a
870 current matrix. */
872 void
873 clear_current_matrices (register struct frame *f)
875 /* Clear frame current matrix, if we have one. */
876 if (f->current_matrix)
877 clear_glyph_matrix (f->current_matrix);
879 /* Clear the matrix of the menu bar window, if such a window exists.
880 The menu bar window is currently used to display menus on X when
881 no toolkit support is compiled in. */
882 if (WINDOWP (f->menu_bar_window))
883 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix);
885 /* Clear the matrix of the tool-bar window, if any. */
886 if (WINDOWP (f->tool_bar_window))
887 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix);
889 /* Clear current window matrices. */
890 xassert (WINDOWP (FRAME_ROOT_WINDOW (f)));
891 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 0);
895 /* Clear out all display lines of F for a coming redisplay. */
897 void
898 clear_desired_matrices (register struct frame *f)
900 if (f->desired_matrix)
901 clear_glyph_matrix (f->desired_matrix);
903 if (WINDOWP (f->menu_bar_window))
904 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->desired_matrix);
906 if (WINDOWP (f->tool_bar_window))
907 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->desired_matrix);
909 /* Do it for window matrices. */
910 xassert (WINDOWP (FRAME_ROOT_WINDOW (f)));
911 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 1);
915 /* Clear matrices in window tree rooted in W. If DESIRED_P is
916 non-zero clear desired matrices, otherwise clear current matrices. */
918 static void
919 clear_window_matrices (struct window *w, int desired_p)
921 while (w)
923 if (!NILP (w->hchild))
925 xassert (WINDOWP (w->hchild));
926 clear_window_matrices (XWINDOW (w->hchild), desired_p);
928 else if (!NILP (w->vchild))
930 xassert (WINDOWP (w->vchild));
931 clear_window_matrices (XWINDOW (w->vchild), desired_p);
933 else
935 if (desired_p)
936 clear_glyph_matrix (w->desired_matrix);
937 else
939 clear_glyph_matrix (w->current_matrix);
940 w->window_end_valid = Qnil;
944 w = NILP (w->next) ? 0 : XWINDOW (w->next);
950 /***********************************************************************
951 Glyph Rows
953 See dispextern.h for an overall explanation of glyph rows.
954 ***********************************************************************/
956 /* Clear glyph row ROW. Do it in a way that makes it robust against
957 changes in the glyph_row structure, i.e. addition or removal of
958 structure members. */
960 static struct glyph_row null_row;
962 void
963 clear_glyph_row (struct glyph_row *row)
965 struct glyph *p[1 + LAST_AREA];
967 /* Save pointers. */
968 p[LEFT_MARGIN_AREA] = row->glyphs[LEFT_MARGIN_AREA];
969 p[TEXT_AREA] = row->glyphs[TEXT_AREA];
970 p[RIGHT_MARGIN_AREA] = row->glyphs[RIGHT_MARGIN_AREA];
971 p[LAST_AREA] = row->glyphs[LAST_AREA];
973 /* Clear. */
974 *row = null_row;
976 /* Restore pointers. */
977 row->glyphs[LEFT_MARGIN_AREA] = p[LEFT_MARGIN_AREA];
978 row->glyphs[TEXT_AREA] = p[TEXT_AREA];
979 row->glyphs[RIGHT_MARGIN_AREA] = p[RIGHT_MARGIN_AREA];
980 row->glyphs[LAST_AREA] = p[LAST_AREA];
982 #if 0 /* At some point, some bit-fields of struct glyph were not set,
983 which made glyphs unequal when compared with GLYPH_EQUAL_P.
984 Redisplay outputs such glyphs, and flickering effects were
985 the result. This also depended on the contents of memory
986 returned by xmalloc. If flickering happens again, activate
987 the code below. If the flickering is gone with that, chances
988 are that the flickering has the same reason as here. */
989 memset (p[0], 0, (char *) p[LAST_AREA] - (char *) p[0]);
990 #endif
994 /* Make ROW an empty, enabled row of canonical character height,
995 in window W starting at y-position Y. */
997 void
998 blank_row (struct window *w, struct glyph_row *row, int y)
1000 int min_y, max_y;
1002 min_y = WINDOW_HEADER_LINE_HEIGHT (w);
1003 max_y = WINDOW_BOX_HEIGHT_NO_MODE_LINE (w);
1005 clear_glyph_row (row);
1006 row->y = y;
1007 row->ascent = row->phys_ascent = 0;
1008 row->height = row->phys_height = FRAME_LINE_HEIGHT (XFRAME (w->frame));
1009 row->visible_height = row->height;
1011 if (row->y < min_y)
1012 row->visible_height -= min_y - row->y;
1013 if (row->y + row->height > max_y)
1014 row->visible_height -= row->y + row->height - max_y;
1016 row->enabled_p = 1;
1020 /* Increment buffer positions in glyph row ROW. DELTA and DELTA_BYTES
1021 are the amounts by which to change positions. Note that the first
1022 glyph of the text area of a row can have a buffer position even if
1023 the used count of the text area is zero. Such rows display line
1024 ends. */
1026 void
1027 increment_row_positions (struct glyph_row *row,
1028 EMACS_INT delta, EMACS_INT delta_bytes)
1030 int area, i;
1032 /* Increment start and end positions. */
1033 MATRIX_ROW_START_CHARPOS (row) += delta;
1034 MATRIX_ROW_START_BYTEPOS (row) += delta_bytes;
1035 MATRIX_ROW_END_CHARPOS (row) += delta;
1036 MATRIX_ROW_END_BYTEPOS (row) += delta_bytes;
1037 CHARPOS (row->start.pos) += delta;
1038 BYTEPOS (row->start.pos) += delta_bytes;
1039 CHARPOS (row->end.pos) += delta;
1040 BYTEPOS (row->end.pos) += delta_bytes;
1042 if (!row->enabled_p)
1043 return;
1045 /* Increment positions in glyphs. */
1046 for (area = 0; area < LAST_AREA; ++area)
1047 for (i = 0; i < row->used[area]; ++i)
1048 if (BUFFERP (row->glyphs[area][i].object)
1049 && row->glyphs[area][i].charpos > 0)
1050 row->glyphs[area][i].charpos += delta;
1052 /* Capture the case of rows displaying a line end. */
1053 if (row->used[TEXT_AREA] == 0
1054 && MATRIX_ROW_DISPLAYS_TEXT_P (row))
1055 row->glyphs[TEXT_AREA]->charpos += delta;
1059 #if 0
1060 /* Swap glyphs between two glyph rows A and B. This exchanges glyph
1061 contents, i.e. glyph structure contents are exchanged between A and
1062 B without changing glyph pointers in A and B. */
1064 static void
1065 swap_glyphs_in_rows (a, b)
1066 struct glyph_row *a, *b;
1068 int area;
1070 for (area = 0; area < LAST_AREA; ++area)
1072 /* Number of glyphs to swap. */
1073 int max_used = max (a->used[area], b->used[area]);
1075 /* Start of glyphs in area of row A. */
1076 struct glyph *glyph_a = a->glyphs[area];
1078 /* End + 1 of glyphs in area of row A. */
1079 struct glyph *glyph_a_end = a->glyphs[max_used];
1081 /* Start of glyphs in area of row B. */
1082 struct glyph *glyph_b = b->glyphs[area];
1084 while (glyph_a < glyph_a_end)
1086 /* Non-ISO HP/UX compiler doesn't like auto struct
1087 initialization. */
1088 struct glyph temp;
1089 temp = *glyph_a;
1090 *glyph_a = *glyph_b;
1091 *glyph_b = temp;
1092 ++glyph_a;
1093 ++glyph_b;
1098 #endif /* 0 */
1100 /* Exchange pointers to glyph memory between glyph rows A and B. */
1102 static INLINE void
1103 swap_glyph_pointers (struct glyph_row *a, struct glyph_row *b)
1105 int i;
1106 for (i = 0; i < LAST_AREA + 1; ++i)
1108 struct glyph *temp = a->glyphs[i];
1109 a->glyphs[i] = b->glyphs[i];
1110 b->glyphs[i] = temp;
1115 /* Copy glyph row structure FROM to glyph row structure TO, except
1116 that glyph pointers in the structures are left unchanged. */
1118 static INLINE void
1119 copy_row_except_pointers (struct glyph_row *to, struct glyph_row *from)
1121 struct glyph *pointers[1 + LAST_AREA];
1123 /* Save glyph pointers of TO. */
1124 memcpy (pointers, to->glyphs, sizeof to->glyphs);
1126 /* Do a structure assignment. */
1127 *to = *from;
1129 /* Restore original pointers of TO. */
1130 memcpy (to->glyphs, pointers, sizeof to->glyphs);
1134 /* Copy contents of glyph row FROM to glyph row TO. Glyph pointers in
1135 TO and FROM are left unchanged. Glyph contents are copied from the
1136 glyph memory of FROM to the glyph memory of TO. Increment buffer
1137 positions in row TO by DELTA/ DELTA_BYTES. */
1139 void
1140 copy_glyph_row_contents (struct glyph_row *to, struct glyph_row *from,
1141 EMACS_INT delta, EMACS_INT delta_bytes)
1143 int area;
1145 /* This is like a structure assignment TO = FROM, except that
1146 glyph pointers in the rows are left unchanged. */
1147 copy_row_except_pointers (to, from);
1149 /* Copy glyphs from FROM to TO. */
1150 for (area = 0; area < LAST_AREA; ++area)
1151 if (from->used[area])
1152 memcpy (to->glyphs[area], from->glyphs[area],
1153 from->used[area] * sizeof (struct glyph));
1155 /* Increment buffer positions in TO by DELTA. */
1156 increment_row_positions (to, delta, delta_bytes);
1160 /* Assign glyph row FROM to glyph row TO. This works like a structure
1161 assignment TO = FROM, except that glyph pointers are not copied but
1162 exchanged between TO and FROM. Pointers must be exchanged to avoid
1163 a memory leak. */
1165 static INLINE void
1166 assign_row (struct glyph_row *to, struct glyph_row *from)
1168 swap_glyph_pointers (to, from);
1169 copy_row_except_pointers (to, from);
1173 /* Test whether the glyph memory of the glyph row WINDOW_ROW, which is
1174 a row in a window matrix, is a slice of the glyph memory of the
1175 glyph row FRAME_ROW which is a row in a frame glyph matrix. Value
1176 is non-zero if the glyph memory of WINDOW_ROW is part of the glyph
1177 memory of FRAME_ROW. */
1179 #if GLYPH_DEBUG
1181 static int
1182 glyph_row_slice_p (struct glyph_row *window_row, struct glyph_row *frame_row)
1184 struct glyph *window_glyph_start = window_row->glyphs[0];
1185 struct glyph *frame_glyph_start = frame_row->glyphs[0];
1186 struct glyph *frame_glyph_end = frame_row->glyphs[LAST_AREA];
1188 return (frame_glyph_start <= window_glyph_start
1189 && window_glyph_start < frame_glyph_end);
1192 #endif /* GLYPH_DEBUG */
1194 #if 0
1196 /* Find the row in the window glyph matrix WINDOW_MATRIX being a slice
1197 of ROW in the frame matrix FRAME_MATRIX. Value is null if no row
1198 in WINDOW_MATRIX is found satisfying the condition. */
1200 static struct glyph_row *
1201 find_glyph_row_slice (struct glyph_matrix *window_matrix,
1202 struct glyph_matrix *frame_matrix, int row)
1204 int i;
1206 xassert (row >= 0 && row < frame_matrix->nrows);
1208 for (i = 0; i < window_matrix->nrows; ++i)
1209 if (glyph_row_slice_p (window_matrix->rows + i,
1210 frame_matrix->rows + row))
1211 break;
1213 return i < window_matrix->nrows ? window_matrix->rows + i : 0;
1216 #endif /* 0 */
1218 /* Prepare ROW for display. Desired rows are cleared lazily,
1219 i.e. they are only marked as to be cleared by setting their
1220 enabled_p flag to zero. When a row is to be displayed, a prior
1221 call to this function really clears it. */
1223 void
1224 prepare_desired_row (struct glyph_row *row)
1226 if (!row->enabled_p)
1228 unsigned rp = row->reversed_p;
1230 clear_glyph_row (row);
1231 row->enabled_p = 1;
1232 row->reversed_p = rp;
1237 /* Return a hash code for glyph row ROW. */
1239 static int
1240 line_hash_code (struct glyph_row *row)
1242 int hash = 0;
1244 if (row->enabled_p)
1246 struct glyph *glyph = row->glyphs[TEXT_AREA];
1247 struct glyph *end = glyph + row->used[TEXT_AREA];
1249 while (glyph < end)
1251 int c = glyph->u.ch;
1252 int face_id = glyph->face_id;
1253 if (FRAME_MUST_WRITE_SPACES (SELECTED_FRAME ())) /* XXX Is SELECTED_FRAME OK here? */
1254 c -= SPACEGLYPH;
1255 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + c;
1256 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + face_id;
1257 ++glyph;
1260 if (hash == 0)
1261 hash = 1;
1264 return hash;
1268 /* Return the cost of drawing line VPOS in MATRIX. The cost equals
1269 the number of characters in the line. If must_write_spaces is
1270 zero, leading and trailing spaces are ignored. */
1272 static unsigned int
1273 line_draw_cost (struct glyph_matrix *matrix, int vpos)
1275 struct glyph_row *row = matrix->rows + vpos;
1276 struct glyph *beg = row->glyphs[TEXT_AREA];
1277 struct glyph *end = beg + row->used[TEXT_AREA];
1278 int len;
1279 Lisp_Object *glyph_table_base = GLYPH_TABLE_BASE;
1280 int glyph_table_len = GLYPH_TABLE_LENGTH;
1282 /* Ignore trailing and leading spaces if we can. */
1283 if (!FRAME_MUST_WRITE_SPACES (SELECTED_FRAME ())) /* XXX Is SELECTED_FRAME OK here? */
1285 /* Skip from the end over trailing spaces. */
1286 while (end > beg && CHAR_GLYPH_SPACE_P (*(end - 1)))
1287 --end;
1289 /* All blank line. */
1290 if (end == beg)
1291 return 0;
1293 /* Skip over leading spaces. */
1294 while (CHAR_GLYPH_SPACE_P (*beg))
1295 ++beg;
1298 /* If we don't have a glyph-table, each glyph is one character,
1299 so return the number of glyphs. */
1300 if (glyph_table_base == 0)
1301 len = end - beg;
1302 else
1304 /* Otherwise, scan the glyphs and accumulate their total length
1305 in LEN. */
1306 len = 0;
1307 while (beg < end)
1309 GLYPH g;
1311 SET_GLYPH_FROM_CHAR_GLYPH (g, *beg);
1313 if (GLYPH_INVALID_P (g)
1314 || GLYPH_SIMPLE_P (glyph_table_base, glyph_table_len, g))
1315 len += 1;
1316 else
1317 len += GLYPH_LENGTH (glyph_table_base, g);
1319 ++beg;
1323 return len;
1327 /* Test two glyph rows A and B for equality. Value is non-zero if A
1328 and B have equal contents. W is the window to which the glyphs
1329 rows A and B belong. It is needed here to test for partial row
1330 visibility. MOUSE_FACE_P non-zero means compare the mouse_face_p
1331 flags of A and B, too. */
1333 static INLINE int
1334 row_equal_p (struct window *w, struct glyph_row *a, struct glyph_row *b, int mouse_face_p)
1336 if (a == b)
1337 return 1;
1338 else if (a->hash != b->hash)
1339 return 0;
1340 else
1342 struct glyph *a_glyph, *b_glyph, *a_end;
1343 int area;
1345 if (mouse_face_p && a->mouse_face_p != b->mouse_face_p)
1346 return 0;
1348 /* Compare glyphs. */
1349 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
1351 if (a->used[area] != b->used[area])
1352 return 0;
1354 a_glyph = a->glyphs[area];
1355 a_end = a_glyph + a->used[area];
1356 b_glyph = b->glyphs[area];
1358 while (a_glyph < a_end
1359 && GLYPH_EQUAL_P (a_glyph, b_glyph))
1360 ++a_glyph, ++b_glyph;
1362 if (a_glyph != a_end)
1363 return 0;
1366 if (a->fill_line_p != b->fill_line_p
1367 || a->cursor_in_fringe_p != b->cursor_in_fringe_p
1368 || a->left_fringe_bitmap != b->left_fringe_bitmap
1369 || a->left_fringe_face_id != b->left_fringe_face_id
1370 || a->right_fringe_bitmap != b->right_fringe_bitmap
1371 || a->right_fringe_face_id != b->right_fringe_face_id
1372 || a->overlay_arrow_bitmap != b->overlay_arrow_bitmap
1373 || a->exact_window_width_line_p != b->exact_window_width_line_p
1374 || a->overlapped_p != b->overlapped_p
1375 || (MATRIX_ROW_CONTINUATION_LINE_P (a)
1376 != MATRIX_ROW_CONTINUATION_LINE_P (b))
1377 || a->reversed_p != b->reversed_p
1378 /* Different partially visible characters on left margin. */
1379 || a->x != b->x
1380 /* Different height. */
1381 || a->ascent != b->ascent
1382 || a->phys_ascent != b->phys_ascent
1383 || a->phys_height != b->phys_height
1384 || a->visible_height != b->visible_height)
1385 return 0;
1388 return 1;
1393 /***********************************************************************
1394 Glyph Pool
1396 See dispextern.h for an overall explanation of glyph pools.
1397 ***********************************************************************/
1399 /* Allocate a glyph_pool structure. The structure returned is
1400 initialized with zeros. The global variable glyph_pool_count is
1401 incremented for each pool allocated. */
1403 static struct glyph_pool *
1404 new_glyph_pool (void)
1406 struct glyph_pool *result;
1408 /* Allocate a new glyph_pool and clear it. */
1409 result = (struct glyph_pool *) xmalloc (sizeof *result);
1410 memset (result, 0, sizeof *result);
1412 /* For memory leak and double deletion checking. */
1413 ++glyph_pool_count;
1415 return result;
1419 /* Free a glyph_pool structure POOL. The function may be called with
1420 a null POOL pointer. The global variable glyph_pool_count is
1421 decremented with every pool structure freed. If this count gets
1422 negative, more structures were freed than allocated, i.e. one
1423 structure must have been freed more than once or a bogus pointer
1424 was passed to free_glyph_pool. */
1426 static void
1427 free_glyph_pool (struct glyph_pool *pool)
1429 if (pool)
1431 /* More freed than allocated? */
1432 --glyph_pool_count;
1433 xassert (glyph_pool_count >= 0);
1435 xfree (pool->glyphs);
1436 xfree (pool);
1441 /* Enlarge a glyph pool POOL. MATRIX_DIM gives the number of rows and
1442 columns we need. This function never shrinks a pool. The only
1443 case in which this would make sense, would be when a frame's size
1444 is changed from a large value to a smaller one. But, if someone
1445 does it once, we can expect that he will do it again.
1447 Value is non-zero if the pool changed in a way which makes
1448 re-adjusting window glyph matrices necessary. */
1450 static int
1451 realloc_glyph_pool (struct glyph_pool *pool, struct dim matrix_dim)
1453 int needed;
1454 int changed_p;
1456 changed_p = (pool->glyphs == 0
1457 || matrix_dim.height != pool->nrows
1458 || matrix_dim.width != pool->ncolumns);
1460 /* Enlarge the glyph pool. */
1461 needed = matrix_dim.width * matrix_dim.height;
1462 if (needed > pool->nglyphs)
1464 int size = needed * sizeof (struct glyph);
1466 if (pool->glyphs)
1468 pool->glyphs = (struct glyph *) xrealloc (pool->glyphs, size);
1469 memset (pool->glyphs + pool->nglyphs, 0,
1470 size - pool->nglyphs * sizeof (struct glyph));
1472 else
1474 pool->glyphs = (struct glyph *) xmalloc (size);
1475 memset (pool->glyphs, 0, size);
1478 pool->nglyphs = needed;
1481 /* Remember the number of rows and columns because (a) we use them
1482 to do sanity checks, and (b) the number of columns determines
1483 where rows in the frame matrix start---this must be available to
1484 determine pointers to rows of window sub-matrices. */
1485 pool->nrows = matrix_dim.height;
1486 pool->ncolumns = matrix_dim.width;
1488 return changed_p;
1493 /***********************************************************************
1494 Debug Code
1495 ***********************************************************************/
1497 #if GLYPH_DEBUG
1500 /* Flush standard output. This is sometimes useful to call from the debugger.
1501 XXX Maybe this should be changed to flush the current terminal instead of
1502 stdout.
1505 void
1506 flush_stdout (void)
1508 fflush (stdout);
1512 /* Check that no glyph pointers have been lost in MATRIX. If a
1513 pointer has been lost, e.g. by using a structure assignment between
1514 rows, at least one pointer must occur more than once in the rows of
1515 MATRIX. */
1517 void
1518 check_matrix_pointer_lossage (struct glyph_matrix *matrix)
1520 int i, j;
1522 for (i = 0; i < matrix->nrows; ++i)
1523 for (j = 0; j < matrix->nrows; ++j)
1524 xassert (i == j
1525 || (matrix->rows[i].glyphs[TEXT_AREA]
1526 != matrix->rows[j].glyphs[TEXT_AREA]));
1530 /* Get a pointer to glyph row ROW in MATRIX, with bounds checks. */
1532 struct glyph_row *
1533 matrix_row (struct glyph_matrix *matrix, int row)
1535 xassert (matrix && matrix->rows);
1536 xassert (row >= 0 && row < matrix->nrows);
1538 /* That's really too slow for normal testing because this function
1539 is called almost everywhere. Although---it's still astonishingly
1540 fast, so it is valuable to have for debugging purposes. */
1541 #if 0
1542 check_matrix_pointer_lossage (matrix);
1543 #endif
1545 return matrix->rows + row;
1549 #if 0 /* This function makes invalid assumptions when text is
1550 partially invisible. But it might come handy for debugging
1551 nevertheless. */
1553 /* Check invariants that must hold for an up to date current matrix of
1554 window W. */
1556 static void
1557 check_matrix_invariants (struct window *w)
1559 struct glyph_matrix *matrix = w->current_matrix;
1560 int yb = window_text_bottom_y (w);
1561 struct glyph_row *row = matrix->rows;
1562 struct glyph_row *last_text_row = NULL;
1563 struct buffer *saved = current_buffer;
1564 struct buffer *buffer = XBUFFER (w->buffer);
1565 int c;
1567 /* This can sometimes happen for a fresh window. */
1568 if (matrix->nrows < 2)
1569 return;
1571 set_buffer_temp (buffer);
1573 /* Note: last row is always reserved for the mode line. */
1574 while (MATRIX_ROW_DISPLAYS_TEXT_P (row)
1575 && MATRIX_ROW_BOTTOM_Y (row) < yb)
1577 struct glyph_row *next = row + 1;
1579 if (MATRIX_ROW_DISPLAYS_TEXT_P (row))
1580 last_text_row = row;
1582 /* Check that character and byte positions are in sync. */
1583 xassert (MATRIX_ROW_START_BYTEPOS (row)
1584 == CHAR_TO_BYTE (MATRIX_ROW_START_CHARPOS (row)));
1585 xassert (BYTEPOS (row->start.pos)
1586 == CHAR_TO_BYTE (CHARPOS (row->start.pos)));
1588 /* CHAR_TO_BYTE aborts when invoked for a position > Z. We can
1589 have such a position temporarily in case of a minibuffer
1590 displaying something like `[Sole completion]' at its end. */
1591 if (MATRIX_ROW_END_CHARPOS (row) < BUF_ZV (current_buffer))
1593 xassert (MATRIX_ROW_END_BYTEPOS (row)
1594 == CHAR_TO_BYTE (MATRIX_ROW_END_CHARPOS (row)));
1595 xassert (BYTEPOS (row->end.pos)
1596 == CHAR_TO_BYTE (CHARPOS (row->end.pos)));
1599 /* Check that end position of `row' is equal to start position
1600 of next row. */
1601 if (next->enabled_p && MATRIX_ROW_DISPLAYS_TEXT_P (next))
1603 xassert (MATRIX_ROW_END_CHARPOS (row)
1604 == MATRIX_ROW_START_CHARPOS (next));
1605 xassert (MATRIX_ROW_END_BYTEPOS (row)
1606 == MATRIX_ROW_START_BYTEPOS (next));
1607 xassert (CHARPOS (row->end.pos) == CHARPOS (next->start.pos));
1608 xassert (BYTEPOS (row->end.pos) == BYTEPOS (next->start.pos));
1610 row = next;
1613 xassert (w->current_matrix->nrows == w->desired_matrix->nrows);
1614 xassert (w->desired_matrix->rows != NULL);
1615 set_buffer_temp (saved);
1618 #endif /* 0 */
1620 #endif /* GLYPH_DEBUG != 0 */
1624 /**********************************************************************
1625 Allocating/ Adjusting Glyph Matrices
1626 **********************************************************************/
1628 /* Allocate glyph matrices over a window tree for a frame-based
1629 redisplay
1631 X and Y are column/row within the frame glyph matrix where
1632 sub-matrices for the window tree rooted at WINDOW must be
1633 allocated. DIM_ONLY_P non-zero means that the caller of this
1634 function is only interested in the result matrix dimension, and
1635 matrix adjustments should not be performed.
1637 The function returns the total width/height of the sub-matrices of
1638 the window tree. If called on a frame root window, the computation
1639 will take the mini-buffer window into account.
1641 *WINDOW_CHANGE_FLAGS is set to a bit mask with bits
1643 NEW_LEAF_MATRIX set if any window in the tree did not have a
1644 glyph matrices yet, and
1646 CHANGED_LEAF_MATRIX set if the dimension or location of a matrix of
1647 any window in the tree will be changed or have been changed (see
1648 DIM_ONLY_P)
1650 *WINDOW_CHANGE_FLAGS must be initialized by the caller of this
1651 function.
1653 Windows are arranged into chains of windows on the same level
1654 through the next fields of window structures. Such a level can be
1655 either a sequence of horizontally adjacent windows from left to
1656 right, or a sequence of vertically adjacent windows from top to
1657 bottom. Each window in a horizontal sequence can be either a leaf
1658 window or a vertical sequence; a window in a vertical sequence can
1659 be either a leaf or a horizontal sequence. All windows in a
1660 horizontal sequence have the same height, and all windows in a
1661 vertical sequence have the same width.
1663 This function uses, for historical reasons, a more general
1664 algorithm to determine glyph matrix dimensions that would be
1665 necessary.
1667 The matrix height of a horizontal sequence is determined by the
1668 maximum height of any matrix in the sequence. The matrix width of
1669 a horizontal sequence is computed by adding up matrix widths of
1670 windows in the sequence.
1672 |<------- result width ------->|
1673 +---------+----------+---------+ ---
1674 | | | | |
1675 | | | |
1676 +---------+ | | result height
1677 | +---------+
1678 | | |
1679 +----------+ ---
1681 The matrix width of a vertical sequence is the maximum matrix width
1682 of any window in the sequence. Its height is computed by adding up
1683 matrix heights of windows in the sequence.
1685 |<---- result width -->|
1686 +---------+ ---
1687 | | |
1688 | | |
1689 +---------+--+ |
1690 | | |
1691 | | result height
1693 +------------+---------+ |
1694 | | |
1695 | | |
1696 +------------+---------+ --- */
1698 /* Bit indicating that a new matrix will be allocated or has been
1699 allocated. */
1701 #define NEW_LEAF_MATRIX (1 << 0)
1703 /* Bit indicating that a matrix will or has changed its location or
1704 size. */
1706 #define CHANGED_LEAF_MATRIX (1 << 1)
1708 static struct dim
1709 allocate_matrices_for_frame_redisplay (Lisp_Object window, int x, int y,
1710 int dim_only_p, int *window_change_flags)
1712 struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
1713 int x0 = x, y0 = y;
1714 int wmax = 0, hmax = 0;
1715 struct dim total;
1716 struct dim dim;
1717 struct window *w;
1718 int in_horz_combination_p;
1720 /* What combination is WINDOW part of? Compute this once since the
1721 result is the same for all windows in the `next' chain. The
1722 special case of a root window (parent equal to nil) is treated
1723 like a vertical combination because a root window's `next'
1724 points to the mini-buffer window, if any, which is arranged
1725 vertically below other windows. */
1726 in_horz_combination_p
1727 = (!NILP (XWINDOW (window)->parent)
1728 && !NILP (XWINDOW (XWINDOW (window)->parent)->hchild));
1730 /* For WINDOW and all windows on the same level. */
1733 w = XWINDOW (window);
1735 /* Get the dimension of the window sub-matrix for W, depending
1736 on whether this is a combination or a leaf window. */
1737 if (!NILP (w->hchild))
1738 dim = allocate_matrices_for_frame_redisplay (w->hchild, x, y,
1739 dim_only_p,
1740 window_change_flags);
1741 else if (!NILP (w->vchild))
1742 dim = allocate_matrices_for_frame_redisplay (w->vchild, x, y,
1743 dim_only_p,
1744 window_change_flags);
1745 else
1747 /* If not already done, allocate sub-matrix structures. */
1748 if (w->desired_matrix == NULL)
1750 w->desired_matrix = new_glyph_matrix (f->desired_pool);
1751 w->current_matrix = new_glyph_matrix (f->current_pool);
1752 *window_change_flags |= NEW_LEAF_MATRIX;
1755 /* Width and height MUST be chosen so that there are no
1756 holes in the frame matrix. */
1757 dim.width = required_matrix_width (w);
1758 dim.height = required_matrix_height (w);
1760 /* Will matrix be re-allocated? */
1761 if (x != w->desired_matrix->matrix_x
1762 || y != w->desired_matrix->matrix_y
1763 || dim.width != w->desired_matrix->matrix_w
1764 || dim.height != w->desired_matrix->matrix_h
1765 || (margin_glyphs_to_reserve (w, dim.width,
1766 w->left_margin_cols)
1767 != w->desired_matrix->left_margin_glyphs)
1768 || (margin_glyphs_to_reserve (w, dim.width,
1769 w->right_margin_cols)
1770 != w->desired_matrix->right_margin_glyphs))
1771 *window_change_flags |= CHANGED_LEAF_MATRIX;
1773 /* Actually change matrices, if allowed. Do not consider
1774 CHANGED_LEAF_MATRIX computed above here because the pool
1775 may have been changed which we don't now here. We trust
1776 that we only will be called with DIM_ONLY_P != 0 when
1777 necessary. */
1778 if (!dim_only_p)
1780 adjust_glyph_matrix (w, w->desired_matrix, x, y, dim);
1781 adjust_glyph_matrix (w, w->current_matrix, x, y, dim);
1785 /* If we are part of a horizontal combination, advance x for
1786 windows to the right of W; otherwise advance y for windows
1787 below W. */
1788 if (in_horz_combination_p)
1789 x += dim.width;
1790 else
1791 y += dim.height;
1793 /* Remember maximum glyph matrix dimensions. */
1794 wmax = max (wmax, dim.width);
1795 hmax = max (hmax, dim.height);
1797 /* Next window on same level. */
1798 window = w->next;
1800 while (!NILP (window));
1802 /* Set `total' to the total glyph matrix dimension of this window
1803 level. In a vertical combination, the width is the width of the
1804 widest window; the height is the y we finally reached, corrected
1805 by the y we started with. In a horizontal combination, the total
1806 height is the height of the tallest window, and the width is the
1807 x we finally reached, corrected by the x we started with. */
1808 if (in_horz_combination_p)
1810 total.width = x - x0;
1811 total.height = hmax;
1813 else
1815 total.width = wmax;
1816 total.height = y - y0;
1819 return total;
1823 /* Return the required height of glyph matrices for window W. */
1825 static int
1826 required_matrix_height (struct window *w)
1828 #ifdef HAVE_WINDOW_SYSTEM
1829 struct frame *f = XFRAME (w->frame);
1831 if (FRAME_WINDOW_P (f))
1833 int ch_height = FRAME_SMALLEST_FONT_HEIGHT (f);
1834 int window_pixel_height = window_box_height (w) + eabs (w->vscroll);
1835 return (((window_pixel_height + ch_height - 1)
1836 / ch_height) * w->nrows_scale_factor
1837 /* One partially visible line at the top and
1838 bottom of the window. */
1840 /* 2 for header and mode line. */
1841 + 2);
1843 #endif /* HAVE_WINDOW_SYSTEM */
1845 return WINDOW_TOTAL_LINES (w);
1849 /* Return the required width of glyph matrices for window W. */
1851 static int
1852 required_matrix_width (struct window *w)
1854 #ifdef HAVE_WINDOW_SYSTEM
1855 struct frame *f = XFRAME (w->frame);
1856 if (FRAME_WINDOW_P (f))
1858 int ch_width = FRAME_SMALLEST_CHAR_WIDTH (f);
1859 int window_pixel_width = WINDOW_TOTAL_WIDTH (w);
1861 /* Compute number of glyphs needed in a glyph row. */
1862 return (((window_pixel_width + ch_width - 1)
1863 / ch_width) * w->ncols_scale_factor
1864 /* 2 partially visible columns in the text area. */
1866 /* One partially visible column at the right
1867 edge of each marginal area. */
1868 + 1 + 1);
1870 #endif /* HAVE_WINDOW_SYSTEM */
1872 return XINT (w->total_cols);
1876 /* Allocate window matrices for window-based redisplay. W is the
1877 window whose matrices must be allocated/reallocated. */
1879 static void
1880 allocate_matrices_for_window_redisplay (struct window *w)
1882 while (w)
1884 if (!NILP (w->vchild))
1885 allocate_matrices_for_window_redisplay (XWINDOW (w->vchild));
1886 else if (!NILP (w->hchild))
1887 allocate_matrices_for_window_redisplay (XWINDOW (w->hchild));
1888 else
1890 /* W is a leaf window. */
1891 struct dim dim;
1893 /* If matrices are not yet allocated, allocate them now. */
1894 if (w->desired_matrix == NULL)
1896 w->desired_matrix = new_glyph_matrix (NULL);
1897 w->current_matrix = new_glyph_matrix (NULL);
1900 dim.width = required_matrix_width (w);
1901 dim.height = required_matrix_height (w);
1902 adjust_glyph_matrix (w, w->desired_matrix, 0, 0, dim);
1903 adjust_glyph_matrix (w, w->current_matrix, 0, 0, dim);
1906 w = NILP (w->next) ? NULL : XWINDOW (w->next);
1911 /* Re-allocate/ re-compute glyph matrices on frame F. If F is null,
1912 do it for all frames; otherwise do it just for the given frame.
1913 This function must be called when a new frame is created, its size
1914 changes, or its window configuration changes. */
1916 void
1917 adjust_glyphs (struct frame *f)
1919 /* Block input so that expose events and other events that access
1920 glyph matrices are not processed while we are changing them. */
1921 BLOCK_INPUT;
1923 if (f)
1924 adjust_frame_glyphs (f);
1925 else
1927 Lisp_Object tail, lisp_frame;
1929 FOR_EACH_FRAME (tail, lisp_frame)
1930 adjust_frame_glyphs (XFRAME (lisp_frame));
1933 UNBLOCK_INPUT;
1937 /* Adjust frame glyphs when Emacs is initialized.
1939 To be called from init_display.
1941 We need a glyph matrix because redraw will happen soon.
1942 Unfortunately, window sizes on selected_frame are not yet set to
1943 meaningful values. I believe we can assume that there are only two
1944 windows on the frame---the mini-buffer and the root window. Frame
1945 height and width seem to be correct so far. So, set the sizes of
1946 windows to estimated values. */
1948 static void
1949 adjust_frame_glyphs_initially (void)
1951 struct frame *sf = SELECTED_FRAME ();
1952 struct window *root = XWINDOW (sf->root_window);
1953 struct window *mini = XWINDOW (root->next);
1954 int frame_lines = FRAME_LINES (sf);
1955 int frame_cols = FRAME_COLS (sf);
1956 int top_margin = FRAME_TOP_MARGIN (sf);
1958 /* Do it for the root window. */
1959 XSETFASTINT (root->top_line, top_margin);
1960 XSETFASTINT (root->total_cols, frame_cols);
1961 set_window_height (sf->root_window, frame_lines - 1 - top_margin, 0);
1963 /* Do it for the mini-buffer window. */
1964 XSETFASTINT (mini->top_line, frame_lines - 1);
1965 XSETFASTINT (mini->total_cols, frame_cols);
1966 set_window_height (root->next, 1, 0);
1968 adjust_frame_glyphs (sf);
1969 glyphs_initialized_initially_p = 1;
1973 /* Allocate/reallocate glyph matrices of a single frame F. */
1975 static void
1976 adjust_frame_glyphs (struct frame *f)
1978 if (FRAME_WINDOW_P (f))
1979 adjust_frame_glyphs_for_window_redisplay (f);
1980 else
1981 adjust_frame_glyphs_for_frame_redisplay (f);
1983 /* Don't forget the message buffer and the buffer for
1984 decode_mode_spec. */
1985 adjust_frame_message_buffer (f);
1986 adjust_decode_mode_spec_buffer (f);
1988 f->glyphs_initialized_p = 1;
1991 /* Return 1 if any window in the tree has nonzero window margins. See
1992 the hack at the end of adjust_frame_glyphs_for_frame_redisplay. */
1993 static int
1994 showing_window_margins_p (struct window *w)
1996 while (w)
1998 if (!NILP (w->hchild))
2000 if (showing_window_margins_p (XWINDOW (w->hchild)))
2001 return 1;
2003 else if (!NILP (w->vchild))
2005 if (showing_window_margins_p (XWINDOW (w->vchild)))
2006 return 1;
2008 else if (!NILP (w->left_margin_cols)
2009 || !NILP (w->right_margin_cols))
2010 return 1;
2012 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2014 return 0;
2018 /* In the window tree with root W, build current matrices of leaf
2019 windows from the frame's current matrix. */
2021 static void
2022 fake_current_matrices (Lisp_Object window)
2024 struct window *w;
2026 for (; !NILP (window); window = w->next)
2028 w = XWINDOW (window);
2030 if (!NILP (w->hchild))
2031 fake_current_matrices (w->hchild);
2032 else if (!NILP (w->vchild))
2033 fake_current_matrices (w->vchild);
2034 else
2036 int i;
2037 struct frame *f = XFRAME (w->frame);
2038 struct glyph_matrix *m = w->current_matrix;
2039 struct glyph_matrix *fm = f->current_matrix;
2041 xassert (m->matrix_h == WINDOW_TOTAL_LINES (w));
2042 xassert (m->matrix_w == WINDOW_TOTAL_COLS (w));
2044 for (i = 0; i < m->matrix_h; ++i)
2046 struct glyph_row *r = m->rows + i;
2047 struct glyph_row *fr = fm->rows + i + WINDOW_TOP_EDGE_LINE (w);
2049 xassert (r->glyphs[TEXT_AREA] >= fr->glyphs[TEXT_AREA]
2050 && r->glyphs[LAST_AREA] <= fr->glyphs[LAST_AREA]);
2052 r->enabled_p = fr->enabled_p;
2053 if (r->enabled_p)
2055 r->used[LEFT_MARGIN_AREA] = m->left_margin_glyphs;
2056 r->used[RIGHT_MARGIN_AREA] = m->right_margin_glyphs;
2057 r->used[TEXT_AREA] = (m->matrix_w
2058 - r->used[LEFT_MARGIN_AREA]
2059 - r->used[RIGHT_MARGIN_AREA]);
2060 r->mode_line_p = 0;
2068 /* Save away the contents of frame F's current frame matrix. Value is
2069 a glyph matrix holding the contents of F's current frame matrix. */
2071 static struct glyph_matrix *
2072 save_current_matrix (struct frame *f)
2074 int i;
2075 struct glyph_matrix *saved;
2077 saved = (struct glyph_matrix *) xmalloc (sizeof *saved);
2078 memset (saved, 0, sizeof *saved);
2079 saved->nrows = f->current_matrix->nrows;
2080 saved->rows = (struct glyph_row *) xmalloc (saved->nrows
2081 * sizeof *saved->rows);
2082 memset (saved->rows, 0, saved->nrows * sizeof *saved->rows);
2084 for (i = 0; i < saved->nrows; ++i)
2086 struct glyph_row *from = f->current_matrix->rows + i;
2087 struct glyph_row *to = saved->rows + i;
2088 size_t nbytes = from->used[TEXT_AREA] * sizeof (struct glyph);
2089 to->glyphs[TEXT_AREA] = (struct glyph *) xmalloc (nbytes);
2090 memcpy (to->glyphs[TEXT_AREA], from->glyphs[TEXT_AREA], nbytes);
2091 to->used[TEXT_AREA] = from->used[TEXT_AREA];
2094 return saved;
2098 /* Restore the contents of frame F's current frame matrix from SAVED,
2099 and free memory associated with SAVED. */
2101 static void
2102 restore_current_matrix (struct frame *f, struct glyph_matrix *saved)
2104 int i;
2106 for (i = 0; i < saved->nrows; ++i)
2108 struct glyph_row *from = saved->rows + i;
2109 struct glyph_row *to = f->current_matrix->rows + i;
2110 size_t nbytes = from->used[TEXT_AREA] * sizeof (struct glyph);
2111 memcpy (to->glyphs[TEXT_AREA], from->glyphs[TEXT_AREA], nbytes);
2112 to->used[TEXT_AREA] = from->used[TEXT_AREA];
2113 xfree (from->glyphs[TEXT_AREA]);
2116 xfree (saved->rows);
2117 xfree (saved);
2122 /* Allocate/reallocate glyph matrices of a single frame F for
2123 frame-based redisplay. */
2125 static void
2126 adjust_frame_glyphs_for_frame_redisplay (struct frame *f)
2128 struct dim matrix_dim;
2129 int pool_changed_p;
2130 int window_change_flags;
2131 int top_window_y;
2133 if (!FRAME_LIVE_P (f))
2134 return;
2136 top_window_y = FRAME_TOP_MARGIN (f);
2138 /* Allocate glyph pool structures if not already done. */
2139 if (f->desired_pool == NULL)
2141 f->desired_pool = new_glyph_pool ();
2142 f->current_pool = new_glyph_pool ();
2145 /* Allocate frames matrix structures if needed. */
2146 if (f->desired_matrix == NULL)
2148 f->desired_matrix = new_glyph_matrix (f->desired_pool);
2149 f->current_matrix = new_glyph_matrix (f->current_pool);
2152 /* Compute window glyph matrices. (This takes the mini-buffer
2153 window into account). The result is the size of the frame glyph
2154 matrix needed. The variable window_change_flags is set to a bit
2155 mask indicating whether new matrices will be allocated or
2156 existing matrices change their size or location within the frame
2157 matrix. */
2158 window_change_flags = 0;
2159 matrix_dim
2160 = allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f),
2161 0, top_window_y,
2163 &window_change_flags);
2165 /* Add in menu bar lines, if any. */
2166 matrix_dim.height += top_window_y;
2168 /* Enlarge pools as necessary. */
2169 pool_changed_p = realloc_glyph_pool (f->desired_pool, matrix_dim);
2170 realloc_glyph_pool (f->current_pool, matrix_dim);
2172 /* Set up glyph pointers within window matrices. Do this only if
2173 absolutely necessary since it requires a frame redraw. */
2174 if (pool_changed_p || window_change_flags)
2176 /* Do it for window matrices. */
2177 allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f),
2178 0, top_window_y, 0,
2179 &window_change_flags);
2181 /* Size of frame matrices must equal size of frame. Note
2182 that we are called for X frames with window widths NOT equal
2183 to the frame width (from CHANGE_FRAME_SIZE_1). */
2184 xassert (matrix_dim.width == FRAME_COLS (f)
2185 && matrix_dim.height == FRAME_LINES (f));
2187 /* Pointers to glyph memory in glyph rows are exchanged during
2188 the update phase of redisplay, which means in general that a
2189 frame's current matrix consists of pointers into both the
2190 desired and current glyph pool of the frame. Adjusting a
2191 matrix sets the frame matrix up so that pointers are all into
2192 the same pool. If we want to preserve glyph contents of the
2193 current matrix over a call to adjust_glyph_matrix, we must
2194 make a copy of the current glyphs, and restore the current
2195 matrix' contents from that copy. */
2196 if (display_completed
2197 && !FRAME_GARBAGED_P (f)
2198 && matrix_dim.width == f->current_matrix->matrix_w
2199 && matrix_dim.height == f->current_matrix->matrix_h
2200 /* For some reason, the frame glyph matrix gets corrupted if
2201 any of the windows contain margins. I haven't been able
2202 to hunt down the reason, but for the moment this prevents
2203 the problem from manifesting. -- cyd */
2204 && !showing_window_margins_p (XWINDOW (FRAME_ROOT_WINDOW (f))))
2206 struct glyph_matrix *copy = save_current_matrix (f);
2207 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim);
2208 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim);
2209 restore_current_matrix (f, copy);
2210 fake_current_matrices (FRAME_ROOT_WINDOW (f));
2212 else
2214 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim);
2215 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim);
2216 SET_FRAME_GARBAGED (f);
2222 /* Allocate/reallocate glyph matrices of a single frame F for
2223 window-based redisplay. */
2225 static void
2226 adjust_frame_glyphs_for_window_redisplay (struct frame *f)
2228 struct window *w;
2230 xassert (FRAME_WINDOW_P (f) && FRAME_LIVE_P (f));
2232 /* Allocate/reallocate window matrices. */
2233 allocate_matrices_for_window_redisplay (XWINDOW (FRAME_ROOT_WINDOW (f)));
2235 #ifdef HAVE_X_WINDOWS
2236 /* Allocate/ reallocate matrices of the dummy window used to display
2237 the menu bar under X when no X toolkit support is available. */
2238 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
2240 /* Allocate a dummy window if not already done. */
2241 if (NILP (f->menu_bar_window))
2243 f->menu_bar_window = make_window ();
2244 w = XWINDOW (f->menu_bar_window);
2245 XSETFRAME (w->frame, f);
2246 w->pseudo_window_p = 1;
2248 else
2249 w = XWINDOW (f->menu_bar_window);
2251 /* Set window dimensions to frame dimensions and allocate or
2252 adjust glyph matrices of W. */
2253 XSETFASTINT (w->top_line, 0);
2254 XSETFASTINT (w->left_col, 0);
2255 XSETFASTINT (w->total_lines, FRAME_MENU_BAR_LINES (f));
2256 XSETFASTINT (w->total_cols, FRAME_TOTAL_COLS (f));
2257 allocate_matrices_for_window_redisplay (w);
2259 #endif /* not USE_X_TOOLKIT && not USE_GTK */
2260 #endif /* HAVE_X_WINDOWS */
2262 #ifndef USE_GTK
2263 /* Allocate/ reallocate matrices of the tool bar window. If we
2264 don't have a tool bar window yet, make one. */
2265 if (NILP (f->tool_bar_window))
2267 f->tool_bar_window = make_window ();
2268 w = XWINDOW (f->tool_bar_window);
2269 XSETFRAME (w->frame, f);
2270 w->pseudo_window_p = 1;
2272 else
2273 w = XWINDOW (f->tool_bar_window);
2275 XSETFASTINT (w->top_line, FRAME_MENU_BAR_LINES (f));
2276 XSETFASTINT (w->left_col, 0);
2277 XSETFASTINT (w->total_lines, FRAME_TOOL_BAR_LINES (f));
2278 XSETFASTINT (w->total_cols, FRAME_TOTAL_COLS (f));
2279 allocate_matrices_for_window_redisplay (w);
2280 #endif
2284 /* Adjust/ allocate message buffer of frame F.
2286 Note that the message buffer is never freed. Since I could not
2287 find a free in 19.34, I assume that freeing it would be
2288 problematic in some way and don't do it either.
2290 (Implementation note: It should be checked if we can free it
2291 eventually without causing trouble). */
2293 static void
2294 adjust_frame_message_buffer (struct frame *f)
2296 int size = FRAME_MESSAGE_BUF_SIZE (f) + 1;
2298 if (FRAME_MESSAGE_BUF (f))
2300 char *buffer = FRAME_MESSAGE_BUF (f);
2301 char *new_buffer = (char *) xrealloc (buffer, size);
2302 FRAME_MESSAGE_BUF (f) = new_buffer;
2304 else
2305 FRAME_MESSAGE_BUF (f) = (char *) xmalloc (size);
2309 /* Re-allocate buffer for decode_mode_spec on frame F. */
2311 static void
2312 adjust_decode_mode_spec_buffer (struct frame *f)
2314 f->decode_mode_spec_buffer
2315 = (char *) xrealloc (f->decode_mode_spec_buffer,
2316 FRAME_MESSAGE_BUF_SIZE (f) + 1);
2321 /**********************************************************************
2322 Freeing Glyph Matrices
2323 **********************************************************************/
2325 /* Free glyph memory for a frame F. F may be null. This function can
2326 be called for the same frame more than once. The root window of
2327 F may be nil when this function is called. This is the case when
2328 the function is called when F is destroyed. */
2330 void
2331 free_glyphs (struct frame *f)
2333 if (f && f->glyphs_initialized_p)
2335 /* Block interrupt input so that we don't get surprised by an X
2336 event while we're in an inconsistent state. */
2337 BLOCK_INPUT;
2338 f->glyphs_initialized_p = 0;
2340 /* Release window sub-matrices. */
2341 if (!NILP (f->root_window))
2342 free_window_matrices (XWINDOW (f->root_window));
2344 /* Free the dummy window for menu bars without X toolkit and its
2345 glyph matrices. */
2346 if (!NILP (f->menu_bar_window))
2348 struct window *w = XWINDOW (f->menu_bar_window);
2349 free_glyph_matrix (w->desired_matrix);
2350 free_glyph_matrix (w->current_matrix);
2351 w->desired_matrix = w->current_matrix = NULL;
2352 f->menu_bar_window = Qnil;
2355 /* Free the tool bar window and its glyph matrices. */
2356 if (!NILP (f->tool_bar_window))
2358 struct window *w = XWINDOW (f->tool_bar_window);
2359 free_glyph_matrix (w->desired_matrix);
2360 free_glyph_matrix (w->current_matrix);
2361 w->desired_matrix = w->current_matrix = NULL;
2362 f->tool_bar_window = Qnil;
2365 /* Release frame glyph matrices. Reset fields to zero in
2366 case we are called a second time. */
2367 if (f->desired_matrix)
2369 free_glyph_matrix (f->desired_matrix);
2370 free_glyph_matrix (f->current_matrix);
2371 f->desired_matrix = f->current_matrix = NULL;
2374 /* Release glyph pools. */
2375 if (f->desired_pool)
2377 free_glyph_pool (f->desired_pool);
2378 free_glyph_pool (f->current_pool);
2379 f->desired_pool = f->current_pool = NULL;
2382 UNBLOCK_INPUT;
2387 /* Free glyph sub-matrices in the window tree rooted at W. This
2388 function may be called with a null pointer, and it may be called on
2389 the same tree more than once. */
2391 void
2392 free_window_matrices (struct window *w)
2394 while (w)
2396 if (!NILP (w->hchild))
2397 free_window_matrices (XWINDOW (w->hchild));
2398 else if (!NILP (w->vchild))
2399 free_window_matrices (XWINDOW (w->vchild));
2400 else
2402 /* This is a leaf window. Free its memory and reset fields
2403 to zero in case this function is called a second time for
2404 W. */
2405 free_glyph_matrix (w->current_matrix);
2406 free_glyph_matrix (w->desired_matrix);
2407 w->current_matrix = w->desired_matrix = NULL;
2410 /* Next window on same level. */
2411 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2416 /* Check glyph memory leaks. This function is called from
2417 shut_down_emacs. Note that frames are not destroyed when Emacs
2418 exits. We therefore free all glyph memory for all active frames
2419 explicitly and check that nothing is left allocated. */
2421 void
2422 check_glyph_memory (void)
2424 Lisp_Object tail, frame;
2426 /* Free glyph memory for all frames. */
2427 FOR_EACH_FRAME (tail, frame)
2428 free_glyphs (XFRAME (frame));
2430 /* Check that nothing is left allocated. */
2431 if (glyph_matrix_count)
2432 abort ();
2433 if (glyph_pool_count)
2434 abort ();
2439 /**********************************************************************
2440 Building a Frame Matrix
2441 **********************************************************************/
2443 /* Most of the redisplay code works on glyph matrices attached to
2444 windows. This is a good solution most of the time, but it is not
2445 suitable for terminal code. Terminal output functions cannot rely
2446 on being able to set an arbitrary terminal window. Instead they
2447 must be provided with a view of the whole frame, i.e. the whole
2448 screen. We build such a view by constructing a frame matrix from
2449 window matrices in this section.
2451 Windows that must be updated have their must_be_update_p flag set.
2452 For all such windows, their desired matrix is made part of the
2453 desired frame matrix. For other windows, their current matrix is
2454 made part of the desired frame matrix.
2456 +-----------------+----------------+
2457 | desired | desired |
2458 | | |
2459 +-----------------+----------------+
2460 | current |
2462 +----------------------------------+
2464 Desired window matrices can be made part of the frame matrix in a
2465 cheap way: We exploit the fact that the desired frame matrix and
2466 desired window matrices share their glyph memory. This is not
2467 possible for current window matrices. Their glyphs are copied to
2468 the desired frame matrix. The latter is equivalent to
2469 preserve_other_columns in the old redisplay.
2471 Used glyphs counters for frame matrix rows are the result of adding
2472 up glyph lengths of the window matrices. A line in the frame
2473 matrix is enabled, if a corresponding line in a window matrix is
2474 enabled.
2476 After building the desired frame matrix, it will be passed to
2477 terminal code, which will manipulate both the desired and current
2478 frame matrix. Changes applied to the frame's current matrix have
2479 to be visible in current window matrices afterwards, of course.
2481 This problem is solved like this:
2483 1. Window and frame matrices share glyphs. Window matrices are
2484 constructed in a way that their glyph contents ARE the glyph
2485 contents needed in a frame matrix. Thus, any modification of
2486 glyphs done in terminal code will be reflected in window matrices
2487 automatically.
2489 2. Exchanges of rows in a frame matrix done by terminal code are
2490 intercepted by hook functions so that corresponding row operations
2491 on window matrices can be performed. This is necessary because we
2492 use pointers to glyphs in glyph row structures. To satisfy the
2493 assumption of point 1 above that glyphs are updated implicitly in
2494 window matrices when they are manipulated via the frame matrix,
2495 window and frame matrix must of course agree where to find the
2496 glyphs for their rows. Possible manipulations that must be
2497 mirrored are assignments of rows of the desired frame matrix to the
2498 current frame matrix and scrolling the current frame matrix. */
2500 /* Build frame F's desired matrix from window matrices. Only windows
2501 which have the flag must_be_updated_p set have to be updated. Menu
2502 bar lines of a frame are not covered by window matrices, so make
2503 sure not to touch them in this function. */
2505 static void
2506 build_frame_matrix (struct frame *f)
2508 int i;
2510 /* F must have a frame matrix when this function is called. */
2511 xassert (!FRAME_WINDOW_P (f));
2513 /* Clear all rows in the frame matrix covered by window matrices.
2514 Menu bar lines are not covered by windows. */
2515 for (i = FRAME_TOP_MARGIN (f); i < f->desired_matrix->nrows; ++i)
2516 clear_glyph_row (MATRIX_ROW (f->desired_matrix, i));
2518 /* Build the matrix by walking the window tree. */
2519 build_frame_matrix_from_window_tree (f->desired_matrix,
2520 XWINDOW (FRAME_ROOT_WINDOW (f)));
2524 /* Walk a window tree, building a frame matrix MATRIX from window
2525 matrices. W is the root of a window tree. */
2527 static void
2528 build_frame_matrix_from_window_tree (struct glyph_matrix *matrix, struct window *w)
2530 while (w)
2532 if (!NILP (w->hchild))
2533 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->hchild));
2534 else if (!NILP (w->vchild))
2535 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->vchild));
2536 else
2537 build_frame_matrix_from_leaf_window (matrix, w);
2539 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2544 /* Add a window's matrix to a frame matrix. FRAME_MATRIX is the
2545 desired frame matrix built. W is a leaf window whose desired or
2546 current matrix is to be added to FRAME_MATRIX. W's flag
2547 must_be_updated_p determines which matrix it contributes to
2548 FRAME_MATRIX. If must_be_updated_p is non-zero, W's desired matrix
2549 is added to FRAME_MATRIX, otherwise W's current matrix is added.
2550 Adding a desired matrix means setting up used counters and such in
2551 frame rows, while adding a current window matrix to FRAME_MATRIX
2552 means copying glyphs. The latter case corresponds to
2553 preserve_other_columns in the old redisplay. */
2555 static void
2556 build_frame_matrix_from_leaf_window (struct glyph_matrix *frame_matrix, struct window *w)
2558 struct glyph_matrix *window_matrix;
2559 int window_y, frame_y;
2560 /* If non-zero, a glyph to insert at the right border of W. */
2561 GLYPH right_border_glyph;
2563 SET_GLYPH_FROM_CHAR (right_border_glyph, 0);
2565 /* Set window_matrix to the matrix we have to add to FRAME_MATRIX. */
2566 if (w->must_be_updated_p)
2568 window_matrix = w->desired_matrix;
2570 /* Decide whether we want to add a vertical border glyph. */
2571 if (!WINDOW_RIGHTMOST_P (w))
2573 struct Lisp_Char_Table *dp = window_display_table (w);
2574 Lisp_Object gc;
2576 SET_GLYPH_FROM_CHAR (right_border_glyph, '|');
2577 if (dp
2578 && (gc = DISP_BORDER_GLYPH (dp), GLYPH_CODE_P (gc))
2579 && GLYPH_CODE_CHAR_VALID_P (gc))
2581 SET_GLYPH_FROM_GLYPH_CODE (right_border_glyph, gc);
2582 spec_glyph_lookup_face (w, &right_border_glyph);
2585 if (GLYPH_FACE (right_border_glyph) <= 0)
2586 SET_GLYPH_FACE (right_border_glyph, VERTICAL_BORDER_FACE_ID);
2589 else
2590 window_matrix = w->current_matrix;
2592 /* For all rows in the window matrix and corresponding rows in the
2593 frame matrix. */
2594 window_y = 0;
2595 frame_y = window_matrix->matrix_y;
2596 while (window_y < window_matrix->nrows)
2598 struct glyph_row *frame_row = frame_matrix->rows + frame_y;
2599 struct glyph_row *window_row = window_matrix->rows + window_y;
2600 int current_row_p = window_matrix == w->current_matrix;
2602 /* Fill up the frame row with spaces up to the left margin of the
2603 window row. */
2604 fill_up_frame_row_with_spaces (frame_row, window_matrix->matrix_x);
2606 /* Fill up areas in the window matrix row with spaces. */
2607 fill_up_glyph_row_with_spaces (window_row);
2609 /* If only part of W's desired matrix has been built, and
2610 window_row wasn't displayed, use the corresponding current
2611 row instead. */
2612 if (window_matrix == w->desired_matrix
2613 && !window_row->enabled_p)
2615 window_row = w->current_matrix->rows + window_y;
2616 current_row_p = 1;
2619 if (current_row_p)
2621 /* Copy window row to frame row. */
2622 memcpy (frame_row->glyphs[TEXT_AREA] + window_matrix->matrix_x,
2623 window_row->glyphs[0],
2624 window_matrix->matrix_w * sizeof (struct glyph));
2626 else
2628 xassert (window_row->enabled_p);
2630 /* Only when a desired row has been displayed, we want
2631 the corresponding frame row to be updated. */
2632 frame_row->enabled_p = 1;
2634 /* Maybe insert a vertical border between horizontally adjacent
2635 windows. */
2636 if (GLYPH_CHAR (right_border_glyph) != 0)
2638 struct glyph *border = window_row->glyphs[LAST_AREA] - 1;
2639 SET_CHAR_GLYPH_FROM_GLYPH (*border, right_border_glyph);
2642 #if GLYPH_DEBUG
2643 /* Window row window_y must be a slice of frame row
2644 frame_y. */
2645 xassert (glyph_row_slice_p (window_row, frame_row));
2647 /* If rows are in sync, we don't have to copy glyphs because
2648 frame and window share glyphs. */
2650 strcpy (w->current_matrix->method, w->desired_matrix->method);
2651 add_window_display_history (w, w->current_matrix->method, 0);
2652 #endif
2655 /* Set number of used glyphs in the frame matrix. Since we fill
2656 up with spaces, and visit leaf windows from left to right it
2657 can be done simply. */
2658 frame_row->used[TEXT_AREA]
2659 = window_matrix->matrix_x + window_matrix->matrix_w;
2661 /* Next row. */
2662 ++window_y;
2663 ++frame_y;
2667 /* Given a user-specified glyph, possibly including a Lisp-level face
2668 ID, return a glyph that has a realized face ID.
2669 This is used for glyphs displayed specially and not part of the text;
2670 for instance, vertical separators, truncation markers, etc. */
2672 void
2673 spec_glyph_lookup_face (struct window *w, GLYPH *glyph)
2675 int lface_id = GLYPH_FACE (*glyph);
2676 /* Convert the glyph's specified face to a realized (cache) face. */
2677 if (lface_id > 0)
2679 int face_id = merge_faces (XFRAME (w->frame),
2680 Qt, lface_id, DEFAULT_FACE_ID);
2681 SET_GLYPH_FACE (*glyph, face_id);
2685 /* Add spaces to a glyph row ROW in a window matrix.
2687 Each row has the form:
2689 +---------+-----------------------------+------------+
2690 | left | text | right |
2691 +---------+-----------------------------+------------+
2693 Left and right marginal areas are optional. This function adds
2694 spaces to areas so that there are no empty holes between areas.
2695 In other words: If the right area is not empty, the text area
2696 is filled up with spaces up to the right area. If the text area
2697 is not empty, the left area is filled up.
2699 To be called for frame-based redisplay, only. */
2701 static void
2702 fill_up_glyph_row_with_spaces (struct glyph_row *row)
2704 fill_up_glyph_row_area_with_spaces (row, LEFT_MARGIN_AREA);
2705 fill_up_glyph_row_area_with_spaces (row, TEXT_AREA);
2706 fill_up_glyph_row_area_with_spaces (row, RIGHT_MARGIN_AREA);
2710 /* Fill area AREA of glyph row ROW with spaces. To be called for
2711 frame-based redisplay only. */
2713 static void
2714 fill_up_glyph_row_area_with_spaces (struct glyph_row *row, int area)
2716 if (row->glyphs[area] < row->glyphs[area + 1])
2718 struct glyph *end = row->glyphs[area + 1];
2719 struct glyph *text = row->glyphs[area] + row->used[area];
2721 while (text < end)
2722 *text++ = space_glyph;
2723 row->used[area] = text - row->glyphs[area];
2728 /* Add spaces to the end of ROW in a frame matrix until index UPTO is
2729 reached. In frame matrices only one area, TEXT_AREA, is used. */
2731 static void
2732 fill_up_frame_row_with_spaces (struct glyph_row *row, int upto)
2734 int i = row->used[TEXT_AREA];
2735 struct glyph *glyph = row->glyphs[TEXT_AREA];
2737 while (i < upto)
2738 glyph[i++] = space_glyph;
2740 row->used[TEXT_AREA] = i;
2745 /**********************************************************************
2746 Mirroring operations on frame matrices in window matrices
2747 **********************************************************************/
2749 /* Set frame being updated via frame-based redisplay to F. This
2750 function must be called before updates to make explicit that we are
2751 working on frame matrices or not. */
2753 static INLINE void
2754 set_frame_matrix_frame (struct frame *f)
2756 frame_matrix_frame = f;
2760 /* Make sure glyph row ROW in CURRENT_MATRIX is up to date.
2761 DESIRED_MATRIX is the desired matrix corresponding to
2762 CURRENT_MATRIX. The update is done by exchanging glyph pointers
2763 between rows in CURRENT_MATRIX and DESIRED_MATRIX. If
2764 frame_matrix_frame is non-null, this indicates that the exchange is
2765 done in frame matrices, and that we have to perform analogous
2766 operations in window matrices of frame_matrix_frame. */
2768 static INLINE void
2769 make_current (struct glyph_matrix *desired_matrix, struct glyph_matrix *current_matrix, int row)
2771 struct glyph_row *current_row = MATRIX_ROW (current_matrix, row);
2772 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, row);
2773 int mouse_face_p = current_row->mouse_face_p;
2775 /* Do current_row = desired_row. This exchanges glyph pointers
2776 between both rows, and does a structure assignment otherwise. */
2777 assign_row (current_row, desired_row);
2779 /* Enable current_row to mark it as valid. */
2780 current_row->enabled_p = 1;
2781 current_row->mouse_face_p = mouse_face_p;
2783 /* If we are called on frame matrices, perform analogous operations
2784 for window matrices. */
2785 if (frame_matrix_frame)
2786 mirror_make_current (XWINDOW (frame_matrix_frame->root_window), row);
2790 /* W is the root of a window tree. FRAME_ROW is the index of a row in
2791 W's frame which has been made current (by swapping pointers between
2792 current and desired matrix). Perform analogous operations in the
2793 matrices of leaf windows in the window tree rooted at W. */
2795 static void
2796 mirror_make_current (struct window *w, int frame_row)
2798 while (w)
2800 if (!NILP (w->hchild))
2801 mirror_make_current (XWINDOW (w->hchild), frame_row);
2802 else if (!NILP (w->vchild))
2803 mirror_make_current (XWINDOW (w->vchild), frame_row);
2804 else
2806 /* Row relative to window W. Don't use FRAME_TO_WINDOW_VPOS
2807 here because the checks performed in debug mode there
2808 will not allow the conversion. */
2809 int row = frame_row - w->desired_matrix->matrix_y;
2811 /* If FRAME_ROW is within W, assign the desired row to the
2812 current row (exchanging glyph pointers). */
2813 if (row >= 0 && row < w->desired_matrix->matrix_h)
2815 struct glyph_row *current_row
2816 = MATRIX_ROW (w->current_matrix, row);
2817 struct glyph_row *desired_row
2818 = MATRIX_ROW (w->desired_matrix, row);
2820 if (desired_row->enabled_p)
2821 assign_row (current_row, desired_row);
2822 else
2823 swap_glyph_pointers (desired_row, current_row);
2824 current_row->enabled_p = 1;
2826 /* Set the Y coordinate of the mode/header line's row.
2827 It is needed in draw_row_with_mouse_face to find the
2828 screen coordinates. (Window-based redisplay sets
2829 this in update_window, but no one seems to do that
2830 for frame-based redisplay.) */
2831 if (current_row->mode_line_p)
2832 current_row->y = row;
2836 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2841 /* Perform row dance after scrolling. We are working on the range of
2842 lines UNCHANGED_AT_TOP + 1 to UNCHANGED_AT_TOP + NLINES (not
2843 including) in MATRIX. COPY_FROM is a vector containing, for each
2844 row I in the range 0 <= I < NLINES, the index of the original line
2845 to move to I. This index is relative to the row range, i.e. 0 <=
2846 index < NLINES. RETAINED_P is a vector containing zero for each
2847 row 0 <= I < NLINES which is empty.
2849 This function is called from do_scrolling and do_direct_scrolling. */
2851 void
2852 mirrored_line_dance (struct glyph_matrix *matrix, int unchanged_at_top, int nlines,
2853 int *copy_from, char *retained_p)
2855 /* A copy of original rows. */
2856 struct glyph_row *old_rows;
2858 /* Rows to assign to. */
2859 struct glyph_row *new_rows = MATRIX_ROW (matrix, unchanged_at_top);
2861 int i;
2863 /* Make a copy of the original rows. */
2864 old_rows = (struct glyph_row *) alloca (nlines * sizeof *old_rows);
2865 memcpy (old_rows, new_rows, nlines * sizeof *old_rows);
2867 /* Assign new rows, maybe clear lines. */
2868 for (i = 0; i < nlines; ++i)
2870 int enabled_before_p = new_rows[i].enabled_p;
2872 xassert (i + unchanged_at_top < matrix->nrows);
2873 xassert (unchanged_at_top + copy_from[i] < matrix->nrows);
2874 new_rows[i] = old_rows[copy_from[i]];
2875 new_rows[i].enabled_p = enabled_before_p;
2877 /* RETAINED_P is zero for empty lines. */
2878 if (!retained_p[copy_from[i]])
2879 new_rows[i].enabled_p = 0;
2882 /* Do the same for window matrices, if MATRIX is a frame matrix. */
2883 if (frame_matrix_frame)
2884 mirror_line_dance (XWINDOW (frame_matrix_frame->root_window),
2885 unchanged_at_top, nlines, copy_from, retained_p);
2889 /* Synchronize glyph pointers in the current matrix of window W with
2890 the current frame matrix. */
2892 static void
2893 sync_window_with_frame_matrix_rows (struct window *w)
2895 struct frame *f = XFRAME (w->frame);
2896 struct glyph_row *window_row, *window_row_end, *frame_row;
2897 int left, right, x, width;
2899 /* Preconditions: W must be a leaf window on a tty frame. */
2900 xassert (NILP (w->hchild) && NILP (w->vchild));
2901 xassert (!FRAME_WINDOW_P (f));
2903 left = margin_glyphs_to_reserve (w, 1, w->left_margin_cols);
2904 right = margin_glyphs_to_reserve (w, 1, w->right_margin_cols);
2905 x = w->current_matrix->matrix_x;
2906 width = w->current_matrix->matrix_w;
2908 window_row = w->current_matrix->rows;
2909 window_row_end = window_row + w->current_matrix->nrows;
2910 frame_row = f->current_matrix->rows + WINDOW_TOP_EDGE_LINE (w);
2912 for (; window_row < window_row_end; ++window_row, ++frame_row)
2914 window_row->glyphs[LEFT_MARGIN_AREA]
2915 = frame_row->glyphs[0] + x;
2916 window_row->glyphs[TEXT_AREA]
2917 = window_row->glyphs[LEFT_MARGIN_AREA] + left;
2918 window_row->glyphs[LAST_AREA]
2919 = window_row->glyphs[LEFT_MARGIN_AREA] + width;
2920 window_row->glyphs[RIGHT_MARGIN_AREA]
2921 = window_row->glyphs[LAST_AREA] - right;
2926 /* Return the window in the window tree rooted in W containing frame
2927 row ROW. Value is null if none is found. */
2929 struct window *
2930 frame_row_to_window (struct window *w, int row)
2932 struct window *found = NULL;
2934 while (w && !found)
2936 if (!NILP (w->hchild))
2937 found = frame_row_to_window (XWINDOW (w->hchild), row);
2938 else if (!NILP (w->vchild))
2939 found = frame_row_to_window (XWINDOW (w->vchild), row);
2940 else if (row >= WINDOW_TOP_EDGE_LINE (w)
2941 && row < WINDOW_BOTTOM_EDGE_LINE (w))
2942 found = w;
2944 w = NILP (w->next) ? 0 : XWINDOW (w->next);
2947 return found;
2951 /* Perform a line dance in the window tree rooted at W, after
2952 scrolling a frame matrix in mirrored_line_dance.
2954 We are working on the range of lines UNCHANGED_AT_TOP + 1 to
2955 UNCHANGED_AT_TOP + NLINES (not including) in W's frame matrix.
2956 COPY_FROM is a vector containing, for each row I in the range 0 <=
2957 I < NLINES, the index of the original line to move to I. This
2958 index is relative to the row range, i.e. 0 <= index < NLINES.
2959 RETAINED_P is a vector containing zero for each row 0 <= I < NLINES
2960 which is empty. */
2962 static void
2963 mirror_line_dance (struct window *w, int unchanged_at_top, int nlines, int *copy_from, char *retained_p)
2965 while (w)
2967 if (!NILP (w->hchild))
2968 mirror_line_dance (XWINDOW (w->hchild), unchanged_at_top,
2969 nlines, copy_from, retained_p);
2970 else if (!NILP (w->vchild))
2971 mirror_line_dance (XWINDOW (w->vchild), unchanged_at_top,
2972 nlines, copy_from, retained_p);
2973 else
2975 /* W is a leaf window, and we are working on its current
2976 matrix m. */
2977 struct glyph_matrix *m = w->current_matrix;
2978 int i, sync_p = 0;
2979 struct glyph_row *old_rows;
2981 /* Make a copy of the original rows of matrix m. */
2982 old_rows = (struct glyph_row *) alloca (m->nrows * sizeof *old_rows);
2983 memcpy (old_rows, m->rows, m->nrows * sizeof *old_rows);
2985 for (i = 0; i < nlines; ++i)
2987 /* Frame relative line assigned to. */
2988 int frame_to = i + unchanged_at_top;
2990 /* Frame relative line assigned. */
2991 int frame_from = copy_from[i] + unchanged_at_top;
2993 /* Window relative line assigned to. */
2994 int window_to = frame_to - m->matrix_y;
2996 /* Window relative line assigned. */
2997 int window_from = frame_from - m->matrix_y;
2999 /* Is assigned line inside window? */
3000 int from_inside_window_p
3001 = window_from >= 0 && window_from < m->matrix_h;
3003 /* Is assigned to line inside window? */
3004 int to_inside_window_p
3005 = window_to >= 0 && window_to < m->matrix_h;
3007 if (from_inside_window_p && to_inside_window_p)
3009 /* Enabled setting before assignment. */
3010 int enabled_before_p;
3012 /* Do the assignment. The enabled_p flag is saved
3013 over the assignment because the old redisplay did
3014 that. */
3015 enabled_before_p = m->rows[window_to].enabled_p;
3016 m->rows[window_to] = old_rows[window_from];
3017 m->rows[window_to].enabled_p = enabled_before_p;
3019 /* If frame line is empty, window line is empty, too. */
3020 if (!retained_p[copy_from[i]])
3021 m->rows[window_to].enabled_p = 0;
3023 else if (to_inside_window_p)
3025 /* A copy between windows. This is an infrequent
3026 case not worth optimizing. */
3027 struct frame *f = XFRAME (w->frame);
3028 struct window *root = XWINDOW (FRAME_ROOT_WINDOW (f));
3029 struct window *w2;
3030 struct glyph_matrix *m2;
3031 int m2_from;
3033 w2 = frame_row_to_window (root, frame_from);
3034 /* ttn@surf.glug.org: when enabling menu bar using `emacs
3035 -nw', FROM_FRAME sometimes has no associated window.
3036 This check avoids a segfault if W2 is null. */
3037 if (w2)
3039 m2 = w2->current_matrix;
3040 m2_from = frame_from - m2->matrix_y;
3041 copy_row_except_pointers (m->rows + window_to,
3042 m2->rows + m2_from);
3044 /* If frame line is empty, window line is empty, too. */
3045 if (!retained_p[copy_from[i]])
3046 m->rows[window_to].enabled_p = 0;
3048 sync_p = 1;
3050 else if (from_inside_window_p)
3051 sync_p = 1;
3054 /* If there was a copy between windows, make sure glyph
3055 pointers are in sync with the frame matrix. */
3056 if (sync_p)
3057 sync_window_with_frame_matrix_rows (w);
3059 /* Check that no pointers are lost. */
3060 CHECK_MATRIX (m);
3063 /* Next window on same level. */
3064 w = NILP (w->next) ? 0 : XWINDOW (w->next);
3069 #if GLYPH_DEBUG
3071 /* Check that window and frame matrices agree about their
3072 understanding where glyphs of the rows are to find. For each
3073 window in the window tree rooted at W, check that rows in the
3074 matrices of leaf window agree with their frame matrices about
3075 glyph pointers. */
3077 void
3078 check_window_matrix_pointers (struct window *w)
3080 while (w)
3082 if (!NILP (w->hchild))
3083 check_window_matrix_pointers (XWINDOW (w->hchild));
3084 else if (!NILP (w->vchild))
3085 check_window_matrix_pointers (XWINDOW (w->vchild));
3086 else
3088 struct frame *f = XFRAME (w->frame);
3089 check_matrix_pointers (w->desired_matrix, f->desired_matrix);
3090 check_matrix_pointers (w->current_matrix, f->current_matrix);
3093 w = NILP (w->next) ? 0 : XWINDOW (w->next);
3098 /* Check that window rows are slices of frame rows. WINDOW_MATRIX is
3099 a window and FRAME_MATRIX is the corresponding frame matrix. For
3100 each row in WINDOW_MATRIX check that it's a slice of the
3101 corresponding frame row. If it isn't, abort. */
3103 static void
3104 check_matrix_pointers (struct glyph_matrix *window_matrix,
3105 struct glyph_matrix *frame_matrix)
3107 /* Row number in WINDOW_MATRIX. */
3108 int i = 0;
3110 /* Row number corresponding to I in FRAME_MATRIX. */
3111 int j = window_matrix->matrix_y;
3113 /* For all rows check that the row in the window matrix is a
3114 slice of the row in the frame matrix. If it isn't we didn't
3115 mirror an operation on the frame matrix correctly. */
3116 while (i < window_matrix->nrows)
3118 if (!glyph_row_slice_p (window_matrix->rows + i,
3119 frame_matrix->rows + j))
3120 abort ();
3121 ++i, ++j;
3125 #endif /* GLYPH_DEBUG != 0 */
3129 /**********************************************************************
3130 VPOS and HPOS translations
3131 **********************************************************************/
3133 #if GLYPH_DEBUG
3135 /* Translate vertical position VPOS which is relative to window W to a
3136 vertical position relative to W's frame. */
3138 static int
3139 window_to_frame_vpos (struct window *w, int vpos)
3141 struct frame *f = XFRAME (w->frame);
3143 xassert (!FRAME_WINDOW_P (f));
3144 xassert (vpos >= 0 && vpos <= w->desired_matrix->nrows);
3145 vpos += WINDOW_TOP_EDGE_LINE (w);
3146 xassert (vpos >= 0 && vpos <= FRAME_LINES (f));
3147 return vpos;
3151 /* Translate horizontal position HPOS which is relative to window W to
3152 a horizontal position relative to W's frame. */
3154 static int
3155 window_to_frame_hpos (struct window *w, int hpos)
3157 xassert (!FRAME_WINDOW_P (XFRAME (w->frame)));
3158 hpos += WINDOW_LEFT_EDGE_COL (w);
3159 return hpos;
3162 #endif /* GLYPH_DEBUG */
3166 /**********************************************************************
3167 Redrawing Frames
3168 **********************************************************************/
3170 DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0,
3171 doc: /* Clear frame FRAME and output again what is supposed to appear on it. */)
3172 (Lisp_Object frame)
3174 struct frame *f;
3176 CHECK_LIVE_FRAME (frame);
3177 f = XFRAME (frame);
3179 /* Ignore redraw requests, if frame has no glyphs yet.
3180 (Implementation note: It still has to be checked why we are
3181 called so early here). */
3182 if (!glyphs_initialized_initially_p)
3183 return Qnil;
3185 update_begin (f);
3186 #ifdef MSDOS
3187 if (FRAME_MSDOS_P (f))
3188 FRAME_TERMINAL (f)->set_terminal_modes_hook (FRAME_TERMINAL (f));
3189 #endif
3190 clear_frame (f);
3191 clear_current_matrices (f);
3192 update_end (f);
3193 if (FRAME_TERMCAP_P (f))
3194 fflush (FRAME_TTY (f)->output);
3195 windows_or_buffers_changed++;
3196 /* Mark all windows as inaccurate, so that every window will have
3197 its redisplay done. */
3198 mark_window_display_accurate (FRAME_ROOT_WINDOW (f), 0);
3199 set_window_update_flags (XWINDOW (FRAME_ROOT_WINDOW (f)), 1);
3200 f->garbaged = 0;
3201 return Qnil;
3205 /* Redraw frame F. This is nothing more than a call to the Lisp
3206 function redraw-frame. */
3208 void
3209 redraw_frame (struct frame *f)
3211 Lisp_Object frame;
3212 XSETFRAME (frame, f);
3213 Fredraw_frame (frame);
3217 DEFUN ("redraw-display", Fredraw_display, Sredraw_display, 0, 0, "",
3218 doc: /* Clear and redisplay all visible frames. */)
3219 (void)
3221 Lisp_Object tail, frame;
3223 FOR_EACH_FRAME (tail, frame)
3224 if (FRAME_VISIBLE_P (XFRAME (frame)))
3225 Fredraw_frame (frame);
3227 return Qnil;
3231 /* This is used when frame_garbaged is set. Call Fredraw_frame on all
3232 visible frames marked as garbaged. */
3234 void
3235 redraw_garbaged_frames (void)
3237 Lisp_Object tail, frame;
3239 FOR_EACH_FRAME (tail, frame)
3240 if (FRAME_VISIBLE_P (XFRAME (frame))
3241 && FRAME_GARBAGED_P (XFRAME (frame)))
3242 Fredraw_frame (frame);
3247 /***********************************************************************
3248 Frame Update
3249 ***********************************************************************/
3251 /* Update frame F based on the data in desired matrices.
3253 If FORCE_P is non-zero, don't let redisplay be stopped by detecting
3254 pending input. If INHIBIT_HAIRY_ID_P is non-zero, don't try
3255 scrolling.
3257 Value is non-zero if redisplay was stopped due to pending input. */
3260 update_frame (struct frame *f, int force_p, int inhibit_hairy_id_p)
3262 /* 1 means display has been paused because of pending input. */
3263 int paused_p;
3264 struct window *root_window = XWINDOW (f->root_window);
3266 if (redisplay_dont_pause)
3267 force_p = 1;
3268 #if PERIODIC_PREEMPTION_CHECKING
3269 else if (NILP (Vredisplay_preemption_period))
3270 force_p = 1;
3271 else if (!force_p && NUMBERP (Vredisplay_preemption_period))
3273 EMACS_TIME tm;
3274 double p = XFLOATINT (Vredisplay_preemption_period);
3275 int sec, usec;
3277 if (detect_input_pending_ignore_squeezables ())
3279 paused_p = 1;
3280 goto do_pause;
3283 sec = (int) p;
3284 usec = (p - sec) * 1000000;
3286 EMACS_GET_TIME (tm);
3287 EMACS_SET_SECS_USECS (preemption_period, sec, usec);
3288 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
3290 #endif
3292 if (FRAME_WINDOW_P (f))
3294 /* We are working on window matrix basis. All windows whose
3295 flag must_be_updated_p is set have to be updated. */
3297 /* Record that we are not working on frame matrices. */
3298 set_frame_matrix_frame (NULL);
3300 /* Update all windows in the window tree of F, maybe stopping
3301 when pending input is detected. */
3302 update_begin (f);
3304 /* Update the menu bar on X frames that don't have toolkit
3305 support. */
3306 if (WINDOWP (f->menu_bar_window))
3307 update_window (XWINDOW (f->menu_bar_window), 1);
3309 /* Update the tool-bar window, if present. */
3310 if (WINDOWP (f->tool_bar_window))
3312 struct window *w = XWINDOW (f->tool_bar_window);
3314 /* Update tool-bar window. */
3315 if (w->must_be_updated_p)
3317 Lisp_Object tem;
3319 update_window (w, 1);
3320 w->must_be_updated_p = 0;
3322 /* Swap tool-bar strings. We swap because we want to
3323 reuse strings. */
3324 tem = f->current_tool_bar_string;
3325 f->current_tool_bar_string = f->desired_tool_bar_string;
3326 f->desired_tool_bar_string = tem;
3331 /* Update windows. */
3332 paused_p = update_window_tree (root_window, force_p);
3333 update_end (f);
3335 /* This flush is a performance bottleneck under X,
3336 and it doesn't seem to be necessary anyway (in general).
3337 It is necessary when resizing the window with the mouse, or
3338 at least the fringes are not redrawn in a timely manner. ++kfs */
3339 if (f->force_flush_display_p)
3341 FRAME_RIF (f)->flush_display (f);
3342 f->force_flush_display_p = 0;
3345 else
3347 /* We are working on frame matrix basis. Set the frame on whose
3348 frame matrix we operate. */
3349 set_frame_matrix_frame (f);
3351 /* Build F's desired matrix from window matrices. */
3352 build_frame_matrix (f);
3354 /* Update the display */
3355 update_begin (f);
3356 paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p);
3357 update_end (f);
3359 if (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f))
3361 if (FRAME_TTY (f)->termscript)
3362 fflush (FRAME_TTY (f)->termscript);
3363 if (FRAME_TERMCAP_P (f))
3364 fflush (FRAME_TTY (f)->output);
3367 /* Check window matrices for lost pointers. */
3368 #if GLYPH_DEBUG
3369 check_window_matrix_pointers (root_window);
3370 add_frame_display_history (f, paused_p);
3371 #endif
3374 #if PERIODIC_PREEMPTION_CHECKING
3375 do_pause:
3376 #endif
3377 /* Reset flags indicating that a window should be updated. */
3378 set_window_update_flags (root_window, 0);
3380 display_completed = !paused_p;
3381 return paused_p;
3386 /************************************************************************
3387 Window-based updates
3388 ************************************************************************/
3390 /* Perform updates in window tree rooted at W. FORCE_P non-zero means
3391 don't stop updating when input is pending. */
3393 static int
3394 update_window_tree (struct window *w, int force_p)
3396 int paused_p = 0;
3398 while (w && !paused_p)
3400 if (!NILP (w->hchild))
3401 paused_p |= update_window_tree (XWINDOW (w->hchild), force_p);
3402 else if (!NILP (w->vchild))
3403 paused_p |= update_window_tree (XWINDOW (w->vchild), force_p);
3404 else if (w->must_be_updated_p)
3405 paused_p |= update_window (w, force_p);
3407 w = NILP (w->next) ? 0 : XWINDOW (w->next);
3410 return paused_p;
3414 /* Update window W if its flag must_be_updated_p is non-zero. If
3415 FORCE_P is non-zero, don't stop updating if input is pending. */
3417 void
3418 update_single_window (struct window *w, int force_p)
3420 if (w->must_be_updated_p)
3422 struct frame *f = XFRAME (WINDOW_FRAME (w));
3424 /* Record that this is not a frame-based redisplay. */
3425 set_frame_matrix_frame (NULL);
3427 if (redisplay_dont_pause)
3428 force_p = 1;
3429 #if PERIODIC_PREEMPTION_CHECKING
3430 else if (NILP (Vredisplay_preemption_period))
3431 force_p = 1;
3432 else if (!force_p && NUMBERP (Vredisplay_preemption_period))
3434 EMACS_TIME tm;
3435 double p = XFLOATINT (Vredisplay_preemption_period);
3436 int sec, usec;
3438 sec = (int) p;
3439 usec = (p - sec) * 1000000;
3441 EMACS_GET_TIME (tm);
3442 EMACS_SET_SECS_USECS (preemption_period, sec, usec);
3443 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
3445 #endif
3447 /* Update W. */
3448 update_begin (f);
3449 update_window (w, force_p);
3450 update_end (f);
3452 /* Reset flag in W. */
3453 w->must_be_updated_p = 0;
3457 #ifdef HAVE_WINDOW_SYSTEM
3459 /* Redraw lines from the current matrix of window W that are
3460 overlapped by other rows. YB is bottom-most y-position in W. */
3462 static void
3463 redraw_overlapped_rows (struct window *w, int yb)
3465 int i;
3466 struct frame *f = XFRAME (WINDOW_FRAME (w));
3468 /* If rows overlapping others have been changed, the rows being
3469 overlapped have to be redrawn. This won't draw lines that have
3470 already been drawn in update_window_line because overlapped_p in
3471 desired rows is 0, so after row assignment overlapped_p in
3472 current rows is 0. */
3473 for (i = 0; i < w->current_matrix->nrows; ++i)
3475 struct glyph_row *row = w->current_matrix->rows + i;
3477 if (!row->enabled_p)
3478 break;
3479 else if (row->mode_line_p)
3480 continue;
3482 if (row->overlapped_p)
3484 enum glyph_row_area area;
3486 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
3488 updated_row = row;
3489 updated_area = area;
3490 FRAME_RIF (f)->cursor_to (i, 0, row->y,
3491 area == TEXT_AREA ? row->x : 0);
3492 if (row->used[area])
3493 FRAME_RIF (f)->write_glyphs (row->glyphs[area],
3494 row->used[area]);
3495 FRAME_RIF (f)->clear_end_of_line (-1);
3498 row->overlapped_p = 0;
3501 if (MATRIX_ROW_BOTTOM_Y (row) >= yb)
3502 break;
3507 /* Redraw lines from the current matrix of window W that overlap
3508 others. YB is bottom-most y-position in W. */
3510 static void
3511 redraw_overlapping_rows (struct window *w, int yb)
3513 int i, bottom_y;
3514 struct glyph_row *row;
3515 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
3517 for (i = 0; i < w->current_matrix->nrows; ++i)
3519 row = w->current_matrix->rows + i;
3521 if (!row->enabled_p)
3522 break;
3523 else if (row->mode_line_p)
3524 continue;
3526 bottom_y = MATRIX_ROW_BOTTOM_Y (row);
3528 if (row->overlapping_p)
3530 int overlaps = 0;
3532 if (MATRIX_ROW_OVERLAPS_PRED_P (row) && i > 0
3533 && !MATRIX_ROW (w->current_matrix, i - 1)->overlapped_p)
3534 overlaps |= OVERLAPS_PRED;
3535 if (MATRIX_ROW_OVERLAPS_SUCC_P (row) && bottom_y < yb
3536 && !MATRIX_ROW (w->current_matrix, i + 1)->overlapped_p)
3537 overlaps |= OVERLAPS_SUCC;
3539 if (overlaps)
3541 if (row->used[LEFT_MARGIN_AREA])
3542 rif->fix_overlapping_area (w, row, LEFT_MARGIN_AREA, overlaps);
3544 if (row->used[TEXT_AREA])
3545 rif->fix_overlapping_area (w, row, TEXT_AREA, overlaps);
3547 if (row->used[RIGHT_MARGIN_AREA])
3548 rif->fix_overlapping_area (w, row, RIGHT_MARGIN_AREA, overlaps);
3550 /* Record in neighbour rows that ROW overwrites part of
3551 their display. */
3552 if (overlaps & OVERLAPS_PRED)
3553 MATRIX_ROW (w->current_matrix, i - 1)->overlapped_p = 1;
3554 if (overlaps & OVERLAPS_SUCC)
3555 MATRIX_ROW (w->current_matrix, i + 1)->overlapped_p = 1;
3559 if (bottom_y >= yb)
3560 break;
3564 #endif /* HAVE_WINDOW_SYSTEM */
3567 #ifdef GLYPH_DEBUG
3569 /* Check that no row in the current matrix of window W is enabled
3570 which is below what's displayed in the window. */
3572 void
3573 check_current_matrix_flags (struct window *w)
3575 int last_seen_p = 0;
3576 int i, yb = window_text_bottom_y (w);
3578 for (i = 0; i < w->current_matrix->nrows - 1; ++i)
3580 struct glyph_row *row = MATRIX_ROW (w->current_matrix, i);
3581 if (!last_seen_p && MATRIX_ROW_BOTTOM_Y (row) >= yb)
3582 last_seen_p = 1;
3583 else if (last_seen_p && row->enabled_p)
3584 abort ();
3588 #endif /* GLYPH_DEBUG */
3591 /* Update display of window W. FORCE_P non-zero means that we should
3592 not stop when detecting pending input. */
3594 static int
3595 update_window (struct window *w, int force_p)
3597 struct glyph_matrix *desired_matrix = w->desired_matrix;
3598 int paused_p;
3599 #if !PERIODIC_PREEMPTION_CHECKING
3600 int preempt_count = baud_rate / 2400 + 1;
3601 #endif
3602 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
3603 #if GLYPH_DEBUG
3604 /* Check that W's frame doesn't have glyph matrices. */
3605 xassert (FRAME_WINDOW_P (XFRAME (WINDOW_FRAME (w))));
3606 #endif
3608 /* Check pending input the first time so that we can quickly return. */
3609 #if !PERIODIC_PREEMPTION_CHECKING
3610 if (!force_p)
3611 detect_input_pending_ignore_squeezables ();
3612 #endif
3614 /* If forced to complete the update, or if no input is pending, do
3615 the update. */
3616 if (force_p || !input_pending || !NILP (do_mouse_tracking))
3618 struct glyph_row *row, *end;
3619 struct glyph_row *mode_line_row;
3620 struct glyph_row *header_line_row;
3621 int yb, changed_p = 0, mouse_face_overwritten_p = 0, n_updated;
3623 rif->update_window_begin_hook (w);
3624 yb = window_text_bottom_y (w);
3626 /* If window has a header line, update it before everything else.
3627 Adjust y-positions of other rows by the header line height. */
3628 row = desired_matrix->rows;
3629 end = row + desired_matrix->nrows - 1;
3631 if (row->mode_line_p)
3633 header_line_row = row;
3634 ++row;
3636 else
3637 header_line_row = NULL;
3639 /* Update the mode line, if necessary. */
3640 mode_line_row = MATRIX_MODE_LINE_ROW (desired_matrix);
3641 if (mode_line_row->mode_line_p && mode_line_row->enabled_p)
3643 mode_line_row->y = yb;
3644 update_window_line (w, MATRIX_ROW_VPOS (mode_line_row,
3645 desired_matrix),
3646 &mouse_face_overwritten_p);
3649 /* Find first enabled row. Optimizations in redisplay_internal
3650 may lead to an update with only one row enabled. There may
3651 be also completely empty matrices. */
3652 while (row < end && !row->enabled_p)
3653 ++row;
3655 /* Try reusing part of the display by copying. */
3656 if (row < end && !desired_matrix->no_scrolling_p)
3658 int rc = scrolling_window (w, header_line_row != NULL);
3659 if (rc < 0)
3661 /* All rows were found to be equal. */
3662 paused_p = 0;
3663 goto set_cursor;
3665 else if (rc > 0)
3667 /* We've scrolled the display. */
3668 force_p = 1;
3669 changed_p = 1;
3673 /* Update the rest of the lines. */
3674 for (n_updated = 0; row < end && (force_p || !input_pending); ++row)
3675 if (row->enabled_p)
3677 int vpos = MATRIX_ROW_VPOS (row, desired_matrix);
3678 int i;
3680 /* We'll have to play a little bit with when to
3681 detect_input_pending. If it's done too often,
3682 scrolling large windows with repeated scroll-up
3683 commands will too quickly pause redisplay. */
3684 #if PERIODIC_PREEMPTION_CHECKING
3685 if (!force_p)
3687 EMACS_TIME tm, dif;
3688 EMACS_GET_TIME (tm);
3689 EMACS_SUB_TIME (dif, preemption_next_check, tm);
3690 if (EMACS_TIME_NEG_P (dif))
3692 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
3693 if (detect_input_pending_ignore_squeezables ())
3694 break;
3697 #else
3698 if (!force_p && ++n_updated % preempt_count == 0)
3699 detect_input_pending_ignore_squeezables ();
3700 #endif
3701 changed_p |= update_window_line (w, vpos,
3702 &mouse_face_overwritten_p);
3704 /* Mark all rows below the last visible one in the current
3705 matrix as invalid. This is necessary because of
3706 variable line heights. Consider the case of three
3707 successive redisplays, where the first displays 5
3708 lines, the second 3 lines, and the third 5 lines again.
3709 If the second redisplay wouldn't mark rows in the
3710 current matrix invalid, the third redisplay might be
3711 tempted to optimize redisplay based on lines displayed
3712 in the first redisplay. */
3713 if (MATRIX_ROW_BOTTOM_Y (row) >= yb)
3714 for (i = vpos + 1; i < w->current_matrix->nrows - 1; ++i)
3715 MATRIX_ROW (w->current_matrix, i)->enabled_p = 0;
3718 /* Was display preempted? */
3719 paused_p = row < end;
3721 set_cursor:
3723 /* Update the header line after scrolling because a new header
3724 line would otherwise overwrite lines at the top of the window
3725 that can be scrolled. */
3726 if (header_line_row && header_line_row->enabled_p)
3728 header_line_row->y = 0;
3729 update_window_line (w, 0, &mouse_face_overwritten_p);
3732 /* Fix the appearance of overlapping/overlapped rows. */
3733 if (!paused_p && !w->pseudo_window_p)
3735 #ifdef HAVE_WINDOW_SYSTEM
3736 if (changed_p && rif->fix_overlapping_area)
3738 redraw_overlapped_rows (w, yb);
3739 redraw_overlapping_rows (w, yb);
3741 #endif
3743 /* Make cursor visible at cursor position of W. */
3744 set_window_cursor_after_update (w);
3746 #if 0 /* Check that current matrix invariants are satisfied. This is
3747 for debugging only. See the comment of check_matrix_invariants. */
3748 IF_DEBUG (check_matrix_invariants (w));
3749 #endif
3752 #if GLYPH_DEBUG
3753 /* Remember the redisplay method used to display the matrix. */
3754 strcpy (w->current_matrix->method, w->desired_matrix->method);
3755 #endif
3757 #ifdef HAVE_WINDOW_SYSTEM
3758 update_window_fringes (w, 0);
3759 #endif
3761 /* End the update of window W. Don't set the cursor if we
3762 paused updating the display because in this case,
3763 set_window_cursor_after_update hasn't been called, and
3764 output_cursor doesn't contain the cursor location. */
3765 rif->update_window_end_hook (w, !paused_p, mouse_face_overwritten_p);
3767 else
3768 paused_p = 1;
3770 #if GLYPH_DEBUG
3771 /* check_current_matrix_flags (w); */
3772 add_window_display_history (w, w->current_matrix->method, paused_p);
3773 #endif
3775 clear_glyph_matrix (desired_matrix);
3777 return paused_p;
3781 /* Update the display of area AREA in window W, row number VPOS.
3782 AREA can be either LEFT_MARGIN_AREA or RIGHT_MARGIN_AREA. */
3784 static void
3785 update_marginal_area (struct window *w, int area, int vpos)
3787 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
3788 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
3790 /* Let functions in xterm.c know what area subsequent X positions
3791 will be relative to. */
3792 updated_area = area;
3794 /* Set cursor to start of glyphs, write them, and clear to the end
3795 of the area. I don't think that something more sophisticated is
3796 necessary here, since marginal areas will not be the default. */
3797 rif->cursor_to (vpos, 0, desired_row->y, 0);
3798 if (desired_row->used[area])
3799 rif->write_glyphs (desired_row->glyphs[area], desired_row->used[area]);
3800 rif->clear_end_of_line (-1);
3804 /* Update the display of the text area of row VPOS in window W.
3805 Value is non-zero if display has changed. */
3807 static int
3808 update_text_area (struct window *w, int vpos)
3810 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos);
3811 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
3812 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
3813 int changed_p = 0;
3815 /* Let functions in xterm.c know what area subsequent X positions
3816 will be relative to. */
3817 updated_area = TEXT_AREA;
3819 /* If rows are at different X or Y, or rows have different height,
3820 or the current row is marked invalid, write the entire line. */
3821 if (!current_row->enabled_p
3822 || desired_row->y != current_row->y
3823 || desired_row->ascent != current_row->ascent
3824 || desired_row->phys_ascent != current_row->phys_ascent
3825 || desired_row->phys_height != current_row->phys_height
3826 || desired_row->visible_height != current_row->visible_height
3827 || current_row->overlapped_p
3828 /* This next line is necessary for correctly redrawing
3829 mouse-face areas after scrolling and other operations.
3830 However, it causes excessive flickering when mouse is moved
3831 across the mode line. Luckily, turning it off for the mode
3832 line doesn't seem to hurt anything. -- cyd.
3833 But it is still needed for the header line. -- kfs. */
3834 || (current_row->mouse_face_p
3835 && !(current_row->mode_line_p && vpos > 0))
3836 || current_row->x != desired_row->x)
3838 rif->cursor_to (vpos, 0, desired_row->y, desired_row->x);
3840 if (desired_row->used[TEXT_AREA])
3841 rif->write_glyphs (desired_row->glyphs[TEXT_AREA],
3842 desired_row->used[TEXT_AREA]);
3844 /* Clear to end of window. */
3845 rif->clear_end_of_line (-1);
3846 changed_p = 1;
3848 /* This erases the cursor. We do this here because
3849 notice_overwritten_cursor cannot easily check this, which
3850 might indicate that the whole functionality of
3851 notice_overwritten_cursor would better be implemented here.
3852 On the other hand, we need notice_overwritten_cursor as long
3853 as mouse highlighting is done asynchronously outside of
3854 redisplay. */
3855 if (vpos == w->phys_cursor.vpos)
3856 w->phys_cursor_on_p = 0;
3858 else
3860 int stop, i, x;
3861 struct glyph *current_glyph = current_row->glyphs[TEXT_AREA];
3862 struct glyph *desired_glyph = desired_row->glyphs[TEXT_AREA];
3863 int overlapping_glyphs_p = current_row->contains_overlapping_glyphs_p;
3864 int desired_stop_pos = desired_row->used[TEXT_AREA];
3865 int abort_skipping = 0;
3867 /* If the desired row extends its face to the text area end, and
3868 unless the current row also does so at the same position,
3869 make sure we write at least one glyph, so that the face
3870 extension actually takes place. */
3871 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row)
3872 && (desired_stop_pos < current_row->used[TEXT_AREA]
3873 || (desired_stop_pos == current_row->used[TEXT_AREA]
3874 && !MATRIX_ROW_EXTENDS_FACE_P (current_row))))
3875 --desired_stop_pos;
3877 stop = min (current_row->used[TEXT_AREA], desired_stop_pos);
3878 i = 0;
3879 x = desired_row->x;
3881 /* Loop over glyphs that current and desired row may have
3882 in common. */
3883 while (i < stop)
3885 int can_skip_p = !abort_skipping;
3887 /* Skip over glyphs that both rows have in common. These
3888 don't have to be written. We can't skip if the last
3889 current glyph overlaps the glyph to its right. For
3890 example, consider a current row of `if ' with the `f' in
3891 Courier bold so that it overlaps the ` ' to its right.
3892 If the desired row is ` ', we would skip over the space
3893 after the `if' and there would remain a pixel from the
3894 `f' on the screen. */
3895 if (overlapping_glyphs_p && i > 0)
3897 struct glyph *glyph = &current_row->glyphs[TEXT_AREA][i - 1];
3898 int left, right;
3900 rif->get_glyph_overhangs (glyph, XFRAME (w->frame),
3901 &left, &right);
3902 can_skip_p = (right == 0 && !abort_skipping);
3905 if (can_skip_p)
3907 int start_hpos = i;
3909 while (i < stop
3910 && GLYPH_EQUAL_P (desired_glyph, current_glyph))
3912 x += desired_glyph->pixel_width;
3913 ++desired_glyph, ++current_glyph, ++i;
3916 /* Consider the case that the current row contains "xxx
3917 ppp ggg" in italic Courier font, and the desired row
3918 is "xxx ggg". The character `p' has lbearing, `g'
3919 has not. The loop above will stop in front of the
3920 first `p' in the current row. If we would start
3921 writing glyphs there, we wouldn't erase the lbearing
3922 of the `p'. The rest of the lbearing problem is then
3923 taken care of by draw_glyphs. */
3924 if (overlapping_glyphs_p
3925 && i > 0
3926 && i < current_row->used[TEXT_AREA]
3927 && (current_row->used[TEXT_AREA]
3928 != desired_row->used[TEXT_AREA]))
3930 int left, right;
3932 rif->get_glyph_overhangs (current_glyph, XFRAME (w->frame),
3933 &left, &right);
3934 while (left > 0 && i > 0)
3936 --i, --desired_glyph, --current_glyph;
3937 x -= desired_glyph->pixel_width;
3938 left -= desired_glyph->pixel_width;
3941 /* Abort the skipping algorithm if we end up before
3942 our starting point, to avoid looping (bug#1070).
3943 This can happen when the lbearing is larger than
3944 the pixel width. */
3945 abort_skipping = (i < start_hpos);
3949 /* Try to avoid writing the entire rest of the desired row
3950 by looking for a resync point. This mainly prevents
3951 mode line flickering in the case the mode line is in
3952 fixed-pitch font, which it usually will be. */
3953 if (i < desired_row->used[TEXT_AREA])
3955 int start_x = x, start_hpos = i;
3956 struct glyph *start = desired_glyph;
3957 int current_x = x;
3958 int skip_first_p = !can_skip_p;
3960 /* Find the next glyph that's equal again. */
3961 while (i < stop
3962 && (skip_first_p
3963 || !GLYPH_EQUAL_P (desired_glyph, current_glyph))
3964 && x == current_x)
3966 x += desired_glyph->pixel_width;
3967 current_x += current_glyph->pixel_width;
3968 ++desired_glyph, ++current_glyph, ++i;
3969 skip_first_p = 0;
3972 if (i == start_hpos || x != current_x)
3974 i = start_hpos;
3975 x = start_x;
3976 desired_glyph = start;
3977 break;
3980 rif->cursor_to (vpos, start_hpos, desired_row->y, start_x);
3981 rif->write_glyphs (start, i - start_hpos);
3982 changed_p = 1;
3986 /* Write the rest. */
3987 if (i < desired_row->used[TEXT_AREA])
3989 rif->cursor_to (vpos, i, desired_row->y, x);
3990 rif->write_glyphs (desired_glyph, desired_row->used[TEXT_AREA] - i);
3991 changed_p = 1;
3994 /* Maybe clear to end of line. */
3995 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row))
3997 /* If new row extends to the end of the text area, nothing
3998 has to be cleared, if and only if we did a write_glyphs
3999 above. This is made sure by setting desired_stop_pos
4000 appropriately above. */
4001 xassert (i < desired_row->used[TEXT_AREA]
4002 || ((desired_row->used[TEXT_AREA]
4003 == current_row->used[TEXT_AREA])
4004 && MATRIX_ROW_EXTENDS_FACE_P (current_row)));
4006 else if (MATRIX_ROW_EXTENDS_FACE_P (current_row))
4008 /* If old row extends to the end of the text area, clear. */
4009 if (i >= desired_row->used[TEXT_AREA])
4010 rif->cursor_to (vpos, i, desired_row->y,
4011 desired_row->pixel_width);
4012 rif->clear_end_of_line (-1);
4013 changed_p = 1;
4015 else if (desired_row->pixel_width < current_row->pixel_width)
4017 /* Otherwise clear to the end of the old row. Everything
4018 after that position should be clear already. */
4019 int x;
4021 if (i >= desired_row->used[TEXT_AREA])
4022 rif->cursor_to (vpos, i, desired_row->y,
4023 desired_row->pixel_width);
4025 /* If cursor is displayed at the end of the line, make sure
4026 it's cleared. Nowadays we don't have a phys_cursor_glyph
4027 with which to erase the cursor (because this method
4028 doesn't work with lbearing/rbearing), so we must do it
4029 this way. */
4030 if (vpos == w->phys_cursor.vpos
4031 && (desired_row->reversed_p
4032 ? (w->phys_cursor.hpos < 0)
4033 : (w->phys_cursor.hpos >= desired_row->used[TEXT_AREA])))
4035 w->phys_cursor_on_p = 0;
4036 x = -1;
4038 else
4039 x = current_row->pixel_width;
4040 rif->clear_end_of_line (x);
4041 changed_p = 1;
4045 return changed_p;
4049 /* Update row VPOS in window W. Value is non-zero if display has been
4050 changed. */
4052 static int
4053 update_window_line (struct window *w, int vpos, int *mouse_face_overwritten_p)
4055 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos);
4056 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos);
4057 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
4058 int changed_p = 0;
4060 /* Set the row being updated. This is important to let xterm.c
4061 know what line height values are in effect. */
4062 updated_row = desired_row;
4064 /* A row can be completely invisible in case a desired matrix was
4065 built with a vscroll and then make_cursor_line_fully_visible shifts
4066 the matrix. Make sure to make such rows current anyway, since
4067 we need the correct y-position, for example, in the current matrix. */
4068 if (desired_row->mode_line_p
4069 || desired_row->visible_height > 0)
4071 xassert (desired_row->enabled_p);
4073 /* Update display of the left margin area, if there is one. */
4074 if (!desired_row->full_width_p
4075 && !NILP (w->left_margin_cols))
4077 changed_p = 1;
4078 update_marginal_area (w, LEFT_MARGIN_AREA, vpos);
4081 /* Update the display of the text area. */
4082 if (update_text_area (w, vpos))
4084 changed_p = 1;
4085 if (current_row->mouse_face_p)
4086 *mouse_face_overwritten_p = 1;
4089 /* Update display of the right margin area, if there is one. */
4090 if (!desired_row->full_width_p
4091 && !NILP (w->right_margin_cols))
4093 changed_p = 1;
4094 update_marginal_area (w, RIGHT_MARGIN_AREA, vpos);
4097 /* Draw truncation marks etc. */
4098 if (!current_row->enabled_p
4099 || desired_row->y != current_row->y
4100 || desired_row->visible_height != current_row->visible_height
4101 || desired_row->cursor_in_fringe_p != current_row->cursor_in_fringe_p
4102 || desired_row->overlay_arrow_bitmap != current_row->overlay_arrow_bitmap
4103 || current_row->redraw_fringe_bitmaps_p
4104 || desired_row->mode_line_p != current_row->mode_line_p
4105 || desired_row->exact_window_width_line_p != current_row->exact_window_width_line_p
4106 || (MATRIX_ROW_CONTINUATION_LINE_P (desired_row)
4107 != MATRIX_ROW_CONTINUATION_LINE_P (current_row)))
4108 rif->after_update_window_line_hook (desired_row);
4111 /* Update current_row from desired_row. */
4112 make_current (w->desired_matrix, w->current_matrix, vpos);
4113 updated_row = NULL;
4114 return changed_p;
4118 /* Set the cursor after an update of window W. This function may only
4119 be called from update_window. */
4121 static void
4122 set_window_cursor_after_update (struct window *w)
4124 struct frame *f = XFRAME (w->frame);
4125 struct redisplay_interface *rif = FRAME_RIF (f);
4126 int cx, cy, vpos, hpos;
4128 /* Not intended for frame matrix updates. */
4129 xassert (FRAME_WINDOW_P (f));
4131 if (cursor_in_echo_area
4132 && !NILP (echo_area_buffer[0])
4133 /* If we are showing a message instead of the mini-buffer,
4134 show the cursor for the message instead. */
4135 && XWINDOW (minibuf_window) == w
4136 && EQ (minibuf_window, echo_area_window)
4137 /* These cases apply only to the frame that contains
4138 the active mini-buffer window. */
4139 && FRAME_HAS_MINIBUF_P (f)
4140 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window))
4142 cx = cy = vpos = hpos = 0;
4144 if (cursor_in_echo_area >= 0)
4146 /* If the mini-buffer is several lines high, find the last
4147 line that has any text on it. Note: either all lines
4148 are enabled or none. Otherwise we wouldn't be able to
4149 determine Y. */
4150 struct glyph_row *row, *last_row;
4151 struct glyph *glyph;
4152 int yb = window_text_bottom_y (w);
4154 last_row = NULL;
4155 row = w->current_matrix->rows;
4156 while (row->enabled_p
4157 && (last_row == NULL
4158 || MATRIX_ROW_BOTTOM_Y (row) <= yb))
4160 if (row->used[TEXT_AREA]
4161 && row->glyphs[TEXT_AREA][0].charpos >= 0)
4162 last_row = row;
4163 ++row;
4166 if (last_row)
4168 struct glyph *start = last_row->glyphs[TEXT_AREA];
4169 struct glyph *last = start + last_row->used[TEXT_AREA] - 1;
4171 while (last > start && last->charpos < 0)
4172 --last;
4174 for (glyph = start; glyph < last; ++glyph)
4176 cx += glyph->pixel_width;
4177 ++hpos;
4180 cy = last_row->y;
4181 vpos = MATRIX_ROW_VPOS (last_row, w->current_matrix);
4185 else
4187 cx = w->cursor.x;
4188 cy = w->cursor.y;
4189 hpos = w->cursor.hpos;
4190 vpos = w->cursor.vpos;
4193 /* Window cursor can be out of sync for horizontally split windows. */
4194 hpos = max (-1, hpos); /* -1 is for when cursor is on the left fringe */
4195 hpos = min (w->current_matrix->matrix_w - 1, hpos);
4196 vpos = max (0, vpos);
4197 vpos = min (w->current_matrix->nrows - 1, vpos);
4198 rif->cursor_to (vpos, hpos, cy, cx);
4202 /* Set WINDOW->must_be_updated_p to ON_P for all windows in the window
4203 tree rooted at W. */
4205 void
4206 set_window_update_flags (struct window *w, int on_p)
4208 while (w)
4210 if (!NILP (w->hchild))
4211 set_window_update_flags (XWINDOW (w->hchild), on_p);
4212 else if (!NILP (w->vchild))
4213 set_window_update_flags (XWINDOW (w->vchild), on_p);
4214 else
4215 w->must_be_updated_p = on_p;
4217 w = NILP (w->next) ? 0 : XWINDOW (w->next);
4223 /***********************************************************************
4224 Window-Based Scrolling
4225 ***********************************************************************/
4227 /* Structure describing rows in scrolling_window. */
4229 struct row_entry
4231 /* Number of occurrences of this row in desired and current matrix. */
4232 int old_uses, new_uses;
4234 /* Vpos of row in new matrix. */
4235 int new_line_number;
4237 /* Bucket index of this row_entry in the hash table row_table. */
4238 int bucket;
4240 /* The row described by this entry. */
4241 struct glyph_row *row;
4243 /* Hash collision chain. */
4244 struct row_entry *next;
4247 /* A pool to allocate row_entry structures from, and the size of the
4248 pool. The pool is reallocated in scrolling_window when we find
4249 that we need a larger one. */
4251 static struct row_entry *row_entry_pool;
4252 static int row_entry_pool_size;
4254 /* Index of next free entry in row_entry_pool. */
4256 static int row_entry_idx;
4258 /* The hash table used during scrolling, and the table's size. This
4259 table is used to quickly identify equal rows in the desired and
4260 current matrix. */
4262 static struct row_entry **row_table;
4263 static int row_table_size;
4265 /* Vectors of pointers to row_entry structures belonging to the
4266 current and desired matrix, and the size of the vectors. */
4268 static struct row_entry **old_lines, **new_lines;
4269 static int old_lines_size, new_lines_size;
4271 /* A pool to allocate run structures from, and its size. */
4273 static struct run *run_pool;
4274 static int runs_size;
4276 /* A vector of runs of lines found during scrolling. */
4278 static struct run **runs;
4280 /* Add glyph row ROW to the scrolling hash table during the scrolling
4281 of window W. */
4283 static INLINE struct row_entry *
4284 add_row_entry (struct window *w, struct glyph_row *row)
4286 struct row_entry *entry;
4287 int i = row->hash % row_table_size;
4289 entry = row_table[i];
4290 while (entry && !row_equal_p (w, entry->row, row, 1))
4291 entry = entry->next;
4293 if (entry == NULL)
4295 entry = row_entry_pool + row_entry_idx++;
4296 entry->row = row;
4297 entry->old_uses = entry->new_uses = 0;
4298 entry->new_line_number = 0;
4299 entry->bucket = i;
4300 entry->next = row_table[i];
4301 row_table[i] = entry;
4304 return entry;
4308 /* Try to reuse part of the current display of W by scrolling lines.
4309 HEADER_LINE_P non-zero means W has a header line.
4311 The algorithm is taken from Communications of the ACM, Apr78 "A
4312 Technique for Isolating Differences Between Files." It should take
4313 O(N) time.
4315 A short outline of the steps of the algorithm
4317 1. Skip lines equal at the start and end of both matrices.
4319 2. Enter rows in the current and desired matrix into a symbol
4320 table, counting how often they appear in both matrices.
4322 3. Rows that appear exactly once in both matrices serve as anchors,
4323 i.e. we assume that such lines are likely to have been moved.
4325 4. Starting from anchor lines, extend regions to be scrolled both
4326 forward and backward.
4328 Value is
4330 -1 if all rows were found to be equal.
4331 0 to indicate that we did not scroll the display, or
4332 1 if we did scroll. */
4334 static int
4335 scrolling_window (struct window *w, int header_line_p)
4337 struct glyph_matrix *desired_matrix = w->desired_matrix;
4338 struct glyph_matrix *current_matrix = w->current_matrix;
4339 int yb = window_text_bottom_y (w);
4340 int i, j, first_old, first_new, last_old, last_new;
4341 int nruns, nbytes, n, run_idx;
4342 struct row_entry *entry;
4343 struct redisplay_interface *rif = FRAME_RIF (XFRAME (WINDOW_FRAME (w)));
4345 /* Skip over rows equal at the start. */
4346 for (i = header_line_p ? 1 : 0; i < current_matrix->nrows - 1; ++i)
4348 struct glyph_row *d = MATRIX_ROW (desired_matrix, i);
4349 struct glyph_row *c = MATRIX_ROW (current_matrix, i);
4351 if (c->enabled_p
4352 && d->enabled_p
4353 && !d->redraw_fringe_bitmaps_p
4354 && c->y == d->y
4355 && MATRIX_ROW_BOTTOM_Y (c) <= yb
4356 && MATRIX_ROW_BOTTOM_Y (d) <= yb
4357 && row_equal_p (w, c, d, 1))
4359 assign_row (c, d);
4360 d->enabled_p = 0;
4362 else
4363 break;
4366 /* Give up if some rows in the desired matrix are not enabled. */
4367 if (!MATRIX_ROW (desired_matrix, i)->enabled_p)
4368 return -1;
4370 first_old = first_new = i;
4372 /* Set last_new to the index + 1 of the last enabled row in the
4373 desired matrix. */
4374 i = first_new + 1;
4375 while (i < desired_matrix->nrows - 1
4376 && MATRIX_ROW (desired_matrix, i)->enabled_p
4377 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (desired_matrix, i)) <= yb)
4378 ++i;
4380 if (!MATRIX_ROW (desired_matrix, i)->enabled_p)
4381 return 0;
4383 last_new = i;
4385 /* Set last_old to the index + 1 of the last enabled row in the
4386 current matrix. We don't look at the enabled flag here because
4387 we plan to reuse part of the display even if other parts are
4388 disabled. */
4389 i = first_old + 1;
4390 while (i < current_matrix->nrows - 1)
4392 int bottom = MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (current_matrix, i));
4393 if (bottom <= yb)
4394 ++i;
4395 if (bottom >= yb)
4396 break;
4399 last_old = i;
4401 /* Skip over rows equal at the bottom. */
4402 i = last_new;
4403 j = last_old;
4404 while (i - 1 > first_new
4405 && j - 1 > first_old
4406 && MATRIX_ROW (current_matrix, i - 1)->enabled_p
4407 && (MATRIX_ROW (current_matrix, i - 1)->y
4408 == MATRIX_ROW (desired_matrix, j - 1)->y)
4409 && !MATRIX_ROW (desired_matrix, j - 1)->redraw_fringe_bitmaps_p
4410 && row_equal_p (w,
4411 MATRIX_ROW (desired_matrix, i - 1),
4412 MATRIX_ROW (current_matrix, j - 1), 1))
4413 --i, --j;
4414 last_new = i;
4415 last_old = j;
4417 /* Nothing to do if all rows are equal. */
4418 if (last_new == first_new)
4419 return 0;
4421 /* Reallocate vectors, tables etc. if necessary. */
4423 if (current_matrix->nrows > old_lines_size)
4425 old_lines_size = current_matrix->nrows;
4426 nbytes = old_lines_size * sizeof *old_lines;
4427 old_lines = (struct row_entry **) xrealloc (old_lines, nbytes);
4430 if (desired_matrix->nrows > new_lines_size)
4432 new_lines_size = desired_matrix->nrows;
4433 nbytes = new_lines_size * sizeof *new_lines;
4434 new_lines = (struct row_entry **) xrealloc (new_lines, nbytes);
4437 n = desired_matrix->nrows + current_matrix->nrows;
4438 if (3 * n > row_table_size)
4440 row_table_size = next_almost_prime (3 * n);
4441 nbytes = row_table_size * sizeof *row_table;
4442 row_table = (struct row_entry **) xrealloc (row_table, nbytes);
4443 memset (row_table, 0, nbytes);
4446 if (n > row_entry_pool_size)
4448 row_entry_pool_size = n;
4449 nbytes = row_entry_pool_size * sizeof *row_entry_pool;
4450 row_entry_pool = (struct row_entry *) xrealloc (row_entry_pool, nbytes);
4453 if (desired_matrix->nrows > runs_size)
4455 runs_size = desired_matrix->nrows;
4456 nbytes = runs_size * sizeof *runs;
4457 runs = (struct run **) xrealloc (runs, nbytes);
4458 nbytes = runs_size * sizeof *run_pool;
4459 run_pool = (struct run *) xrealloc (run_pool, nbytes);
4462 nruns = run_idx = 0;
4463 row_entry_idx = 0;
4465 /* Add rows from the current and desired matrix to the hash table
4466 row_hash_table to be able to find equal ones quickly. */
4468 for (i = first_old; i < last_old; ++i)
4470 if (MATRIX_ROW (current_matrix, i)->enabled_p)
4472 entry = add_row_entry (w, MATRIX_ROW (current_matrix, i));
4473 old_lines[i] = entry;
4474 ++entry->old_uses;
4476 else
4477 old_lines[i] = NULL;
4480 for (i = first_new; i < last_new; ++i)
4482 xassert (MATRIX_ROW_ENABLED_P (desired_matrix, i));
4483 entry = add_row_entry (w, MATRIX_ROW (desired_matrix, i));
4484 ++entry->new_uses;
4485 entry->new_line_number = i;
4486 new_lines[i] = entry;
4489 /* Identify moves based on lines that are unique and equal
4490 in both matrices. */
4491 for (i = first_old; i < last_old;)
4492 if (old_lines[i]
4493 && old_lines[i]->old_uses == 1
4494 && old_lines[i]->new_uses == 1)
4496 int j, k;
4497 int new_line = old_lines[i]->new_line_number;
4498 struct run *run = run_pool + run_idx++;
4500 /* Record move. */
4501 run->current_vpos = i;
4502 run->current_y = MATRIX_ROW (current_matrix, i)->y;
4503 run->desired_vpos = new_line;
4504 run->desired_y = MATRIX_ROW (desired_matrix, new_line)->y;
4505 run->nrows = 1;
4506 run->height = MATRIX_ROW (current_matrix, i)->height;
4508 /* Extend backward. */
4509 j = i - 1;
4510 k = new_line - 1;
4511 while (j > first_old
4512 && k > first_new
4513 && old_lines[j] == new_lines[k])
4515 int h = MATRIX_ROW (current_matrix, j)->height;
4516 --run->current_vpos;
4517 --run->desired_vpos;
4518 ++run->nrows;
4519 run->height += h;
4520 run->desired_y -= h;
4521 run->current_y -= h;
4522 --j, --k;
4525 /* Extend forward. */
4526 j = i + 1;
4527 k = new_line + 1;
4528 while (j < last_old
4529 && k < last_new
4530 && old_lines[j] == new_lines[k])
4532 int h = MATRIX_ROW (current_matrix, j)->height;
4533 ++run->nrows;
4534 run->height += h;
4535 ++j, ++k;
4538 /* Insert run into list of all runs. Order runs by copied
4539 pixel lines. Note that we record runs that don't have to
4540 be copied because they are already in place. This is done
4541 because we can avoid calling update_window_line in this
4542 case. */
4543 for (j = 0; j < nruns && runs[j]->height > run->height; ++j)
4545 for (k = nruns; k > j; --k)
4546 runs[k] = runs[k - 1];
4547 runs[j] = run;
4548 ++nruns;
4550 i += run->nrows;
4552 else
4553 ++i;
4555 /* Do the moves. Do it in a way that we don't overwrite something
4556 we want to copy later on. This is not solvable in general
4557 because there is only one display and we don't have a way to
4558 exchange areas on this display. Example:
4560 +-----------+ +-----------+
4561 | A | | B |
4562 +-----------+ --> +-----------+
4563 | B | | A |
4564 +-----------+ +-----------+
4566 Instead, prefer bigger moves, and invalidate moves that would
4567 copy from where we copied to. */
4569 for (i = 0; i < nruns; ++i)
4570 if (runs[i]->nrows > 0)
4572 struct run *r = runs[i];
4574 /* Copy on the display. */
4575 if (r->current_y != r->desired_y)
4577 rif->scroll_run_hook (w, r);
4579 /* Invalidate runs that copy from where we copied to. */
4580 for (j = i + 1; j < nruns; ++j)
4582 struct run *p = runs[j];
4584 if ((p->current_y >= r->desired_y
4585 && p->current_y < r->desired_y + r->height)
4586 || (p->current_y + p->height >= r->desired_y
4587 && (p->current_y + p->height
4588 < r->desired_y + r->height)))
4589 p->nrows = 0;
4593 /* Assign matrix rows. */
4594 for (j = 0; j < r->nrows; ++j)
4596 struct glyph_row *from, *to;
4597 int to_overlapped_p;
4599 to = MATRIX_ROW (current_matrix, r->desired_vpos + j);
4600 from = MATRIX_ROW (desired_matrix, r->desired_vpos + j);
4601 to_overlapped_p = to->overlapped_p;
4602 if (!from->mode_line_p && !w->pseudo_window_p
4603 && (to->left_fringe_bitmap != from->left_fringe_bitmap
4604 || to->right_fringe_bitmap != from->right_fringe_bitmap
4605 || to->left_fringe_face_id != from->left_fringe_face_id
4606 || to->right_fringe_face_id != from->right_fringe_face_id
4607 || to->overlay_arrow_bitmap != from->overlay_arrow_bitmap))
4608 from->redraw_fringe_bitmaps_p = 1;
4609 assign_row (to, from);
4610 to->enabled_p = 1, from->enabled_p = 0;
4611 to->overlapped_p = to_overlapped_p;
4615 /* Clear the hash table, for the next time. */
4616 for (i = 0; i < row_entry_idx; ++i)
4617 row_table[row_entry_pool[i].bucket] = NULL;
4619 /* Value is > 0 to indicate that we scrolled the display. */
4620 return nruns;
4625 /************************************************************************
4626 Frame-Based Updates
4627 ************************************************************************/
4629 /* Update the desired frame matrix of frame F.
4631 FORCE_P non-zero means that the update should not be stopped by
4632 pending input. INHIBIT_HAIRY_ID_P non-zero means that scrolling
4633 should not be tried.
4635 Value is non-zero if update was stopped due to pending input. */
4637 static int
4638 update_frame_1 (struct frame *f, int force_p, int inhibit_id_p)
4640 /* Frame matrices to work on. */
4641 struct glyph_matrix *current_matrix = f->current_matrix;
4642 struct glyph_matrix *desired_matrix = f->desired_matrix;
4643 int i;
4644 int pause;
4645 int preempt_count = baud_rate / 2400 + 1;
4647 xassert (current_matrix && desired_matrix);
4649 if (baud_rate != FRAME_COST_BAUD_RATE (f))
4650 calculate_costs (f);
4652 if (preempt_count <= 0)
4653 preempt_count = 1;
4655 #if !PERIODIC_PREEMPTION_CHECKING
4656 if (!force_p && detect_input_pending_ignore_squeezables ())
4658 pause = 1;
4659 goto do_pause;
4661 #endif
4663 /* If we cannot insert/delete lines, it's no use trying it. */
4664 if (!FRAME_LINE_INS_DEL_OK (f))
4665 inhibit_id_p = 1;
4667 /* See if any of the desired lines are enabled; don't compute for
4668 i/d line if just want cursor motion. */
4669 for (i = 0; i < desired_matrix->nrows; i++)
4670 if (MATRIX_ROW_ENABLED_P (desired_matrix, i))
4671 break;
4673 /* Try doing i/d line, if not yet inhibited. */
4674 if (!inhibit_id_p && i < desired_matrix->nrows)
4675 force_p |= scrolling (f);
4677 /* Update the individual lines as needed. Do bottom line first. */
4678 if (MATRIX_ROW_ENABLED_P (desired_matrix, desired_matrix->nrows - 1))
4679 update_frame_line (f, desired_matrix->nrows - 1);
4681 /* Now update the rest of the lines. */
4682 for (i = 0; i < desired_matrix->nrows - 1 && (force_p || !input_pending); i++)
4684 if (MATRIX_ROW_ENABLED_P (desired_matrix, i))
4686 if (FRAME_TERMCAP_P (f))
4688 /* Flush out every so many lines.
4689 Also flush out if likely to have more than 1k buffered
4690 otherwise. I'm told that some telnet connections get
4691 really screwed by more than 1k output at once. */
4692 FILE *display_output = FRAME_TTY (f)->output;
4693 if (display_output)
4695 int outq = PENDING_OUTPUT_COUNT (display_output);
4696 if (outq > 900
4697 || (outq > 20 && ((i - 1) % preempt_count == 0)))
4699 fflush (display_output);
4700 if (preempt_count == 1)
4702 #ifdef EMACS_OUTQSIZE
4703 if (EMACS_OUTQSIZE (0, &outq) < 0)
4704 /* Probably not a tty. Ignore the error and reset
4705 the outq count. */
4706 outq = PENDING_OUTPUT_COUNT (FRAME_TTY (f->output));
4707 #endif
4708 outq *= 10;
4709 if (baud_rate <= outq && baud_rate > 0)
4710 sleep (outq / baud_rate);
4716 #if PERIODIC_PREEMPTION_CHECKING
4717 if (!force_p)
4719 EMACS_TIME tm, dif;
4720 EMACS_GET_TIME (tm);
4721 EMACS_SUB_TIME (dif, preemption_next_check, tm);
4722 if (EMACS_TIME_NEG_P (dif))
4724 EMACS_ADD_TIME (preemption_next_check, tm, preemption_period);
4725 if (detect_input_pending_ignore_squeezables ())
4726 break;
4729 #else
4730 if (!force_p && (i - 1) % preempt_count == 0)
4731 detect_input_pending_ignore_squeezables ();
4732 #endif
4734 update_frame_line (f, i);
4738 pause = (i < FRAME_LINES (f) - 1) ? i : 0;
4740 /* Now just clean up termcap drivers and set cursor, etc. */
4741 if (!pause)
4743 if ((cursor_in_echo_area
4744 /* If we are showing a message instead of the mini-buffer,
4745 show the cursor for the message instead of for the
4746 (now hidden) mini-buffer contents. */
4747 || (EQ (minibuf_window, selected_window)
4748 && EQ (minibuf_window, echo_area_window)
4749 && !NILP (echo_area_buffer[0])))
4750 /* These cases apply only to the frame that contains
4751 the active mini-buffer window. */
4752 && FRAME_HAS_MINIBUF_P (f)
4753 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window))
4755 int top = WINDOW_TOP_EDGE_LINE (XWINDOW (FRAME_MINIBUF_WINDOW (f)));
4756 int row, col;
4758 if (cursor_in_echo_area < 0)
4760 /* Negative value of cursor_in_echo_area means put
4761 cursor at beginning of line. */
4762 row = top;
4763 col = 0;
4765 else
4767 /* Positive value of cursor_in_echo_area means put
4768 cursor at the end of the prompt. If the mini-buffer
4769 is several lines high, find the last line that has
4770 any text on it. */
4771 row = FRAME_LINES (f);
4774 --row;
4775 col = 0;
4777 if (MATRIX_ROW_ENABLED_P (current_matrix, row))
4779 /* Frame rows are filled up with spaces that
4780 must be ignored here. */
4781 struct glyph_row *r = MATRIX_ROW (current_matrix,
4782 row);
4783 struct glyph *start = r->glyphs[TEXT_AREA];
4784 struct glyph *last = start + r->used[TEXT_AREA];
4786 while (last > start
4787 && (last - 1)->charpos < 0)
4788 --last;
4790 col = last - start;
4793 while (row > top && col == 0);
4795 /* Make sure COL is not out of range. */
4796 if (col >= FRAME_CURSOR_X_LIMIT (f))
4798 /* If we have another row, advance cursor into it. */
4799 if (row < FRAME_LINES (f) - 1)
4801 col = FRAME_LEFT_SCROLL_BAR_COLS (f);
4802 row++;
4804 /* Otherwise move it back in range. */
4805 else
4806 col = FRAME_CURSOR_X_LIMIT (f) - 1;
4810 cursor_to (f, row, col);
4812 else
4814 /* We have only one cursor on terminal frames. Use it to
4815 display the cursor of the selected window. */
4816 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
4817 if (w->cursor.vpos >= 0
4818 /* The cursor vpos may be temporarily out of bounds
4819 in the following situation: There is one window,
4820 with the cursor in the lower half of it. The window
4821 is split, and a message causes a redisplay before
4822 a new cursor position has been computed. */
4823 && w->cursor.vpos < WINDOW_TOTAL_LINES (w))
4825 int x = WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos);
4826 int y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos);
4828 if (INTEGERP (w->left_margin_cols))
4829 x += XFASTINT (w->left_margin_cols);
4831 /* x = max (min (x, FRAME_TOTAL_COLS (f) - 1), 0); */
4832 cursor_to (f, y, x);
4837 #if !PERIODIC_PREEMPTION_CHECKING
4838 do_pause:
4839 #endif
4841 clear_desired_matrices (f);
4842 return pause;
4846 /* Do line insertions/deletions on frame F for frame-based redisplay. */
4849 scrolling (struct frame *frame)
4851 int unchanged_at_top, unchanged_at_bottom;
4852 int window_size;
4853 int changed_lines;
4854 int *old_hash = (int *) alloca (FRAME_LINES (frame) * sizeof (int));
4855 int *new_hash = (int *) alloca (FRAME_LINES (frame) * sizeof (int));
4856 int *draw_cost = (int *) alloca (FRAME_LINES (frame) * sizeof (int));
4857 int *old_draw_cost = (int *) alloca (FRAME_LINES (frame) * sizeof (int));
4858 register int i;
4859 int free_at_end_vpos = FRAME_LINES (frame);
4860 struct glyph_matrix *current_matrix = frame->current_matrix;
4861 struct glyph_matrix *desired_matrix = frame->desired_matrix;
4863 if (!current_matrix)
4864 abort ();
4866 /* Compute hash codes of all the lines. Also calculate number of
4867 changed lines, number of unchanged lines at the beginning, and
4868 number of unchanged lines at the end. */
4869 changed_lines = 0;
4870 unchanged_at_top = 0;
4871 unchanged_at_bottom = FRAME_LINES (frame);
4872 for (i = 0; i < FRAME_LINES (frame); i++)
4874 /* Give up on this scrolling if some old lines are not enabled. */
4875 if (!MATRIX_ROW_ENABLED_P (current_matrix, i))
4876 return 0;
4877 old_hash[i] = line_hash_code (MATRIX_ROW (current_matrix, i));
4878 if (! MATRIX_ROW_ENABLED_P (desired_matrix, i))
4880 /* This line cannot be redrawn, so don't let scrolling mess it. */
4881 new_hash[i] = old_hash[i];
4882 #define INFINITY 1000000 /* Taken from scroll.c */
4883 draw_cost[i] = INFINITY;
4885 else
4887 new_hash[i] = line_hash_code (MATRIX_ROW (desired_matrix, i));
4888 draw_cost[i] = line_draw_cost (desired_matrix, i);
4891 if (old_hash[i] != new_hash[i])
4893 changed_lines++;
4894 unchanged_at_bottom = FRAME_LINES (frame) - i - 1;
4896 else if (i == unchanged_at_top)
4897 unchanged_at_top++;
4898 old_draw_cost[i] = line_draw_cost (current_matrix, i);
4901 /* If changed lines are few, don't allow preemption, don't scroll. */
4902 if ((!FRAME_SCROLL_REGION_OK (frame)
4903 && changed_lines < baud_rate / 2400)
4904 || unchanged_at_bottom == FRAME_LINES (frame))
4905 return 1;
4907 window_size = (FRAME_LINES (frame) - unchanged_at_top
4908 - unchanged_at_bottom);
4910 if (FRAME_SCROLL_REGION_OK (frame))
4911 free_at_end_vpos -= unchanged_at_bottom;
4912 else if (FRAME_MEMORY_BELOW_FRAME (frame))
4913 free_at_end_vpos = -1;
4915 /* If large window, fast terminal and few lines in common between
4916 current frame and desired frame, don't bother with i/d calc. */
4917 if (!FRAME_SCROLL_REGION_OK (frame)
4918 && window_size >= 18 && baud_rate > 2400
4919 && (window_size >=
4920 10 * scrolling_max_lines_saved (unchanged_at_top,
4921 FRAME_LINES (frame) - unchanged_at_bottom,
4922 old_hash, new_hash, draw_cost)))
4923 return 0;
4925 if (window_size < 2)
4926 return 0;
4928 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom,
4929 draw_cost + unchanged_at_top - 1,
4930 old_draw_cost + unchanged_at_top - 1,
4931 old_hash + unchanged_at_top - 1,
4932 new_hash + unchanged_at_top - 1,
4933 free_at_end_vpos - unchanged_at_top);
4935 return 0;
4939 /* Count the number of blanks at the start of the vector of glyphs R
4940 which is LEN glyphs long. */
4942 static int
4943 count_blanks (struct glyph *r, int len)
4945 int i;
4947 for (i = 0; i < len; ++i)
4948 if (!CHAR_GLYPH_SPACE_P (r[i]))
4949 break;
4951 return i;
4955 /* Count the number of glyphs in common at the start of the glyph
4956 vectors STR1 and STR2. END1 is the end of STR1 and END2 is the end
4957 of STR2. Value is the number of equal glyphs equal at the start. */
4959 static int
4960 count_match (struct glyph *str1, struct glyph *end1, struct glyph *str2, struct glyph *end2)
4962 struct glyph *p1 = str1;
4963 struct glyph *p2 = str2;
4965 while (p1 < end1
4966 && p2 < end2
4967 && GLYPH_CHAR_AND_FACE_EQUAL_P (p1, p2))
4968 ++p1, ++p2;
4970 return p1 - str1;
4974 /* Char insertion/deletion cost vector, from term.c */
4976 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_TOTAL_COLS((f))])
4979 /* Perform a frame-based update on line VPOS in frame FRAME. */
4981 static void
4982 update_frame_line (struct frame *f, int vpos)
4984 struct glyph *obody, *nbody, *op1, *op2, *np1, *nend;
4985 int tem;
4986 int osp, nsp, begmatch, endmatch, olen, nlen;
4987 struct glyph_matrix *current_matrix = f->current_matrix;
4988 struct glyph_matrix *desired_matrix = f->desired_matrix;
4989 struct glyph_row *current_row = MATRIX_ROW (current_matrix, vpos);
4990 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, vpos);
4991 int must_write_whole_line_p;
4992 int write_spaces_p = FRAME_MUST_WRITE_SPACES (f);
4993 int colored_spaces_p = (FACE_FROM_ID (f, DEFAULT_FACE_ID)->background
4994 != FACE_TTY_DEFAULT_BG_COLOR);
4996 if (colored_spaces_p)
4997 write_spaces_p = 1;
4999 /* Current row not enabled means it has unknown contents. We must
5000 write the whole desired line in that case. */
5001 must_write_whole_line_p = !current_row->enabled_p;
5002 if (must_write_whole_line_p)
5004 obody = 0;
5005 olen = 0;
5007 else
5009 obody = MATRIX_ROW_GLYPH_START (current_matrix, vpos);
5010 olen = current_row->used[TEXT_AREA];
5012 /* Ignore trailing spaces, if we can. */
5013 if (!write_spaces_p)
5014 while (olen > 0 && CHAR_GLYPH_SPACE_P (obody[olen-1]))
5015 olen--;
5018 current_row->enabled_p = 1;
5019 current_row->used[TEXT_AREA] = desired_row->used[TEXT_AREA];
5021 /* If desired line is empty, just clear the line. */
5022 if (!desired_row->enabled_p)
5024 nlen = 0;
5025 goto just_erase;
5028 nbody = desired_row->glyphs[TEXT_AREA];
5029 nlen = desired_row->used[TEXT_AREA];
5030 nend = nbody + nlen;
5032 /* If display line has unknown contents, write the whole line. */
5033 if (must_write_whole_line_p)
5035 /* Ignore spaces at the end, if we can. */
5036 if (!write_spaces_p)
5037 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1]))
5038 --nlen;
5040 /* Write the contents of the desired line. */
5041 if (nlen)
5043 cursor_to (f, vpos, 0);
5044 write_glyphs (f, nbody, nlen);
5047 /* Don't call clear_end_of_line if we already wrote the whole
5048 line. The cursor will not be at the right margin in that
5049 case but in the line below. */
5050 if (nlen < FRAME_TOTAL_COLS (f))
5052 cursor_to (f, vpos, nlen);
5053 clear_end_of_line (f, FRAME_TOTAL_COLS (f));
5055 else
5056 /* Make sure we are in the right row, otherwise cursor movement
5057 with cmgoto might use `ch' in the wrong row. */
5058 cursor_to (f, vpos, 0);
5060 make_current (desired_matrix, current_matrix, vpos);
5061 return;
5064 /* Pretend trailing spaces are not there at all,
5065 unless for one reason or another we must write all spaces. */
5066 if (!write_spaces_p)
5067 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1]))
5068 nlen--;
5070 /* If there's no i/d char, quickly do the best we can without it. */
5071 if (!FRAME_CHAR_INS_DEL_OK (f))
5073 int i, j;
5075 /* Find the first glyph in desired row that doesn't agree with
5076 a glyph in the current row, and write the rest from there on. */
5077 for (i = 0; i < nlen; i++)
5079 if (i >= olen || !GLYPH_EQUAL_P (nbody + i, obody + i))
5081 /* Find the end of the run of different glyphs. */
5082 j = i + 1;
5083 while (j < nlen
5084 && (j >= olen
5085 || !GLYPH_EQUAL_P (nbody + j, obody + j)
5086 || CHAR_GLYPH_PADDING_P (nbody[j])))
5087 ++j;
5089 /* Output this run of non-matching chars. */
5090 cursor_to (f, vpos, i);
5091 write_glyphs (f, nbody + i, j - i);
5092 i = j - 1;
5094 /* Now find the next non-match. */
5098 /* Clear the rest of the line, or the non-clear part of it. */
5099 if (olen > nlen)
5101 cursor_to (f, vpos, nlen);
5102 clear_end_of_line (f, olen);
5105 /* Make current row = desired row. */
5106 make_current (desired_matrix, current_matrix, vpos);
5107 return;
5110 /* Here when CHAR_INS_DEL_OK != 0, i.e. we can insert or delete
5111 characters in a row. */
5113 if (!olen)
5115 /* If current line is blank, skip over initial spaces, if
5116 possible, and write the rest. */
5117 if (write_spaces_p)
5118 nsp = 0;
5119 else
5120 nsp = count_blanks (nbody, nlen);
5122 if (nlen > nsp)
5124 cursor_to (f, vpos, nsp);
5125 write_glyphs (f, nbody + nsp, nlen - nsp);
5128 /* Exchange contents between current_frame and new_frame. */
5129 make_current (desired_matrix, current_matrix, vpos);
5130 return;
5133 /* Compute number of leading blanks in old and new contents. */
5134 osp = count_blanks (obody, olen);
5135 nsp = (colored_spaces_p ? 0 : count_blanks (nbody, nlen));
5137 /* Compute number of matching chars starting with first non-blank. */
5138 begmatch = count_match (obody + osp, obody + olen,
5139 nbody + nsp, nbody + nlen);
5141 /* Spaces in new match implicit space past the end of old. */
5142 /* A bug causing this to be a no-op was fixed in 18.29. */
5143 if (!write_spaces_p && osp + begmatch == olen)
5145 np1 = nbody + nsp;
5146 while (np1 + begmatch < nend && CHAR_GLYPH_SPACE_P (np1[begmatch]))
5147 ++begmatch;
5150 /* Avoid doing insert/delete char
5151 just cause number of leading spaces differs
5152 when the following text does not match. */
5153 if (begmatch == 0 && osp != nsp)
5154 osp = nsp = min (osp, nsp);
5156 /* Find matching characters at end of line */
5157 op1 = obody + olen;
5158 np1 = nbody + nlen;
5159 op2 = op1 + begmatch - min (olen - osp, nlen - nsp);
5160 while (op1 > op2
5161 && GLYPH_EQUAL_P (op1 - 1, np1 - 1))
5163 op1--;
5164 np1--;
5166 endmatch = obody + olen - op1;
5168 /* tem gets the distance to insert or delete.
5169 endmatch is how many characters we save by doing so.
5170 Is it worth it? */
5172 tem = (nlen - nsp) - (olen - osp);
5173 if (endmatch && tem
5174 && (!FRAME_CHAR_INS_DEL_OK (f)
5175 || endmatch <= char_ins_del_cost (f)[tem]))
5176 endmatch = 0;
5178 /* nsp - osp is the distance to insert or delete.
5179 If that is nonzero, begmatch is known to be nonzero also.
5180 begmatch + endmatch is how much we save by doing the ins/del.
5181 Is it worth it? */
5183 if (nsp != osp
5184 && (!FRAME_CHAR_INS_DEL_OK (f)
5185 || begmatch + endmatch <= char_ins_del_cost (f)[nsp - osp]))
5187 begmatch = 0;
5188 endmatch = 0;
5189 osp = nsp = min (osp, nsp);
5192 /* Now go through the line, inserting, writing and
5193 deleting as appropriate. */
5195 if (osp > nsp)
5197 cursor_to (f, vpos, nsp);
5198 delete_glyphs (f, osp - nsp);
5200 else if (nsp > osp)
5202 /* If going to delete chars later in line
5203 and insert earlier in the line,
5204 must delete first to avoid losing data in the insert */
5205 if (endmatch && nlen < olen + nsp - osp)
5207 cursor_to (f, vpos, nlen - endmatch + osp - nsp);
5208 delete_glyphs (f, olen + nsp - osp - nlen);
5209 olen = nlen - (nsp - osp);
5211 cursor_to (f, vpos, osp);
5212 insert_glyphs (f, 0, nsp - osp);
5214 olen += nsp - osp;
5216 tem = nsp + begmatch + endmatch;
5217 if (nlen != tem || olen != tem)
5219 if (!endmatch || nlen == olen)
5221 /* If new text being written reaches right margin, there is
5222 no need to do clear-to-eol at the end of this function
5223 (and it would not be safe, since cursor is not going to
5224 be "at the margin" after the text is done). */
5225 if (nlen == FRAME_TOTAL_COLS (f))
5226 olen = 0;
5228 /* Function write_glyphs is prepared to do nothing
5229 if passed a length <= 0. Check it here to avoid
5230 unnecessary cursor movement. */
5231 if (nlen - tem > 0)
5233 cursor_to (f, vpos, nsp + begmatch);
5234 write_glyphs (f, nbody + nsp + begmatch, nlen - tem);
5237 else if (nlen > olen)
5239 /* Here, we used to have the following simple code:
5240 ----------------------------------------
5241 write_glyphs (nbody + nsp + begmatch, olen - tem);
5242 insert_glyphs (nbody + nsp + begmatch + olen - tem, nlen - olen);
5243 ----------------------------------------
5244 but it doesn't work if nbody[nsp + begmatch + olen - tem]
5245 is a padding glyph. */
5246 int out = olen - tem; /* Columns to be overwritten originally. */
5247 int del;
5249 cursor_to (f, vpos, nsp + begmatch);
5251 /* Calculate columns we can actually overwrite. */
5252 while (CHAR_GLYPH_PADDING_P (nbody[nsp + begmatch + out]))
5253 out--;
5254 write_glyphs (f, nbody + nsp + begmatch, out);
5256 /* If we left columns to be overwritten, we must delete them. */
5257 del = olen - tem - out;
5258 if (del > 0)
5259 delete_glyphs (f, del);
5261 /* At last, we insert columns not yet written out. */
5262 insert_glyphs (f, nbody + nsp + begmatch + out, nlen - olen + del);
5263 olen = nlen;
5265 else if (olen > nlen)
5267 cursor_to (f, vpos, nsp + begmatch);
5268 write_glyphs (f, nbody + nsp + begmatch, nlen - tem);
5269 delete_glyphs (f, olen - nlen);
5270 olen = nlen;
5274 just_erase:
5275 /* If any unerased characters remain after the new line, erase them. */
5276 if (olen > nlen)
5278 cursor_to (f, vpos, nlen);
5279 clear_end_of_line (f, olen);
5282 /* Exchange contents between current_frame and new_frame. */
5283 make_current (desired_matrix, current_matrix, vpos);
5288 /***********************************************************************
5289 X/Y Position -> Buffer Position
5290 ***********************************************************************/
5292 /* Determine what's under window-relative pixel position (*X, *Y).
5293 Return the OBJECT (string or buffer) that's there.
5294 Return in *POS the position in that object.
5295 Adjust *X and *Y to character positions.
5296 Return in *DX and *DY the pixel coordinates of the click,
5297 relative to the top left corner of OBJECT, or relative to
5298 the top left corner of the character glyph at (*X, *Y)
5299 if OBJECT is nil.
5300 Return WIDTH and HEIGHT of the object at (*X, *Y), or zero
5301 if the coordinates point to an empty area of the display. */
5303 Lisp_Object
5304 buffer_posn_from_coords (struct window *w, int *x, int *y, struct display_pos *pos, Lisp_Object *object, int *dx, int *dy, int *width, int *height)
5306 struct it it;
5307 Lisp_Object old_current_buffer = Fcurrent_buffer ();
5308 struct text_pos startp;
5309 Lisp_Object string;
5310 struct glyph_row *row;
5311 #ifdef HAVE_WINDOW_SYSTEM
5312 struct image *img = 0;
5313 #endif
5314 int x0, x1, to_x;
5316 /* We used to set current_buffer directly here, but that does the
5317 wrong thing with `face-remapping-alist' (bug#2044). */
5318 Fset_buffer (w->buffer);
5319 SET_TEXT_POS_FROM_MARKER (startp, w->start);
5320 CHARPOS (startp) = min (ZV, max (BEGV, CHARPOS (startp)));
5321 BYTEPOS (startp) = min (ZV_BYTE, max (BEGV_BYTE, BYTEPOS (startp)));
5322 start_display (&it, w, startp);
5324 x0 = *x;
5326 /* First, move to the beginning of the row corresponding to *Y. We
5327 need to be in that row to get the correct value of base paragraph
5328 direction for the text at (*X, *Y). */
5329 move_it_to (&it, -1, 0, *y, -1, MOVE_TO_X | MOVE_TO_Y);
5331 /* TO_X is the pixel position that the iterator will compute for the
5332 glyph at *X. We add it.first_visible_x because iterator
5333 positions include the hscroll. */
5334 to_x = x0 + it.first_visible_x;
5335 if (it.bidi_it.paragraph_dir == R2L)
5336 /* For lines in an R2L paragraph, we need to mirror TO_X wrt the
5337 text area. This is because the iterator, even in R2L
5338 paragraphs, delivers glyphs as if they started at the left
5339 margin of the window. (When we actually produce glyphs for
5340 display, we reverse their order in PRODUCE_GLYPHS, but the
5341 iterator doesn't know about that.) The following line adjusts
5342 the pixel position to the iterator geometry, which is what
5343 move_it_* routines use. (The -1 is because in a window whose
5344 text-area width is W, the rightmost pixel position is W-1, and
5345 it should be mirrored into zero pixel position.) */
5346 to_x = window_box_width (w, TEXT_AREA) - to_x - 1;
5348 /* Now move horizontally in the row to the glyph under *X. Second
5349 argument is ZV to prevent move_it_in_display_line from matching
5350 based on buffer positions. */
5351 move_it_in_display_line (&it, ZV, to_x, MOVE_TO_X);
5353 Fset_buffer (old_current_buffer);
5355 *dx = x0 + it.first_visible_x - it.current_x;
5356 *dy = *y - it.current_y;
5358 string = w->buffer;
5359 if (STRINGP (it.string))
5360 string = it.string;
5361 *pos = it.current;
5362 if (it.what == IT_COMPOSITION
5363 && it.cmp_it.nchars > 1
5364 && it.cmp_it.reversed_p)
5366 /* The current display element is a grapheme cluster in a
5367 composition. In that case, we need the position of the first
5368 character of the cluster. But, as it.cmp_it.reversed_p is 1,
5369 it.current points to the last character of the cluster, thus
5370 we must move back to the first character of the same
5371 cluster. */
5372 CHARPOS (pos->pos) -= it.cmp_it.nchars - 1;
5373 if (STRINGP (it.string))
5374 BYTEPOS (pos->pos) = string_char_to_byte (string, CHARPOS (pos->pos));
5375 else
5376 BYTEPOS (pos->pos) = CHAR_TO_BYTE (CHARPOS (pos->pos));
5379 #ifdef HAVE_WINDOW_SYSTEM
5380 if (it.what == IT_IMAGE)
5382 if ((img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
5383 && !NILP (img->spec))
5384 *object = img->spec;
5386 #endif
5388 if (it.vpos < w->current_matrix->nrows
5389 && (row = MATRIX_ROW (w->current_matrix, it.vpos),
5390 row->enabled_p))
5392 if (it.hpos < row->used[TEXT_AREA])
5394 struct glyph *glyph = row->glyphs[TEXT_AREA] + it.hpos;
5395 #ifdef HAVE_WINDOW_SYSTEM
5396 if (img)
5398 *dy -= row->ascent - glyph->ascent;
5399 *dx += glyph->slice.img.x;
5400 *dy += glyph->slice.img.y;
5401 /* Image slices positions are still relative to the entire image */
5402 *width = img->width;
5403 *height = img->height;
5405 else
5406 #endif
5408 *width = glyph->pixel_width;
5409 *height = glyph->ascent + glyph->descent;
5412 else
5414 *width = 0;
5415 *height = row->height;
5418 else
5420 *width = *height = 0;
5423 /* Add extra (default width) columns if clicked after EOL. */
5424 x1 = max(0, it.current_x + it.pixel_width - it.first_visible_x);
5425 if (x0 > x1)
5426 it.hpos += (x0 - x1) / WINDOW_FRAME_COLUMN_WIDTH (w);
5428 *x = it.hpos;
5429 *y = it.vpos;
5431 return string;
5435 /* Value is the string under window-relative coordinates X/Y in the
5436 mode line or header line (PART says which) of window W, or nil if none.
5437 *CHARPOS is set to the position in the string returned. */
5439 Lisp_Object
5440 mode_line_string (struct window *w, enum window_part part,
5441 int *x, int *y, EMACS_INT *charpos, Lisp_Object *object,
5442 int *dx, int *dy, int *width, int *height)
5444 struct glyph_row *row;
5445 struct glyph *glyph, *end;
5446 int x0, y0;
5447 Lisp_Object string = Qnil;
5449 if (part == ON_MODE_LINE)
5450 row = MATRIX_MODE_LINE_ROW (w->current_matrix);
5451 else
5452 row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
5453 y0 = *y - row->y;
5454 *y = row - MATRIX_FIRST_TEXT_ROW (w->current_matrix);
5456 if (row->mode_line_p && row->enabled_p)
5458 /* Find the glyph under X. If we find one with a string object,
5459 it's the one we were looking for. */
5460 glyph = row->glyphs[TEXT_AREA];
5461 end = glyph + row->used[TEXT_AREA];
5462 for (x0 = *x; glyph < end && x0 >= glyph->pixel_width; ++glyph)
5463 x0 -= glyph->pixel_width;
5464 *x = glyph - row->glyphs[TEXT_AREA];
5465 if (glyph < end)
5467 string = glyph->object;
5468 *charpos = glyph->charpos;
5469 *width = glyph->pixel_width;
5470 *height = glyph->ascent + glyph->descent;
5471 #ifdef HAVE_WINDOW_SYSTEM
5472 if (glyph->type == IMAGE_GLYPH)
5474 struct image *img;
5475 img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
5476 if (img != NULL)
5477 *object = img->spec;
5478 y0 -= row->ascent - glyph->ascent;
5480 #endif
5482 else
5484 /* Add extra (default width) columns if clicked after EOL. */
5485 *x += x0 / WINDOW_FRAME_COLUMN_WIDTH (w);
5486 *width = 0;
5487 *height = row->height;
5490 else
5492 *x = 0;
5493 x0 = 0;
5494 *width = *height = 0;
5497 *dx = x0;
5498 *dy = y0;
5500 return string;
5504 /* Value is the string under window-relative coordinates X/Y in either
5505 marginal area, or nil if none. *CHARPOS is set to the position in
5506 the string returned. */
5508 Lisp_Object
5509 marginal_area_string (struct window *w, enum window_part part,
5510 int *x, int *y, EMACS_INT *charpos, Lisp_Object *object,
5511 int *dx, int *dy, int *width, int *height)
5513 struct glyph_row *row = w->current_matrix->rows;
5514 struct glyph *glyph, *end;
5515 int x0, y0, i, wy = *y;
5516 int area;
5517 Lisp_Object string = Qnil;
5519 if (part == ON_LEFT_MARGIN)
5520 area = LEFT_MARGIN_AREA;
5521 else if (part == ON_RIGHT_MARGIN)
5522 area = RIGHT_MARGIN_AREA;
5523 else
5524 abort ();
5526 for (i = 0; row->enabled_p && i < w->current_matrix->nrows; ++i, ++row)
5527 if (wy >= row->y && wy < MATRIX_ROW_BOTTOM_Y (row))
5528 break;
5529 y0 = *y - row->y;
5530 *y = row - MATRIX_FIRST_TEXT_ROW (w->current_matrix);
5532 if (row->enabled_p)
5534 /* Find the glyph under X. If we find one with a string object,
5535 it's the one we were looking for. */
5536 if (area == RIGHT_MARGIN_AREA)
5537 x0 = ((WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5538 ? WINDOW_LEFT_FRINGE_WIDTH (w)
5539 : WINDOW_TOTAL_FRINGE_WIDTH (w))
5540 + window_box_width (w, LEFT_MARGIN_AREA)
5541 + window_box_width (w, TEXT_AREA));
5542 else
5543 x0 = (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
5544 ? WINDOW_LEFT_FRINGE_WIDTH (w)
5545 : 0);
5547 glyph = row->glyphs[area];
5548 end = glyph + row->used[area];
5549 for (x0 = *x - x0; glyph < end && x0 >= glyph->pixel_width; ++glyph)
5550 x0 -= glyph->pixel_width;
5551 *x = glyph - row->glyphs[area];
5552 if (glyph < end)
5554 string = glyph->object;
5555 *charpos = glyph->charpos;
5556 *width = glyph->pixel_width;
5557 *height = glyph->ascent + glyph->descent;
5558 #ifdef HAVE_WINDOW_SYSTEM
5559 if (glyph->type == IMAGE_GLYPH)
5561 struct image *img;
5562 img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
5563 if (img != NULL)
5564 *object = img->spec;
5565 y0 -= row->ascent - glyph->ascent;
5566 x0 += glyph->slice.img.x;
5567 y0 += glyph->slice.img.y;
5569 #endif
5571 else
5573 /* Add extra (default width) columns if clicked after EOL. */
5574 *x += x0 / WINDOW_FRAME_COLUMN_WIDTH (w);
5575 *width = 0;
5576 *height = row->height;
5579 else
5581 x0 = 0;
5582 *x = 0;
5583 *width = *height = 0;
5586 *dx = x0;
5587 *dy = y0;
5589 return string;
5593 /***********************************************************************
5594 Changing Frame Sizes
5595 ***********************************************************************/
5597 #ifdef SIGWINCH
5599 SIGTYPE
5600 window_change_signal (int signalnum) /* If we don't have an argument, */
5601 /* some compilers complain in signal calls. */
5603 int width, height;
5604 int old_errno = errno;
5606 struct tty_display_info *tty;
5608 signal (SIGWINCH, window_change_signal);
5609 SIGNAL_THREAD_CHECK (signalnum);
5611 /* The frame size change obviously applies to a single
5612 termcap-controlled terminal, but we can't decide which.
5613 Therefore, we resize the frames corresponding to each tty.
5615 for (tty = tty_list; tty; tty = tty->next) {
5617 if (! tty->term_initted)
5618 continue;
5620 /* Suspended tty frames have tty->input == NULL avoid trying to
5621 use it. */
5622 if (!tty->input)
5623 continue;
5625 get_tty_size (fileno (tty->input), &width, &height);
5627 if (width > 5 && height > 2) {
5628 Lisp_Object tail, frame;
5630 FOR_EACH_FRAME (tail, frame)
5631 if (FRAME_TERMCAP_P (XFRAME (frame)) && FRAME_TTY (XFRAME (frame)) == tty)
5632 /* Record the new sizes, but don't reallocate the data
5633 structures now. Let that be done later outside of the
5634 signal handler. */
5635 change_frame_size (XFRAME (frame), height, width, 0, 1, 0);
5639 errno = old_errno;
5641 #endif /* SIGWINCH */
5644 /* Do any change in frame size that was requested by a signal. SAFE
5645 non-zero means this function is called from a place where it is
5646 safe to change frame sizes while a redisplay is in progress. */
5648 void
5649 do_pending_window_change (int safe)
5651 /* If window_change_signal should have run before, run it now. */
5652 if (redisplaying_p && !safe)
5653 return;
5655 while (delayed_size_change)
5657 Lisp_Object tail, frame;
5659 delayed_size_change = 0;
5661 FOR_EACH_FRAME (tail, frame)
5663 struct frame *f = XFRAME (frame);
5665 if (f->new_text_lines != 0 || f->new_text_cols != 0)
5666 change_frame_size (f, f->new_text_lines, f->new_text_cols,
5667 0, 0, safe);
5673 /* Change the frame height and/or width. Values may be given as zero to
5674 indicate no change is to take place.
5676 If DELAY is non-zero, then assume we're being called from a signal
5677 handler, and queue the change for later - perhaps the next
5678 redisplay. Since this tries to resize windows, we can't call it
5679 from a signal handler.
5681 SAFE non-zero means this function is called from a place where it's
5682 safe to change frame sizes while a redisplay is in progress. */
5684 void
5685 change_frame_size (register struct frame *f, int newheight, int newwidth, int pretend, int delay, int safe)
5687 Lisp_Object tail, frame;
5689 if (FRAME_MSDOS_P (f))
5691 /* On MS-DOS, all frames use the same screen, so a change in
5692 size affects all frames. Termcap now supports multiple
5693 ttys. */
5694 FOR_EACH_FRAME (tail, frame)
5695 if (! FRAME_WINDOW_P (XFRAME (frame)))
5696 change_frame_size_1 (XFRAME (frame), newheight, newwidth,
5697 pretend, delay, safe);
5699 else
5700 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe);
5703 static void
5704 change_frame_size_1 (register struct frame *f, int newheight, int newwidth, int pretend, int delay, int safe)
5706 int new_frame_total_cols;
5707 int count = SPECPDL_INDEX ();
5709 /* If we can't deal with the change now, queue it for later. */
5710 if (delay || (redisplaying_p && !safe))
5712 f->new_text_lines = newheight;
5713 f->new_text_cols = newwidth;
5714 delayed_size_change = 1;
5715 return;
5718 /* This size-change overrides any pending one for this frame. */
5719 f->new_text_lines = 0;
5720 f->new_text_cols = 0;
5722 /* If an argument is zero, set it to the current value. */
5723 if (newheight == 0)
5724 newheight = FRAME_LINES (f);
5725 if (newwidth == 0)
5726 newwidth = FRAME_COLS (f);
5728 /* Compute width of windows in F.
5729 This is the width of the frame without vertical scroll bars. */
5730 new_frame_total_cols = FRAME_TOTAL_COLS_ARG (f, newwidth);
5732 /* Round up to the smallest acceptable size. */
5733 check_frame_size (f, &newheight, &newwidth);
5735 /* If we're not changing the frame size, quit now. */
5736 /* Frame width may be unchanged but the text portion may change, for example,
5737 fullscreen and remove/add scroll bar. */
5738 if (newheight == FRAME_LINES (f)
5739 && newwidth == FRAME_COLS (f) // text portion unchanged
5740 && new_frame_total_cols == FRAME_TOTAL_COLS (f)) // frame width unchanged
5741 return;
5743 BLOCK_INPUT;
5745 #ifdef MSDOS
5746 /* We only can set screen dimensions to certain values supported
5747 by our video hardware. Try to find the smallest size greater
5748 or equal to the requested dimensions. */
5749 dos_set_window_size (&newheight, &newwidth);
5750 #endif
5752 if (newheight != FRAME_LINES (f))
5754 if (FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))
5756 /* Frame has both root and mini-buffer. */
5757 XSETFASTINT (XWINDOW (FRAME_ROOT_WINDOW (f))->top_line,
5758 FRAME_TOP_MARGIN (f));
5759 set_window_height (FRAME_ROOT_WINDOW (f),
5760 (newheight
5762 - FRAME_TOP_MARGIN (f)),
5764 XSETFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top_line,
5765 newheight - 1);
5766 set_window_height (FRAME_MINIBUF_WINDOW (f), 1, 0);
5768 else
5769 /* Frame has just one top-level window. */
5770 set_window_height (FRAME_ROOT_WINDOW (f),
5771 newheight - FRAME_TOP_MARGIN (f), 2);
5773 /* MSDOS frames cannot PRETEND, as they change frame size by
5774 manipulating video hardware. */
5775 if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
5776 FrameRows (FRAME_TTY (f)) = newheight;
5779 if (new_frame_total_cols != FRAME_TOTAL_COLS (f))
5781 set_window_width (FRAME_ROOT_WINDOW (f), new_frame_total_cols, 2);
5782 if (FRAME_HAS_MINIBUF_P (f))
5783 set_window_width (FRAME_MINIBUF_WINDOW (f), new_frame_total_cols, 0);
5785 /* MSDOS frames cannot PRETEND, as they change frame size by
5786 manipulating video hardware. */
5787 if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
5788 FrameCols (FRAME_TTY (f)) = newwidth;
5790 if (WINDOWP (f->tool_bar_window))
5791 XSETFASTINT (XWINDOW (f->tool_bar_window)->total_cols, newwidth);
5794 FRAME_LINES (f) = newheight;
5795 SET_FRAME_COLS (f, newwidth);
5798 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
5799 int text_area_x, text_area_y, text_area_width, text_area_height;
5801 window_box (w, TEXT_AREA, &text_area_x, &text_area_y, &text_area_width,
5802 &text_area_height);
5803 if (w->cursor.x >= text_area_x + text_area_width)
5804 w->cursor.hpos = w->cursor.x = 0;
5805 if (w->cursor.y >= text_area_y + text_area_height)
5806 w->cursor.vpos = w->cursor.y = 0;
5809 adjust_glyphs (f);
5810 calculate_costs (f);
5811 SET_FRAME_GARBAGED (f);
5812 f->resized_p = 1;
5814 UNBLOCK_INPUT;
5816 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
5818 run_window_configuration_change_hook (f);
5820 unbind_to (count, Qnil);
5825 /***********************************************************************
5826 Terminal Related Lisp Functions
5827 ***********************************************************************/
5829 DEFUN ("open-termscript", Fopen_termscript, Sopen_termscript,
5830 1, 1, "FOpen termscript file: ",
5831 doc: /* Start writing all terminal output to FILE as well as the terminal.
5832 FILE = nil means just close any termscript file currently open. */)
5833 (Lisp_Object file)
5835 struct tty_display_info *tty;
5837 if (! FRAME_TERMCAP_P (SELECTED_FRAME ())
5838 && ! FRAME_MSDOS_P (SELECTED_FRAME ()))
5839 error ("Current frame is not on a tty device");
5841 tty = CURTTY ();
5843 if (tty->termscript != 0)
5845 BLOCK_INPUT;
5846 fclose (tty->termscript);
5847 UNBLOCK_INPUT;
5849 tty->termscript = 0;
5851 if (! NILP (file))
5853 file = Fexpand_file_name (file, Qnil);
5854 tty->termscript = fopen (SDATA (file), "w");
5855 if (tty->termscript == 0)
5856 report_file_error ("Opening termscript", Fcons (file, Qnil));
5858 return Qnil;
5862 DEFUN ("send-string-to-terminal", Fsend_string_to_terminal,
5863 Ssend_string_to_terminal, 1, 2, 0,
5864 doc: /* Send STRING to the terminal without alteration.
5865 Control characters in STRING will have terminal-dependent effects.
5867 Optional parameter TERMINAL specifies the tty terminal device to use.
5868 It may be a terminal object, a frame, or nil for the terminal used by
5869 the currently selected frame. In batch mode, STRING is sent to stdout
5870 when TERMINAL is nil. */)
5871 (Lisp_Object string, Lisp_Object terminal)
5873 struct terminal *t = get_terminal (terminal, 1);
5874 FILE *out;
5876 /* ??? Perhaps we should do something special for multibyte strings here. */
5877 CHECK_STRING (string);
5878 BLOCK_INPUT;
5880 if (!t)
5881 error ("Unknown terminal device");
5883 if (t->type == output_initial)
5884 out = stdout;
5885 else if (t->type != output_termcap && t->type != output_msdos_raw)
5886 error ("Device %d is not a termcap terminal device", t->id);
5887 else
5889 struct tty_display_info *tty = t->display_info.tty;
5891 if (! tty->output)
5892 error ("Terminal is currently suspended");
5894 if (tty->termscript)
5896 fwrite (SDATA (string), 1, SBYTES (string), tty->termscript);
5897 fflush (tty->termscript);
5899 out = tty->output;
5901 fwrite (SDATA (string), 1, SBYTES (string), out);
5902 fflush (out);
5903 UNBLOCK_INPUT;
5904 return Qnil;
5908 DEFUN ("ding", Fding, Sding, 0, 1, 0,
5909 doc: /* Beep, or flash the screen.
5910 Also, unless an argument is given,
5911 terminate any keyboard macro currently executing. */)
5912 (Lisp_Object arg)
5914 if (!NILP (arg))
5916 if (noninteractive)
5917 putchar (07);
5918 else
5919 ring_bell (XFRAME (selected_frame));
5921 else
5922 bitch_at_user ();
5924 return Qnil;
5927 void
5928 bitch_at_user (void)
5930 if (noninteractive)
5931 putchar (07);
5932 else if (!INTERACTIVE) /* Stop executing a keyboard macro. */
5933 error ("Keyboard macro terminated by a command ringing the bell");
5934 else
5935 ring_bell (XFRAME (selected_frame));
5940 /***********************************************************************
5941 Sleeping, Waiting
5942 ***********************************************************************/
5944 DEFUN ("sleep-for", Fsleep_for, Ssleep_for, 1, 2, 0,
5945 doc: /* Pause, without updating display, for SECONDS seconds.
5946 SECONDS may be a floating-point value, meaning that you can wait for a
5947 fraction of a second. Optional second arg MILLISECONDS specifies an
5948 additional wait period, in milliseconds; this may be useful if your
5949 Emacs was built without floating point support.
5950 \(Not all operating systems support waiting for a fraction of a second.) */)
5951 (Lisp_Object seconds, Lisp_Object milliseconds)
5953 int sec, usec;
5955 if (NILP (milliseconds))
5956 XSETINT (milliseconds, 0);
5957 else
5958 CHECK_NUMBER (milliseconds);
5959 usec = XINT (milliseconds) * 1000;
5962 double duration = extract_float (seconds);
5963 sec = (int) duration;
5964 usec += (duration - sec) * 1000000;
5967 #ifndef EMACS_HAS_USECS
5968 if (sec == 0 && usec != 0)
5969 error ("Millisecond `sleep-for' not supported on %s", SYSTEM_TYPE);
5970 #endif
5972 /* Assure that 0 <= usec < 1000000. */
5973 if (usec < 0)
5975 /* We can't rely on the rounding being correct if usec is negative. */
5976 if (-1000000 < usec)
5977 sec--, usec += 1000000;
5978 else
5979 sec -= -usec / 1000000, usec = 1000000 - (-usec % 1000000);
5981 else
5982 sec += usec / 1000000, usec %= 1000000;
5984 if (sec < 0 || (sec == 0 && usec == 0))
5985 return Qnil;
5987 wait_reading_process_output (sec, usec, 0, 0, Qnil, NULL, 0);
5989 return Qnil;
5993 /* This is just like wait_reading_process_output, except that
5994 it does redisplay.
5996 TIMEOUT is number of seconds to wait (float or integer),
5997 or t to wait forever.
5998 READING is 1 if reading input.
5999 If DO_DISPLAY is >0 display process output while waiting.
6000 If DO_DISPLAY is >1 perform an initial redisplay before waiting.
6003 Lisp_Object
6004 sit_for (Lisp_Object timeout, int reading, int do_display)
6006 int sec, usec;
6008 swallow_events (do_display);
6010 if ((detect_input_pending_run_timers (do_display))
6011 || !NILP (Vexecuting_kbd_macro))
6012 return Qnil;
6014 if (do_display >= 2)
6015 redisplay_preserve_echo_area (2);
6017 if (INTEGERP (timeout))
6019 sec = XINT (timeout);
6020 usec = 0;
6022 else if (FLOATP (timeout))
6024 double seconds = XFLOAT_DATA (timeout);
6025 sec = (int) seconds;
6026 usec = (int) ((seconds - sec) * 1000000);
6028 else if (EQ (timeout, Qt))
6030 sec = 0;
6031 usec = 0;
6033 else
6034 wrong_type_argument (Qnumberp, timeout);
6036 if (sec == 0 && usec == 0 && !EQ (timeout, Qt))
6037 return Qt;
6039 #ifdef SIGIO
6040 gobble_input (0);
6041 #endif
6043 wait_reading_process_output (sec, usec, reading ? -1 : 1, do_display,
6044 Qnil, NULL, 0);
6046 return detect_input_pending () ? Qnil : Qt;
6050 DEFUN ("redisplay", Fredisplay, Sredisplay, 0, 1, 0,
6051 doc: /* Perform redisplay if no input is available.
6052 If optional arg FORCE is non-nil or `redisplay-dont-pause' is non-nil,
6053 perform a full redisplay even if input is available.
6054 Return t if redisplay was performed, nil otherwise. */)
6055 (Lisp_Object force)
6057 int count;
6059 swallow_events (1);
6060 if ((detect_input_pending_run_timers (1)
6061 && NILP (force) && !redisplay_dont_pause)
6062 || !NILP (Vexecuting_kbd_macro))
6063 return Qnil;
6065 count = SPECPDL_INDEX ();
6066 if (!NILP (force) && !redisplay_dont_pause)
6067 specbind (Qredisplay_dont_pause, Qt);
6068 redisplay_preserve_echo_area (2);
6069 unbind_to (count, Qnil);
6070 return Qt;
6075 /***********************************************************************
6076 Other Lisp Functions
6077 ***********************************************************************/
6079 /* A vector of size >= 2 * NFRAMES + 3 * NBUFFERS + 1, containing the
6080 session's frames, frame names, buffers, buffer-read-only flags, and
6081 buffer-modified-flags. */
6083 static Lisp_Object frame_and_buffer_state;
6086 DEFUN ("frame-or-buffer-changed-p", Fframe_or_buffer_changed_p,
6087 Sframe_or_buffer_changed_p, 0, 1, 0,
6088 doc: /* Return non-nil if the frame and buffer state appears to have changed.
6089 VARIABLE is a variable name whose value is either nil or a state vector
6090 that will be updated to contain all frames and buffers,
6091 aside from buffers whose names start with space,
6092 along with the buffers' read-only and modified flags. This allows a fast
6093 check to see whether buffer menus might need to be recomputed.
6094 If this function returns non-nil, it updates the internal vector to reflect
6095 the current state.
6097 If VARIABLE is nil, an internal variable is used. Users should not
6098 pass nil for VARIABLE. */)
6099 (Lisp_Object variable)
6101 Lisp_Object state, tail, frame, buf;
6102 Lisp_Object *vecp, *end;
6103 int n;
6105 if (! NILP (variable))
6107 CHECK_SYMBOL (variable);
6108 state = Fsymbol_value (variable);
6109 if (! VECTORP (state))
6110 goto changed;
6112 else
6113 state = frame_and_buffer_state;
6115 vecp = XVECTOR (state)->contents;
6116 end = vecp + XVECTOR (state)->size;
6118 FOR_EACH_FRAME (tail, frame)
6120 if (vecp == end)
6121 goto changed;
6122 if (!EQ (*vecp++, frame))
6123 goto changed;
6124 if (vecp == end)
6125 goto changed;
6126 if (!EQ (*vecp++, XFRAME (frame)->name))
6127 goto changed;
6129 /* Check that the buffer info matches. */
6130 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
6132 buf = XCDR (XCAR (tail));
6133 /* Ignore buffers that aren't included in buffer lists. */
6134 if (SREF (XBUFFER (buf)->name, 0) == ' ')
6135 continue;
6136 if (vecp == end)
6137 goto changed;
6138 if (!EQ (*vecp++, buf))
6139 goto changed;
6140 if (vecp == end)
6141 goto changed;
6142 if (!EQ (*vecp++, XBUFFER (buf)->read_only))
6143 goto changed;
6144 if (vecp == end)
6145 goto changed;
6146 if (!EQ (*vecp++, Fbuffer_modified_p (buf)))
6147 goto changed;
6149 if (vecp == end)
6150 goto changed;
6151 /* Detect deletion of a buffer at the end of the list. */
6152 if (EQ (*vecp, Qlambda))
6153 return Qnil;
6155 /* Come here if we decide the data has changed. */
6156 changed:
6157 /* Count the size we will need.
6158 Start with 1 so there is room for at least one lambda at the end. */
6159 n = 1;
6160 FOR_EACH_FRAME (tail, frame)
6161 n += 2;
6162 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
6163 n += 3;
6164 /* Reallocate the vector if data has grown to need it,
6165 or if it has shrunk a lot. */
6166 if (! VECTORP (state)
6167 || n > XVECTOR (state)->size
6168 || n + 20 < XVECTOR (state)->size / 2)
6169 /* Add 20 extra so we grow it less often. */
6171 state = Fmake_vector (make_number (n + 20), Qlambda);
6172 if (! NILP (variable))
6173 Fset (variable, state);
6174 else
6175 frame_and_buffer_state = state;
6178 /* Record the new data in the (possibly reallocated) vector. */
6179 vecp = XVECTOR (state)->contents;
6180 FOR_EACH_FRAME (tail, frame)
6182 *vecp++ = frame;
6183 *vecp++ = XFRAME (frame)->name;
6185 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
6187 buf = XCDR (XCAR (tail));
6188 /* Ignore buffers that aren't included in buffer lists. */
6189 if (SREF (XBUFFER (buf)->name, 0) == ' ')
6190 continue;
6191 *vecp++ = buf;
6192 *vecp++ = XBUFFER (buf)->read_only;
6193 *vecp++ = Fbuffer_modified_p (buf);
6195 /* Fill up the vector with lambdas (always at least one). */
6196 *vecp++ = Qlambda;
6197 while (vecp - XVECTOR (state)->contents
6198 < XVECTOR (state)->size)
6199 *vecp++ = Qlambda;
6200 /* Make sure we didn't overflow the vector. */
6201 if (vecp - XVECTOR (state)->contents
6202 > XVECTOR (state)->size)
6203 abort ();
6204 return Qt;
6209 /***********************************************************************
6210 Initialization
6211 ***********************************************************************/
6213 /* Initialization done when Emacs fork is started, before doing stty.
6214 Determine terminal type and set terminal_driver. Then invoke its
6215 decoding routine to set up variables in the terminal package. */
6217 void
6218 init_display (void)
6220 char *terminal_type;
6222 /* Construct the space glyph. */
6223 space_glyph.type = CHAR_GLYPH;
6224 SET_CHAR_GLYPH (space_glyph, ' ', DEFAULT_FACE_ID, 0);
6225 space_glyph.charpos = -1;
6227 inverse_video = 0;
6228 cursor_in_echo_area = 0;
6229 terminal_type = (char *) 0;
6231 /* Now is the time to initialize this; it's used by init_sys_modes
6232 during startup. */
6233 Vinitial_window_system = Qnil;
6235 /* SIGWINCH needs to be handled no matter what display we start
6236 with. Otherwise newly opened tty frames will not resize
6237 automatically. */
6238 #ifdef SIGWINCH
6239 #ifndef CANNOT_DUMP
6240 if (initialized)
6241 #endif /* CANNOT_DUMP */
6242 signal (SIGWINCH, window_change_signal);
6243 #endif /* SIGWINCH */
6245 /* If running as a daemon, no need to initialize any frames/terminal. */
6246 if (IS_DAEMON)
6247 return;
6249 /* If the user wants to use a window system, we shouldn't bother
6250 initializing the terminal. This is especially important when the
6251 terminal is so dumb that emacs gives up before and doesn't bother
6252 using the window system.
6254 If the DISPLAY environment variable is set and nonempty,
6255 try to use X, and die with an error message if that doesn't work. */
6257 #ifdef HAVE_X_WINDOWS
6258 if (! inhibit_window_system && ! display_arg)
6260 char *display;
6261 display = getenv ("DISPLAY");
6262 display_arg = (display != 0 && *display != 0);
6264 if (display_arg && !x_display_ok (display))
6266 fprintf (stderr, "Display %s unavailable, simulating -nw\n",
6267 display);
6268 inhibit_window_system = 1;
6272 if (!inhibit_window_system && display_arg
6273 #ifndef CANNOT_DUMP
6274 && initialized
6275 #endif
6278 Vinitial_window_system = Qx;
6279 #ifdef HAVE_X11
6280 Vwindow_system_version = make_number (11);
6281 #endif
6282 #if defined (GNU_LINUX) && defined (HAVE_LIBNCURSES)
6283 /* In some versions of ncurses,
6284 tputs crashes if we have not called tgetent.
6285 So call tgetent. */
6286 { char b[2044]; tgetent (b, "xterm");}
6287 #endif
6288 adjust_frame_glyphs_initially ();
6289 return;
6291 #endif /* HAVE_X_WINDOWS */
6293 #ifdef HAVE_NTGUI
6294 if (!inhibit_window_system)
6296 Vinitial_window_system = Qw32;
6297 Vwindow_system_version = make_number (1);
6298 adjust_frame_glyphs_initially ();
6299 return;
6301 #endif /* HAVE_NTGUI */
6303 #ifdef HAVE_NS
6304 if (!inhibit_window_system
6305 #ifndef CANNOT_DUMP
6306 && initialized
6307 #endif
6310 Vinitial_window_system = Qns;
6311 Vwindow_system_version = make_number(10);
6312 adjust_frame_glyphs_initially ();
6313 return;
6315 #endif
6317 /* If no window system has been specified, try to use the terminal. */
6318 if (! isatty (0))
6320 fatal ("standard input is not a tty");
6321 exit (1);
6324 #ifdef WINDOWSNT
6325 terminal_type = "w32console";
6326 #else
6327 /* Look at the TERM variable. */
6328 terminal_type = (char *) getenv ("TERM");
6329 #endif
6330 if (!terminal_type)
6332 #ifdef HAVE_WINDOW_SYSTEM
6333 if (! inhibit_window_system)
6334 fprintf (stderr, "Please set the environment variable DISPLAY or TERM (see `tset').\n");
6335 else
6336 #endif /* HAVE_WINDOW_SYSTEM */
6337 fprintf (stderr, "Please set the environment variable TERM; see `tset'.\n");
6338 exit (1);
6342 struct terminal *t;
6343 struct frame *f = XFRAME (selected_frame);
6345 /* Open a display on the controlling tty. */
6346 t = init_tty (0, terminal_type, 1); /* Errors are fatal. */
6348 /* Convert the initial frame to use the new display. */
6349 if (f->output_method != output_initial)
6350 abort ();
6351 f->output_method = t->type;
6352 f->terminal = t;
6354 t->reference_count++;
6355 #ifdef MSDOS
6356 f->output_data.tty->display_info = &the_only_display_info;
6357 #else
6358 if (f->output_method == output_termcap)
6359 create_tty_output (f);
6360 #endif
6361 t->display_info.tty->top_frame = selected_frame;
6362 change_frame_size (XFRAME (selected_frame),
6363 FrameRows (t->display_info.tty),
6364 FrameCols (t->display_info.tty), 0, 0, 1);
6366 /* Delete the initial terminal. */
6367 if (--initial_terminal->reference_count == 0
6368 && initial_terminal->delete_terminal_hook)
6369 (*initial_terminal->delete_terminal_hook) (initial_terminal);
6371 /* Update frame parameters to reflect the new type. */
6372 Fmodify_frame_parameters
6373 (selected_frame, Fcons (Fcons (Qtty_type,
6374 Ftty_type (selected_frame)), Qnil));
6375 if (t->display_info.tty->name)
6376 Fmodify_frame_parameters (selected_frame,
6377 Fcons (Fcons (Qtty, build_string (t->display_info.tty->name)),
6378 Qnil));
6379 else
6380 Fmodify_frame_parameters (selected_frame, Fcons (Fcons (Qtty, Qnil),
6381 Qnil));
6385 struct frame *sf = SELECTED_FRAME ();
6386 int width = FRAME_TOTAL_COLS (sf);
6387 int height = FRAME_LINES (sf);
6389 unsigned int total_glyphs = height * (width + 2) * sizeof (struct glyph);
6391 /* If these sizes are so big they cause overflow, just ignore the
6392 change. It's not clear what better we could do. */
6393 if (total_glyphs / sizeof (struct glyph) / height != width + 2)
6394 fatal ("screen size %dx%d too big", width, height);
6397 adjust_frame_glyphs_initially ();
6398 calculate_costs (XFRAME (selected_frame));
6400 /* Set up faces of the initial terminal frame of a dumped Emacs. */
6401 if (initialized
6402 && !noninteractive
6403 && NILP (Vinitial_window_system))
6405 /* For the initial frame, we don't have any way of knowing what
6406 are the foreground and background colors of the terminal. */
6407 struct frame *sf = SELECTED_FRAME();
6409 FRAME_FOREGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_FG_COLOR;
6410 FRAME_BACKGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_BG_COLOR;
6411 call0 (intern ("tty-set-up-initial-frame-faces"));
6417 /***********************************************************************
6418 Blinking cursor
6419 ***********************************************************************/
6421 DEFUN ("internal-show-cursor", Finternal_show_cursor,
6422 Sinternal_show_cursor, 2, 2, 0,
6423 doc: /* Set the cursor-visibility flag of WINDOW to SHOW.
6424 WINDOW nil means use the selected window. SHOW non-nil means
6425 show a cursor in WINDOW in the next redisplay. SHOW nil means
6426 don't show a cursor. */)
6427 (Lisp_Object window, Lisp_Object show)
6429 /* Don't change cursor state while redisplaying. This could confuse
6430 output routines. */
6431 if (!redisplaying_p)
6433 if (NILP (window))
6434 window = selected_window;
6435 else
6436 CHECK_WINDOW (window);
6438 XWINDOW (window)->cursor_off_p = NILP (show);
6441 return Qnil;
6445 DEFUN ("internal-show-cursor-p", Finternal_show_cursor_p,
6446 Sinternal_show_cursor_p, 0, 1, 0,
6447 doc: /* Value is non-nil if next redisplay will display a cursor in WINDOW.
6448 WINDOW nil or omitted means report on the selected window. */)
6449 (Lisp_Object window)
6451 struct window *w;
6453 if (NILP (window))
6454 window = selected_window;
6455 else
6456 CHECK_WINDOW (window);
6458 w = XWINDOW (window);
6459 return w->cursor_off_p ? Qnil : Qt;
6462 DEFUN ("last-nonminibuffer-frame", Flast_nonminibuf_frame,
6463 Slast_nonminibuf_frame, 0, 0, 0,
6464 doc: /* Value is last nonminibuffer frame. */)
6465 (void)
6467 Lisp_Object frame = Qnil;
6469 if (last_nonminibuf_frame)
6470 XSETFRAME (frame, last_nonminibuf_frame);
6472 return frame;
6475 /***********************************************************************
6476 Initialization
6477 ***********************************************************************/
6479 void
6480 syms_of_display (void)
6482 defsubr (&Sredraw_frame);
6483 defsubr (&Sredraw_display);
6484 defsubr (&Sframe_or_buffer_changed_p);
6485 defsubr (&Sopen_termscript);
6486 defsubr (&Sding);
6487 defsubr (&Sredisplay);
6488 defsubr (&Ssleep_for);
6489 defsubr (&Ssend_string_to_terminal);
6490 defsubr (&Sinternal_show_cursor);
6491 defsubr (&Sinternal_show_cursor_p);
6492 defsubr (&Slast_nonminibuf_frame);
6494 #if GLYPH_DEBUG
6495 defsubr (&Sdump_redisplay_history);
6496 #endif
6498 frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda);
6499 staticpro (&frame_and_buffer_state);
6501 Qdisplay_table = intern_c_string ("display-table");
6502 staticpro (&Qdisplay_table);
6503 Qredisplay_dont_pause = intern_c_string ("redisplay-dont-pause");
6504 staticpro (&Qredisplay_dont_pause);
6506 DEFVAR_INT ("baud-rate", baud_rate,
6507 doc: /* *The output baud rate of the terminal.
6508 On most systems, changing this value will affect the amount of padding
6509 and the other strategic decisions made during redisplay. */);
6511 DEFVAR_BOOL ("inverse-video", inverse_video,
6512 doc: /* *Non-nil means invert the entire frame display.
6513 This means everything is in inverse video which otherwise would not be. */);
6515 DEFVAR_BOOL ("visible-bell", visible_bell,
6516 doc: /* *Non-nil means try to flash the frame to represent a bell.
6518 See also `ring-bell-function'. */);
6520 DEFVAR_BOOL ("no-redraw-on-reenter", no_redraw_on_reenter,
6521 doc: /* *Non-nil means no need to redraw entire frame after suspending.
6522 A non-nil value is useful if the terminal can automatically preserve
6523 Emacs's frame display when you reenter Emacs.
6524 It is up to you to set this variable if your terminal can do that. */);
6526 DEFVAR_LISP ("initial-window-system", Vinitial_window_system,
6527 doc: /* Name of the window system that Emacs uses for the first frame.
6528 The value is a symbol:
6529 nil for a termcap frame (a character-only terminal),
6530 'x' for an Emacs frame that is really an X window,
6531 'w32' for an Emacs frame that is a window on MS-Windows display,
6532 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
6533 'pc' for a direct-write MS-DOS frame.
6535 Use of this variable as a boolean is deprecated. Instead,
6536 use `display-graphic-p' or any of the other `display-*-p'
6537 predicates which report frame's specific UI-related capabilities. */);
6539 DEFVAR_KBOARD ("window-system", Vwindow_system,
6540 doc: /* Name of window system through which the selected frame is displayed.
6541 The value is a symbol:
6542 nil for a termcap frame (a character-only terminal),
6543 'x' for an Emacs frame that is really an X window,
6544 'w32' for an Emacs frame that is a window on MS-Windows display,
6545 'ns' for an Emacs frame on a GNUstep or Macintosh Cocoa display,
6546 'pc' for a direct-write MS-DOS frame.
6548 Use of this variable as a boolean is deprecated. Instead,
6549 use `display-graphic-p' or any of the other `display-*-p'
6550 predicates which report frame's specific UI-related capabilities. */);
6552 DEFVAR_LISP ("window-system-version", Vwindow_system_version,
6553 doc: /* The version number of the window system in use.
6554 For X windows, this is 11. */);
6556 DEFVAR_BOOL ("cursor-in-echo-area", cursor_in_echo_area,
6557 doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */);
6559 DEFVAR_LISP ("glyph-table", Vglyph_table,
6560 doc: /* Table defining how to output a glyph code to the frame.
6561 If not nil, this is a vector indexed by glyph code to define the glyph.
6562 Each element can be:
6563 integer: a glyph code which this glyph is an alias for.
6564 string: output this glyph using that string (not impl. in X windows).
6565 nil: this glyph mod 524288 is the code of a character to output,
6566 and this glyph / 524288 is the face number (see `face-id') to use
6567 while outputting it. */);
6568 Vglyph_table = Qnil;
6570 DEFVAR_LISP ("standard-display-table", Vstandard_display_table,
6571 doc: /* Display table to use for buffers that specify none.
6572 See `buffer-display-table' for more information. */);
6573 Vstandard_display_table = Qnil;
6575 DEFVAR_BOOL ("redisplay-dont-pause", redisplay_dont_pause,
6576 doc: /* *Non-nil means update isn't paused when input is detected. */);
6577 redisplay_dont_pause = 0;
6579 #if PERIODIC_PREEMPTION_CHECKING
6580 DEFVAR_LISP ("redisplay-preemption-period", Vredisplay_preemption_period,
6581 doc: /* *The period in seconds between checking for input during redisplay.
6582 If input is detected, redisplay is pre-empted, and the input is processed.
6583 If nil, never pre-empt redisplay. */);
6584 Vredisplay_preemption_period = make_float (0.10);
6585 #endif
6587 #ifdef CANNOT_DUMP
6588 if (noninteractive)
6589 #endif
6591 Vinitial_window_system = Qnil;
6592 Vwindow_system_version = Qnil;