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/>. */
31 /* cm.h must come after dispextern.h on Windows. */
32 #include "dispextern.h"
35 #include "character.h"
38 #include "termhooks.h"
43 #include "intervals.h"
44 #include "blockinput.h"
47 #include "syssignal.h"
51 #endif /* HAVE_X_WINDOWS */
55 #endif /* HAVE_NTGUI */
61 /* Include systime.h after xterm.h to avoid double inclusion of time.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
79 #undef PENDING_OUTPUT_COUNT
80 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->__bufp - (FILE)->__buffer)
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)
87 #ifndef PENDING_OUTPUT_COUNT
88 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_ptr - (FILE)->_base)
90 #endif /* not __GNU_LIBRARY__ */
92 #if defined(HAVE_TERM_H) && defined (GNU_LINUX) && defined (HAVE_LIBNCURSES)
93 #include <term.h> /* for tgetent */
96 /* Structure to pass dimensions around. Used for character bounding
97 boxes, glyph matrix dimensions and alike. */
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
*);
133 static int glyph_row_slice_p (struct glyph_row
*, struct glyph_row
*);
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
*,
138 static void build_frame_matrix_from_leaf_window (struct glyph_matrix
*,
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,
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
*,
158 static void mirror_make_current (struct window
*, int);
159 void check_window_matrix_pointers (struct window
*);
161 static void check_matrix_pointers (struct glyph_matrix
*,
162 struct glyph_matrix
*);
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
179 #define PERIODIC_PREEMPTION_CHECKING 0
182 #if PERIODIC_PREEMPTION_CHECKING
184 /* Redisplay preemption timers. */
186 static EMACS_TIME preemption_period
;
187 static EMACS_TIME preemption_next_check
;
191 /* Nonzero upon entry to redisplay means do not assume anything about
192 current contents of actual terminal frame; clear and redraw it. */
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
;
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. */
257 /* Convert vpos and hpos from frame to window and vice versa.
258 This may only be used for terminal frames. */
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
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
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. */
301 add_window_display_history (struct window
*w
, char *msg
, int paused_p
)
305 if (history_idx
>= REDISPLAY_HISTORY_SIZE
)
307 buf
= redisplay_history
[history_idx
].trace
;
310 sprintf (buf
, "%d: window %p (`%s')%s\n",
313 ((BUFFERP (w
->buffer
)
314 && STRINGP (XBUFFER (w
->buffer
)->name
))
315 ? SSDATA (XBUFFER (w
->buffer
)->name
)
317 paused_p
? " ***paused***" : "");
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
327 add_frame_display_history (struct frame
*f
, int paused_p
)
331 if (history_idx
>= REDISPLAY_HISTORY_SIZE
)
333 buf
= redisplay_history
[history_idx
].trace
;
336 sprintf (buf
, "%d: update frame %p%s",
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. */)
349 for (i
= history_idx
- 1; i
!= history_idx
; --i
)
352 i
= REDISPLAY_HISTORY_SIZE
- 1;
353 fprintf (stderr
, "%s\n", redisplay_history
[i
].trace
);
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. */
372 safe_bcopy (const char *from
, char *to
, int size
)
378 /***********************************************************************
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. */
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. */
419 free_glyph_matrix (struct glyph_matrix
*matrix
)
425 /* Detect the case that more matrices are freed than were
427 if (--glyph_matrix_count
< 0)
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
);
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
449 margin_glyphs_to_reserve (struct window
*w
, int total_glyphs
, Lisp_Object margin
)
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
);
467 /* Adjust glyph matrix MATRIX on window W or on a frame to changed
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
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. */
490 adjust_glyph_matrix (struct window
*w
, struct glyph_matrix
*matrix
, int x
, int y
, struct dim dim
)
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.
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
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
)
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
;
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. */
552 xassert (matrix
->pool
->glyphs
);
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
);
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
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
];
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
;
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
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
;
613 row
->glyphs
[LEFT_MARGIN_AREA
]
614 = (struct glyph
*) xrealloc (row
->glyphs
[LEFT_MARGIN_AREA
],
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
];
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
;
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);
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
665 if (!marginal_areas_changed_p
666 && !header_line_changed_p
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
)
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;
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
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. */
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
733 reverse_rows (struct glyph_matrix
*matrix
, int start
, int end
)
737 for (i
= start
, j
= end
- 1; i
< j
; ++i
, --j
)
739 /* Non-ISO HP/UX compiler doesn't like auto struct
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
762 rotate_matrix (struct glyph_matrix
*matrix
, int first
, int last
, int by
)
766 /* Up (rotate left, i.e. towards lower indices). */
768 reverse_rows (matrix
, first
, first
+ by
);
769 reverse_rows (matrix
, first
+ by
, last
);
770 reverse_rows (matrix
, first
, last
);
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/
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. */
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;
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
823 Resets update hints to defaults value. The only update hint
824 currently present is the flag MATRIX->no_scrolling_p. */
827 clear_glyph_matrix (struct glyph_matrix
*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. */
842 shift_glyph_matrix (struct window
*w
, struct glyph_matrix
*matrix
, int start
, int end
, int dy
)
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
];
858 row
->visible_height
= row
->height
;
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
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. */
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. */
919 clear_window_matrices (struct window
*w
, int desired_p
)
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
);
936 clear_glyph_matrix (w
->desired_matrix
);
939 clear_glyph_matrix (w
->current_matrix
);
940 w
->window_end_valid
= Qnil
;
944 w
= NILP (w
->next
) ? 0 : XWINDOW (w
->next
);
950 /***********************************************************************
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
;
963 clear_glyph_row (struct glyph_row
*row
)
965 struct glyph
*p
[1 + LAST_AREA
];
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
];
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]);
994 /* Make ROW an empty, enabled row of canonical character height,
995 in window W starting at y-position Y. */
998 blank_row (struct window
*w
, struct glyph_row
*row
, int y
)
1002 min_y
= WINDOW_HEADER_LINE_HEIGHT (w
);
1003 max_y
= WINDOW_BOX_HEIGHT_NO_MODE_LINE (w
);
1005 clear_glyph_row (row
);
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
;
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
;
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
1027 increment_row_positions (struct glyph_row
*row
,
1028 EMACS_INT delta
, EMACS_INT delta_bytes
)
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
)
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
;
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. */
1065 swap_glyphs_in_rows (a
, b
)
1066 struct glyph_row
*a
, *b
;
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
1090 *glyph_a
= *glyph_b
;
1100 /* Exchange pointers to glyph memory between glyph rows A and B. */
1103 swap_glyph_pointers (struct glyph_row
*a
, struct glyph_row
*b
)
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. */
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. */
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. */
1140 copy_glyph_row_contents (struct glyph_row
*to
, struct glyph_row
*from
,
1141 EMACS_INT delta
, EMACS_INT delta_bytes
)
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
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. */
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 */
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
)
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
))
1213 return i
< window_matrix
->nrows
? window_matrix
->rows
+ i
: 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. */
1224 prepare_desired_row (struct glyph_row
*row
)
1226 if (!row
->enabled_p
)
1228 unsigned rp
= row
->reversed_p
;
1230 clear_glyph_row (row
);
1232 row
->reversed_p
= rp
;
1237 /* Return a hash code for glyph row ROW. */
1240 line_hash_code (struct glyph_row
*row
)
1246 struct glyph
*glyph
= row
->glyphs
[TEXT_AREA
];
1247 struct glyph
*end
= glyph
+ row
->used
[TEXT_AREA
];
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? */
1255 hash
= (((hash
<< 4) + (hash
>> 24)) & 0x0fffffff) + c
;
1256 hash
= (((hash
<< 4) + (hash
>> 24)) & 0x0fffffff) + face_id
;
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. */
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
];
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)))
1289 /* All blank line. */
1293 /* Skip over leading spaces. */
1294 while (CHAR_GLYPH_SPACE_P (*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)
1304 /* Otherwise, scan the glyphs and accumulate their total length
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
))
1317 len
+= GLYPH_LENGTH (glyph_table_base
, g
);
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. */
1334 row_equal_p (struct window
*w
, struct glyph_row
*a
, struct glyph_row
*b
, int mouse_face_p
)
1338 else if (a
->hash
!= b
->hash
)
1342 struct glyph
*a_glyph
, *b_glyph
, *a_end
;
1345 if (mouse_face_p
&& a
->mouse_face_p
!= b
->mouse_face_p
)
1348 /* Compare glyphs. */
1349 for (area
= LEFT_MARGIN_AREA
; area
< LAST_AREA
; ++area
)
1351 if (a
->used
[area
] != b
->used
[area
])
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
)
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. */
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
)
1393 /***********************************************************************
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. */
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. */
1427 free_glyph_pool (struct glyph_pool
*pool
)
1431 /* More freed than allocated? */
1433 xassert (glyph_pool_count
>= 0);
1435 xfree (pool
->glyphs
);
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. */
1451 realloc_glyph_pool (struct glyph_pool
*pool
, struct dim matrix_dim
)
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
);
1468 pool
->glyphs
= (struct glyph
*) xrealloc (pool
->glyphs
, size
);
1469 memset (pool
->glyphs
+ pool
->nglyphs
, 0,
1470 size
- pool
->nglyphs
* sizeof (struct glyph
));
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
;
1493 /***********************************************************************
1495 ***********************************************************************/
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
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
1518 check_matrix_pointer_lossage (struct glyph_matrix
*matrix
)
1522 for (i
= 0; i
< matrix
->nrows
; ++i
)
1523 for (j
= 0; j
< matrix
->nrows
; ++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. */
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. */
1542 check_matrix_pointer_lossage (matrix
);
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
1553 /* Check invariants that must hold for an up to date current matrix of
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
);
1567 /* This can sometimes happen for a fresh window. */
1568 if (matrix
->nrows
< 2)
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
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
));
1613 xassert (w
->current_matrix
->nrows
== w
->desired_matrix
->nrows
);
1614 xassert (w
->desired_matrix
->rows
!= NULL
);
1615 set_buffer_temp (saved
);
1620 #endif /* GLYPH_DEBUG != 0 */
1624 /**********************************************************************
1625 Allocating/ Adjusting Glyph Matrices
1626 **********************************************************************/
1628 /* Allocate glyph matrices over a window tree for a frame-based
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
1650 *WINDOW_CHANGE_FLAGS must be initialized by the caller of this
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
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 +---------+----------+---------+ ---
1676 +---------+ | | result height
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 -->|
1693 +------------+---------+ |
1696 +------------+---------+ --- */
1698 /* Bit indicating that a new matrix will be allocated or has been
1701 #define NEW_LEAF_MATRIX (1 << 0)
1703 /* Bit indicating that a matrix will or has changed its location or
1706 #define CHANGED_LEAF_MATRIX (1 << 1)
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
)));
1714 int wmax
= 0, hmax
= 0;
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
,
1740 window_change_flags
);
1741 else if (!NILP (w
->vchild
))
1742 dim
= allocate_matrices_for_frame_redisplay (w
->vchild
, x
, y
,
1744 window_change_flags
);
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
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
1788 if (in_horz_combination_p
)
1793 /* Remember maximum glyph matrix dimensions. */
1794 wmax
= max (wmax
, dim
.width
);
1795 hmax
= max (hmax
, dim
.height
);
1797 /* Next window on same level. */
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
;
1816 total
.height
= y
- y0
;
1823 /* Return the required height of glyph matrices for window W. */
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. */
1843 #endif /* HAVE_WINDOW_SYSTEM */
1845 return WINDOW_TOTAL_LINES (w
);
1849 /* Return the required width of glyph matrices for window W. */
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. */
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. */
1880 allocate_matrices_for_window_redisplay (struct window
*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
));
1890 /* W is a leaf window. */
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. */
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. */
1924 adjust_frame_glyphs (f
);
1927 Lisp_Object tail
, lisp_frame
;
1929 FOR_EACH_FRAME (tail
, lisp_frame
)
1930 adjust_frame_glyphs (XFRAME (lisp_frame
));
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. */
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. */
1976 adjust_frame_glyphs (struct frame
*f
)
1978 if (FRAME_WINDOW_P (f
))
1979 adjust_frame_glyphs_for_window_redisplay (f
);
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. */
1994 showing_window_margins_p (struct window
*w
)
1998 if (!NILP (w
->hchild
))
2000 if (showing_window_margins_p (XWINDOW (w
->hchild
)))
2003 else if (!NILP (w
->vchild
))
2005 if (showing_window_margins_p (XWINDOW (w
->vchild
)))
2008 else if (!NILP (w
->left_margin_cols
)
2009 || !NILP (w
->right_margin_cols
))
2012 w
= NILP (w
->next
) ? 0 : XWINDOW (w
->next
);
2018 /* In the window tree with root W, build current matrices of leaf
2019 windows from the frame's current matrix. */
2022 fake_current_matrices (Lisp_Object window
)
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
);
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
;
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
]);
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
)
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
];
2098 /* Restore the contents of frame F's current frame matrix from SAVED,
2099 and free memory associated with SAVED. */
2102 restore_current_matrix (struct frame
*f
, struct glyph_matrix
*saved
)
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
);
2122 /* Allocate/reallocate glyph matrices of a single frame F for
2123 frame-based redisplay. */
2126 adjust_frame_glyphs_for_frame_redisplay (struct frame
*f
)
2128 struct dim matrix_dim
;
2130 int window_change_flags
;
2133 if (!FRAME_LIVE_P (f
))
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
2158 window_change_flags
= 0;
2160 = allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f
),
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
),
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
));
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. */
2226 adjust_frame_glyphs_for_window_redisplay (struct frame
*f
)
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;
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 */
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;
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
);
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). */
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
;
2305 FRAME_MESSAGE_BUF (f
) = (char *) xmalloc (size
);
2309 /* Re-allocate buffer for decode_mode_spec on frame F. */
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. */
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. */
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
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
;
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. */
2392 free_window_matrices (struct window
*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
));
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
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. */
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
)
2433 if (glyph_pool_count
)
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 |
2459 +-----------------+----------------+
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
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
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. */
2506 build_frame_matrix (struct frame
*f
)
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. */
2528 build_frame_matrix_from_window_tree (struct glyph_matrix
*matrix
, struct window
*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
));
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. */
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
);
2576 SET_GLYPH_FROM_CHAR (right_border_glyph
, '|');
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
);
2590 window_matrix
= w
->current_matrix
;
2592 /* For all rows in the window matrix and corresponding rows in the
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
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
2612 if (window_matrix
== w
->desired_matrix
2613 && !window_row
->enabled_p
)
2615 window_row
= w
->current_matrix
->rows
+ window_y
;
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
));
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
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
);
2643 /* Window row window_y must be a slice of frame row
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);
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
;
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. */
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. */
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. */
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. */
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
];
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. */
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
];
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. */
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. */
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. */
2796 mirror_make_current (struct window
*w
, int frame_row
)
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
);
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
);
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. */
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
);
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. */
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. */
2930 frame_row_to_window (struct window
*w
, int row
)
2932 struct window
*found
= NULL
;
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
))
2944 w
= NILP (w
->next
) ? 0 : XWINDOW (w
->next
);
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
2963 mirror_line_dance (struct window
*w
, int unchanged_at_top
, int nlines
, int *copy_from
, char *retained_p
)
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
);
2975 /* W is a leaf window, and we are working on its current
2977 struct glyph_matrix
*m
= w
->current_matrix
;
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
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
));
3030 struct glyph_matrix
*m2
;
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. */
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;
3050 else if (from_inside_window_p
)
3054 /* If there was a copy between windows, make sure glyph
3055 pointers are in sync with the frame matrix. */
3057 sync_window_with_frame_matrix_rows (w
);
3059 /* Check that no pointers are lost. */
3063 /* Next window on same level. */
3064 w
= NILP (w
->next
) ? 0 : XWINDOW (w
->next
);
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
3078 check_window_matrix_pointers (struct window
*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
));
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. */
3104 check_matrix_pointers (struct glyph_matrix
*window_matrix
,
3105 struct glyph_matrix
*frame_matrix
)
3107 /* Row number in WINDOW_MATRIX. */
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
))
3125 #endif /* GLYPH_DEBUG != 0 */
3129 /**********************************************************************
3130 VPOS and HPOS translations
3131 **********************************************************************/
3135 /* Translate vertical position VPOS which is relative to window W to a
3136 vertical position relative to W's frame. */
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
));
3151 /* Translate horizontal position HPOS which is relative to window W to
3152 a horizontal position relative to W's frame. */
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
);
3162 #endif /* GLYPH_DEBUG */
3166 /**********************************************************************
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. */)
3176 CHECK_LIVE_FRAME (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
)
3187 if (FRAME_MSDOS_P (f
))
3188 FRAME_TERMINAL (f
)->set_terminal_modes_hook (FRAME_TERMINAL (f
));
3191 clear_current_matrices (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);
3205 /* Redraw frame F. This is nothing more than a call to the Lisp
3206 function redraw-frame. */
3209 redraw_frame (struct frame
*f
)
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. */)
3221 Lisp_Object tail
, frame
;
3223 FOR_EACH_FRAME (tail
, frame
)
3224 if (FRAME_VISIBLE_P (XFRAME (frame
)))
3225 Fredraw_frame (frame
);
3231 /* This is used when frame_garbaged is set. Call Fredraw_frame on all
3232 visible frames marked as garbaged. */
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 /***********************************************************************
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
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. */
3264 struct window
*root_window
= XWINDOW (f
->root_window
);
3266 if (redisplay_dont_pause
)
3268 #if PERIODIC_PREEMPTION_CHECKING
3269 else if (NILP (Vredisplay_preemption_period
))
3271 else if (!force_p
&& NUMBERP (Vredisplay_preemption_period
))
3274 double p
= XFLOATINT (Vredisplay_preemption_period
);
3277 if (detect_input_pending_ignore_squeezables ())
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
);
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. */
3304 /* Update the menu bar on X frames that don't have toolkit
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
)
3319 update_window (w
, 1);
3320 w
->must_be_updated_p
= 0;
3322 /* Swap tool-bar strings. We swap because we want to
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
);
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;
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 */
3356 paused_p
= update_frame_1 (f
, force_p
, inhibit_hairy_id_p
);
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. */
3369 check_window_matrix_pointers (root_window
);
3370 add_frame_display_history (f
, paused_p
);
3374 #if PERIODIC_PREEMPTION_CHECKING
3377 /* Reset flags indicating that a window should be updated. */
3378 set_window_update_flags (root_window
, 0);
3380 display_completed
= !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. */
3394 update_window_tree (struct window
*w
, int force_p
)
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
);
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. */
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
)
3429 #if PERIODIC_PREEMPTION_CHECKING
3430 else if (NILP (Vredisplay_preemption_period
))
3432 else if (!force_p
&& NUMBERP (Vredisplay_preemption_period
))
3435 double p
= XFLOATINT (Vredisplay_preemption_period
);
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
);
3449 update_window (w
, force_p
);
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. */
3463 redraw_overlapped_rows (struct window
*w
, int yb
)
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
)
3479 else if (row
->mode_line_p
)
3482 if (row
->overlapped_p
)
3484 enum glyph_row_area area
;
3486 for (area
= LEFT_MARGIN_AREA
; area
< LAST_AREA
; ++area
)
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
],
3495 FRAME_RIF (f
)->clear_end_of_line (-1);
3498 row
->overlapped_p
= 0;
3501 if (MATRIX_ROW_BOTTOM_Y (row
) >= yb
)
3507 /* Redraw lines from the current matrix of window W that overlap
3508 others. YB is bottom-most y-position in W. */
3511 redraw_overlapping_rows (struct window
*w
, int yb
)
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
)
3523 else if (row
->mode_line_p
)
3526 bottom_y
= MATRIX_ROW_BOTTOM_Y (row
);
3528 if (row
->overlapping_p
)
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
;
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
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;
3564 #endif /* HAVE_WINDOW_SYSTEM */
3569 /* Check that no row in the current matrix of window W is enabled
3570 which is below what's displayed in the window. */
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
)
3583 else if (last_seen_p
&& row
->enabled_p
)
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. */
3595 update_window (struct window
*w
, int force_p
)
3597 struct glyph_matrix
*desired_matrix
= w
->desired_matrix
;
3599 #if !PERIODIC_PREEMPTION_CHECKING
3600 int preempt_count
= baud_rate
/ 2400 + 1;
3602 struct redisplay_interface
*rif
= FRAME_RIF (XFRAME (WINDOW_FRAME (w
)));
3604 /* Check that W's frame doesn't have glyph matrices. */
3605 xassert (FRAME_WINDOW_P (XFRAME (WINDOW_FRAME (w
))));
3608 /* Check pending input the first time so that we can quickly return. */
3609 #if !PERIODIC_PREEMPTION_CHECKING
3611 detect_input_pending_ignore_squeezables ();
3614 /* If forced to complete the update, or if no input is pending, do
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
;
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
,
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
)
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
);
3661 /* All rows were found to be equal. */
3667 /* We've scrolled the display. */
3673 /* Update the rest of the lines. */
3674 for (n_updated
= 0; row
< end
&& (force_p
|| !input_pending
); ++row
)
3677 int vpos
= MATRIX_ROW_VPOS (row
, desired_matrix
);
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
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 ())
3698 if (!force_p
&& ++n_updated
% preempt_count
== 0)
3699 detect_input_pending_ignore_squeezables ();
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
;
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
);
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
));
3753 /* Remember the redisplay method used to display the matrix. */
3754 strcpy (w
->current_matrix
->method
, w
->desired_matrix
->method
);
3757 #ifdef HAVE_WINDOW_SYSTEM
3758 update_window_fringes (w
, 0);
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
);
3771 /* check_current_matrix_flags (w); */
3772 add_window_display_history (w
, w
->current_matrix
->method
, paused_p
);
3775 clear_glyph_matrix (desired_matrix
);
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. */
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. */
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
)));
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);
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
3855 if (vpos
== w
->phys_cursor
.vpos
)
3856 w
->phys_cursor_on_p
= 0;
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
))))
3877 stop
= min (current_row
->used
[TEXT_AREA
], desired_stop_pos
);
3881 /* Loop over glyphs that current and desired row may have
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
= ¤t_row
->glyphs
[TEXT_AREA
][i
- 1];
3900 rif
->get_glyph_overhangs (glyph
, XFRAME (w
->frame
),
3902 can_skip_p
= (right
== 0 && !abort_skipping
);
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
3926 && i
< current_row
->used
[TEXT_AREA
]
3927 && (current_row
->used
[TEXT_AREA
]
3928 != desired_row
->used
[TEXT_AREA
]))
3932 rif
->get_glyph_overhangs (current_glyph
, XFRAME (w
->frame
),
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
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
;
3958 int skip_first_p
= !can_skip_p
;
3960 /* Find the next glyph that's equal again. */
3963 || !GLYPH_EQUAL_P (desired_glyph
, current_glyph
))
3966 x
+= desired_glyph
->pixel_width
;
3967 current_x
+= current_glyph
->pixel_width
;
3968 ++desired_glyph
, ++current_glyph
, ++i
;
3972 if (i
== start_hpos
|| x
!= current_x
)
3976 desired_glyph
= start
;
3980 rif
->cursor_to (vpos
, start_hpos
, desired_row
->y
, start_x
);
3981 rif
->write_glyphs (start
, i
- start_hpos
);
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
);
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);
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. */
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
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;
4039 x
= current_row
->pixel_width
;
4040 rif
->clear_end_of_line (x
);
4049 /* Update row VPOS in window W. Value is non-zero if display has been
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
)));
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
))
4078 update_marginal_area (w
, LEFT_MARGIN_AREA
, vpos
);
4081 /* Update the display of the text area. */
4082 if (update_text_area (w
, vpos
))
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
))
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
);
4118 /* Set the cursor after an update of window W. This function may only
4119 be called from update_window. */
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
4150 struct glyph_row
*row
, *last_row
;
4151 struct glyph
*glyph
;
4152 int yb
= window_text_bottom_y (w
);
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)
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)
4174 for (glyph
= start
; glyph
< last
; ++glyph
)
4176 cx
+= glyph
->pixel_width
;
4181 vpos
= MATRIX_ROW_VPOS (last_row
, w
->current_matrix
);
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. */
4206 set_window_update_flags (struct window
*w
, int on_p
)
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
);
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. */
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. */
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
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
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
;
4295 entry
= row_entry_pool
+ row_entry_idx
++;
4297 entry
->old_uses
= entry
->new_uses
= 0;
4298 entry
->new_line_number
= 0;
4300 entry
->next
= row_table
[i
];
4301 row_table
[i
] = 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
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.
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. */
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
);
4353 && !d
->redraw_fringe_bitmaps_p
4355 && MATRIX_ROW_BOTTOM_Y (c
) <= yb
4356 && MATRIX_ROW_BOTTOM_Y (d
) <= yb
4357 && row_equal_p (w
, c
, d
, 1))
4366 /* Give up if some rows in the desired matrix are not enabled. */
4367 if (!MATRIX_ROW (desired_matrix
, i
)->enabled_p
)
4370 first_old
= first_new
= i
;
4372 /* Set last_new to the index + 1 of the last enabled row in the
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
)
4380 if (!MATRIX_ROW (desired_matrix
, i
)->enabled_p
)
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
4390 while (i
< current_matrix
->nrows
- 1)
4392 int bottom
= MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (current_matrix
, i
));
4401 /* Skip over rows equal at the bottom. */
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
4411 MATRIX_ROW (desired_matrix
, i
- 1),
4412 MATRIX_ROW (current_matrix
, j
- 1), 1))
4417 /* Nothing to do if all rows are equal. */
4418 if (last_new
== first_new
)
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;
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
;
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
));
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
;)
4493 && old_lines
[i
]->old_uses
== 1
4494 && old_lines
[i
]->new_uses
== 1)
4497 int new_line
= old_lines
[i
]->new_line_number
;
4498 struct run
*run
= run_pool
+ run_idx
++;
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
;
4506 run
->height
= MATRIX_ROW (current_matrix
, i
)->height
;
4508 /* Extend backward. */
4511 while (j
> first_old
4513 && old_lines
[j
] == new_lines
[k
])
4515 int h
= MATRIX_ROW (current_matrix
, j
)->height
;
4516 --run
->current_vpos
;
4517 --run
->desired_vpos
;
4520 run
->desired_y
-= h
;
4521 run
->current_y
-= h
;
4525 /* Extend forward. */
4530 && old_lines
[j
] == new_lines
[k
])
4532 int h
= MATRIX_ROW (current_matrix
, j
)->height
;
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
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];
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 +-----------+ +-----------+
4562 +-----------+ --> +-----------+
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
)))
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. */
4625 /************************************************************************
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. */
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
;
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)
4655 #if !PERIODIC_PREEMPTION_CHECKING
4656 if (!force_p
&& detect_input_pending_ignore_squeezables ())
4663 /* If we cannot insert/delete lines, it's no use trying it. */
4664 if (!FRAME_LINE_INS_DEL_OK (f
))
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
))
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
;
4695 int outq
= PENDING_OUTPUT_COUNT (display_output
);
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
4706 outq
= PENDING_OUTPUT_COUNT (FRAME_TTY (f
->output
));
4709 if (baud_rate
<= outq
&& baud_rate
> 0)
4710 sleep (outq
/ baud_rate
);
4716 #if PERIODIC_PREEMPTION_CHECKING
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 ())
4730 if (!force_p
&& (i
- 1) % preempt_count
== 0)
4731 detect_input_pending_ignore_squeezables ();
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. */
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
)));
4758 if (cursor_in_echo_area
< 0)
4760 /* Negative value of cursor_in_echo_area means put
4761 cursor at beginning of line. */
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
4771 row
= FRAME_LINES (f
);
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
,
4783 struct glyph
*start
= r
->glyphs
[TEXT_AREA
];
4784 struct glyph
*last
= start
+ r
->used
[TEXT_AREA
];
4787 && (last
- 1)->charpos
< 0)
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
);
4804 /* Otherwise move it back in range. */
4806 col
= FRAME_CURSOR_X_LIMIT (f
) - 1;
4810 cursor_to (f
, row
, col
);
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
4841 clear_desired_matrices (f
);
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
;
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));
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
)
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. */
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
))
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
;
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
])
4894 unchanged_at_bottom
= FRAME_LINES (frame
) - i
- 1;
4896 else if (i
== 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
))
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
4920 10 * scrolling_max_lines_saved (unchanged_at_top
,
4921 FRAME_LINES (frame
) - unchanged_at_bottom
,
4922 old_hash
, new_hash
, draw_cost
)))
4925 if (window_size
< 2)
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
);
4939 /* Count the number of blanks at the start of the vector of glyphs R
4940 which is LEN glyphs long. */
4943 count_blanks (struct glyph
*r
, int len
)
4947 for (i
= 0; i
< len
; ++i
)
4948 if (!CHAR_GLYPH_SPACE_P (r
[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. */
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
;
4967 && GLYPH_CHAR_AND_FACE_EQUAL_P (p1
, p2
))
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. */
4982 update_frame_line (struct frame
*f
, int vpos
)
4984 struct glyph
*obody
, *nbody
, *op1
, *op2
, *np1
, *nend
;
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
)
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
)
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]))
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
)
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]))
5040 /* Write the contents of the desired line. */
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
));
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
);
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]))
5070 /* If there's no i/d char, quickly do the best we can without it. */
5071 if (!FRAME_CHAR_INS_DEL_OK (f
))
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. */
5085 || !GLYPH_EQUAL_P (nbody
+ j
, obody
+ j
)
5086 || CHAR_GLYPH_PADDING_P (nbody
[j
])))
5089 /* Output this run of non-matching chars. */
5090 cursor_to (f
, vpos
, i
);
5091 write_glyphs (f
, nbody
+ i
, j
- i
);
5094 /* Now find the next non-match. */
5098 /* Clear the rest of the line, or the non-clear part of it. */
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
);
5110 /* Here when CHAR_INS_DEL_OK != 0, i.e. we can insert or delete
5111 characters in a row. */
5115 /* If current line is blank, skip over initial spaces, if
5116 possible, and write the rest. */
5120 nsp
= count_blanks (nbody
, nlen
);
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
);
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
)
5146 while (np1
+ begmatch
< nend
&& CHAR_GLYPH_SPACE_P (np1
[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 */
5159 op2
= op1
+ begmatch
- min (olen
- osp
, nlen
- nsp
);
5161 && GLYPH_EQUAL_P (op1
- 1, np1
- 1))
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.
5172 tem
= (nlen
- nsp
) - (olen
- osp
);
5174 && (!FRAME_CHAR_INS_DEL_OK (f
)
5175 || endmatch
<= char_ins_del_cost (f
)[tem
]))
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.
5184 && (!FRAME_CHAR_INS_DEL_OK (f
)
5185 || begmatch
+ endmatch
<= char_ins_del_cost (f
)[nsp
- osp
]))
5189 osp
= nsp
= min (osp
, nsp
);
5192 /* Now go through the line, inserting, writing and
5193 deleting as appropriate. */
5197 cursor_to (f
, vpos
, nsp
);
5198 delete_glyphs (f
, osp
- nsp
);
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
);
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
))
5228 /* Function write_glyphs is prepared to do nothing
5229 if passed a length <= 0. Check it here to avoid
5230 unnecessary cursor movement. */
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. */
5249 cursor_to (f
, vpos
, nsp
+ begmatch
);
5251 /* Calculate columns we can actually overwrite. */
5252 while (CHAR_GLYPH_PADDING_P (nbody
[nsp
+ begmatch
+ 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
;
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
);
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
);
5275 /* If any unerased characters remain after the new line, erase them. */
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)
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. */
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
)
5307 Lisp_Object old_current_buffer
= Fcurrent_buffer ();
5308 struct text_pos startp
;
5310 struct glyph_row
*row
;
5311 #ifdef HAVE_WINDOW_SYSTEM
5312 struct image
*img
= 0;
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
);
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
;
5359 if (STRINGP (it
.string
))
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
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
));
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
;
5388 if (it
.vpos
< w
->current_matrix
->nrows
5389 && (row
= MATRIX_ROW (w
->current_matrix
, it
.vpos
),
5392 if (it
.hpos
< row
->used
[TEXT_AREA
])
5394 struct glyph
*glyph
= row
->glyphs
[TEXT_AREA
] + it
.hpos
;
5395 #ifdef HAVE_WINDOW_SYSTEM
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
;
5408 *width
= glyph
->pixel_width
;
5409 *height
= glyph
->ascent
+ glyph
->descent
;
5415 *height
= row
->height
;
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
);
5426 it
.hpos
+= (x0
- x1
) / WINDOW_FRAME_COLUMN_WIDTH (w
);
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. */
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
;
5447 Lisp_Object string
= Qnil
;
5449 if (part
== ON_MODE_LINE
)
5450 row
= MATRIX_MODE_LINE_ROW (w
->current_matrix
);
5452 row
= MATRIX_HEADER_LINE_ROW (w
->current_matrix
);
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
];
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
)
5475 img
= IMAGE_FROM_ID (WINDOW_XFRAME (w
), glyph
->u
.img_id
);
5477 *object
= img
->spec
;
5478 y0
-= row
->ascent
- glyph
->ascent
;
5484 /* Add extra (default width) columns if clicked after EOL. */
5485 *x
+= x0
/ WINDOW_FRAME_COLUMN_WIDTH (w
);
5487 *height
= row
->height
;
5494 *width
= *height
= 0;
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. */
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
;
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
;
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
))
5530 *y
= row
- MATRIX_FIRST_TEXT_ROW (w
->current_matrix
);
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
));
5543 x0
= (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w
)
5544 ? WINDOW_LEFT_FRINGE_WIDTH (w
)
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
];
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
)
5562 img
= IMAGE_FROM_ID (WINDOW_XFRAME (w
), glyph
->u
.img_id
);
5564 *object
= img
->spec
;
5565 y0
-= row
->ascent
- glyph
->ascent
;
5566 x0
+= glyph
->slice
.img
.x
;
5567 y0
+= glyph
->slice
.img
.y
;
5573 /* Add extra (default width) columns if clicked after EOL. */
5574 *x
+= x0
/ WINDOW_FRAME_COLUMN_WIDTH (w
);
5576 *height
= row
->height
;
5583 *width
= *height
= 0;
5593 /***********************************************************************
5594 Changing Frame Sizes
5595 ***********************************************************************/
5600 window_change_signal (int signalnum
) /* If we don't have an argument, */
5601 /* some compilers complain in signal calls. */
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
)
5620 /* Suspended tty frames have tty->input == NULL avoid trying to
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
5635 change_frame_size (XFRAME (frame
), height
, width
, 0, 1, 0);
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. */
5649 do_pending_window_change (int safe
)
5651 /* If window_change_signal should have run before, run it now. */
5652 if (redisplaying_p
&& !safe
)
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
,
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. */
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
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
);
5700 change_frame_size_1 (f
, newheight
, newwidth
, pretend
, delay
, safe
);
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;
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. */
5724 newheight
= FRAME_LINES (f
);
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
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
);
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
),
5762 - FRAME_TOP_MARGIN (f
)),
5764 XSETFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f
))->top_line
,
5766 set_window_height (FRAME_MINIBUF_WINDOW (f
), 1, 0);
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
,
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;
5810 calculate_costs (f
);
5811 SET_FRAME_GARBAGED (f
);
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. */)
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");
5843 if (tty
->termscript
!= 0)
5846 fclose (tty
->termscript
);
5849 tty
->termscript
= 0;
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
));
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);
5876 /* ??? Perhaps we should do something special for multibyte strings here. */
5877 CHECK_STRING (string
);
5881 error ("Unknown terminal device");
5883 if (t
->type
== output_initial
)
5885 else if (t
->type
!= output_termcap
&& t
->type
!= output_msdos_raw
)
5886 error ("Device %d is not a termcap terminal device", t
->id
);
5889 struct tty_display_info
*tty
= t
->display_info
.tty
;
5892 error ("Terminal is currently suspended");
5894 if (tty
->termscript
)
5896 fwrite (SDATA (string
), 1, SBYTES (string
), tty
->termscript
);
5897 fflush (tty
->termscript
);
5901 fwrite (SDATA (string
), 1, SBYTES (string
), out
);
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. */)
5919 ring_bell (XFRAME (selected_frame
));
5928 bitch_at_user (void)
5932 else if (!INTERACTIVE
) /* Stop executing a keyboard macro. */
5933 error ("Keyboard macro terminated by a command ringing the bell");
5935 ring_bell (XFRAME (selected_frame
));
5940 /***********************************************************************
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
)
5955 if (NILP (milliseconds
))
5956 XSETINT (milliseconds
, 0);
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
);
5972 /* Assure that 0 <= usec < 1000000. */
5975 /* We can't rely on the rounding being correct if usec is negative. */
5976 if (-1000000 < usec
)
5977 sec
--, usec
+= 1000000;
5979 sec
-= -usec
/ 1000000, usec
= 1000000 - (-usec
% 1000000);
5982 sec
+= usec
/ 1000000, usec
%= 1000000;
5984 if (sec
< 0 || (sec
== 0 && usec
== 0))
5987 wait_reading_process_output (sec
, usec
, 0, 0, Qnil
, NULL
, 0);
5993 /* This is just like wait_reading_process_output, except that
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.
6004 sit_for (Lisp_Object timeout
, int reading
, int do_display
)
6008 swallow_events (do_display
);
6010 if ((detect_input_pending_run_timers (do_display
))
6011 || !NILP (Vexecuting_kbd_macro
))
6014 if (do_display
>= 2)
6015 redisplay_preserve_echo_area (2);
6017 if (INTEGERP (timeout
))
6019 sec
= XINT (timeout
);
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
))
6034 wrong_type_argument (Qnumberp
, timeout
);
6036 if (sec
== 0 && usec
== 0 && !EQ (timeout
, Qt
))
6043 wait_reading_process_output (sec
, usec
, reading
? -1 : 1, do_display
,
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. */)
6060 if ((detect_input_pending_run_timers (1)
6061 && NILP (force
) && !redisplay_dont_pause
)
6062 || !NILP (Vexecuting_kbd_macro
))
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
);
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
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
;
6105 if (! NILP (variable
))
6107 CHECK_SYMBOL (variable
);
6108 state
= Fsymbol_value (variable
);
6109 if (! VECTORP (state
))
6113 state
= frame_and_buffer_state
;
6115 vecp
= XVECTOR (state
)->contents
;
6116 end
= vecp
+ XVECTOR (state
)->size
;
6118 FOR_EACH_FRAME (tail
, frame
)
6122 if (!EQ (*vecp
++, frame
))
6126 if (!EQ (*vecp
++, XFRAME (frame
)->name
))
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) == ' ')
6138 if (!EQ (*vecp
++, buf
))
6142 if (!EQ (*vecp
++, XBUFFER (buf
)->read_only
))
6146 if (!EQ (*vecp
++, Fbuffer_modified_p (buf
)))
6151 /* Detect deletion of a buffer at the end of the list. */
6152 if (EQ (*vecp
, Qlambda
))
6155 /* Come here if we decide the data has changed. */
6157 /* Count the size we will need.
6158 Start with 1 so there is room for at least one lambda at the end. */
6160 FOR_EACH_FRAME (tail
, frame
)
6162 for (tail
= Vbuffer_alist
; CONSP (tail
); tail
= XCDR (tail
))
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
);
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
)
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) == ' ')
6192 *vecp
++ = XBUFFER (buf
)->read_only
;
6193 *vecp
++ = Fbuffer_modified_p (buf
);
6195 /* Fill up the vector with lambdas (always at least one). */
6197 while (vecp
- XVECTOR (state
)->contents
6198 < XVECTOR (state
)->size
)
6200 /* Make sure we didn't overflow the vector. */
6201 if (vecp
- XVECTOR (state
)->contents
6202 > XVECTOR (state
)->size
)
6209 /***********************************************************************
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. */
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;
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
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
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. */
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
)
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",
6268 inhibit_window_system
= 1;
6272 if (!inhibit_window_system
&& display_arg
6278 Vinitial_window_system
= Qx
;
6280 Vwindow_system_version
= make_number (11);
6282 #if defined (GNU_LINUX) && defined (HAVE_LIBNCURSES)
6283 /* In some versions of ncurses,
6284 tputs crashes if we have not called tgetent.
6286 { char b
[2044]; tgetent (b
, "xterm");}
6288 adjust_frame_glyphs_initially ();
6291 #endif /* HAVE_X_WINDOWS */
6294 if (!inhibit_window_system
)
6296 Vinitial_window_system
= Qw32
;
6297 Vwindow_system_version
= make_number (1);
6298 adjust_frame_glyphs_initially ();
6301 #endif /* HAVE_NTGUI */
6304 if (!inhibit_window_system
6310 Vinitial_window_system
= Qns
;
6311 Vwindow_system_version
= make_number(10);
6312 adjust_frame_glyphs_initially ();
6317 /* If no window system has been specified, try to use the terminal. */
6320 fatal ("standard input is not a tty");
6325 terminal_type
= "w32console";
6327 /* Look at the TERM variable. */
6328 terminal_type
= (char *) getenv ("TERM");
6332 #ifdef HAVE_WINDOW_SYSTEM
6333 if (! inhibit_window_system
)
6334 fprintf (stderr
, "Please set the environment variable DISPLAY or TERM (see `tset').\n");
6336 #endif /* HAVE_WINDOW_SYSTEM */
6337 fprintf (stderr
, "Please set the environment variable TERM; see `tset'.\n");
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
)
6351 f
->output_method
= t
->type
;
6354 t
->reference_count
++;
6356 f
->output_data
.tty
->display_info
= &the_only_display_info
;
6358 if (f
->output_method
== output_termcap
)
6359 create_tty_output (f
);
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
)),
6380 Fmodify_frame_parameters (selected_frame
, Fcons (Fcons (Qtty
, 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. */
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 /***********************************************************************
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
6431 if (!redisplaying_p
)
6434 window
= selected_window
;
6436 CHECK_WINDOW (window
);
6438 XWINDOW (window
)->cursor_off_p
= NILP (show
);
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
)
6454 window
= selected_window
;
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. */)
6467 Lisp_Object frame
= Qnil
;
6469 if (last_nonminibuf_frame
)
6470 XSETFRAME (frame
, last_nonminibuf_frame
);
6475 /***********************************************************************
6477 ***********************************************************************/
6480 syms_of_display (void)
6482 defsubr (&Sredraw_frame
);
6483 defsubr (&Sredraw_display
);
6484 defsubr (&Sframe_or_buffer_changed_p
);
6485 defsubr (&Sopen_termscript
);
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
);
6495 defsubr (&Sdump_redisplay_history
);
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);
6591 Vinitial_window_system
= Qnil
;
6592 Vwindow_system_version
= Qnil
;