Mercurial > emacs
annotate src/dispnew.c @ 49393:85246e86a2cd
* w32term.c (x_draw_glyph_string_foreground)
(x_draw_composite_glyph_string_foreground): Implement overstriking.
* w32term.c (x_write_glyphs): Clear phys_cursor_on_p if current
phys_cursor's hpos is overwritten. This is still not completely
correct, as it doesn't really make sense to use hpos at all to
get the cursor glyph (as that is relative to the width of the
characters on the line, which may have changed during the update).
* w32term.c (notice_overwritten_cursor): Handle the special case
of the cursor being in the first blank non-text line at the
end of a window.
* w32term.c (x_draw_hollow_cursor, x_draw_bar_cursor)
(x_draw_phys_cursor_glyph): Set phys_cursor_width here.
Compute from the x position returned by x_draw_glyphs.
* w32term.c (note_mode_line_or_margin_highlight): Renamed from
note_mode_line_highlight and extended.
* w32term.c (last_window): New variable.
(w32_read_socket) <WM_MOUSEMOVE>: Generate SELECT_WINDOW_EVENTs.
(note_mouse_movement): Remove reimplemented code in #if 0.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Wed, 22 Jan 2003 23:04:05 +0000 |
parents | 2cbb0b823e83 |
children | 23a1cea22d13 |
rev | line source |
---|---|
314 | 1 /* Updating of data structures for redisplay. |
44261 | 2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 97, 98, 1999, 2000, 2001, 2002 |
18853
4501a367a887
(direct_output_forward_char): Reenable check against
Richard M. Stallman <rms@gnu.org>
parents:
18774
diff
changeset
|
3 Free Software Foundation, Inc. |
314 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
7 GNU Emacs is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
1777
4edfaa19c7a7
* window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents:
1766
diff
changeset
|
9 the Free Software Foundation; either version 2, or (at your option) |
314 | 10 any later version. |
11 | |
12 GNU Emacs is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14125
diff
changeset
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14125
diff
changeset
|
20 Boston, MA 02111-1307, USA. */ |
314 | 21 |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
22 #include <config.h> |
314 | 23 #include <signal.h> |
7900
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7814
diff
changeset
|
24 #include <stdio.h> |
314 | 25 #include <ctype.h> |
26 | |
21514 | 27 #ifdef HAVE_UNISTD_H |
28 #include <unistd.h> | |
29 #endif | |
30 | |
3525
58e789baa27a
Include lisp.h earlier (before termhooks.h).
Richard M. Stallman <rms@gnu.org>
parents:
3517
diff
changeset
|
31 #include "lisp.h" |
314 | 32 #include "termchar.h" |
33 #include "termopts.h" | |
2198 | 34 #include "termhooks.h" |
13526
34382f4e23cb
Always include dispextern.h before cm.h.
Richard M. Stallman <rms@gnu.org>
parents:
13448
diff
changeset
|
35 /* cm.h must come after dispextern.h on Windows. */ |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
36 #include "dispextern.h" |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
37 #include "cm.h" |
314 | 38 #include "buffer.h" |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
39 #include "charset.h" |
31093
6da961dff718
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30720
diff
changeset
|
40 #include "keyboard.h" |
764 | 41 #include "frame.h" |
314 | 42 #include "window.h" |
43 #include "commands.h" | |
44 #include "disptab.h" | |
45 #include "indent.h" | |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
46 #include "intervals.h" |
15065 | 47 #include "blockinput.h" |
21514 | 48 #include "process.h" |
314 | 49 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
50 /* I don't know why DEC Alpha OSF1 fail to compile this file if we |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
51 include the following file. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
52 /* #include "systty.h" */ |
12917 | 53 #include "syssignal.h" |
554 | 54 |
314 | 55 #ifdef HAVE_X_WINDOWS |
56 #include "xterm.h" | |
25012 | 57 #endif /* HAVE_X_WINDOWS */ |
314 | 58 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
59 #ifdef HAVE_NTGUI |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
60 #include "w32term.h" |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
61 #endif /* HAVE_NTGUI */ |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
62 |
44890
01b93e5e53a7
Patch for building Emacs on Mac OS X. April 26, 2002. See ChangeLog,
Andrew Choi <akochoi@shaw.ca>
parents:
44815
diff
changeset
|
63 #ifdef MAC_OS |
32752
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
64 #include "macterm.h" |
44890
01b93e5e53a7
Patch for building Emacs on Mac OS X. April 26, 2002. See ChangeLog,
Andrew Choi <akochoi@shaw.ca>
parents:
44815
diff
changeset
|
65 #endif /* MAC_OS */ |
32752
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
66 |
25012 | 67 /* Include systime.h after xterm.h to avoid double inclusion of time.h. */ |
68 | |
7808
52e2eb6245d4
Include systime.h after xterm.h.
Richard M. Stallman <rms@gnu.org>
parents:
7648
diff
changeset
|
69 #include "systime.h" |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
70 #include <errno.h> |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
71 |
25012 | 72 /* To get the prototype for `sleep'. */ |
73 | |
74 #ifdef HAVE_UNISTD_H | |
75 #include <unistd.h> | |
76 #endif | |
77 | |
314 | 78 /* Get number of chars of output now in the buffer of a stdio stream. |
25012 | 79 This ought to be built in in stdio, but it isn't. Some s- files |
80 override this because their stdio internals differ. */ | |
81 | |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
82 #ifdef __GNU_LIBRARY__ |
25012 | 83 |
84 /* The s- file might have overridden the definition with one that | |
85 works for the system's C library. But we are using the GNU C | |
86 library, so this is the right definition for every system. */ | |
87 | |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
88 #ifdef GNU_LIBRARY_PENDING_OUTPUT_COUNT |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
89 #define PENDING_OUTPUT_COUNT GNU_LIBRARY_PENDING_OUTPUT_COUNT |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
90 #else |
7443
a9cb818e5316
[__GNU_LIBRARY__]: Redefine PENDING_OUTPUT_COUNT even if already defined.
Roland McGrath <roland@gnu.org>
parents:
7247
diff
changeset
|
91 #undef PENDING_OUTPUT_COUNT |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
92 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->__bufp - (FILE)->__buffer) |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
93 #endif |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
94 #else /* not __GNU_LIBRARY__ */ |
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
95 #if !defined (PENDING_OUTPUT_COUNT) && HAVE_STDIO_EXT_H && HAVE___FPENDING |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
96 #include <stdio_ext.h> |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
97 #define PENDING_OUTPUT_COUNT(FILE) __fpending (FILE) |
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
25781
diff
changeset
|
98 #endif |
7443
a9cb818e5316
[__GNU_LIBRARY__]: Redefine PENDING_OUTPUT_COUNT even if already defined.
Roland McGrath <roland@gnu.org>
parents:
7247
diff
changeset
|
99 #ifndef PENDING_OUTPUT_COUNT |
314 | 100 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_ptr - (FILE)->_base) |
101 #endif | |
25012 | 102 #endif /* not __GNU_LIBRARY__ */ |
103 | |
41969
e669966d496e
Test GNU_LINUX, not LINUX.
Richard M. Stallman <rms@gnu.org>
parents:
41120
diff
changeset
|
104 #if defined(HAVE_TERM_H) && defined (GNU_LINUX) && defined (HAVE_LIBNCURSES) |
29437 | 105 #include <term.h> /* for tgetent */ |
106 #endif | |
25012 | 107 |
108 /* Structure to pass dimensions around. Used for character bounding | |
109 boxes, glyph matrix dimensions and alike. */ | |
110 | |
111 struct dim | |
112 { | |
113 int width; | |
114 int height; | |
115 }; | |
116 | |
117 | |
118 /* Function prototypes. */ | |
119 | |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
120 static struct glyph_matrix *save_current_matrix P_ ((struct frame *)); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
121 static void restore_current_matrix P_ ((struct frame *, struct glyph_matrix *)); |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
122 static void fake_current_matrices P_ ((Lisp_Object)); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
123 static void redraw_overlapping_rows P_ ((struct window *, int)); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
124 static void redraw_overlapped_rows P_ ((struct window *, int)); |
25012 | 125 static int count_blanks P_ ((struct glyph *, int)); |
126 static int count_match P_ ((struct glyph *, struct glyph *, | |
127 struct glyph *, struct glyph *)); | |
128 static unsigned line_draw_cost P_ ((struct glyph_matrix *, int)); | |
129 static void update_frame_line P_ ((struct frame *, int)); | |
130 static struct dim allocate_matrices_for_frame_redisplay | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
131 P_ ((Lisp_Object, int, int, int, int *)); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
132 static void allocate_matrices_for_window_redisplay P_ ((struct window *)); |
25012 | 133 static int realloc_glyph_pool P_ ((struct glyph_pool *, struct dim)); |
134 static void adjust_frame_glyphs P_ ((struct frame *)); | |
135 struct glyph_matrix *new_glyph_matrix P_ ((struct glyph_pool *)); | |
136 static void free_glyph_matrix P_ ((struct glyph_matrix *)); | |
137 static void adjust_glyph_matrix P_ ((struct window *, struct glyph_matrix *, | |
138 int, int, struct dim)); | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
139 static void change_frame_size_1 P_ ((struct frame *, int, int, int, int, int)); |
25012 | 140 static void swap_glyph_pointers P_ ((struct glyph_row *, struct glyph_row *)); |
34895
53e52b3525bf
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34893
diff
changeset
|
141 #if GLYPH_DEBUG |
25012 | 142 static int glyph_row_slice_p P_ ((struct glyph_row *, struct glyph_row *)); |
30323
4cd1b8fe118c
(direct_output_for_insert): Remove confusing
Gerd Moellmann <gerd@gnu.org>
parents:
30307
diff
changeset
|
143 #endif |
25012 | 144 static void fill_up_frame_row_with_spaces P_ ((struct glyph_row *, int)); |
145 static void build_frame_matrix_from_window_tree P_ ((struct glyph_matrix *, | |
146 struct window *)); | |
147 static void build_frame_matrix_from_leaf_window P_ ((struct glyph_matrix *, | |
148 struct window *)); | |
149 static struct glyph_pool *new_glyph_pool P_ ((void)); | |
150 static void free_glyph_pool P_ ((struct glyph_pool *)); | |
151 static void adjust_frame_glyphs_initially P_ ((void)); | |
152 static void adjust_frame_message_buffer P_ ((struct frame *)); | |
153 static void adjust_decode_mode_spec_buffer P_ ((struct frame *)); | |
154 static void fill_up_glyph_row_with_spaces P_ ((struct glyph_row *)); | |
155 static void build_frame_matrix P_ ((struct frame *)); | |
156 void clear_current_matrices P_ ((struct frame *)); | |
157 void scroll_glyph_matrix_range P_ ((struct glyph_matrix *, int, int, | |
158 int, int)); | |
159 static void clear_window_matrices P_ ((struct window *, int)); | |
160 static void fill_up_glyph_row_area_with_spaces P_ ((struct glyph_row *, int)); | |
161 static int scrolling_window P_ ((struct window *, int)); | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
162 static int update_window_line P_ ((struct window *, int, int *)); |
25012 | 163 static void update_marginal_area P_ ((struct window *, int, int)); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
164 static int update_text_area P_ ((struct window *, int)); |
25012 | 165 static void make_current P_ ((struct glyph_matrix *, struct glyph_matrix *, |
166 int)); | |
167 static void mirror_make_current P_ ((struct window *, int)); | |
168 void check_window_matrix_pointers P_ ((struct window *)); | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
169 #if GLYPH_DEBUG |
25012 | 170 static void check_matrix_pointers P_ ((struct glyph_matrix *, |
171 struct glyph_matrix *)); | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
172 #endif |
25012 | 173 static void mirror_line_dance P_ ((struct window *, int, int, int *, char *)); |
174 static int update_window_tree P_ ((struct window *, int)); | |
175 static int update_window P_ ((struct window *, int)); | |
176 static int update_frame_1 P_ ((struct frame *, int, int)); | |
177 static void set_window_cursor_after_update P_ ((struct window *)); | |
178 static int row_equal_p P_ ((struct window *, struct glyph_row *, | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
179 struct glyph_row *, int)); |
25012 | 180 static void adjust_frame_glyphs_for_window_redisplay P_ ((struct frame *)); |
181 static void adjust_frame_glyphs_for_frame_redisplay P_ ((struct frame *)); | |
182 static void reverse_rows P_ ((struct glyph_matrix *, int, int)); | |
183 static int margin_glyphs_to_reserve P_ ((struct window *, int, Lisp_Object)); | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
184 static void sync_window_with_frame_matrix_rows P_ ((struct window *)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
185 struct window *frame_row_to_window P_ ((struct window *, int)); |
25012 | 186 |
187 | |
188 /* Non-zero means don't pause redisplay for pending input. (This is | |
189 for debugging and for a future implementation of EDT-like | |
190 scrolling. */ | |
191 | |
192 int redisplay_dont_pause; | |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
193 |
554 | 194 /* Nonzero upon entry to redisplay means do not assume anything about |
764 | 195 current contents of actual terminal frame; clear and redraw it. */ |
314 | 196 |
764 | 197 int frame_garbaged; |
314 | 198 |
25012 | 199 /* Nonzero means last display completed. Zero means it was preempted. */ |
314 | 200 |
201 int display_completed; | |
202 | |
25012 | 203 /* Lisp variable visible-bell; enables use of screen-flash instead of |
204 audible bell. */ | |
314 | 205 |
206 int visible_bell; | |
207 | |
764 | 208 /* Invert the color of the whole frame, at a low level. */ |
314 | 209 |
210 int inverse_video; | |
211 | |
212 /* Line speed of the terminal. */ | |
213 | |
43713
f92c4d87863a
Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
42835
diff
changeset
|
214 EMACS_INT baud_rate; |
314 | 215 |
25012 | 216 /* Either nil or a symbol naming the window system under which Emacs |
217 is running. */ | |
314 | 218 |
219 Lisp_Object Vwindow_system; | |
220 | |
221 /* Version number of X windows: 10, 11 or nil. */ | |
25012 | 222 |
314 | 223 Lisp_Object Vwindow_system_version; |
224 | |
25012 | 225 /* Vector of glyph definitions. Indexed by glyph number, the contents |
226 are a string which is how to output the glyph. | |
314 | 227 |
228 If Vglyph_table is nil, a glyph is output by using its low 8 bits | |
25012 | 229 as a character code. |
230 | |
231 This is an obsolete feature that is no longer used. The variable | |
232 is retained for compatibility. */ | |
314 | 233 |
234 Lisp_Object Vglyph_table; | |
235 | |
236 /* Display table to use for vectors that don't specify their own. */ | |
237 | |
238 Lisp_Object Vstandard_display_table; | |
239 | |
25012 | 240 /* Nonzero means reading single-character input with prompt so put |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
241 cursor on mini-buffer after the prompt. Positive means at end of |
25012 | 242 text in echo area; negative means at beginning of line. */ |
243 | |
314 | 244 int cursor_in_echo_area; |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
245 |
30720
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
246 Lisp_Object Qdisplay_table, Qredisplay_dont_pause; |
25012 | 247 |
314 | 248 |
25012 | 249 /* The currently selected frame. In a single-frame version, this |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
250 variable always equals the_only_frame. */ |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
251 |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
252 Lisp_Object selected_frame; |
25012 | 253 |
254 /* A frame which is not just a mini-buffer, or 0 if there are no such | |
764 | 255 frames. This is usually the most recent such frame that was |
9572 | 256 selected. In a single-frame version, this variable always holds |
257 the address of the_only_frame. */ | |
25012 | 258 |
259 struct frame *last_nonminibuf_frame; | |
260 | |
261 /* Stdio stream being used for copy of all output. */ | |
262 | |
263 FILE *termscript; | |
264 | |
265 /* Structure for info on cursor positioning. */ | |
266 | |
267 struct cm Wcm; | |
268 | |
269 /* 1 means SIGWINCH happened when not safe. */ | |
270 | |
271 int delayed_size_change; | |
272 | |
273 /* 1 means glyph initialization has been completed at startup. */ | |
274 | |
275 static int glyphs_initialized_initially_p; | |
276 | |
277 /* Updated window if != 0. Set by update_window. */ | |
278 | |
279 struct window *updated_window; | |
280 | |
281 /* Glyph row updated in update_window_line, and area that is updated. */ | |
282 | |
283 struct glyph_row *updated_row; | |
284 int updated_area; | |
285 | |
286 /* A glyph for a space. */ | |
287 | |
288 struct glyph space_glyph; | |
289 | |
290 /* Non-zero means update has been performed directly, so that there's | |
291 no need for redisplay_internal to do much work. Set by | |
292 direct_output_for_insert. */ | |
293 | |
294 int redisplay_performed_directly_p; | |
295 | |
296 /* Counts of allocated structures. These counts serve to diagnose | |
297 memory leaks and double frees. */ | |
298 | |
299 int glyph_matrix_count; | |
300 int glyph_pool_count; | |
301 | |
302 /* If non-null, the frame whose frame matrices are manipulated. If | |
303 null, window matrices are worked on. */ | |
304 | |
305 static struct frame *frame_matrix_frame; | |
306 | |
307 /* Current interface for window-based redisplay. Set from init_xterm. | |
308 A null value means we are not using window-based redisplay. */ | |
309 | |
310 struct redisplay_interface *rif; | |
311 | |
312 /* Non-zero means that fonts have been loaded since the last glyph | |
313 matrix adjustments. Redisplay must stop, and glyph matrices must | |
314 be adjusted when this flag becomes non-zero during display. The | |
315 reason fonts can be loaded so late is that fonts of fontsets are | |
316 loaded on demand. */ | |
317 | |
318 int fonts_changed_p; | |
319 | |
320 /* Convert vpos and hpos from frame to window and vice versa. | |
321 This may only be used for terminal frames. */ | |
322 | |
323 #if GLYPH_DEBUG | |
324 | |
325 static int window_to_frame_vpos P_ ((struct window *, int)); | |
326 static int window_to_frame_hpos P_ ((struct window *, int)); | |
327 #define WINDOW_TO_FRAME_VPOS(W, VPOS) window_to_frame_vpos ((W), (VPOS)) | |
328 #define WINDOW_TO_FRAME_HPOS(W, HPOS) window_to_frame_hpos ((W), (HPOS)) | |
329 | |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
330 /* One element of the ring buffer containing redisplay history |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
331 information. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
332 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
333 struct redisplay_history |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
334 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
335 char trace[512 + 100]; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
336 }; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
337 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
338 /* The size of the history buffer. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
339 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
340 #define REDISPLAY_HISTORY_SIZE 30 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
341 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
342 /* The redisplay history buffer. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
343 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
344 static struct redisplay_history redisplay_history[REDISPLAY_HISTORY_SIZE]; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
345 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
346 /* Next free entry in redisplay_history. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
347 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
348 static int history_idx; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
349 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
350 /* A tick that's incremented each time something is added to the |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
351 history. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
352 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
353 static unsigned history_tick; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
354 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
355 static void add_frame_display_history P_ ((struct frame *, int)); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
356 static void add_window_display_history P_ ((struct window *, char *, int)); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
357 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
358 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
359 /* Add to the redisplay history how window W has been displayed. |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
360 MSG is a trace containing the information how W's glyph matrix |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
361 has been constructed. PAUSED_P non-zero means that the update |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
362 has been interrupted for pending input. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
363 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
364 static void |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
365 add_window_display_history (w, msg, paused_p) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
366 struct window *w; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
367 char *msg; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
368 int paused_p; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
369 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
370 char *buf; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
371 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
372 if (history_idx >= REDISPLAY_HISTORY_SIZE) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
373 history_idx = 0; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
374 buf = redisplay_history[history_idx].trace; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
375 ++history_idx; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
376 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
377 sprintf (buf, "%d: window %p (`%s')%s\n", |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
378 history_tick++, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
379 w, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
380 ((BUFFERP (w->buffer) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
381 && STRINGP (XBUFFER (w->buffer)->name)) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
382 ? (char *) SDATA (XBUFFER (w->buffer)->name) |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
383 : "???"), |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
384 paused_p ? " ***paused***" : ""); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
385 strcat (buf, msg); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
386 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
387 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
388 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
389 /* Add to the redisplay history that frame F has been displayed. |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
390 PAUSED_P non-zero means that the update has been interrupted for |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
391 pending input. */ |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
392 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
393 static void |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
394 add_frame_display_history (f, paused_p) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
395 struct frame *f; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
396 int paused_p; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
397 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
398 char *buf; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
399 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
400 if (history_idx >= REDISPLAY_HISTORY_SIZE) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
401 history_idx = 0; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
402 buf = redisplay_history[history_idx].trace; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
403 ++history_idx; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
404 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
405 sprintf (buf, "%d: update frame %p%s", |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
406 history_tick++, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
407 f, paused_p ? " ***paused***" : ""); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
408 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
409 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
410 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
411 DEFUN ("dump-redisplay-history", Fdump_redisplay_history, |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
412 Sdump_redisplay_history, 0, 0, "", |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
413 doc: /* Dump redisplay history to stderr. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
414 () |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
415 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
416 int i; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
417 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
418 for (i = history_idx - 1; i != history_idx; --i) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
419 { |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
420 if (i < 0) |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
421 i = REDISPLAY_HISTORY_SIZE - 1; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
422 fprintf (stderr, "%s\n", redisplay_history[i].trace); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
423 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
424 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
425 return Qnil; |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
426 } |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
427 |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
428 |
25012 | 429 #else /* GLYPH_DEBUG == 0 */ |
430 | |
431 #define WINDOW_TO_FRAME_VPOS(W, VPOS) ((VPOS) + XFASTINT ((W)->top)) | |
432 #define WINDOW_TO_FRAME_HPOS(W, HPOS) ((HPOS) + XFASTINT ((W)->left)) | |
433 | |
434 #endif /* GLYPH_DEBUG == 0 */ | |
435 | |
436 | |
437 /* Like bcopy except never gets confused by overlap. Let this be the | |
438 first function defined in this file, or change emacs.c where the | |
439 address of this function is used. */ | |
314 | 440 |
441 void | |
442 safe_bcopy (from, to, size) | |
46551
227785e3e29f
(safe_bcopy): Source pointer now points to const.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
443 const char *from; |
227785e3e29f
(safe_bcopy): Source pointer now points to const.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
444 char *to; |
314 | 445 int size; |
446 { | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
447 if (size <= 0 || from == to) |
314 | 448 return; |
449 | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
450 /* If the source and destination don't overlap, then bcopy can |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
451 handle it. If they do overlap, but the destination is lower in |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
452 memory than the source, we'll assume bcopy can handle that. */ |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
453 if (to < from || from + size <= to) |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
454 bcopy (from, to, size); |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
455 |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
456 /* Otherwise, we'll copy from the end. */ |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
457 else |
314 | 458 { |
46551
227785e3e29f
(safe_bcopy): Source pointer now points to const.
Ken Raeburn <raeburn@raeburn.org>
parents:
46370
diff
changeset
|
459 register const char *endf = from + size; |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
460 register char *endt = to + size; |
314 | 461 |
462 /* If TO - FROM is large, then we should break the copy into | |
463 nonoverlapping chunks of TO - FROM bytes each. However, if | |
464 TO - FROM is small, then the bcopy function call overhead | |
465 makes this not worth it. The crossover point could be about | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
466 anywhere. Since I don't think the obvious copy loop is too |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
467 bad, I'm trying to err in its favor. */ |
314 | 468 if (to - from < 64) |
469 { | |
470 do | |
471 *--endt = *--endf; | |
472 while (endf != from); | |
473 } | |
474 else | |
475 { | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
476 for (;;) |
314 | 477 { |
478 endt -= (to - from); | |
479 endf -= (to - from); | |
480 | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
481 if (endt < to) |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
482 break; |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
483 |
314 | 484 bcopy (endf, endt, to - from); |
485 } | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
486 |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
487 /* If SIZE wasn't a multiple of TO - FROM, there will be a |
25012 | 488 little left over. The amount left over is (endt + (to - |
489 from)) - to, which is endt - from. */ | |
314 | 490 bcopy (from, to, endt - from); |
491 } | |
492 } | |
493 } | |
494 | |
25012 | 495 |
496 | |
497 /*********************************************************************** | |
498 Glyph Matrices | |
499 ***********************************************************************/ | |
500 | |
501 /* Allocate and return a glyph_matrix structure. POOL is the glyph | |
502 pool from which memory for the matrix should be allocated, or null | |
503 for window-based redisplay where no glyph pools are used. The | |
504 member `pool' of the glyph matrix structure returned is set to | |
505 POOL, the structure is otherwise zeroed. */ | |
506 | |
507 struct glyph_matrix * | |
508 new_glyph_matrix (pool) | |
509 struct glyph_pool *pool; | |
510 { | |
511 struct glyph_matrix *result; | |
512 | |
513 /* Allocate and clear. */ | |
514 result = (struct glyph_matrix *) xmalloc (sizeof *result); | |
515 bzero (result, sizeof *result); | |
516 | |
517 /* Increment number of allocated matrices. This count is used | |
518 to detect memory leaks. */ | |
519 ++glyph_matrix_count; | |
520 | |
521 /* Set pool and return. */ | |
522 result->pool = pool; | |
523 return result; | |
524 } | |
525 | |
526 | |
527 /* Free glyph matrix MATRIX. Passing in a null MATRIX is allowed. | |
528 | |
529 The global counter glyph_matrix_count is decremented when a matrix | |
530 is freed. If the count gets negative, more structures were freed | |
531 than allocated, i.e. one matrix was freed more than once or a bogus | |
532 pointer was passed to this function. | |
533 | |
534 If MATRIX->pool is null, this means that the matrix manages its own | |
535 glyph memory---this is done for matrices on X frames. Freeing the | |
536 matrix also frees the glyph memory in this case. */ | |
537 | |
538 static void | |
539 free_glyph_matrix (matrix) | |
540 struct glyph_matrix *matrix; | |
541 { | |
542 if (matrix) | |
543 { | |
544 int i; | |
545 | |
546 /* Detect the case that more matrices are freed than were | |
547 allocated. */ | |
548 if (--glyph_matrix_count < 0) | |
549 abort (); | |
550 | |
551 /* Free glyph memory if MATRIX owns it. */ | |
552 if (matrix->pool == NULL) | |
553 for (i = 0; i < matrix->rows_allocated; ++i) | |
554 xfree (matrix->rows[i].glyphs[LEFT_MARGIN_AREA]); | |
555 | |
556 /* Free row structures and the matrix itself. */ | |
557 xfree (matrix->rows); | |
558 xfree (matrix); | |
559 } | |
560 } | |
561 | |
562 | |
563 /* Return the number of glyphs to reserve for a marginal area of | |
564 window W. TOTAL_GLYPHS is the number of glyphs in a complete | |
565 display line of window W. MARGIN gives the width of the marginal | |
566 area in canonical character units. MARGIN should be an integer | |
567 or a float. */ | |
568 | |
569 static int | |
570 margin_glyphs_to_reserve (w, total_glyphs, margin) | |
571 struct window *w; | |
572 int total_glyphs; | |
573 Lisp_Object margin; | |
574 { | |
575 int n; | |
576 | |
577 if (NUMBERP (margin)) | |
578 { | |
579 int width = XFASTINT (w->width); | |
580 double d = max (0, XFLOATINT (margin)); | |
581 d = min (width / 2 - 1, d); | |
582 n = (int) ((double) total_glyphs / width * d); | |
583 } | |
584 else | |
585 n = 0; | |
586 | |
587 return n; | |
588 } | |
589 | |
590 | |
591 /* Adjust glyph matrix MATRIX on window W or on a frame to changed | |
592 window sizes. | |
593 | |
594 W is null if the function is called for a frame glyph matrix. | |
595 Otherwise it is the window MATRIX is a member of. X and Y are the | |
596 indices of the first column and row of MATRIX within the frame | |
597 matrix, if such a matrix exists. They are zero for purely | |
598 window-based redisplay. DIM is the needed size of the matrix. | |
599 | |
600 In window-based redisplay, where no frame matrices exist, glyph | |
601 matrices manage their own glyph storage. Otherwise, they allocate | |
602 storage from a common frame glyph pool which can be found in | |
603 MATRIX->pool. | |
604 | |
605 The reason for this memory management strategy is to avoid complete | |
606 frame redraws if possible. When we allocate from a common pool, a | |
607 change of the location or size of a sub-matrix within the pool | |
608 requires a complete redisplay of the frame because we cannot easily | |
609 make sure that the current matrices of all windows still agree with | |
610 what is displayed on the screen. While this is usually fast, it | |
611 leads to screen flickering. */ | |
612 | |
613 static void | |
614 adjust_glyph_matrix (w, matrix, x, y, dim) | |
615 struct window *w; | |
616 struct glyph_matrix *matrix; | |
617 int x, y; | |
618 struct dim dim; | |
619 { | |
620 int i; | |
621 int new_rows; | |
622 int marginal_areas_changed_p = 0; | |
25546 | 623 int header_line_changed_p = 0; |
624 int header_line_p = 0; | |
25012 | 625 int left = -1, right = -1; |
34203
e55480843a8e
(scrolling_window): Fix code inserting runs in list of all runs.
Gerd Moellmann <gerd@gnu.org>
parents:
33763
diff
changeset
|
626 int window_x, window_y, window_width = -1, window_height; |
25012 | 627 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
628 /* See if W had a header line that has disappeared now, or vice versa. */ |
25012 | 629 if (w) |
630 { | |
25546 | 631 header_line_p = WINDOW_WANTS_HEADER_LINE_P (w); |
632 header_line_changed_p = header_line_p != matrix->header_line_p; | |
25012 | 633 } |
25546 | 634 matrix->header_line_p = header_line_p; |
25012 | 635 |
636 /* Do nothing if MATRIX' size, position, vscroll, and marginal areas | |
637 haven't changed. This optimization is important because preserving | |
638 the matrix means preventing redisplay. */ | |
639 if (matrix->pool == NULL) | |
640 { | |
641 window_box (w, -1, &window_x, &window_y, &window_width, &window_height); | |
642 left = margin_glyphs_to_reserve (w, dim.width, w->left_margin_width); | |
643 right = margin_glyphs_to_reserve (w, dim.width, w->right_margin_width); | |
644 xassert (left >= 0 && right >= 0); | |
645 marginal_areas_changed_p = (left != matrix->left_margin_glyphs | |
646 || right != matrix->right_margin_glyphs); | |
647 | |
648 if (!marginal_areas_changed_p | |
649 && !fonts_changed_p | |
25546 | 650 && !header_line_changed_p |
34279
7ab25b4a077c
(adjust_glyph_matrix): Don't reuse a window's current
Gerd Moellmann <gerd@gnu.org>
parents:
34203
diff
changeset
|
651 && matrix->window_left_x == XFASTINT (w->left) |
25012 | 652 && matrix->window_top_y == XFASTINT (w->top) |
653 && matrix->window_height == window_height | |
654 && matrix->window_vscroll == w->vscroll | |
655 && matrix->window_width == window_width) | |
656 return; | |
657 } | |
658 | |
659 /* Enlarge MATRIX->rows if necessary. New rows are cleared. */ | |
660 if (matrix->rows_allocated < dim.height) | |
661 { | |
662 int size = dim.height * sizeof (struct glyph_row); | |
663 new_rows = dim.height - matrix->rows_allocated; | |
664 matrix->rows = (struct glyph_row *) xrealloc (matrix->rows, size); | |
665 bzero (matrix->rows + matrix->rows_allocated, | |
666 new_rows * sizeof *matrix->rows); | |
667 matrix->rows_allocated = dim.height; | |
668 } | |
669 else | |
670 new_rows = 0; | |
671 | |
672 /* If POOL is not null, MATRIX is a frame matrix or a window matrix | |
673 on a frame not using window-based redisplay. Set up pointers for | |
674 each row into the glyph pool. */ | |
675 if (matrix->pool) | |
676 { | |
677 xassert (matrix->pool->glyphs); | |
678 | |
679 if (w) | |
680 { | |
681 left = margin_glyphs_to_reserve (w, dim.width, | |
682 w->left_margin_width); | |
683 right = margin_glyphs_to_reserve (w, dim.width, | |
684 w->right_margin_width); | |
685 } | |
686 else | |
687 left = right = 0; | |
688 | |
689 for (i = 0; i < dim.height; ++i) | |
690 { | |
691 struct glyph_row *row = &matrix->rows[i]; | |
692 | |
693 row->glyphs[LEFT_MARGIN_AREA] | |
694 = (matrix->pool->glyphs | |
695 + (y + i) * matrix->pool->ncolumns | |
696 + x); | |
697 | |
698 if (w == NULL | |
699 || row == matrix->rows + dim.height - 1 | |
25546 | 700 || (row == matrix->rows && matrix->header_line_p)) |
25012 | 701 { |
702 row->glyphs[TEXT_AREA] | |
703 = row->glyphs[LEFT_MARGIN_AREA]; | |
704 row->glyphs[RIGHT_MARGIN_AREA] | |
705 = row->glyphs[TEXT_AREA] + dim.width; | |
706 row->glyphs[LAST_AREA] | |
707 = row->glyphs[RIGHT_MARGIN_AREA]; | |
708 } | |
709 else | |
710 { | |
711 row->glyphs[TEXT_AREA] | |
712 = row->glyphs[LEFT_MARGIN_AREA] + left; | |
713 row->glyphs[RIGHT_MARGIN_AREA] | |
714 = row->glyphs[TEXT_AREA] + dim.width - left - right; | |
715 row->glyphs[LAST_AREA] | |
716 = row->glyphs[LEFT_MARGIN_AREA] + dim.width; | |
717 } | |
718 } | |
719 | |
720 matrix->left_margin_glyphs = left; | |
721 matrix->right_margin_glyphs = right; | |
722 } | |
723 else | |
724 { | |
725 /* If MATRIX->pool is null, MATRIX is responsible for managing | |
726 its own memory. Allocate glyph memory from the heap. */ | |
727 if (dim.width > matrix->matrix_w | |
728 || new_rows | |
25546 | 729 || header_line_changed_p |
25012 | 730 || marginal_areas_changed_p) |
731 { | |
732 struct glyph_row *row = matrix->rows; | |
733 struct glyph_row *end = row + matrix->rows_allocated; | |
734 | |
735 while (row < end) | |
736 { | |
737 row->glyphs[LEFT_MARGIN_AREA] | |
738 = (struct glyph *) xrealloc (row->glyphs[LEFT_MARGIN_AREA], | |
739 (dim.width | |
740 * sizeof (struct glyph))); | |
741 | |
742 /* The mode line never has marginal areas. */ | |
743 if (row == matrix->rows + dim.height - 1 | |
25546 | 744 || (row == matrix->rows && matrix->header_line_p)) |
25012 | 745 { |
746 row->glyphs[TEXT_AREA] | |
747 = row->glyphs[LEFT_MARGIN_AREA]; | |
748 row->glyphs[RIGHT_MARGIN_AREA] | |
749 = row->glyphs[TEXT_AREA] + dim.width; | |
750 row->glyphs[LAST_AREA] | |
751 = row->glyphs[RIGHT_MARGIN_AREA]; | |
752 } | |
753 else | |
754 { | |
755 row->glyphs[TEXT_AREA] | |
756 = row->glyphs[LEFT_MARGIN_AREA] + left; | |
757 row->glyphs[RIGHT_MARGIN_AREA] | |
758 = row->glyphs[TEXT_AREA] + dim.width - left - right; | |
759 row->glyphs[LAST_AREA] | |
760 = row->glyphs[LEFT_MARGIN_AREA] + dim.width; | |
761 } | |
762 ++row; | |
763 } | |
764 } | |
765 | |
766 xassert (left >= 0 && right >= 0); | |
767 matrix->left_margin_glyphs = left; | |
768 matrix->right_margin_glyphs = right; | |
769 } | |
770 | |
771 /* Number of rows to be used by MATRIX. */ | |
772 matrix->nrows = dim.height; | |
31932
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
773 xassert (matrix->nrows >= 0); |
25012 | 774 |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
775 if (w) |
25012 | 776 { |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
777 if (matrix == w->current_matrix) |
25012 | 778 { |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
779 /* Mark rows in a current matrix of a window as not having |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
780 valid contents. It's important to not do this for |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
781 desired matrices. When Emacs starts, it may already be |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
782 building desired matrices when this function runs. */ |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
783 if (window_width < 0) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
784 window_width = window_box_width (w, -1); |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
785 |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
786 /* Optimize the case that only the height has changed (C-x 2, |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
787 upper window). Invalidate all rows that are no longer part |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
788 of the window. */ |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
789 if (!marginal_areas_changed_p |
37098
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
790 && !header_line_changed_p |
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
791 && new_rows == 0 |
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
792 && dim.width == matrix->matrix_w |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
793 && matrix->window_left_x == XFASTINT (w->left) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
794 && matrix->window_top_y == XFASTINT (w->top) |
37098
e293840c7332
(adjust_glyph_matrix): Don't try to reuse the current
Gerd Moellmann <gerd@gnu.org>
parents:
36697
diff
changeset
|
795 && matrix->window_width == window_width) |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
796 { |
38528
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
797 /* Find the last row in the window. */ |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
798 for (i = 0; i < matrix->nrows && matrix->rows[i].enabled_p; ++i) |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
799 if (MATRIX_ROW_BOTTOM_Y (matrix->rows + i) >= window_height) |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
800 { |
38748
bb32ae33769e
(adjust_glyph_matrix): Undo last change.
Gerd Moellmann <gerd@gnu.org>
parents:
38734
diff
changeset
|
801 ++i; |
38528
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
802 break; |
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
803 } |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
804 |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
805 /* Window end is invalid, if inside of the rows that |
38528
c867615c6a26
(adjust_glyph_matrix): In the optimization for
Gerd Moellmann <gerd@gnu.org>
parents:
38489
diff
changeset
|
806 are invalidated below. */ |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
807 if (INTEGERP (w->window_end_vpos) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
808 && XFASTINT (w->window_end_vpos) >= i) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
809 w->window_end_valid = Qnil; |
25012 | 810 |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
811 while (i < matrix->nrows) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
812 matrix->rows[i++].enabled_p = 0; |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
813 } |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
814 else |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
815 { |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
816 for (i = 0; i < matrix->nrows; ++i) |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
817 matrix->rows[i].enabled_p = 0; |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
818 } |
25012 | 819 } |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
820 else if (matrix == w->desired_matrix) |
25012 | 821 { |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
822 /* Rows in desired matrices always have to be cleared; |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
823 redisplay expects this is the case when it runs, so it |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
824 had better be the case when we adjust matrices between |
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
825 redisplays. */ |
25012 | 826 for (i = 0; i < matrix->nrows; ++i) |
827 matrix->rows[i].enabled_p = 0; | |
828 } | |
829 } | |
35609
83f1f7fbe26e
(adjust_glyph_matrix): Always clear desired matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
35445
diff
changeset
|
830 |
25012 | 831 |
832 /* Remember last values to be able to optimize frame redraws. */ | |
833 matrix->matrix_x = x; | |
834 matrix->matrix_y = y; | |
835 matrix->matrix_w = dim.width; | |
836 matrix->matrix_h = dim.height; | |
837 | |
838 /* Record the top y location and height of W at the time the matrix | |
839 was last adjusted. This is used to optimize redisplay above. */ | |
840 if (w) | |
841 { | |
34279
7ab25b4a077c
(adjust_glyph_matrix): Don't reuse a window's current
Gerd Moellmann <gerd@gnu.org>
parents:
34203
diff
changeset
|
842 matrix->window_left_x = XFASTINT (w->left); |
25012 | 843 matrix->window_top_y = XFASTINT (w->top); |
844 matrix->window_height = window_height; | |
845 matrix->window_width = window_width; | |
846 matrix->window_vscroll = w->vscroll; | |
847 } | |
848 } | |
849 | |
850 | |
851 /* Reverse the contents of rows in MATRIX between START and END. The | |
852 contents of the row at END - 1 end up at START, END - 2 at START + | |
853 1 etc. This is part of the implementation of rotate_matrix (see | |
854 below). */ | |
314 | 855 |
856 static void | |
25012 | 857 reverse_rows (matrix, start, end) |
858 struct glyph_matrix *matrix; | |
859 int start, end; | |
314 | 860 { |
25012 | 861 int i, j; |
862 | |
863 for (i = start, j = end - 1; i < j; ++i, --j) | |
864 { | |
865 /* Non-ISO HP/UX compiler doesn't like auto struct | |
866 initialization. */ | |
867 struct glyph_row temp; | |
868 temp = matrix->rows[i]; | |
869 matrix->rows[i] = matrix->rows[j]; | |
870 matrix->rows[j] = temp; | |
871 } | |
314 | 872 } |
873 | |
25012 | 874 |
875 /* Rotate the contents of rows in MATRIX in the range FIRST .. LAST - | |
876 1 by BY positions. BY < 0 means rotate left, i.e. towards lower | |
877 indices. (Note: this does not copy glyphs, only glyph pointers in | |
878 row structures are moved around). | |
879 | |
880 The algorithm used for rotating the vector was, I believe, first | |
881 described by Kernighan. See the vector R as consisting of two | |
882 sub-vectors AB, where A has length BY for BY >= 0. The result | |
883 after rotating is then BA. Reverse both sub-vectors to get ArBr | |
884 and reverse the result to get (ArBr)r which is BA. Similar for | |
885 rotating right. */ | |
886 | |
887 void | |
888 rotate_matrix (matrix, first, last, by) | |
889 struct glyph_matrix *matrix; | |
890 int first, last, by; | |
314 | 891 { |
25012 | 892 if (by < 0) |
893 { | |
894 /* Up (rotate left, i.e. towards lower indices). */ | |
895 by = -by; | |
896 reverse_rows (matrix, first, first + by); | |
897 reverse_rows (matrix, first + by, last); | |
898 reverse_rows (matrix, first, last); | |
899 } | |
900 else if (by > 0) | |
314 | 901 { |
25012 | 902 /* Down (rotate right, i.e. towards higher indices). */ |
903 reverse_rows (matrix, last - by, last); | |
904 reverse_rows (matrix, first, last - by); | |
905 reverse_rows (matrix, first, last); | |
314 | 906 } |
25012 | 907 } |
908 | |
909 | |
910 /* Increment buffer positions in glyph rows of MATRIX. Do it for rows | |
911 with indices START <= index < END. Increment positions by DELTA/ | |
912 DELTA_BYTES. */ | |
913 | |
914 void | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
915 increment_matrix_positions (matrix, start, end, delta, delta_bytes) |
25012 | 916 struct glyph_matrix *matrix; |
917 int start, end, delta, delta_bytes; | |
918 { | |
919 /* Check that START and END are reasonable values. */ | |
920 xassert (start >= 0 && start <= matrix->nrows); | |
921 xassert (end >= 0 && end <= matrix->nrows); | |
922 xassert (start <= end); | |
923 | |
924 for (; start < end; ++start) | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
925 increment_row_positions (matrix->rows + start, delta, delta_bytes); |
25012 | 926 } |
927 | |
928 | |
929 /* Enable a range of rows in glyph matrix MATRIX. START and END are | |
930 the row indices of the first and last + 1 row to enable. If | |
931 ENABLED_P is non-zero, enabled_p flags in rows will be set to 1. */ | |
932 | |
933 void | |
934 enable_glyph_matrix_rows (matrix, start, end, enabled_p) | |
935 struct glyph_matrix *matrix; | |
936 int start, end; | |
937 int enabled_p; | |
938 { | |
31932
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
939 xassert (start <= end); |
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
940 xassert (start >= 0 && start < matrix->nrows); |
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
941 xassert (end >= 0 && end <= matrix->nrows); |
081edde76197
(adjust_glyph_matrix, enable_glyph_matrix_rows):
Gerd Moellmann <gerd@gnu.org>
parents:
31850
diff
changeset
|
942 |
25012 | 943 for (; start < end; ++start) |
944 matrix->rows[start].enabled_p = enabled_p != 0; | |
945 } | |
946 | |
947 | |
948 /* Clear MATRIX. | |
949 | |
950 This empties all rows in MATRIX by setting the enabled_p flag for | |
951 all rows of the matrix to zero. The function prepare_desired_row | |
952 will eventually really clear a row when it sees one with a zero | |
953 enabled_p flag. | |
954 | |
955 Resets update hints to defaults value. The only update hint | |
956 currently present is the flag MATRIX->no_scrolling_p. */ | |
957 | |
958 void | |
959 clear_glyph_matrix (matrix) | |
960 struct glyph_matrix *matrix; | |
961 { | |
962 if (matrix) | |
314 | 963 { |
25012 | 964 enable_glyph_matrix_rows (matrix, 0, matrix->nrows, 0); |
965 matrix->no_scrolling_p = 0; | |
314 | 966 } |
967 } | |
25012 | 968 |
969 | |
970 /* Shift part of the glyph matrix MATRIX of window W up or down. | |
971 Increment y-positions in glyph rows between START and END by DY, | |
972 and recompute their visible height. */ | |
973 | |
974 void | |
975 shift_glyph_matrix (w, matrix, start, end, dy) | |
976 struct window *w; | |
977 struct glyph_matrix *matrix; | |
978 int start, end, dy; | |
979 { | |
980 int min_y, max_y; | |
981 | |
982 xassert (start <= end); | |
983 xassert (start >= 0 && start < matrix->nrows); | |
984 xassert (end >= 0 && end <= matrix->nrows); | |
985 | |
25546 | 986 min_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w); |
25012 | 987 max_y = WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE (w); |
988 | |
989 for (; start < end; ++start) | |
990 { | |
991 struct glyph_row *row = &matrix->rows[start]; | |
992 | |
993 row->y += dy; | |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
994 row->visible_height = row->height; |
25012 | 995 |
996 if (row->y < min_y) | |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
997 row->visible_height -= min_y - row->y; |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
998 if (row->y + row->height > max_y) |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
999 row->visible_height -= row->y + row->height - max_y; |
25012 | 1000 } |
1001 } | |
1002 | |
1003 | |
1004 /* Mark all rows in current matrices of frame F as invalid. Marking | |
1005 invalid is done by setting enabled_p to zero for all rows in a | |
1006 current matrix. */ | |
1007 | |
1008 void | |
1009 clear_current_matrices (f) | |
1010 register struct frame *f; | |
1011 { | |
1012 /* Clear frame current matrix, if we have one. */ | |
1013 if (f->current_matrix) | |
1014 clear_glyph_matrix (f->current_matrix); | |
1015 | |
1016 /* Clear the matrix of the menu bar window, if such a window exists. | |
1017 The menu bar window is currently used to display menus on X when | |
1018 no toolkit support is compiled in. */ | |
1019 if (WINDOWP (f->menu_bar_window)) | |
1020 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); | |
1021 | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1022 /* Clear the matrix of the tool-bar window, if any. */ |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1023 if (WINDOWP (f->tool_bar_window)) |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1024 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->current_matrix); |
25012 | 1025 |
1026 /* Clear current window matrices. */ | |
1027 xassert (WINDOWP (FRAME_ROOT_WINDOW (f))); | |
1028 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 0); | |
1029 } | |
1030 | |
1031 | |
1032 /* Clear out all display lines of F for a coming redisplay. */ | |
314 | 1033 |
21514 | 1034 void |
25012 | 1035 clear_desired_matrices (f) |
1036 register struct frame *f; | |
314 | 1037 { |
25012 | 1038 if (f->desired_matrix) |
1039 clear_glyph_matrix (f->desired_matrix); | |
1040 | |
1041 if (WINDOWP (f->menu_bar_window)) | |
1042 clear_glyph_matrix (XWINDOW (f->menu_bar_window)->desired_matrix); | |
1043 | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1044 if (WINDOWP (f->tool_bar_window)) |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
1045 clear_glyph_matrix (XWINDOW (f->tool_bar_window)->desired_matrix); |
25012 | 1046 |
1047 /* Do it for window matrices. */ | |
1048 xassert (WINDOWP (FRAME_ROOT_WINDOW (f))); | |
1049 clear_window_matrices (XWINDOW (FRAME_ROOT_WINDOW (f)), 1); | |
1050 } | |
1051 | |
1052 | |
1053 /* Clear matrices in window tree rooted in W. If DESIRED_P is | |
1054 non-zero clear desired matrices, otherwise clear current matrices. */ | |
1055 | |
1056 static void | |
1057 clear_window_matrices (w, desired_p) | |
1058 struct window *w; | |
1059 int desired_p; | |
1060 { | |
1061 while (w) | |
314 | 1062 { |
25012 | 1063 if (!NILP (w->hchild)) |
1064 { | |
1065 xassert (WINDOWP (w->hchild)); | |
1066 clear_window_matrices (XWINDOW (w->hchild), desired_p); | |
1067 } | |
1068 else if (!NILP (w->vchild)) | |
314 | 1069 { |
25012 | 1070 xassert (WINDOWP (w->vchild)); |
1071 clear_window_matrices (XWINDOW (w->vchild), desired_p); | |
1072 } | |
1073 else | |
1074 { | |
1075 if (desired_p) | |
1076 clear_glyph_matrix (w->desired_matrix); | |
1077 else | |
314 | 1078 { |
25012 | 1079 clear_glyph_matrix (w->current_matrix); |
1080 w->window_end_valid = Qnil; | |
314 | 1081 } |
25012 | 1082 } |
1083 | |
1084 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
1085 } | |
1086 } | |
1087 | |
1088 | |
1089 | |
1090 /*********************************************************************** | |
1091 Glyph Rows | |
1092 | |
1093 See dispextern.h for an overall explanation of glyph rows. | |
1094 ***********************************************************************/ | |
1095 | |
1096 /* Clear glyph row ROW. Do it in a way that makes it robust against | |
1097 changes in the glyph_row structure, i.e. addition or removal of | |
1098 structure members. */ | |
1099 | |
33527
c4c7abc48752
(null_row): New gloval static variable.
Kenichi Handa <handa@m17n.org>
parents:
33101
diff
changeset
|
1100 static struct glyph_row null_row; |
c4c7abc48752
(null_row): New gloval static variable.
Kenichi Handa <handa@m17n.org>
parents:
33101
diff
changeset
|
1101 |
25012 | 1102 void |
1103 clear_glyph_row (row) | |
1104 struct glyph_row *row; | |
1105 { | |
1106 struct glyph *p[1 + LAST_AREA]; | |
1107 | |
1108 /* Save pointers. */ | |
1109 p[LEFT_MARGIN_AREA] = row->glyphs[LEFT_MARGIN_AREA]; | |
1110 p[TEXT_AREA] = row->glyphs[TEXT_AREA]; | |
1111 p[RIGHT_MARGIN_AREA] = row->glyphs[RIGHT_MARGIN_AREA]; | |
1112 p[LAST_AREA] = row->glyphs[LAST_AREA]; | |
1113 | |
1114 /* Clear. */ | |
1115 *row = null_row; | |
1116 | |
1117 /* Restore pointers. */ | |
1118 row->glyphs[LEFT_MARGIN_AREA] = p[LEFT_MARGIN_AREA]; | |
1119 row->glyphs[TEXT_AREA] = p[TEXT_AREA]; | |
1120 row->glyphs[RIGHT_MARGIN_AREA] = p[RIGHT_MARGIN_AREA]; | |
1121 row->glyphs[LAST_AREA] = p[LAST_AREA]; | |
30041
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1122 |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1123 #if 0 /* At some point, some bit-fields of struct glyph were not set, |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1124 which made glyphs unequal when compared with GLYPH_EQUAL_P. |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1125 Redisplay outputs such glyphs, and flickering effects were |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1126 the result. This also depended on the contents of memory |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1127 returned by xmalloc. If flickering happens again, activate |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1128 the code below. If the flickering is gone with that, chances |
30041
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1129 are that the flickering has the same reason as here. */ |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1130 bzero (p[0], (char *) p[LAST_AREA] - (char *) p[0]); |
b20d72b7aa4b
(clear_glyph_row): Add debug code in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
29980
diff
changeset
|
1131 #endif |
25012 | 1132 } |
1133 | |
1134 | |
1135 /* Make ROW an empty, enabled row of canonical character height, | |
1136 in window W starting at y-position Y. */ | |
1137 | |
1138 void | |
1139 blank_row (w, row, y) | |
1140 struct window *w; | |
1141 struct glyph_row *row; | |
1142 int y; | |
1143 { | |
1144 int min_y, max_y; | |
1145 | |
25546 | 1146 min_y = WINDOW_DISPLAY_HEADER_LINE_HEIGHT (w); |
25012 | 1147 max_y = WINDOW_DISPLAY_HEIGHT_NO_MODE_LINE (w); |
1148 | |
1149 clear_glyph_row (row); | |
1150 row->y = y; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1151 row->ascent = row->phys_ascent = 0; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1152 row->height = row->phys_height = CANON_Y_UNIT (XFRAME (w->frame)); |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1153 row->visible_height = row->height; |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1154 |
25012 | 1155 if (row->y < min_y) |
38587
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1156 row->visible_height -= min_y - row->y; |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1157 if (row->y + row->height > max_y) |
42e75caf68ff
(shift_glyph_matrix, blank_row): Fix computation
Gerd Moellmann <gerd@gnu.org>
parents:
38528
diff
changeset
|
1158 row->visible_height -= row->y + row->height - max_y; |
25012 | 1159 |
1160 row->enabled_p = 1; | |
1161 } | |
1162 | |
1163 | |
1164 /* Increment buffer positions in glyph row ROW. DELTA and DELTA_BYTES | |
1165 are the amounts by which to change positions. Note that the first | |
1166 glyph of the text area of a row can have a buffer position even if | |
1167 the used count of the text area is zero. Such rows display line | |
1168 ends. */ | |
1169 | |
1170 void | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
1171 increment_row_positions (row, delta, delta_bytes) |
25012 | 1172 struct glyph_row *row; |
1173 int delta, delta_bytes; | |
1174 { | |
1175 int area, i; | |
1176 | |
1177 /* Increment start and end positions. */ | |
1178 MATRIX_ROW_START_CHARPOS (row) += delta; | |
1179 MATRIX_ROW_START_BYTEPOS (row) += delta_bytes; | |
1180 MATRIX_ROW_END_CHARPOS (row) += delta; | |
1181 MATRIX_ROW_END_BYTEPOS (row) += delta_bytes; | |
1182 | |
1183 /* Increment positions in glyphs. */ | |
1184 for (area = 0; area < LAST_AREA; ++area) | |
1185 for (i = 0; i < row->used[area]; ++i) | |
1186 if (BUFFERP (row->glyphs[area][i].object) | |
1187 && row->glyphs[area][i].charpos > 0) | |
1188 row->glyphs[area][i].charpos += delta; | |
1189 | |
1190 /* Capture the case of rows displaying a line end. */ | |
1191 if (row->used[TEXT_AREA] == 0 | |
1192 && MATRIX_ROW_DISPLAYS_TEXT_P (row)) | |
1193 row->glyphs[TEXT_AREA]->charpos += delta; | |
1194 } | |
1195 | |
1196 | |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1197 #if 0 |
25012 | 1198 /* Swap glyphs between two glyph rows A and B. This exchanges glyph |
1199 contents, i.e. glyph structure contents are exchanged between A and | |
1200 B without changing glyph pointers in A and B. */ | |
1201 | |
1202 static void | |
1203 swap_glyphs_in_rows (a, b) | |
1204 struct glyph_row *a, *b; | |
1205 { | |
1206 int area; | |
1207 | |
1208 for (area = 0; area < LAST_AREA; ++area) | |
1209 { | |
1210 /* Number of glyphs to swap. */ | |
1211 int max_used = max (a->used[area], b->used[area]); | |
1212 | |
1213 /* Start of glyphs in area of row A. */ | |
1214 struct glyph *glyph_a = a->glyphs[area]; | |
1215 | |
1216 /* End + 1 of glyphs in area of row A. */ | |
1217 struct glyph *glyph_a_end = a->glyphs[max_used]; | |
1218 | |
1219 /* Start of glyphs in area of row B. */ | |
1220 struct glyph *glyph_b = b->glyphs[area]; | |
1221 | |
1222 while (glyph_a < glyph_a_end) | |
1223 { | |
1224 /* Non-ISO HP/UX compiler doesn't like auto struct | |
1225 initialization. */ | |
1226 struct glyph temp; | |
1227 temp = *glyph_a; | |
1228 *glyph_a = *glyph_b; | |
1229 *glyph_b = temp; | |
1230 ++glyph_a; | |
1231 ++glyph_b; | |
314 | 1232 } |
1233 } | |
1234 } | |
25012 | 1235 |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1236 #endif /* 0 */ |
25012 | 1237 |
1238 /* Exchange pointers to glyph memory between glyph rows A and B. */ | |
1239 | |
1240 static INLINE void | |
1241 swap_glyph_pointers (a, b) | |
1242 struct glyph_row *a, *b; | |
1243 { | |
1244 int i; | |
1245 for (i = 0; i < LAST_AREA + 1; ++i) | |
1246 { | |
1247 struct glyph *temp = a->glyphs[i]; | |
1248 a->glyphs[i] = b->glyphs[i]; | |
1249 b->glyphs[i] = temp; | |
1250 } | |
1251 } | |
1252 | |
1253 | |
1254 /* Copy glyph row structure FROM to glyph row structure TO, except | |
1255 that glyph pointers in the structures are left unchanged. */ | |
1256 | |
1257 INLINE void | |
1258 copy_row_except_pointers (to, from) | |
1259 struct glyph_row *to, *from; | |
1260 { | |
1261 struct glyph *pointers[1 + LAST_AREA]; | |
1262 | |
1263 /* Save glyph pointers of TO. */ | |
1264 bcopy (to->glyphs, pointers, sizeof to->glyphs); | |
1265 | |
1266 /* Do a structure assignment. */ | |
1267 *to = *from; | |
1268 | |
1269 /* Restore original pointers of TO. */ | |
1270 bcopy (pointers, to->glyphs, sizeof to->glyphs); | |
1271 } | |
1272 | |
1273 | |
1274 /* Copy contents of glyph row FROM to glyph row TO. Glyph pointers in | |
1275 TO and FROM are left unchanged. Glyph contents are copied from the | |
1276 glyph memory of FROM to the glyph memory of TO. Increment buffer | |
1277 positions in row TO by DELTA/ DELTA_BYTES. */ | |
1278 | |
1279 void | |
1280 copy_glyph_row_contents (to, from, delta, delta_bytes) | |
1281 struct glyph_row *to, *from; | |
1282 int delta, delta_bytes; | |
1283 { | |
1284 int area; | |
1285 | |
1286 /* This is like a structure assignment TO = FROM, except that | |
1287 glyph pointers in the rows are left unchanged. */ | |
1288 copy_row_except_pointers (to, from); | |
1289 | |
1290 /* Copy glyphs from FROM to TO. */ | |
1291 for (area = 0; area < LAST_AREA; ++area) | |
1292 if (from->used[area]) | |
1293 bcopy (from->glyphs[area], to->glyphs[area], | |
1294 from->used[area] * sizeof (struct glyph)); | |
1295 | |
1296 /* Increment buffer positions in TO by DELTA. */ | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
1297 increment_row_positions (to, delta, delta_bytes); |
25012 | 1298 } |
1299 | |
1300 | |
1301 /* Assign glyph row FROM to glyph row TO. This works like a structure | |
1302 assignment TO = FROM, except that glyph pointers are not copied but | |
1303 exchanged between TO and FROM. Pointers must be exchanged to avoid | |
1304 a memory leak. */ | |
1305 | |
1306 static INLINE void | |
1307 assign_row (to, from) | |
1308 struct glyph_row *to, *from; | |
1309 { | |
1310 swap_glyph_pointers (to, from); | |
1311 copy_row_except_pointers (to, from); | |
1312 } | |
1313 | |
1314 | |
1315 /* Test whether the glyph memory of the glyph row WINDOW_ROW, which is | |
1316 a row in a window matrix, is a slice of the glyph memory of the | |
1317 glyph row FRAME_ROW which is a row in a frame glyph matrix. Value | |
1318 is non-zero if the glyph memory of WINDOW_ROW is part of the glyph | |
1319 memory of FRAME_ROW. */ | |
1320 | |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
1321 #if GLYPH_DEBUG |
30323
4cd1b8fe118c
(direct_output_for_insert): Remove confusing
Gerd Moellmann <gerd@gnu.org>
parents:
30307
diff
changeset
|
1322 |
25012 | 1323 static int |
1324 glyph_row_slice_p (window_row, frame_row) | |
1325 struct glyph_row *window_row, *frame_row; | |
1326 { | |
1327 struct glyph *window_glyph_start = window_row->glyphs[0]; | |
1328 struct glyph *frame_glyph_start = frame_row->glyphs[0]; | |
1329 struct glyph *frame_glyph_end = frame_row->glyphs[LAST_AREA]; | |
1330 | |
1331 return (frame_glyph_start <= window_glyph_start | |
1332 && window_glyph_start < frame_glyph_end); | |
1333 } | |
1334 | |
30323
4cd1b8fe118c
(direct_output_for_insert): Remove confusing
Gerd Moellmann <gerd@gnu.org>
parents:
30307
diff
changeset
|
1335 #endif /* GLYPH_DEBUG */ |
25012 | 1336 |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1337 #if 0 |
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1338 |
25012 | 1339 /* Find the row in the window glyph matrix WINDOW_MATRIX being a slice |
1340 of ROW in the frame matrix FRAME_MATRIX. Value is null if no row | |
1341 in WINDOW_MATRIX is found satisfying the condition. */ | |
1342 | |
1343 static struct glyph_row * | |
1344 find_glyph_row_slice (window_matrix, frame_matrix, row) | |
1345 struct glyph_matrix *window_matrix, *frame_matrix; | |
1346 int row; | |
1347 { | |
1348 int i; | |
1349 | |
1350 xassert (row >= 0 && row < frame_matrix->nrows); | |
1351 | |
1352 for (i = 0; i < window_matrix->nrows; ++i) | |
1353 if (glyph_row_slice_p (window_matrix->rows + i, | |
1354 frame_matrix->rows + row)) | |
1355 break; | |
1356 | |
1357 return i < window_matrix->nrows ? window_matrix->rows + i : 0; | |
1358 } | |
1359 | |
29336
5ccfe8a1638f
(find_glyph_row_slice, swap_glyphs_in_rows): Put in #if 0.
Gerd Moellmann <gerd@gnu.org>
parents:
28708
diff
changeset
|
1360 #endif /* 0 */ |
25012 | 1361 |
1362 /* Prepare ROW for display. Desired rows are cleared lazily, | |
1363 i.e. they are only marked as to be cleared by setting their | |
1364 enabled_p flag to zero. When a row is to be displayed, a prior | |
1365 call to this function really clears it. */ | |
1366 | |
1367 void | |
1368 prepare_desired_row (row) | |
1369 struct glyph_row *row; | |
1370 { | |
1371 if (!row->enabled_p) | |
1372 { | |
1373 clear_glyph_row (row); | |
1374 row->enabled_p = 1; | |
1375 } | |
1376 } | |
1377 | |
1378 | |
1379 /* Return a hash code for glyph row ROW. */ | |
1380 | |
1381 int | |
1382 line_hash_code (row) | |
1383 struct glyph_row *row; | |
1384 { | |
1385 int hash = 0; | |
1386 | |
1387 if (row->enabled_p) | |
1388 { | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1389 struct glyph *glyph = row->glyphs[TEXT_AREA]; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1390 struct glyph *end = glyph + row->used[TEXT_AREA]; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1391 |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1392 while (glyph < end) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1393 { |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1394 int c = glyph->u.ch; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1395 int face_id = glyph->face_id; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1396 if (must_write_spaces) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1397 c -= SPACEGLYPH; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1398 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + c; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1399 hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + face_id; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1400 ++glyph; |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1401 } |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1402 |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1403 if (hash == 0) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
1404 hash = 1; |
25012 | 1405 } |
1406 | |
1407 return hash; | |
1408 } | |
1409 | |
1410 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1411 /* Return the cost of drawing line VPOS in MATRIX. The cost equals |
25012 | 1412 the number of characters in the line. If must_write_spaces is |
1413 zero, leading and trailing spaces are ignored. */ | |
1414 | |
1415 static unsigned int | |
1416 line_draw_cost (matrix, vpos) | |
1417 struct glyph_matrix *matrix; | |
1418 int vpos; | |
1419 { | |
1420 struct glyph_row *row = matrix->rows + vpos; | |
1421 struct glyph *beg = row->glyphs[TEXT_AREA]; | |
1422 struct glyph *end = beg + row->used[TEXT_AREA]; | |
1423 int len; | |
1424 Lisp_Object *glyph_table_base = GLYPH_TABLE_BASE; | |
1425 int glyph_table_len = GLYPH_TABLE_LENGTH; | |
1426 | |
1427 /* Ignore trailing and leading spaces if we can. */ | |
1428 if (!must_write_spaces) | |
1429 { | |
1430 /* Skip from the end over trailing spaces. */ | |
34203
e55480843a8e
(scrolling_window): Fix code inserting runs in list of all runs.
Gerd Moellmann <gerd@gnu.org>
parents:
33763
diff
changeset
|
1431 while (end > beg && CHAR_GLYPH_SPACE_P (*(end - 1))) |
25012 | 1432 --end; |
1433 | |
1434 /* All blank line. */ | |
1435 if (end == beg) | |
1436 return 0; | |
1437 | |
1438 /* Skip over leading spaces. */ | |
1439 while (CHAR_GLYPH_SPACE_P (*beg)) | |
1440 ++beg; | |
1441 } | |
1442 | |
1443 /* If we don't have a glyph-table, each glyph is one character, | |
1444 so return the number of glyphs. */ | |
1445 if (glyph_table_base == 0) | |
1446 len = end - beg; | |
1447 else | |
1448 { | |
1449 /* Otherwise, scan the glyphs and accumulate their total length | |
1450 in LEN. */ | |
1451 len = 0; | |
1452 while (beg < end) | |
1453 { | |
1454 GLYPH g = GLYPH_FROM_CHAR_GLYPH (*beg); | |
1455 | |
26998
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
1456 if (g < 0 |
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
1457 || GLYPH_SIMPLE_P (glyph_table_base, glyph_table_len, g)) |
25012 | 1458 len += 1; |
1459 else | |
1460 len += GLYPH_LENGTH (glyph_table_base, g); | |
1461 | |
1462 ++beg; | |
1463 } | |
1464 } | |
1465 | |
1466 return len; | |
1467 } | |
1468 | |
1469 | |
1470 /* Test two glyph rows A and B for equality. Value is non-zero if A | |
1471 and B have equal contents. W is the window to which the glyphs | |
1472 rows A and B belong. It is needed here to test for partial row | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1473 visibility. MOUSE_FACE_P non-zero means compare the mouse_face_p |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1474 flags of A and B, too. */ |
25012 | 1475 |
1476 static INLINE int | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1477 row_equal_p (w, a, b, mouse_face_p) |
25012 | 1478 struct window *w; |
1479 struct glyph_row *a, *b; | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1480 int mouse_face_p; |
25012 | 1481 { |
1482 if (a == b) | |
1483 return 1; | |
1484 else if (a->hash != b->hash) | |
1485 return 0; | |
1486 else | |
1487 { | |
1488 struct glyph *a_glyph, *b_glyph, *a_end; | |
1489 int area; | |
1490 | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1491 if (mouse_face_p && a->mouse_face_p != b->mouse_face_p) |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1492 return 0; |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
1493 |
25012 | 1494 /* Compare glyphs. */ |
1495 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area) | |
1496 { | |
1497 if (a->used[area] != b->used[area]) | |
1498 return 0; | |
1499 | |
1500 a_glyph = a->glyphs[area]; | |
1501 a_end = a_glyph + a->used[area]; | |
1502 b_glyph = b->glyphs[area]; | |
1503 | |
1504 while (a_glyph < a_end | |
1505 && GLYPH_EQUAL_P (a_glyph, b_glyph)) | |
1506 ++a_glyph, ++b_glyph; | |
1507 | |
1508 if (a_glyph != a_end) | |
1509 return 0; | |
1510 } | |
1511 | |
1512 if (a->truncated_on_left_p != b->truncated_on_left_p | |
1513 || a->fill_line_p != b->fill_line_p | |
1514 || a->truncated_on_right_p != b->truncated_on_right_p | |
1515 || a->overlay_arrow_p != b->overlay_arrow_p | |
1516 || a->continued_p != b->continued_p | |
1517 || a->indicate_empty_line_p != b->indicate_empty_line_p | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1518 || a->overlapped_p != b->overlapped_p |
25012 | 1519 || (MATRIX_ROW_CONTINUATION_LINE_P (a) |
1520 != MATRIX_ROW_CONTINUATION_LINE_P (b)) | |
1521 /* Different partially visible characters on left margin. */ | |
1522 || a->x != b->x | |
1523 /* Different height. */ | |
1524 || a->ascent != b->ascent | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1525 || a->phys_ascent != b->phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
1526 || a->phys_height != b->phys_height |
25012 | 1527 || a->visible_height != b->visible_height) |
1528 return 0; | |
1529 } | |
1530 | |
1531 return 1; | |
1532 } | |
1533 | |
1534 | |
314 | 1535 |
25012 | 1536 /*********************************************************************** |
1537 Glyph Pool | |
1538 | |
1539 See dispextern.h for an overall explanation of glyph pools. | |
1540 ***********************************************************************/ | |
1541 | |
1542 /* Allocate a glyph_pool structure. The structure returned is | |
1543 initialized with zeros. The global variable glyph_pool_count is | |
1544 incremented for each pool allocated. */ | |
1545 | |
1546 static struct glyph_pool * | |
1547 new_glyph_pool () | |
1548 { | |
1549 struct glyph_pool *result; | |
1550 | |
1551 /* Allocate a new glyph_pool and clear it. */ | |
1552 result = (struct glyph_pool *) xmalloc (sizeof *result); | |
1553 bzero (result, sizeof *result); | |
1554 | |
1555 /* For memory leak and double deletion checking. */ | |
1556 ++glyph_pool_count; | |
1557 | |
1558 return result; | |
1559 } | |
1560 | |
1561 | |
1562 /* Free a glyph_pool structure POOL. The function may be called with | |
1563 a null POOL pointer. The global variable glyph_pool_count is | |
1564 decremented with every pool structure freed. If this count gets | |
1565 negative, more structures were freed than allocated, i.e. one | |
1566 structure must have been freed more than once or a bogus pointer | |
1567 was passed to free_glyph_pool. */ | |
1568 | |
1569 static void | |
1570 free_glyph_pool (pool) | |
1571 struct glyph_pool *pool; | |
1572 { | |
1573 if (pool) | |
1574 { | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1575 /* More freed than allocated? */ |
25012 | 1576 --glyph_pool_count; |
1577 xassert (glyph_pool_count >= 0); | |
1578 | |
1579 xfree (pool->glyphs); | |
1580 xfree (pool); | |
1581 } | |
1582 } | |
1583 | |
1584 | |
1585 /* Enlarge a glyph pool POOL. MATRIX_DIM gives the number of rows and | |
1586 columns we need. This function never shrinks a pool. The only | |
1587 case in which this would make sense, would be when a frame's size | |
1588 is changed from a large value to a smaller one. But, if someone | |
1589 does it once, we can expect that he will do it again. | |
1590 | |
1591 Value is non-zero if the pool changed in a way which makes | |
1592 re-adjusting window glyph matrices necessary. */ | |
1593 | |
1594 static int | |
1595 realloc_glyph_pool (pool, matrix_dim) | |
1596 struct glyph_pool *pool; | |
1597 struct dim matrix_dim; | |
1598 { | |
1599 int needed; | |
1600 int changed_p; | |
1601 | |
1602 changed_p = (pool->glyphs == 0 | |
1603 || matrix_dim.height != pool->nrows | |
1604 || matrix_dim.width != pool->ncolumns); | |
1605 | |
1606 /* Enlarge the glyph pool. */ | |
1607 needed = matrix_dim.width * matrix_dim.height; | |
1608 if (needed > pool->nglyphs) | |
1609 { | |
1610 int size = needed * sizeof (struct glyph); | |
1611 | |
1612 if (pool->glyphs) | |
1613 pool->glyphs = (struct glyph *) xrealloc (pool->glyphs, size); | |
1614 else | |
1615 { | |
1616 pool->glyphs = (struct glyph *) xmalloc (size); | |
1617 bzero (pool->glyphs, size); | |
1618 } | |
1619 | |
1620 pool->nglyphs = needed; | |
1621 } | |
1622 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1623 /* Remember the number of rows and columns because (a) we use them |
25012 | 1624 to do sanity checks, and (b) the number of columns determines |
1625 where rows in the frame matrix start---this must be available to | |
1626 determine pointers to rows of window sub-matrices. */ | |
1627 pool->nrows = matrix_dim.height; | |
1628 pool->ncolumns = matrix_dim.width; | |
1629 | |
1630 return changed_p; | |
1631 } | |
1632 | |
1633 | |
1634 | |
1635 /*********************************************************************** | |
1636 Debug Code | |
1637 ***********************************************************************/ | |
1638 | |
1639 #if GLYPH_DEBUG | |
1640 | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1641 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1642 /* Flush standard output. This is sometimes useful to call from |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1643 the debugger. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1644 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1645 void |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1646 flush_stdout () |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1647 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1648 fflush (stdout); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1649 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1650 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
1651 |
25012 | 1652 /* Check that no glyph pointers have been lost in MATRIX. If a |
1653 pointer has been lost, e.g. by using a structure assignment between | |
1654 rows, at least one pointer must occur more than once in the rows of | |
1655 MATRIX. */ | |
1656 | |
1657 void | |
1658 check_matrix_pointer_lossage (matrix) | |
1659 struct glyph_matrix *matrix; | |
1660 { | |
1661 int i, j; | |
1662 | |
1663 for (i = 0; i < matrix->nrows; ++i) | |
1664 for (j = 0; j < matrix->nrows; ++j) | |
1665 xassert (i == j | |
1666 || (matrix->rows[i].glyphs[TEXT_AREA] | |
1667 != matrix->rows[j].glyphs[TEXT_AREA])); | |
1668 } | |
1669 | |
1670 | |
1671 /* Get a pointer to glyph row ROW in MATRIX, with bounds checks. */ | |
1672 | |
1673 struct glyph_row * | |
1674 matrix_row (matrix, row) | |
1675 struct glyph_matrix *matrix; | |
1676 int row; | |
1677 { | |
1678 xassert (matrix && matrix->rows); | |
1679 xassert (row >= 0 && row < matrix->nrows); | |
1680 | |
1681 /* That's really too slow for normal testing because this function | |
1682 is called almost everywhere. Although---it's still astonishingly | |
1683 fast, so it is valuable to have for debugging purposes. */ | |
314 | 1684 #if 0 |
25012 | 1685 check_matrix_pointer_lossage (matrix); |
1686 #endif | |
1687 | |
1688 return matrix->rows + row; | |
1689 } | |
1690 | |
1691 | |
1692 #if 0 /* This function makes invalid assumptions when text is | |
1693 partially invisible. But it might come handy for debugging | |
1694 nevertheless. */ | |
1695 | |
1696 /* Check invariants that must hold for an up to date current matrix of | |
1697 window W. */ | |
1698 | |
1699 static void | |
1700 check_matrix_invariants (w) | |
314 | 1701 struct window *w; |
1702 { | |
25012 | 1703 struct glyph_matrix *matrix = w->current_matrix; |
1704 int yb = window_text_bottom_y (w); | |
1705 struct glyph_row *row = matrix->rows; | |
1706 struct glyph_row *last_text_row = NULL; | |
1707 struct buffer *saved = current_buffer; | |
1708 struct buffer *buffer = XBUFFER (w->buffer); | |
1709 int c; | |
1710 | |
1711 /* This can sometimes happen for a fresh window. */ | |
1712 if (matrix->nrows < 2) | |
1713 return; | |
1714 | |
1715 set_buffer_temp (buffer); | |
1716 | |
1717 /* Note: last row is always reserved for the mode line. */ | |
1718 while (MATRIX_ROW_DISPLAYS_TEXT_P (row) | |
1719 && MATRIX_ROW_BOTTOM_Y (row) < yb) | |
1720 { | |
1721 struct glyph_row *next = row + 1; | |
1722 | |
1723 if (MATRIX_ROW_DISPLAYS_TEXT_P (row)) | |
1724 last_text_row = row; | |
1725 | |
1726 /* Check that character and byte positions are in sync. */ | |
1727 xassert (MATRIX_ROW_START_BYTEPOS (row) | |
1728 == CHAR_TO_BYTE (MATRIX_ROW_START_CHARPOS (row))); | |
1729 | |
1730 /* CHAR_TO_BYTE aborts when invoked for a position > Z. We can | |
1731 have such a position temporarily in case of a minibuffer | |
1732 displaying something like `[Sole completion]' at its end. */ | |
1733 if (MATRIX_ROW_END_CHARPOS (row) < BUF_ZV (current_buffer)) | |
1734 xassert (MATRIX_ROW_END_BYTEPOS (row) | |
1735 == CHAR_TO_BYTE (MATRIX_ROW_END_CHARPOS (row))); | |
1736 | |
1737 /* Check that end position of `row' is equal to start position | |
1738 of next row. */ | |
1739 if (next->enabled_p && MATRIX_ROW_DISPLAYS_TEXT_P (next)) | |
1740 { | |
1741 xassert (MATRIX_ROW_END_CHARPOS (row) | |
1742 == MATRIX_ROW_START_CHARPOS (next)); | |
1743 xassert (MATRIX_ROW_END_BYTEPOS (row) | |
1744 == MATRIX_ROW_START_BYTEPOS (next)); | |
1745 } | |
1746 row = next; | |
1747 } | |
1748 | |
1749 xassert (w->current_matrix->nrows == w->desired_matrix->nrows); | |
1750 xassert (w->desired_matrix->rows != NULL); | |
1751 set_buffer_temp (saved); | |
1752 } | |
1753 | |
1754 #endif /* 0 */ | |
1755 | |
1756 #endif /* GLYPH_DEBUG != 0 */ | |
1757 | |
1758 | |
1759 | |
1760 /********************************************************************** | |
1761 Allocating/ Adjusting Glyph Matrices | |
1762 **********************************************************************/ | |
1763 | |
1764 /* Allocate glyph matrices over a window tree for a frame-based | |
1765 redisplay | |
1766 | |
1767 X and Y are column/row within the frame glyph matrix where | |
1768 sub-matrices for the window tree rooted at WINDOW must be | |
1769 allocated. CH_DIM contains the dimensions of the smallest | |
1770 character that could be used during display. DIM_ONLY_P non-zero | |
1771 means that the caller of this function is only interested in the | |
1772 result matrix dimension, and matrix adjustments should not be | |
1773 performed. | |
1774 | |
1775 The function returns the total width/height of the sub-matrices of | |
1776 the window tree. If called on a frame root window, the computation | |
1777 will take the mini-buffer window into account. | |
1778 | |
1779 *WINDOW_CHANGE_FLAGS is set to a bit mask with bits | |
1780 | |
1781 NEW_LEAF_MATRIX set if any window in the tree did not have a | |
1782 glyph matrices yet, and | |
1783 | |
1784 CHANGED_LEAF_MATRIX set if the dimension or location of a matrix of | |
1785 any window in the tree will be changed or have been changed (see | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1786 DIM_ONLY_P) |
25012 | 1787 |
1788 *WINDOW_CHANGE_FLAGS must be initialized by the caller of this | |
1789 function. | |
1790 | |
1791 Windows are arranged into chains of windows on the same level | |
1792 through the next fields of window structures. Such a level can be | |
1793 either a sequence of horizontally adjacent windows from left to | |
1794 right, or a sequence of vertically adjacent windows from top to | |
1795 bottom. Each window in a horizontal sequence can be either a leaf | |
1796 window or a vertical sequence; a window in a vertical sequence can | |
1797 be either a leaf or a horizontal sequence. All windows in a | |
1798 horizontal sequence have the same height, and all windows in a | |
1799 vertical sequence have the same width. | |
1800 | |
1801 This function uses, for historical reasons, a more general | |
1802 algorithm to determine glyph matrix dimensions that would be | |
1803 necessary. | |
1804 | |
1805 The matrix height of a horizontal sequence is determined by the | |
1806 maximum height of any matrix in the sequence. The matrix width of | |
1807 a horizontal sequence is computed by adding up matrix widths of | |
1808 windows in the sequence. | |
1809 | |
1810 |<------- result width ------->| | |
1811 +---------+----------+---------+ --- | |
1812 | | | | | | |
1813 | | | | | |
1814 +---------+ | | result height | |
1815 | +---------+ | |
1816 | | | | |
1817 +----------+ --- | |
1818 | |
1819 The matrix width of a vertical sequence is the maximum matrix width | |
1820 of any window in the sequence. Its height is computed by adding up | |
1821 matrix heights of windows in the sequence. | |
1822 | |
1823 |<---- result width -->| | |
1824 +---------+ --- | |
1825 | | | | |
1826 | | | | |
1827 +---------+--+ | | |
1828 | | | | |
1829 | | result height | |
1830 | | | |
1831 +------------+---------+ | | |
1832 | | | | |
1833 | | | | |
1834 +------------+---------+ --- */ | |
1835 | |
1836 /* Bit indicating that a new matrix will be allocated or has been | |
1837 allocated. */ | |
1838 | |
1839 #define NEW_LEAF_MATRIX (1 << 0) | |
1840 | |
1841 /* Bit indicating that a matrix will or has changed its location or | |
1842 size. */ | |
1843 | |
1844 #define CHANGED_LEAF_MATRIX (1 << 1) | |
1845 | |
1846 static struct dim | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1847 allocate_matrices_for_frame_redisplay (window, x, y, dim_only_p, |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1848 window_change_flags) |
25012 | 1849 Lisp_Object window; |
1850 int x, y; | |
1851 int dim_only_p; | |
1852 int *window_change_flags; | |
1853 { | |
1854 struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (window))); | |
1855 int x0 = x, y0 = y; | |
1856 int wmax = 0, hmax = 0; | |
1857 struct dim total; | |
1858 struct dim dim; | |
1859 struct window *w; | |
1860 int in_horz_combination_p; | |
1861 | |
1862 /* What combination is WINDOW part of? Compute this once since the | |
1863 result is the same for all windows in the `next' chain. The | |
1864 special case of a root window (parent equal to nil) is treated | |
1865 like a vertical combination because a root window's `next' | |
1866 points to the mini-buffer window, if any, which is arranged | |
1867 vertically below other windows. */ | |
1868 in_horz_combination_p | |
1869 = (!NILP (XWINDOW (window)->parent) | |
1870 && !NILP (XWINDOW (XWINDOW (window)->parent)->hchild)); | |
1871 | |
1872 /* For WINDOW and all windows on the same level. */ | |
1873 do | |
1874 { | |
1875 w = XWINDOW (window); | |
1876 | |
1877 /* Get the dimension of the window sub-matrix for W, depending | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1878 on whether this is a combination or a leaf window. */ |
25012 | 1879 if (!NILP (w->hchild)) |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1880 dim = allocate_matrices_for_frame_redisplay (w->hchild, x, y, |
25012 | 1881 dim_only_p, |
1882 window_change_flags); | |
1883 else if (!NILP (w->vchild)) | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1884 dim = allocate_matrices_for_frame_redisplay (w->vchild, x, y, |
25012 | 1885 dim_only_p, |
1886 window_change_flags); | |
1887 else | |
1888 { | |
1889 /* If not already done, allocate sub-matrix structures. */ | |
1890 if (w->desired_matrix == NULL) | |
1891 { | |
1892 w->desired_matrix = new_glyph_matrix (f->desired_pool); | |
1893 w->current_matrix = new_glyph_matrix (f->current_pool); | |
1894 *window_change_flags |= NEW_LEAF_MATRIX; | |
1895 } | |
1896 | |
1897 /* Width and height MUST be chosen so that there are no | |
1898 holes in the frame matrix. */ | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1899 dim.width = required_matrix_width (w); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1900 dim.height = required_matrix_height (w); |
25012 | 1901 |
1902 /* Will matrix be re-allocated? */ | |
1903 if (x != w->desired_matrix->matrix_x | |
1904 || y != w->desired_matrix->matrix_y | |
1905 || dim.width != w->desired_matrix->matrix_w | |
1906 || dim.height != w->desired_matrix->matrix_h | |
1907 || (margin_glyphs_to_reserve (w, dim.width, | |
1908 w->right_margin_width) | |
1909 != w->desired_matrix->left_margin_glyphs) | |
1910 || (margin_glyphs_to_reserve (w, dim.width, | |
1911 w->left_margin_width) | |
1912 != w->desired_matrix->right_margin_glyphs)) | |
1913 *window_change_flags |= CHANGED_LEAF_MATRIX; | |
1914 | |
1915 /* Actually change matrices, if allowed. Do not consider | |
1916 CHANGED_LEAF_MATRIX computed above here because the pool | |
1917 may have been changed which we don't now here. We trust | |
1918 that we only will be called with DIM_ONLY_P != 0 when | |
1919 necessary. */ | |
1920 if (!dim_only_p) | |
1921 { | |
1922 adjust_glyph_matrix (w, w->desired_matrix, x, y, dim); | |
1923 adjust_glyph_matrix (w, w->current_matrix, x, y, dim); | |
1924 } | |
1925 } | |
1926 | |
1927 /* If we are part of a horizontal combination, advance x for | |
1928 windows to the right of W; otherwise advance y for windows | |
1929 below W. */ | |
1930 if (in_horz_combination_p) | |
1931 x += dim.width; | |
1932 else | |
1933 y += dim.height; | |
1934 | |
1935 /* Remember maximum glyph matrix dimensions. */ | |
1936 wmax = max (wmax, dim.width); | |
1937 hmax = max (hmax, dim.height); | |
1938 | |
1939 /* Next window on same level. */ | |
1940 window = w->next; | |
1941 } | |
1942 while (!NILP (window)); | |
1943 | |
1944 /* Set `total' to the total glyph matrix dimension of this window | |
1945 level. In a vertical combination, the width is the width of the | |
1946 widest window; the height is the y we finally reached, corrected | |
1947 by the y we started with. In a horizontal combination, the total | |
1948 height is the height of the tallest window, and the width is the | |
1949 x we finally reached, corrected by the x we started with. */ | |
1950 if (in_horz_combination_p) | |
1951 { | |
1952 total.width = x - x0; | |
1953 total.height = hmax; | |
1954 } | |
1955 else | |
1956 { | |
1957 total.width = wmax; | |
1958 total.height = y - y0; | |
1959 } | |
1960 | |
1961 return total; | |
1962 } | |
1963 | |
1964 | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1965 /* Return the required height of glyph matrices for window W. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1966 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1967 int |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1968 required_matrix_height (w) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1969 struct window *w; |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1970 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1971 #ifdef HAVE_WINDOW_SYSTEM |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1972 struct frame *f = XFRAME (w->frame); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1973 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1974 if (FRAME_WINDOW_P (f)) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1975 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1976 int ch_height = FRAME_SMALLEST_FONT_HEIGHT (f); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1977 int window_pixel_height = window_box_height (w) + abs (w->vscroll); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1978 return (((window_pixel_height + ch_height - 1) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1979 / ch_height) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1980 /* One partially visible line at the top and |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1981 bottom of the window. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1982 + 2 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
1983 /* 2 for header and mode line. */ |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1984 + 2); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1985 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1986 #endif /* HAVE_WINDOW_SYSTEM */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1987 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1988 return XINT (w->height); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1989 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1990 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1991 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1992 /* Return the required width of glyph matrices for window W. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1993 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1994 int |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1995 required_matrix_width (w) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1996 struct window *w; |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1997 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1998 #ifdef HAVE_WINDOW_SYSTEM |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
1999 struct frame *f = XFRAME (w->frame); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2000 if (FRAME_WINDOW_P (f)) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2001 { |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2002 int ch_width = FRAME_SMALLEST_CHAR_WIDTH (f); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2003 int window_pixel_width = XFLOATINT (w->width) * CANON_X_UNIT (f); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2004 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2005 /* Compute number of glyphs needed in a glyph row. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2006 return (((window_pixel_width + ch_width - 1) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2007 / ch_width) |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2008 /* 2 partially visible columns in the text area. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2009 + 2 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2010 /* One partially visible column at the right |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2011 edge of each marginal area. */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2012 + 1 + 1); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2013 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2014 #endif /* HAVE_WINDOW_SYSTEM */ |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2015 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2016 return XINT (w->width); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2017 } |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2018 |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2019 |
25012 | 2020 /* Allocate window matrices for window-based redisplay. W is the |
2021 window whose matrices must be allocated/reallocated. CH_DIM is the | |
2022 size of the smallest character that could potentially be used on W. */ | |
2023 | |
2024 static void | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2025 allocate_matrices_for_window_redisplay (w) |
25012 | 2026 struct window *w; |
2027 { | |
2028 while (w) | |
314 | 2029 { |
25012 | 2030 if (!NILP (w->vchild)) |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2031 allocate_matrices_for_window_redisplay (XWINDOW (w->vchild)); |
25012 | 2032 else if (!NILP (w->hchild)) |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2033 allocate_matrices_for_window_redisplay (XWINDOW (w->hchild)); |
25012 | 2034 else |
314 | 2035 { |
25012 | 2036 /* W is a leaf window. */ |
2037 struct dim dim; | |
2038 | |
2039 /* If matrices are not yet allocated, allocate them now. */ | |
2040 if (w->desired_matrix == NULL) | |
314 | 2041 { |
25012 | 2042 w->desired_matrix = new_glyph_matrix (NULL); |
2043 w->current_matrix = new_glyph_matrix (NULL); | |
314 | 2044 } |
25012 | 2045 |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2046 dim.width = required_matrix_width (w); |
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2047 dim.height = required_matrix_height (w); |
25012 | 2048 adjust_glyph_matrix (w, w->desired_matrix, 0, 0, dim); |
2049 adjust_glyph_matrix (w, w->current_matrix, 0, 0, dim); | |
2050 } | |
2051 | |
2052 w = NILP (w->next) ? NULL : XWINDOW (w->next); | |
2053 } | |
2054 } | |
2055 | |
2056 | |
2057 /* Re-allocate/ re-compute glyph matrices on frame F. If F is null, | |
2058 do it for all frames; otherwise do it just for the given frame. | |
2059 This function must be called when a new frame is created, its size | |
2060 changes, or its window configuration changes. */ | |
2061 | |
2062 void | |
2063 adjust_glyphs (f) | |
2064 struct frame *f; | |
2065 { | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2066 /* Block input so that expose events and other events that access |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2067 glyph matrices are not processed while we are changing them. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2068 BLOCK_INPUT; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2069 |
25012 | 2070 if (f) |
2071 adjust_frame_glyphs (f); | |
2072 else | |
2073 { | |
2074 Lisp_Object tail, lisp_frame; | |
2075 | |
2076 FOR_EACH_FRAME (tail, lisp_frame) | |
2077 adjust_frame_glyphs (XFRAME (lisp_frame)); | |
2078 } | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2079 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
2080 UNBLOCK_INPUT; |
25012 | 2081 } |
2082 | |
2083 | |
2084 /* Adjust frame glyphs when Emacs is initialized. | |
2085 | |
2086 To be called from init_display. | |
2087 | |
2088 We need a glyph matrix because redraw will happen soon. | |
2089 Unfortunately, window sizes on selected_frame are not yet set to | |
2090 meaningful values. I believe we can assume that there are only two | |
2091 windows on the frame---the mini-buffer and the root window. Frame | |
2092 height and width seem to be correct so far. So, set the sizes of | |
2093 windows to estimated values. */ | |
2094 | |
2095 static void | |
2096 adjust_frame_glyphs_initially () | |
2097 { | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2098 struct frame *sf = SELECTED_FRAME (); |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2099 struct window *root = XWINDOW (sf->root_window); |
25012 | 2100 struct window *mini = XWINDOW (root->next); |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2101 int frame_height = FRAME_HEIGHT (sf); |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2102 int frame_width = FRAME_WIDTH (sf); |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2103 int top_margin = FRAME_TOP_MARGIN (sf); |
25012 | 2104 |
2105 /* Do it for the root window. */ | |
2106 XSETFASTINT (root->top, top_margin); | |
2107 XSETFASTINT (root->width, frame_width); | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2108 set_window_height (sf->root_window, frame_height - 1 - top_margin, 0); |
25012 | 2109 |
2110 /* Do it for the mini-buffer window. */ | |
2111 XSETFASTINT (mini->top, frame_height - 1); | |
2112 XSETFASTINT (mini->width, frame_width); | |
2113 set_window_height (root->next, 1, 0); | |
2114 | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
2115 adjust_frame_glyphs (sf); |
25012 | 2116 glyphs_initialized_initially_p = 1; |
2117 } | |
2118 | |
2119 | |
2120 /* Allocate/reallocate glyph matrices of a single frame F. */ | |
2121 | |
2122 static void | |
2123 adjust_frame_glyphs (f) | |
2124 struct frame *f; | |
2125 { | |
2126 if (FRAME_WINDOW_P (f)) | |
2127 adjust_frame_glyphs_for_window_redisplay (f); | |
2128 else | |
2129 adjust_frame_glyphs_for_frame_redisplay (f); | |
2130 | |
2131 /* Don't forget the message buffer and the buffer for | |
2132 decode_mode_spec. */ | |
2133 adjust_frame_message_buffer (f); | |
2134 adjust_decode_mode_spec_buffer (f); | |
2135 | |
2136 f->glyphs_initialized_p = 1; | |
2137 } | |
2138 | |
2139 | |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2140 /* In the window tree with root W, build current matrices of leaf |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2141 windows from the frame's current matrix. */ |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2142 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2143 static void |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2144 fake_current_matrices (window) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2145 Lisp_Object window; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2146 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2147 struct window *w; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2148 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2149 for (; !NILP (window); window = w->next) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2150 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2151 w = XWINDOW (window); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2152 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2153 if (!NILP (w->hchild)) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2154 fake_current_matrices (w->hchild); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2155 else if (!NILP (w->vchild)) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2156 fake_current_matrices (w->vchild); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2157 else |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2158 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2159 int i; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2160 struct frame *f = XFRAME (w->frame); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2161 struct glyph_matrix *m = w->current_matrix; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2162 struct glyph_matrix *fm = f->current_matrix; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2163 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2164 xassert (m->matrix_h == XFASTINT (w->height)); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2165 xassert (m->matrix_w == XFASTINT (w->width)); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2166 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2167 for (i = 0; i < m->matrix_h; ++i) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2168 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2169 struct glyph_row *r = m->rows + i; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2170 struct glyph_row *fr = fm->rows + i + XFASTINT (w->top); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2171 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2172 xassert (r->glyphs[TEXT_AREA] >= fr->glyphs[TEXT_AREA] |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2173 && r->glyphs[LAST_AREA] <= fr->glyphs[LAST_AREA]); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2174 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2175 r->enabled_p = fr->enabled_p; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2176 if (r->enabled_p) |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2177 { |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2178 r->used[LEFT_MARGIN_AREA] = m->left_margin_glyphs; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2179 r->used[RIGHT_MARGIN_AREA] = m->right_margin_glyphs; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2180 r->used[TEXT_AREA] = (m->matrix_w |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2181 - r->used[LEFT_MARGIN_AREA] |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2182 - r->used[RIGHT_MARGIN_AREA]); |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2183 r->mode_line_p = 0; |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2184 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2185 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2186 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2187 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2188 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2189 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2190 |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2191 /* Save away the contents of frame F's current frame matrix. Value is |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
2192 a glyph matrix holding the contents of F's current frame matrix. */ |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2193 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2194 static struct glyph_matrix * |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2195 save_current_matrix (f) |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2196 struct frame *f; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2197 { |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2198 int i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2199 struct glyph_matrix *saved; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2200 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2201 saved = (struct glyph_matrix *) xmalloc (sizeof *saved); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2202 bzero (saved, sizeof *saved); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2203 saved->nrows = f->current_matrix->nrows; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2204 saved->rows = (struct glyph_row *) xmalloc (saved->nrows |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2205 * sizeof *saved->rows); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2206 bzero (saved->rows, saved->nrows * sizeof *saved->rows); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2207 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2208 for (i = 0; i < saved->nrows; ++i) |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2209 { |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2210 struct glyph_row *from = f->current_matrix->rows + i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2211 struct glyph_row *to = saved->rows + i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2212 size_t nbytes = from->used[TEXT_AREA] * sizeof (struct glyph); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2213 to->glyphs[TEXT_AREA] = (struct glyph *) xmalloc (nbytes); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2214 bcopy (from->glyphs[TEXT_AREA], to->glyphs[TEXT_AREA], nbytes); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2215 to->used[TEXT_AREA] = from->used[TEXT_AREA]; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2216 } |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2217 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2218 return saved; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2219 } |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2220 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2221 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2222 /* Restore the contents of frame F's current frame matrix from SAVED, |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2223 and free memory associated with SAVED. */ |
34849
eac70be4cb58
(save_frame_matrix, restore_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34788
diff
changeset
|
2224 |
eac70be4cb58
(save_frame_matrix, restore_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34788
diff
changeset
|
2225 static void |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2226 restore_current_matrix (f, saved) |
34849
eac70be4cb58
(save_frame_matrix, restore_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34788
diff
changeset
|
2227 struct frame *f; |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2228 struct glyph_matrix *saved; |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2229 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2230 int i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2231 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2232 for (i = 0; i < saved->nrows; ++i) |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2233 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2234 struct glyph_row *from = saved->rows + i; |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2235 struct glyph_row *to = f->current_matrix->rows + i; |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2236 size_t nbytes = from->used[TEXT_AREA] * sizeof (struct glyph); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2237 bcopy (from->glyphs[TEXT_AREA], to->glyphs[TEXT_AREA], nbytes); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2238 to->used[TEXT_AREA] = from->used[TEXT_AREA]; |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2239 xfree (from->glyphs[TEXT_AREA]); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2240 } |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2241 |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2242 xfree (saved->rows); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2243 xfree (saved); |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2244 } |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2245 |
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2246 |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2247 |
25012 | 2248 /* Allocate/reallocate glyph matrices of a single frame F for |
2249 frame-based redisplay. */ | |
2250 | |
2251 static void | |
2252 adjust_frame_glyphs_for_frame_redisplay (f) | |
2253 struct frame *f; | |
2254 { | |
2255 struct dim ch_dim; | |
2256 struct dim matrix_dim; | |
2257 int pool_changed_p; | |
2258 int window_change_flags; | |
2259 int top_window_y; | |
2260 | |
2261 if (!FRAME_LIVE_P (f)) | |
2262 return; | |
2263 | |
2264 /* Determine the smallest character in any font for F. On | |
2265 console windows, all characters have dimension (1, 1). */ | |
2266 ch_dim.width = ch_dim.height = 1; | |
2267 | |
2268 top_window_y = FRAME_TOP_MARGIN (f); | |
2269 | |
2270 /* Allocate glyph pool structures if not already done. */ | |
2271 if (f->desired_pool == NULL) | |
2272 { | |
2273 f->desired_pool = new_glyph_pool (); | |
2274 f->current_pool = new_glyph_pool (); | |
2275 } | |
2276 | |
2277 /* Allocate frames matrix structures if needed. */ | |
2278 if (f->desired_matrix == NULL) | |
2279 { | |
2280 f->desired_matrix = new_glyph_matrix (f->desired_pool); | |
2281 f->current_matrix = new_glyph_matrix (f->current_pool); | |
2282 } | |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2283 |
25012 | 2284 /* Compute window glyph matrices. (This takes the mini-buffer |
2285 window into account). The result is the size of the frame glyph | |
2286 matrix needed. The variable window_change_flags is set to a bit | |
2287 mask indicating whether new matrices will be allocated or | |
2288 existing matrices change their size or location within the frame | |
2289 matrix. */ | |
2290 window_change_flags = 0; | |
2291 matrix_dim | |
2292 = allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f), | |
2293 0, top_window_y, | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2294 1, |
25012 | 2295 &window_change_flags); |
2296 | |
2297 /* Add in menu bar lines, if any. */ | |
2298 matrix_dim.height += top_window_y; | |
2299 | |
2300 /* Enlarge pools as necessary. */ | |
2301 pool_changed_p = realloc_glyph_pool (f->desired_pool, matrix_dim); | |
2302 realloc_glyph_pool (f->current_pool, matrix_dim); | |
2303 | |
2304 /* Set up glyph pointers within window matrices. Do this only if | |
2305 absolutely necessary since it requires a frame redraw. */ | |
2306 if (pool_changed_p || window_change_flags) | |
2307 { | |
2308 /* Do it for window matrices. */ | |
2309 allocate_matrices_for_frame_redisplay (FRAME_ROOT_WINDOW (f), | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2310 0, top_window_y, 0, |
25012 | 2311 &window_change_flags); |
2312 | |
2313 /* Size of frame matrices must equal size of frame. Note | |
2314 that we are called for X frames with window widths NOT equal | |
2315 to the frame width (from CHANGE_FRAME_SIZE_1). */ | |
2316 xassert (matrix_dim.width == FRAME_WIDTH (f) | |
2317 && matrix_dim.height == FRAME_HEIGHT (f)); | |
2318 | |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2319 /* Pointers to glyph memory in glyph rows are exchanged during |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2320 the update phase of redisplay, which means in general that a |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2321 frame's current matrix consists of pointers into both the |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2322 desired and current glyph pool of the frame. Adjusting a |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2323 matrix sets the frame matrix up so that pointers are all into |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2324 the same pool. If we want to preserve glyph contents of the |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2325 current matrix over a call to adjust_glyph_matrix, we must |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2326 make a copy of the current glyphs, and restore the current |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2327 matrix' contents from that copy. */ |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2328 if (display_completed |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2329 && !FRAME_GARBAGED_P (f) |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2330 && matrix_dim.width == f->current_matrix->matrix_w |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2331 && matrix_dim.height == f->current_matrix->matrix_h) |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2332 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2333 struct glyph_matrix *copy = save_current_matrix (f); |
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2334 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2335 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim); |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2336 restore_current_matrix (f, copy); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2337 fake_current_matrices (FRAME_ROOT_WINDOW (f)); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2338 } |
34736
51a0fe34dfc6
(fake_current_matrices, ensure_frame_matrix): New
Gerd Moellmann <gerd@gnu.org>
parents:
34715
diff
changeset
|
2339 else |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2340 { |
35307
8e3c6f1a31ab
(save_or_restore_current_matrices): Function removed.
Gerd Moellmann <gerd@gnu.org>
parents:
35269
diff
changeset
|
2341 adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim); |
34788
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2342 adjust_glyph_matrix (NULL, f->current_matrix, 0, 0, matrix_dim); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2343 SET_FRAME_GARBAGED (f); |
9512f05b60d1
(ensure_frame_matrix): Removed.
Gerd Moellmann <gerd@gnu.org>
parents:
34736
diff
changeset
|
2344 } |
25012 | 2345 } |
2346 } | |
2347 | |
2348 | |
2349 /* Allocate/reallocate glyph matrices of a single frame F for | |
2350 window-based redisplay. */ | |
2351 | |
2352 static void | |
2353 adjust_frame_glyphs_for_window_redisplay (f) | |
2354 struct frame *f; | |
2355 { | |
2356 struct dim ch_dim; | |
2357 struct window *w; | |
2358 | |
2359 xassert (FRAME_WINDOW_P (f) && FRAME_LIVE_P (f)); | |
2360 | |
2361 /* Get minimum sizes. */ | |
2362 #ifdef HAVE_WINDOW_SYSTEM | |
2363 ch_dim.width = FRAME_SMALLEST_CHAR_WIDTH (f); | |
2364 ch_dim.height = FRAME_SMALLEST_FONT_HEIGHT (f); | |
2365 #else | |
2366 ch_dim.width = ch_dim.height = 1; | |
2367 #endif | |
2368 | |
2369 /* Allocate/reallocate window matrices. */ | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2370 allocate_matrices_for_window_redisplay (XWINDOW (FRAME_ROOT_WINDOW (f))); |
25012 | 2371 |
2372 /* Allocate/ reallocate matrices of the dummy window used to display | |
2373 the menu bar under X when no X toolkit support is available. */ | |
49322 | 2374 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) |
25012 | 2375 { |
2376 /* Allocate a dummy window if not already done. */ | |
2377 if (NILP (f->menu_bar_window)) | |
2378 { | |
2379 f->menu_bar_window = make_window (); | |
2380 w = XWINDOW (f->menu_bar_window); | |
2381 XSETFRAME (w->frame, f); | |
2382 w->pseudo_window_p = 1; | |
2383 } | |
2384 else | |
2385 w = XWINDOW (f->menu_bar_window); | |
2386 | |
2387 /* Set window dimensions to frame dimensions and allocate or | |
2388 adjust glyph matrices of W. */ | |
2389 XSETFASTINT (w->top, 0); | |
2390 XSETFASTINT (w->left, 0); | |
2391 XSETFASTINT (w->height, FRAME_MENU_BAR_LINES (f)); | |
2392 XSETFASTINT (w->width, FRAME_WINDOW_WIDTH (f)); | |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2393 allocate_matrices_for_window_redisplay (w); |
25012 | 2394 } |
2395 #endif /* not USE_X_TOOLKIT */ | |
2396 | |
49322 | 2397 #ifndef USE_GTK |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2398 /* Allocate/ reallocate matrices of the tool bar window. If we |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2399 don't have a tool bar window yet, make one. */ |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2400 if (NILP (f->tool_bar_window)) |
25012 | 2401 { |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2402 f->tool_bar_window = make_window (); |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2403 w = XWINDOW (f->tool_bar_window); |
25012 | 2404 XSETFRAME (w->frame, f); |
2405 w->pseudo_window_p = 1; | |
2406 } | |
2407 else | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2408 w = XWINDOW (f->tool_bar_window); |
25012 | 2409 |
2410 XSETFASTINT (w->top, FRAME_MENU_BAR_LINES (f)); | |
2411 XSETFASTINT (w->left, 0); | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2412 XSETFASTINT (w->height, FRAME_TOOL_BAR_LINES (f)); |
25012 | 2413 XSETFASTINT (w->width, FRAME_WINDOW_WIDTH (f)); |
39448
b74c165ef22f
(required_matrix_width, required_matrix_height): New
Gerd Moellmann <gerd@gnu.org>
parents:
39254
diff
changeset
|
2414 allocate_matrices_for_window_redisplay (w); |
49322 | 2415 #endif |
25012 | 2416 } |
2417 | |
2418 | |
2419 /* Adjust/ allocate message buffer of frame F. | |
2420 | |
2421 Note that the message buffer is never freed. Since I could not | |
2422 find a free in 19.34, I assume that freeing it would be | |
2423 problematic in some way and don't do it either. | |
2424 | |
2425 (Implementation note: It should be checked if we can free it | |
2426 eventually without causing trouble). */ | |
2427 | |
2428 static void | |
2429 adjust_frame_message_buffer (f) | |
2430 struct frame *f; | |
2431 { | |
2432 int size = FRAME_MESSAGE_BUF_SIZE (f) + 1; | |
2433 | |
2434 if (FRAME_MESSAGE_BUF (f)) | |
2435 { | |
2436 char *buffer = FRAME_MESSAGE_BUF (f); | |
2437 char *new_buffer = (char *) xrealloc (buffer, size); | |
2438 FRAME_MESSAGE_BUF (f) = new_buffer; | |
2439 } | |
2440 else | |
2441 FRAME_MESSAGE_BUF (f) = (char *) xmalloc (size); | |
2442 } | |
2443 | |
2444 | |
2445 /* Re-allocate buffer for decode_mode_spec on frame F. */ | |
2446 | |
2447 static void | |
2448 adjust_decode_mode_spec_buffer (f) | |
2449 struct frame *f; | |
2450 { | |
2451 f->decode_mode_spec_buffer | |
2452 = (char *) xrealloc (f->decode_mode_spec_buffer, | |
2453 FRAME_MESSAGE_BUF_SIZE (f) + 1); | |
2454 } | |
2455 | |
2456 | |
2457 | |
2458 /********************************************************************** | |
2459 Freeing Glyph Matrices | |
2460 **********************************************************************/ | |
2461 | |
2462 /* Free glyph memory for a frame F. F may be null. This function can | |
2463 be called for the same frame more than once. The root window of | |
2464 F may be nil when this function is called. This is the case when | |
2465 the function is called when F is destroyed. */ | |
2466 | |
2467 void | |
2468 free_glyphs (f) | |
2469 struct frame *f; | |
2470 { | |
2471 if (f && f->glyphs_initialized_p) | |
2472 { | |
27968
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2473 /* Block interrupt input so that we don't get surprised by an X |
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2474 event while we're in an inconsistent state. */ |
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2475 BLOCK_INPUT; |
25012 | 2476 f->glyphs_initialized_p = 0; |
2477 | |
2478 /* Release window sub-matrices. */ | |
2479 if (!NILP (f->root_window)) | |
2480 free_window_matrices (XWINDOW (f->root_window)); | |
2481 | |
2482 /* Free the dummy window for menu bars without X toolkit and its | |
2483 glyph matrices. */ | |
2484 if (!NILP (f->menu_bar_window)) | |
2485 { | |
2486 struct window *w = XWINDOW (f->menu_bar_window); | |
2487 free_glyph_matrix (w->desired_matrix); | |
2488 free_glyph_matrix (w->current_matrix); | |
2489 w->desired_matrix = w->current_matrix = NULL; | |
2490 f->menu_bar_window = Qnil; | |
2491 } | |
2492 | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2493 /* Free the tool bar window and its glyph matrices. */ |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2494 if (!NILP (f->tool_bar_window)) |
25012 | 2495 { |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2496 struct window *w = XWINDOW (f->tool_bar_window); |
25012 | 2497 free_glyph_matrix (w->desired_matrix); |
2498 free_glyph_matrix (w->current_matrix); | |
2499 w->desired_matrix = w->current_matrix = NULL; | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
2500 f->tool_bar_window = Qnil; |
25012 | 2501 } |
2502 | |
2503 /* Release frame glyph matrices. Reset fields to zero in | |
2504 case we are called a second time. */ | |
2505 if (f->desired_matrix) | |
2506 { | |
2507 free_glyph_matrix (f->desired_matrix); | |
2508 free_glyph_matrix (f->current_matrix); | |
2509 f->desired_matrix = f->current_matrix = NULL; | |
2510 } | |
2511 | |
2512 /* Release glyph pools. */ | |
2513 if (f->desired_pool) | |
2514 { | |
2515 free_glyph_pool (f->desired_pool); | |
2516 free_glyph_pool (f->current_pool); | |
2517 f->desired_pool = f->current_pool = NULL; | |
314 | 2518 } |
27968
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2519 |
7634011b93f3
(free_glyphs): Block input while freeing matrices.
Gerd Moellmann <gerd@gnu.org>
parents:
27855
diff
changeset
|
2520 UNBLOCK_INPUT; |
314 | 2521 } |
2522 } | |
2523 | |
25012 | 2524 |
2525 /* Free glyph sub-matrices in the window tree rooted at W. This | |
2526 function may be called with a null pointer, and it may be called on | |
2527 the same tree more than once. */ | |
2528 | |
2529 void | |
2530 free_window_matrices (w) | |
2531 struct window *w; | |
2532 { | |
2533 while (w) | |
2534 { | |
2535 if (!NILP (w->hchild)) | |
2536 free_window_matrices (XWINDOW (w->hchild)); | |
2537 else if (!NILP (w->vchild)) | |
2538 free_window_matrices (XWINDOW (w->vchild)); | |
2539 else | |
2540 { | |
2541 /* This is a leaf window. Free its memory and reset fields | |
2542 to zero in case this function is called a second time for | |
2543 W. */ | |
2544 free_glyph_matrix (w->current_matrix); | |
2545 free_glyph_matrix (w->desired_matrix); | |
2546 w->current_matrix = w->desired_matrix = NULL; | |
2547 } | |
2548 | |
2549 /* Next window on same level. */ | |
2550 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
2551 } | |
2552 } | |
2553 | |
2554 | |
2555 /* Check glyph memory leaks. This function is called from | |
2556 shut_down_emacs. Note that frames are not destroyed when Emacs | |
2557 exits. We therefore free all glyph memory for all active frames | |
2558 explicitly and check that nothing is left allocated. */ | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2559 |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2560 void |
25012 | 2561 check_glyph_memory () |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2562 { |
25012 | 2563 Lisp_Object tail, frame; |
2564 | |
2565 /* Free glyph memory for all frames. */ | |
2566 FOR_EACH_FRAME (tail, frame) | |
2567 free_glyphs (XFRAME (frame)); | |
2568 | |
2569 /* Check that nothing is left allocated. */ | |
2570 if (glyph_matrix_count) | |
2571 abort (); | |
2572 if (glyph_pool_count) | |
2573 abort (); | |
2574 } | |
2575 | |
2576 | |
2577 | |
2578 /********************************************************************** | |
2579 Building a Frame Matrix | |
2580 **********************************************************************/ | |
2581 | |
2582 /* Most of the redisplay code works on glyph matrices attached to | |
2583 windows. This is a good solution most of the time, but it is not | |
2584 suitable for terminal code. Terminal output functions cannot rely | |
2585 on being able to set an arbitrary terminal window. Instead they | |
2586 must be provided with a view of the whole frame, i.e. the whole | |
2587 screen. We build such a view by constructing a frame matrix from | |
2588 window matrices in this section. | |
2589 | |
2590 Windows that must be updated have their must_be_update_p flag set. | |
2591 For all such windows, their desired matrix is made part of the | |
2592 desired frame matrix. For other windows, their current matrix is | |
2593 made part of the desired frame matrix. | |
2594 | |
2595 +-----------------+----------------+ | |
2596 | desired | desired | | |
2597 | | | | |
2598 +-----------------+----------------+ | |
2599 | current | | |
2600 | | | |
2601 +----------------------------------+ | |
2602 | |
2603 Desired window matrices can be made part of the frame matrix in a | |
2604 cheap way: We exploit the fact that the desired frame matrix and | |
2605 desired window matrices share their glyph memory. This is not | |
2606 possible for current window matrices. Their glyphs are copied to | |
2607 the desired frame matrix. The latter is equivalent to | |
2608 preserve_other_columns in the old redisplay. | |
2609 | |
2610 Used glyphs counters for frame matrix rows are the result of adding | |
2611 up glyph lengths of the window matrices. A line in the frame | |
2612 matrix is enabled, if a corresponding line in a window matrix is | |
2613 enabled. | |
2614 | |
2615 After building the desired frame matrix, it will be passed to | |
2616 terminal code, which will manipulate both the desired and current | |
2617 frame matrix. Changes applied to the frame's current matrix have | |
2618 to be visible in current window matrices afterwards, of course. | |
2619 | |
2620 This problem is solved like this: | |
2621 | |
2622 1. Window and frame matrices share glyphs. Window matrices are | |
2623 constructed in a way that their glyph contents ARE the glyph | |
2624 contents needed in a frame matrix. Thus, any modification of | |
2625 glyphs done in terminal code will be reflected in window matrices | |
2626 automatically. | |
2627 | |
2628 2. Exchanges of rows in a frame matrix done by terminal code are | |
2629 intercepted by hook functions so that corresponding row operations | |
2630 on window matrices can be performed. This is necessary because we | |
2631 use pointers to glyphs in glyph row structures. To satisfy the | |
2632 assumption of point 1 above that glyphs are updated implicitly in | |
2633 window matrices when they are manipulated via the frame matrix, | |
2634 window and frame matrix must of course agree where to find the | |
2635 glyphs for their rows. Possible manipulations that must be | |
2636 mirrored are assignments of rows of the desired frame matrix to the | |
2637 current frame matrix and scrolling the current frame matrix. */ | |
2638 | |
2639 /* Build frame F's desired matrix from window matrices. Only windows | |
2640 which have the flag must_be_updated_p set have to be updated. Menu | |
2641 bar lines of a frame are not covered by window matrices, so make | |
2642 sure not to touch them in this function. */ | |
2643 | |
2644 static void | |
2645 build_frame_matrix (f) | |
2646 struct frame *f; | |
2647 { | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2648 int i; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2649 |
25012 | 2650 /* F must have a frame matrix when this function is called. */ |
2651 xassert (!FRAME_WINDOW_P (f)); | |
2652 | |
2653 /* Clear all rows in the frame matrix covered by window matrices. | |
2654 Menu bar lines are not covered by windows. */ | |
2655 for (i = FRAME_TOP_MARGIN (f); i < f->desired_matrix->nrows; ++i) | |
2656 clear_glyph_row (MATRIX_ROW (f->desired_matrix, i)); | |
2657 | |
2658 /* Build the matrix by walking the window tree. */ | |
2659 build_frame_matrix_from_window_tree (f->desired_matrix, | |
2660 XWINDOW (FRAME_ROOT_WINDOW (f))); | |
2661 } | |
2662 | |
2663 | |
2664 /* Walk a window tree, building a frame matrix MATRIX from window | |
2665 matrices. W is the root of a window tree. */ | |
2666 | |
2667 static void | |
2668 build_frame_matrix_from_window_tree (matrix, w) | |
2669 struct glyph_matrix *matrix; | |
2670 struct window *w; | |
2671 { | |
2672 while (w) | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2673 { |
25012 | 2674 if (!NILP (w->hchild)) |
2675 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->hchild)); | |
2676 else if (!NILP (w->vchild)) | |
2677 build_frame_matrix_from_window_tree (matrix, XWINDOW (w->vchild)); | |
2678 else | |
2679 build_frame_matrix_from_leaf_window (matrix, w); | |
2680 | |
2681 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2682 } |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
2683 } |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2684 |
25012 | 2685 |
2686 /* Add a window's matrix to a frame matrix. FRAME_MATRIX is the | |
2687 desired frame matrix built. W is a leaf window whose desired or | |
2688 current matrix is to be added to FRAME_MATRIX. W's flag | |
2689 must_be_updated_p determines which matrix it contributes to | |
2690 FRAME_MATRIX. If must_be_updated_p is non-zero, W's desired matrix | |
2691 is added to FRAME_MATRIX, otherwise W's current matrix is added. | |
2692 Adding a desired matrix means setting up used counters and such in | |
2693 frame rows, while adding a current window matrix to FRAME_MATRIX | |
2694 means copying glyphs. The latter case corresponds to | |
2695 preserve_other_columns in the old redisplay. */ | |
2696 | |
2697 static void | |
2698 build_frame_matrix_from_leaf_window (frame_matrix, w) | |
2699 struct glyph_matrix *frame_matrix; | |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2700 struct window *w; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2701 { |
25012 | 2702 struct glyph_matrix *window_matrix; |
2703 int window_y, frame_y; | |
2704 /* If non-zero, a glyph to insert at the right border of W. */ | |
2705 GLYPH right_border_glyph = 0; | |
2706 | |
2707 /* Set window_matrix to the matrix we have to add to FRAME_MATRIX. */ | |
2708 if (w->must_be_updated_p) | |
2709 { | |
2710 window_matrix = w->desired_matrix; | |
2711 | |
2712 /* Decide whether we want to add a vertical border glyph. */ | |
2713 if (!WINDOW_RIGHTMOST_P (w)) | |
2714 { | |
2715 struct Lisp_Char_Table *dp = window_display_table (w); | |
2716 right_border_glyph = (dp && INTEGERP (DISP_BORDER_GLYPH (dp)) | |
2717 ? XINT (DISP_BORDER_GLYPH (dp)) | |
2718 : '|'); | |
2719 } | |
2720 } | |
2721 else | |
2722 window_matrix = w->current_matrix; | |
2723 | |
2724 /* For all rows in the window matrix and corresponding rows in the | |
2725 frame matrix. */ | |
2726 window_y = 0; | |
2727 frame_y = window_matrix->matrix_y; | |
2728 while (window_y < window_matrix->nrows) | |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2729 { |
25012 | 2730 struct glyph_row *frame_row = frame_matrix->rows + frame_y; |
2731 struct glyph_row *window_row = window_matrix->rows + window_y; | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2732 int current_row_p = window_matrix == w->current_matrix; |
25012 | 2733 |
2734 /* Fill up the frame row with spaces up to the left margin of the | |
2735 window row. */ | |
2736 fill_up_frame_row_with_spaces (frame_row, window_matrix->matrix_x); | |
2737 | |
2738 /* Fill up areas in the window matrix row with spaces. */ | |
2739 fill_up_glyph_row_with_spaces (window_row); | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2740 |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2741 /* If only part of W's desired matrix has been built, and |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2742 window_row wasn't displayed, use the corresponding current |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2743 row instead. */ |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2744 if (window_matrix == w->desired_matrix |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2745 && !window_row->enabled_p) |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
2746 { |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2747 window_row = w->current_matrix->rows + window_y; |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2748 current_row_p = 1; |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2749 } |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2750 |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2751 if (current_row_p) |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2752 { |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2753 /* Copy window row to frame row. */ |
25012 | 2754 bcopy (window_row->glyphs[0], |
2755 frame_row->glyphs[TEXT_AREA] + window_matrix->matrix_x, | |
2756 window_matrix->matrix_w * sizeof (struct glyph)); | |
2757 } | |
2758 else | |
2759 { | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2760 xassert (window_row->enabled_p); |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2761 |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2762 /* Only when a desired row has been displayed, we want |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2763 the corresponding frame row to be updated. */ |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2764 frame_row->enabled_p = 1; |
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
2765 |
25012 | 2766 /* Maybe insert a vertical border between horizontally adjacent |
2767 windows. */ | |
2768 if (right_border_glyph) | |
2769 { | |
2770 struct glyph *border = window_row->glyphs[LAST_AREA] - 1; | |
2771 SET_CHAR_GLYPH_FROM_GLYPH (*border, right_border_glyph); | |
2772 } | |
2773 | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2774 /* Window row window_y must be a slice of frame row |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2775 frame_y. */ |
25012 | 2776 xassert (glyph_row_slice_p (window_row, frame_row)); |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
2777 |
25012 | 2778 /* If rows are in sync, we don't have to copy glyphs because |
2779 frame and window share glyphs. */ | |
25241
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2780 |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2781 #if GLYPH_DEBUG |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2782 strcpy (w->current_matrix->method, w->desired_matrix->method); |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
2783 add_window_display_history (w, w->current_matrix->method, 0); |
25241
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2784 #endif |
25012 | 2785 } |
2786 | |
2787 /* Set number of used glyphs in the frame matrix. Since we fill | |
2788 up with spaces, and visit leaf windows from left to right it | |
2789 can be done simply. */ | |
2790 frame_row->used[TEXT_AREA] | |
2791 = window_matrix->matrix_x + window_matrix->matrix_w; | |
2792 | |
2793 /* Next row. */ | |
2794 ++window_y; | |
2795 ++frame_y; | |
2796 } | |
2797 } | |
2798 | |
2799 | |
2800 /* Add spaces to a glyph row ROW in a window matrix. | |
2801 | |
2802 Each row has the form: | |
2803 | |
2804 +---------+-----------------------------+------------+ | |
2805 | left | text | right | | |
2806 +---------+-----------------------------+------------+ | |
2807 | |
2808 Left and right marginal areas are optional. This function adds | |
2809 spaces to areas so that there are no empty holes between areas. | |
2810 In other words: If the right area is not empty, the text area | |
2811 is filled up with spaces up to the right area. If the text area | |
2812 is not empty, the left area is filled up. | |
2813 | |
2814 To be called for frame-based redisplay, only. */ | |
2815 | |
2816 static void | |
2817 fill_up_glyph_row_with_spaces (row) | |
2818 struct glyph_row *row; | |
2819 { | |
2820 fill_up_glyph_row_area_with_spaces (row, LEFT_MARGIN_AREA); | |
2821 fill_up_glyph_row_area_with_spaces (row, TEXT_AREA); | |
2822 fill_up_glyph_row_area_with_spaces (row, RIGHT_MARGIN_AREA); | |
2823 } | |
2824 | |
2825 | |
2826 /* Fill area AREA of glyph row ROW with spaces. To be called for | |
2827 frame-based redisplay only. */ | |
2828 | |
2829 static void | |
2830 fill_up_glyph_row_area_with_spaces (row, area) | |
2831 struct glyph_row *row; | |
2832 int area; | |
2833 { | |
2834 if (row->glyphs[area] < row->glyphs[area + 1]) | |
2835 { | |
2836 struct glyph *end = row->glyphs[area + 1]; | |
2837 struct glyph *text = row->glyphs[area] + row->used[area]; | |
2838 | |
2839 while (text < end) | |
2840 *text++ = space_glyph; | |
2841 row->used[area] = text - row->glyphs[area]; | |
2842 } | |
2843 } | |
2844 | |
2845 | |
2846 /* Add spaces to the end of ROW in a frame matrix until index UPTO is | |
2847 reached. In frame matrices only one area, TEXT_AREA, is used. */ | |
2848 | |
2849 static void | |
2850 fill_up_frame_row_with_spaces (row, upto) | |
2851 struct glyph_row *row; | |
2852 int upto; | |
2853 { | |
2854 int i = row->used[TEXT_AREA]; | |
2855 struct glyph *glyph = row->glyphs[TEXT_AREA]; | |
2856 | |
2857 while (i < upto) | |
2858 glyph[i++] = space_glyph; | |
2859 | |
2860 row->used[TEXT_AREA] = i; | |
2861 } | |
2862 | |
2863 | |
2864 | |
2865 /********************************************************************** | |
2866 Mirroring operations on frame matrices in window matrices | |
2867 **********************************************************************/ | |
2868 | |
2869 /* Set frame being updated via frame-based redisplay to F. This | |
2870 function must be called before updates to make explicit that we are | |
2871 working on frame matrices or not. */ | |
2872 | |
2873 static INLINE void | |
2874 set_frame_matrix_frame (f) | |
2875 struct frame *f; | |
2876 { | |
2877 frame_matrix_frame = f; | |
2878 } | |
2879 | |
2880 | |
2881 /* Make sure glyph row ROW in CURRENT_MATRIX is up to date. | |
2882 DESIRED_MATRIX is the desired matrix corresponding to | |
2883 CURRENT_MATRIX. The update is done by exchanging glyph pointers | |
2884 between rows in CURRENT_MATRIX and DESIRED_MATRIX. If | |
2885 frame_matrix_frame is non-null, this indicates that the exchange is | |
2886 done in frame matrices, and that we have to perform analogous | |
2887 operations in window matrices of frame_matrix_frame. */ | |
2888 | |
2889 static INLINE void | |
2890 make_current (desired_matrix, current_matrix, row) | |
2891 struct glyph_matrix *desired_matrix, *current_matrix; | |
2892 int row; | |
2893 { | |
2894 struct glyph_row *current_row = MATRIX_ROW (current_matrix, row); | |
2895 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, row); | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
2896 int mouse_face_p = current_row->mouse_face_p; |
25012 | 2897 |
2898 /* Do current_row = desired_row. This exchanges glyph pointers | |
2899 between both rows, and does a structure assignment otherwise. */ | |
2900 assign_row (current_row, desired_row); | |
2901 | |
2902 /* Enable current_row to mark it as valid. */ | |
2903 current_row->enabled_p = 1; | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
2904 current_row->mouse_face_p = mouse_face_p; |
25012 | 2905 |
2906 /* If we are called on frame matrices, perform analogous operations | |
2907 for window matrices. */ | |
2908 if (frame_matrix_frame) | |
2909 mirror_make_current (XWINDOW (frame_matrix_frame->root_window), row); | |
2910 } | |
2911 | |
2912 | |
2913 /* W is the root of a window tree. FRAME_ROW is the index of a row in | |
2914 W's frame which has been made current (by swapping pointers between | |
2915 current and desired matrix). Perform analogous operations in the | |
2916 matrices of leaf windows in the window tree rooted at W. */ | |
2917 | |
2918 static void | |
2919 mirror_make_current (w, frame_row) | |
2920 struct window *w; | |
2921 int frame_row; | |
2922 { | |
2923 while (w) | |
2924 { | |
2925 if (!NILP (w->hchild)) | |
2926 mirror_make_current (XWINDOW (w->hchild), frame_row); | |
2927 else if (!NILP (w->vchild)) | |
2928 mirror_make_current (XWINDOW (w->vchild), frame_row); | |
2929 else | |
2930 { | |
2931 /* Row relative to window W. Don't use FRAME_TO_WINDOW_VPOS | |
2932 here because the checks performed in debug mode there | |
2933 will not allow the conversion. */ | |
2934 int row = frame_row - w->desired_matrix->matrix_y; | |
2935 | |
2936 /* If FRAME_ROW is within W, assign the desired row to the | |
2937 current row (exchanging glyph pointers). */ | |
2938 if (row >= 0 && row < w->desired_matrix->matrix_h) | |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
2939 { |
25012 | 2940 struct glyph_row *current_row |
2941 = MATRIX_ROW (w->current_matrix, row); | |
2942 struct glyph_row *desired_row | |
2943 = MATRIX_ROW (w->desired_matrix, row); | |
25241
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2944 |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2945 if (desired_row->enabled_p) |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2946 assign_row (current_row, desired_row); |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2947 else |
35674d7c4136
(mirror_make_current): If desired row isn't enabled,
Gerd Moellmann <gerd@gnu.org>
parents:
25190
diff
changeset
|
2948 swap_glyph_pointers (desired_row, current_row); |
25012 | 2949 current_row->enabled_p = 1; |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
2950 } |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
2951 } |
25012 | 2952 |
2953 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2954 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
2955 } |
25012 | 2956 |
2957 | |
2958 /* Perform row dance after scrolling. We are working on the range of | |
2959 lines UNCHANGED_AT_TOP + 1 to UNCHANGED_AT_TOP + NLINES (not | |
2960 including) in MATRIX. COPY_FROM is a vector containing, for each | |
2961 row I in the range 0 <= I < NLINES, the index of the original line | |
2962 to move to I. This index is relative to the row range, i.e. 0 <= | |
2963 index < NLINES. RETAINED_P is a vector containing zero for each | |
2964 row 0 <= I < NLINES which is empty. | |
2965 | |
2966 This function is called from do_scrolling and do_direct_scrolling. */ | |
2967 | |
2968 void | |
2969 mirrored_line_dance (matrix, unchanged_at_top, nlines, copy_from, | |
2970 retained_p) | |
2971 struct glyph_matrix *matrix; | |
2972 int unchanged_at_top, nlines; | |
2973 int *copy_from; | |
2974 char *retained_p; | |
2975 { | |
2976 /* A copy of original rows. */ | |
2977 struct glyph_row *old_rows; | |
2978 | |
2979 /* Rows to assign to. */ | |
2980 struct glyph_row *new_rows = MATRIX_ROW (matrix, unchanged_at_top); | |
2981 | |
2982 int i; | |
2983 | |
2984 /* Make a copy of the original rows. */ | |
2985 old_rows = (struct glyph_row *) alloca (nlines * sizeof *old_rows); | |
2986 bcopy (new_rows, old_rows, nlines * sizeof *old_rows); | |
2987 | |
2988 /* Assign new rows, maybe clear lines. */ | |
2989 for (i = 0; i < nlines; ++i) | |
2990 { | |
2991 int enabled_before_p = new_rows[i].enabled_p; | |
2992 | |
2993 xassert (i + unchanged_at_top < matrix->nrows); | |
2994 xassert (unchanged_at_top + copy_from[i] < matrix->nrows); | |
2995 new_rows[i] = old_rows[copy_from[i]]; | |
2996 new_rows[i].enabled_p = enabled_before_p; | |
2997 | |
2998 /* RETAINED_P is zero for empty lines. */ | |
2999 if (!retained_p[copy_from[i]]) | |
3000 new_rows[i].enabled_p = 0; | |
3001 } | |
3002 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3003 /* Do the same for window matrices, if MATRIX is a frame matrix. */ |
25012 | 3004 if (frame_matrix_frame) |
3005 mirror_line_dance (XWINDOW (frame_matrix_frame->root_window), | |
3006 unchanged_at_top, nlines, copy_from, retained_p); | |
3007 } | |
3008 | |
3009 | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3010 /* Synchronize glyph pointers in the current matrix of window W with |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3011 the current frame matrix. */ |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3012 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3013 static void |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3014 sync_window_with_frame_matrix_rows (w) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3015 struct window *w; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3016 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3017 struct frame *f = XFRAME (w->frame); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3018 struct glyph_row *window_row, *window_row_end, *frame_row; |
40271
ae4848857075
(sync_window_with_frame_matrix_rows): Remove unused variable `area'.
Pavel Janík <Pavel@Janik.cz>
parents:
40214
diff
changeset
|
3019 int left, right, x, width; |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3020 |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3021 /* Preconditions: W must be a leaf window on a tty frame. */ |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3022 xassert (NILP (w->hchild) && NILP (w->vchild)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3023 xassert (!FRAME_WINDOW_P (f)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3024 |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3025 left = margin_glyphs_to_reserve (w, 1, w->left_margin_width); |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3026 right = margin_glyphs_to_reserve (w, 1, w->right_margin_width); |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3027 x = w->current_matrix->matrix_x; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3028 width = w->current_matrix->matrix_w; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3029 |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3030 window_row = w->current_matrix->rows; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3031 window_row_end = window_row + w->current_matrix->nrows; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3032 frame_row = f->current_matrix->rows + XFASTINT (w->top); |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3033 |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3034 for (; window_row < window_row_end; ++window_row, ++frame_row) |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3035 { |
40214
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3036 window_row->glyphs[LEFT_MARGIN_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3037 = frame_row->glyphs[0] + x; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3038 window_row->glyphs[TEXT_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3039 = window_row->glyphs[LEFT_MARGIN_AREA] + left; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3040 window_row->glyphs[LAST_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3041 = window_row->glyphs[LEFT_MARGIN_AREA] + width; |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3042 window_row->glyphs[RIGHT_MARGIN_AREA] |
a87bf217f5a6
(sync_window_with_frame_matrix_rows): Fix
Gerd Moellmann <gerd@gnu.org>
parents:
40075
diff
changeset
|
3043 = window_row->glyphs[LAST_AREA] - right; |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3044 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3045 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3046 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3047 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3048 /* Return the window in the window tree rooted in W containing frame |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3049 row ROW. Value is null if none is found. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3050 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3051 struct window * |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3052 frame_row_to_window (w, row) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3053 struct window *w; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3054 int row; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3055 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3056 struct window *found = NULL; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3057 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3058 while (w && !found) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3059 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3060 if (!NILP (w->hchild)) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3061 found = frame_row_to_window (XWINDOW (w->hchild), row); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3062 else if (!NILP (w->vchild)) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3063 found = frame_row_to_window (XWINDOW (w->vchild), row); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3064 else if (row >= XFASTINT (w->top) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3065 && row < XFASTINT (w->top) + XFASTINT (w->height)) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3066 found = w; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3067 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3068 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3069 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3070 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3071 return found; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3072 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3073 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3074 |
25012 | 3075 /* Perform a line dance in the window tree rooted at W, after |
3076 scrolling a frame matrix in mirrored_line_dance. | |
3077 | |
3078 We are working on the range of lines UNCHANGED_AT_TOP + 1 to | |
3079 UNCHANGED_AT_TOP + NLINES (not including) in W's frame matrix. | |
3080 COPY_FROM is a vector containing, for each row I in the range 0 <= | |
3081 I < NLINES, the index of the original line to move to I. This | |
3082 index is relative to the row range, i.e. 0 <= index < NLINES. | |
3083 RETAINED_P is a vector containing zero for each row 0 <= I < NLINES | |
3084 which is empty. */ | |
3085 | |
3086 static void | |
3087 mirror_line_dance (w, unchanged_at_top, nlines, copy_from, retained_p) | |
3088 struct window *w; | |
3089 int unchanged_at_top, nlines; | |
3090 int *copy_from; | |
3091 char *retained_p; | |
3092 { | |
3093 while (w) | |
3094 { | |
3095 if (!NILP (w->hchild)) | |
3096 mirror_line_dance (XWINDOW (w->hchild), unchanged_at_top, | |
3097 nlines, copy_from, retained_p); | |
3098 else if (!NILP (w->vchild)) | |
3099 mirror_line_dance (XWINDOW (w->vchild), unchanged_at_top, | |
3100 nlines, copy_from, retained_p); | |
3101 else | |
3102 { | |
3103 /* W is a leaf window, and we are working on its current | |
3104 matrix m. */ | |
3105 struct glyph_matrix *m = w->current_matrix; | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3106 int i, sync_p = 0; |
25012 | 3107 struct glyph_row *old_rows; |
3108 | |
3109 /* Make a copy of the original rows of matrix m. */ | |
3110 old_rows = (struct glyph_row *) alloca (m->nrows * sizeof *old_rows); | |
3111 bcopy (m->rows, old_rows, m->nrows * sizeof *old_rows); | |
3112 | |
3113 for (i = 0; i < nlines; ++i) | |
3114 { | |
3115 /* Frame relative line assigned to. */ | |
3116 int frame_to = i + unchanged_at_top; | |
3117 | |
3118 /* Frame relative line assigned. */ | |
3119 int frame_from = copy_from[i] + unchanged_at_top; | |
3120 | |
3121 /* Window relative line assigned to. */ | |
3122 int window_to = frame_to - m->matrix_y; | |
3123 | |
3124 /* Window relative line assigned. */ | |
3125 int window_from = frame_from - m->matrix_y; | |
3126 | |
3127 /* Is assigned line inside window? */ | |
3128 int from_inside_window_p | |
3129 = window_from >= 0 && window_from < m->matrix_h; | |
3130 | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3131 /* Is assigned to line inside window? */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3132 int to_inside_window_p |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3133 = window_to >= 0 && window_to < m->matrix_h; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3134 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3135 if (from_inside_window_p && to_inside_window_p) |
25012 | 3136 { |
3137 /* Enabled setting before assignment. */ | |
3138 int enabled_before_p; | |
3139 | |
3140 /* Do the assignment. The enabled_p flag is saved | |
3141 over the assignment because the old redisplay did | |
3142 that. */ | |
3143 enabled_before_p = m->rows[window_to].enabled_p; | |
3144 m->rows[window_to] = old_rows[window_from]; | |
3145 m->rows[window_to].enabled_p = enabled_before_p; | |
3146 | |
3147 /* If frame line is empty, window line is empty, too. */ | |
3148 if (!retained_p[copy_from[i]]) | |
3149 m->rows[window_to].enabled_p = 0; | |
3150 } | |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3151 else if (to_inside_window_p) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3152 { |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3153 /* A copy between windows. This is an infrequent |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3154 case not worth optimizing. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3155 struct frame *f = XFRAME (w->frame); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3156 struct window *root = XWINDOW (FRAME_ROOT_WINDOW (f)); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3157 struct window *w2; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3158 struct glyph_matrix *m2; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3159 int m2_from; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3160 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3161 w2 = frame_row_to_window (root, frame_to); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3162 m2 = w2->current_matrix; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3163 m2_from = frame_from - m2->matrix_y; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3164 copy_row_except_pointers (m->rows + window_to, |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3165 m2->rows + m2_from); |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3166 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3167 /* If frame line is empty, window line is empty, too. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3168 if (!retained_p[copy_from[i]]) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3169 m->rows[window_to].enabled_p = 0; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3170 sync_p = 1; |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3171 } |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3172 else if (from_inside_window_p) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3173 sync_p = 1; |
25012 | 3174 } |
27855
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3175 |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3176 /* If there was a copy between windows, make sure glyph |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3177 pointers are in sync with the frame matrix. */ |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3178 if (sync_p) |
ecfe912fd73c
(flush_stdout) [GLYPH_DEBUG]: New function.
Gerd Moellmann <gerd@gnu.org>
parents:
27727
diff
changeset
|
3179 sync_window_with_frame_matrix_rows (w); |
25012 | 3180 |
3181 /* Check that no pointers are lost. */ | |
3182 CHECK_MATRIX (m); | |
3183 } | |
3184 | |
3185 /* Next window on same level. */ | |
3186 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
3187 } | |
3188 } | |
3189 | |
3190 | |
3191 #if GLYPH_DEBUG | |
3192 | |
3193 /* Check that window and frame matrices agree about their | |
3194 understanding where glyphs of the rows are to find. For each | |
3195 window in the window tree rooted at W, check that rows in the | |
3196 matrices of leaf window agree with their frame matrices about | |
3197 glyph pointers. */ | |
314 | 3198 |
21514 | 3199 void |
25012 | 3200 check_window_matrix_pointers (w) |
314 | 3201 struct window *w; |
3202 { | |
25012 | 3203 while (w) |
3204 { | |
3205 if (!NILP (w->hchild)) | |
3206 check_window_matrix_pointers (XWINDOW (w->hchild)); | |
3207 else if (!NILP (w->vchild)) | |
3208 check_window_matrix_pointers (XWINDOW (w->vchild)); | |
3209 else | |
3210 { | |
3211 struct frame *f = XFRAME (w->frame); | |
3212 check_matrix_pointers (w->desired_matrix, f->desired_matrix); | |
3213 check_matrix_pointers (w->current_matrix, f->current_matrix); | |
3214 } | |
3215 | |
3216 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
3217 } | |
3218 } | |
3219 | |
3220 | |
3221 /* Check that window rows are slices of frame rows. WINDOW_MATRIX is | |
3222 a window and FRAME_MATRIX is the corresponding frame matrix. For | |
3223 each row in WINDOW_MATRIX check that it's a slice of the | |
3224 corresponding frame row. If it isn't, abort. */ | |
3225 | |
3226 static void | |
3227 check_matrix_pointers (window_matrix, frame_matrix) | |
3228 struct glyph_matrix *window_matrix, *frame_matrix; | |
3229 { | |
3230 /* Row number in WINDOW_MATRIX. */ | |
3231 int i = 0; | |
3232 | |
3233 /* Row number corresponding to I in FRAME_MATRIX. */ | |
3234 int j = window_matrix->matrix_y; | |
3235 | |
3236 /* For all rows check that the row in the window matrix is a | |
3237 slice of the row in the frame matrix. If it isn't we didn't | |
3238 mirror an operation on the frame matrix correctly. */ | |
3239 while (i < window_matrix->nrows) | |
3240 { | |
3241 if (!glyph_row_slice_p (window_matrix->rows + i, | |
3242 frame_matrix->rows + j)) | |
3243 abort (); | |
3244 ++i, ++j; | |
3245 } | |
3246 } | |
3247 | |
3248 #endif /* GLYPH_DEBUG != 0 */ | |
3249 | |
3250 | |
3251 | |
3252 /********************************************************************** | |
3253 VPOS and HPOS translations | |
3254 **********************************************************************/ | |
3255 | |
3256 #if GLYPH_DEBUG | |
3257 | |
3258 /* Translate vertical position VPOS which is relative to window W to a | |
3259 vertical position relative to W's frame. */ | |
3260 | |
3261 static int | |
3262 window_to_frame_vpos (w, vpos) | |
3263 struct window *w; | |
3264 int vpos; | |
3265 { | |
3266 struct frame *f = XFRAME (w->frame); | |
3267 | |
3268 xassert (!FRAME_WINDOW_P (f)); | |
3269 xassert (vpos >= 0 && vpos <= w->desired_matrix->nrows); | |
3270 vpos += XFASTINT (w->top); | |
3271 xassert (vpos >= 0 && vpos <= FRAME_HEIGHT (f)); | |
3272 return vpos; | |
3273 } | |
3274 | |
3275 | |
3276 /* Translate horizontal position HPOS which is relative to window W to | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3277 a horizontal position relative to W's frame. */ |
25012 | 3278 |
3279 static int | |
3280 window_to_frame_hpos (w, hpos) | |
3281 struct window *w; | |
3282 int hpos; | |
3283 { | |
3284 struct frame *f = XFRAME (w->frame); | |
3285 | |
3286 xassert (!FRAME_WINDOW_P (f)); | |
3287 hpos += XFASTINT (w->left); | |
3288 return hpos; | |
314 | 3289 } |
25012 | 3290 |
3291 #endif /* GLYPH_DEBUG */ | |
3292 | |
3293 | |
314 | 3294 |
25012 | 3295 /********************************************************************** |
3296 Redrawing Frames | |
3297 **********************************************************************/ | |
3298 | |
3299 DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0, | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3300 doc: /* Clear frame FRAME and output again what is supposed to appear on it. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3301 (frame) |
25012 | 3302 Lisp_Object frame; |
3303 { | |
3304 struct frame *f; | |
3305 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
3306 CHECK_LIVE_FRAME (frame); |
25012 | 3307 f = XFRAME (frame); |
3308 | |
3309 /* Ignore redraw requests, if frame has no glyphs yet. | |
3310 (Implementation note: It still has to be checked why we are | |
3311 called so early here). */ | |
3312 if (!glyphs_initialized_initially_p) | |
3313 return Qnil; | |
3314 | |
3315 update_begin (f); | |
35445
9af454aee182
(Fredraw_frame): Remove reference to
Andrew Innes <andrewi@gnu.org>
parents:
35374
diff
changeset
|
3316 if (FRAME_MSDOS_P (f)) |
25012 | 3317 set_terminal_modes (); |
3318 clear_frame (); | |
3319 clear_current_matrices (f); | |
3320 update_end (f); | |
3321 fflush (stdout); | |
3322 windows_or_buffers_changed++; | |
3323 /* Mark all windows as inaccurate, so that every window will have | |
3324 its redisplay done. */ | |
3325 mark_window_display_accurate (FRAME_ROOT_WINDOW (f), 0); | |
3326 set_window_update_flags (XWINDOW (FRAME_ROOT_WINDOW (f)), 1); | |
3327 f->garbaged = 0; | |
3328 return Qnil; | |
3329 } | |
3330 | |
3331 | |
3332 /* Redraw frame F. This is nothing more than a call to the Lisp | |
3333 function redraw-frame. */ | |
3334 | |
3335 void | |
3336 redraw_frame (f) | |
3337 struct frame *f; | |
3338 { | |
3339 Lisp_Object frame; | |
3340 XSETFRAME (frame, f); | |
3341 Fredraw_frame (frame); | |
3342 } | |
3343 | |
3344 | |
3345 DEFUN ("redraw-display", Fredraw_display, Sredraw_display, 0, 0, "", | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3346 doc: /* Clear and redisplay all visible frames. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
3347 () |
25012 | 3348 { |
3349 Lisp_Object tail, frame; | |
3350 | |
3351 FOR_EACH_FRAME (tail, frame) | |
3352 if (FRAME_VISIBLE_P (XFRAME (frame))) | |
3353 Fredraw_frame (frame); | |
3354 | |
3355 return Qnil; | |
3356 } | |
3357 | |
3358 | |
3359 /* This is used when frame_garbaged is set. Call Fredraw_frame on all | |
3360 visible frames marked as garbaged. */ | |
3361 | |
3362 void | |
3363 redraw_garbaged_frames () | |
3364 { | |
3365 Lisp_Object tail, frame; | |
3366 | |
3367 FOR_EACH_FRAME (tail, frame) | |
3368 if (FRAME_VISIBLE_P (XFRAME (frame)) | |
3369 && FRAME_GARBAGED_P (XFRAME (frame))) | |
3370 Fredraw_frame (frame); | |
3371 } | |
3372 | |
3373 | |
3374 | |
3375 /*********************************************************************** | |
3376 Direct Operations | |
3377 ***********************************************************************/ | |
3378 | |
3379 /* Try to update display and current glyph matrix directly. | |
3380 | |
3381 This function is called after a character G has been inserted into | |
3382 current_buffer. It tries to update the current glyph matrix and | |
3383 perform appropriate screen output to reflect the insertion. If it | |
3384 succeeds, the global flag redisplay_performed_directly_p will be | |
3385 set to 1, and thereby prevent the more costly general redisplay | |
3386 from running (see redisplay_internal). | |
3387 | |
3388 This function is not called for `hairy' character insertions. | |
3389 In particular, it is not called when after or before change | |
3390 functions exist, like they are used by font-lock. See keyboard.c | |
3391 for details where this function is called. */ | |
314 | 3392 |
3393 int | |
3394 direct_output_for_insert (g) | |
3395 int g; | |
3396 { | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
3397 register struct frame *f = SELECTED_FRAME (); |
25012 | 3398 struct window *w = XWINDOW (selected_window); |
3399 struct it it, it2; | |
3400 struct glyph_row *glyph_row; | |
3401 struct glyph *glyphs, *glyph, *end; | |
3402 int n; | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3403 /* Non-null means that redisplay of W is based on window matrices. */ |
25012 | 3404 int window_redisplay_p = FRAME_WINDOW_P (f); |
3405 /* Non-null means we are in overwrite mode. */ | |
3406 int overwrite_p = !NILP (current_buffer->overwrite_mode); | |
3407 int added_width; | |
3408 struct text_pos pos; | |
3409 int delta, delta_bytes; | |
3410 | |
3411 /* Not done directly. */ | |
3412 redisplay_performed_directly_p = 0; | |
3413 | |
3414 /* Quickly give up for some common cases. */ | |
3415 if (cursor_in_echo_area | |
3416 /* Give up if fonts have changed. */ | |
3417 || fonts_changed_p | |
3418 /* Give up if face attributes have been changed. */ | |
3419 || face_change_count | |
3420 /* Give up if cursor position not really known. */ | |
314 | 3421 || !display_completed |
25012 | 3422 /* Give up if buffer appears in two places. */ |
314 | 3423 || buffer_shared > 1 |
34715
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3424 /* Give up if currently displaying a message instead of the |
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3425 minibuffer contents. */ |
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3426 || (EQ (selected_window, minibuf_window) |
fc3693bea815
(direct_output_for_insert): Fix check for mini-window
Gerd Moellmann <gerd@gnu.org>
parents:
34622
diff
changeset
|
3427 && EQ (minibuf_window, echo_area_window)) |
25012 | 3428 /* Give up for hscrolled mini-buffer because display of the prompt |
3429 is handled specially there (see display_line). */ | |
3430 || (MINI_WINDOW_P (w) && XFASTINT (w->hscroll)) | |
3431 /* Give up if overwriting in the middle of a line. */ | |
3432 || (overwrite_p | |
3433 && PT != ZV | |
3434 && FETCH_BYTE (PT) != '\n') | |
3435 /* Give up for tabs and line ends. */ | |
3436 || g == '\t' | |
3437 || g == '\n' | |
3438 || g == '\r' | |
3439 /* Give up if unable to display the cursor in the window. */ | |
3440 || w->cursor.vpos < 0 | |
36279
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3441 /* Give up if we are showing a message or just cleared the message |
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3442 because we might need to resize the echo area window. */ |
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3443 || !NILP (echo_area_buffer[0]) |
1e3dc8692936
(direct_output_for_insert): Give up if we are showing
Gerd Moellmann <gerd@gnu.org>
parents:
36115
diff
changeset
|
3444 || !NILP (echo_area_buffer[1]) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3445 || (glyph_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos), |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3446 /* Can't do it in a continued line because continuation |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3447 lines would change. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3448 (glyph_row->continued_p |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3449 /* Can't use this method if the line overlaps others or is |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3450 overlapped by others because these other lines would |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3451 have to be redisplayed. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3452 || glyph_row->overlapping_p |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3453 || glyph_row->overlapped_p)) |
25012 | 3454 /* Can't do it for partial width windows on terminal frames |
3455 because we can't clear to eol in such a window. */ | |
3456 || (!window_redisplay_p && !WINDOW_FULL_WIDTH_P (w))) | |
3457 return 0; | |
3458 | |
35374
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3459 /* If we can't insert glyphs, we can use this method only |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3460 at the end of a line. */ |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3461 if (!char_ins_del_ok) |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3462 if (PT != ZV && FETCH_BYTE (PT_BYTE) != '\n') |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3463 return 0; |
3fc8f4c6ed56
(direct_output_for_insert): If char_ins_del_ok is
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
3464 |
25012 | 3465 /* Set up a display iterator structure for W. Glyphs will be |
3466 produced in scratch_glyph_row. Current position is W's cursor | |
3467 position. */ | |
3468 clear_glyph_row (&scratch_glyph_row); | |
3469 SET_TEXT_POS (pos, PT, PT_BYTE); | |
28361
eccb57c44da5
(direct_output_for_insert): Use DEC_TEXT_POS
Gerd Moellmann <gerd@gnu.org>
parents:
27968
diff
changeset
|
3470 DEC_TEXT_POS (pos, !NILP (current_buffer->enable_multibyte_characters)); |
25012 | 3471 init_iterator (&it, w, CHARPOS (pos), BYTEPOS (pos), &scratch_glyph_row, |
3472 DEFAULT_FACE_ID); | |
3473 | |
3474 glyph_row = MATRIX_ROW (w->current_matrix, w->cursor.vpos); | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3475 if (glyph_row->mouse_face_p) |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3476 return 0; |
25012 | 3477 |
3478 /* Give up if highlighting trailing whitespace and we have trailing | |
3479 whitespace in glyph_row. We would have to remove the trailing | |
3480 whitespace face in that case. */ | |
25304
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3481 if (!NILP (Vshow_trailing_whitespace) |
25012 | 3482 && glyph_row->used[TEXT_AREA]) |
3483 { | |
3484 struct glyph *last; | |
3485 | |
3486 last = glyph_row->glyphs[TEXT_AREA] + glyph_row->used[TEXT_AREA] - 1; | |
3487 if (last->type == STRETCH_GLYPH | |
3488 || (last->type == CHAR_GLYPH | |
26998
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
3489 && last->u.ch == ' ')) |
25012 | 3490 return 0; |
3491 } | |
3492 | |
3493 /* Give up if there are overlay strings at pos. This would fail | |
3494 if the overlay string has newlines in it. */ | |
3495 if (STRINGP (it.string)) | |
3496 return 0; | |
3497 | |
3498 it.hpos = w->cursor.hpos; | |
3499 it.vpos = w->cursor.vpos; | |
3500 it.current_x = w->cursor.x + it.first_visible_x; | |
3501 it.current_y = w->cursor.y; | |
3502 it.end_charpos = PT; | |
3503 it.stop_charpos = min (PT, it.stop_charpos); | |
39226
d86fe98ee7d5
(direct_output_for_insert): Don't change IT's
Gerd Moellmann <gerd@gnu.org>
parents:
38988
diff
changeset
|
3504 it.stop_charpos = max (IT_CHARPOS (it), it.stop_charpos); |
25012 | 3505 |
3506 /* More than one display element may be returned for PT - 1 if | |
3507 (i) it's a control character which is translated into `\003' or | |
3508 `^C', or (ii) it has a display table entry, or (iii) it's a | |
3509 combination of both. */ | |
3510 delta = delta_bytes = 0; | |
3511 while (get_next_display_element (&it)) | |
3512 { | |
3513 PRODUCE_GLYPHS (&it); | |
3514 | |
3515 /* Give up if glyph doesn't fit completely on the line. */ | |
3516 if (it.current_x >= it.last_visible_x) | |
3517 return 0; | |
3518 | |
3519 /* Give up if new glyph has different ascent or descent than | |
3520 the original row, or if it is not a character glyph. */ | |
3521 if (glyph_row->ascent != it.ascent | |
3522 || glyph_row->height != it.ascent + it.descent | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3523 || glyph_row->phys_ascent != it.phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3524 || glyph_row->phys_height != it.phys_ascent + it.phys_descent |
25012 | 3525 || it.what != IT_CHARACTER) |
3526 return 0; | |
3527 | |
3528 delta += 1; | |
3529 delta_bytes += it.len; | |
32468
20788c8274cd
(direct_output_for_insert): Call set_iterator_to_next
Gerd Moellmann <gerd@gnu.org>
parents:
31932
diff
changeset
|
3530 set_iterator_to_next (&it, 1); |
25012 | 3531 } |
3532 | |
3533 /* Give up if we hit the right edge of the window. We would have | |
3534 to insert truncation or continuation glyphs. */ | |
3535 added_width = it.current_x - (w->cursor.x + it.first_visible_x); | |
3536 if (glyph_row->pixel_width + added_width >= it.last_visible_x) | |
314 | 3537 return 0; |
3538 | |
25012 | 3539 /* Give up if there is a \t following in the line. */ |
3540 it2 = it; | |
3541 it2.end_charpos = ZV; | |
3542 it2.stop_charpos = min (it2.stop_charpos, ZV); | |
3543 while (get_next_display_element (&it2) | |
3544 && !ITERATOR_AT_END_OF_LINE_P (&it2)) | |
3545 { | |
3546 if (it2.c == '\t') | |
3547 return 0; | |
32468
20788c8274cd
(direct_output_for_insert): Call set_iterator_to_next
Gerd Moellmann <gerd@gnu.org>
parents:
31932
diff
changeset
|
3548 set_iterator_to_next (&it2, 1); |
25012 | 3549 } |
3550 | |
3551 /* Number of new glyphs produced. */ | |
3552 n = it.glyph_row->used[TEXT_AREA]; | |
3553 | |
3554 /* Start and end of glyphs in original row. */ | |
3555 glyphs = glyph_row->glyphs[TEXT_AREA] + w->cursor.hpos; | |
3556 end = glyph_row->glyphs[1 + TEXT_AREA]; | |
3557 | |
3558 /* Make room for new glyphs, then insert them. */ | |
3559 xassert (end - glyphs - n >= 0); | |
25781
e5579bc77d9e
(direct_output_for_insert): Cast arguments to
Gerd Moellmann <gerd@gnu.org>
parents:
25735
diff
changeset
|
3560 safe_bcopy ((char *) glyphs, (char *) (glyphs + n), |
e5579bc77d9e
(direct_output_for_insert): Cast arguments to
Gerd Moellmann <gerd@gnu.org>
parents:
25735
diff
changeset
|
3561 (end - glyphs - n) * sizeof (*end)); |
25012 | 3562 bcopy (it.glyph_row->glyphs[TEXT_AREA], glyphs, n * sizeof *glyphs); |
3563 glyph_row->used[TEXT_AREA] = min (glyph_row->used[TEXT_AREA] + n, | |
3564 end - glyph_row->glyphs[TEXT_AREA]); | |
3565 | |
3566 /* Compute new line width. */ | |
3567 glyph = glyph_row->glyphs[TEXT_AREA]; | |
3568 end = glyph + glyph_row->used[TEXT_AREA]; | |
3569 glyph_row->pixel_width = glyph_row->x; | |
3570 while (glyph < end) | |
3571 { | |
3572 glyph_row->pixel_width += glyph->pixel_width; | |
3573 ++glyph; | |
3574 } | |
3575 | |
3576 /* Increment buffer positions for glyphs following the newly | |
3577 inserted ones. */ | |
3578 for (glyph = glyphs + n; glyph < end; ++glyph) | |
26546
0f43cc91d6a5
(direct_output_for_insert): Increment glyph positions
Gerd Moellmann <gerd@gnu.org>
parents:
26499
diff
changeset
|
3579 if (glyph->charpos > 0 && BUFFERP (glyph->object)) |
25012 | 3580 glyph->charpos += delta; |
3581 | |
3582 if (MATRIX_ROW_END_CHARPOS (glyph_row) > 0) | |
3583 { | |
3584 MATRIX_ROW_END_CHARPOS (glyph_row) += delta; | |
3585 MATRIX_ROW_END_BYTEPOS (glyph_row) += delta_bytes; | |
3586 } | |
3587 | |
3588 /* Adjust positions in lines following the one we are in. */ | |
28708
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3589 increment_matrix_positions (w->current_matrix, |
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3590 w->cursor.vpos + 1, |
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3591 w->current_matrix->nrows, |
4e2497e6757e
(increment_matrix_positions): Renamed from
Gerd Moellmann <gerd@gnu.org>
parents:
28682
diff
changeset
|
3592 delta, delta_bytes); |
25012 | 3593 |
3594 glyph_row->contains_overlapping_glyphs_p | |
3595 |= it.glyph_row->contains_overlapping_glyphs_p; | |
3596 | |
26591
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3597 glyph_row->displays_text_p = 1; |
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3598 w->window_end_vpos = make_number (max (w->cursor.vpos, |
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3599 XFASTINT (w->window_end_vpos))); |
f7c7ef351f04
(direct_output_for_insert): Set glyph row's
Gerd Moellmann <gerd@gnu.org>
parents:
26546
diff
changeset
|
3600 |
25304
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3601 if (!NILP (Vshow_trailing_whitespace)) |
25012 | 3602 highlight_trailing_whitespace (it.f, glyph_row); |
3603 | |
3604 /* Write glyphs. If at end of row, we can simply call write_glyphs. | |
3605 In the middle, we have to insert glyphs. Note that this is now | |
3606 implemented for X frames. The implementation uses updated_window | |
3607 and updated_row. */ | |
3608 updated_row = glyph_row; | |
38988
53ae5a92e2fc
(direct_output_for_insert): Set updated_area
Gerd Moellmann <gerd@gnu.org>
parents:
38748
diff
changeset
|
3609 updated_area = TEXT_AREA; |
25012 | 3610 update_begin (f); |
3611 if (rif) | |
3612 { | |
3613 rif->update_window_begin_hook (w); | |
3614 | |
36115
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3615 if (glyphs == end - n |
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3616 /* In front of a space added by append_space. */ |
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3617 || (glyphs == end - n - 1 |
c0fac212cfcc
(direct_output_for_insert): Recognize more cases where
Gerd Moellmann <gerd@gnu.org>
parents:
36097
diff
changeset
|
3618 && (end - n)->charpos <= 0)) |
25012 | 3619 rif->write_glyphs (glyphs, n); |
3620 else | |
3621 rif->insert_glyphs (glyphs, n); | |
3622 } | |
3623 else | |
3624 { | |
3625 if (glyphs == end - n) | |
3626 write_glyphs (glyphs, n); | |
3627 else | |
3628 insert_glyphs (glyphs, n); | |
3629 } | |
3630 | |
3631 w->cursor.hpos += n; | |
3632 w->cursor.x = it.current_x - it.first_visible_x; | |
3633 xassert (w->cursor.hpos >= 0 | |
3634 && w->cursor.hpos < w->desired_matrix->matrix_w); | |
3635 | |
3636 /* How to set the cursor differs depending on whether we are | |
3637 using a frame matrix or a window matrix. Note that when | |
3638 a frame matrix is used, cursor_to expects frame coordinates, | |
3639 and the X and Y parameters are not used. */ | |
3640 if (window_redisplay_p) | |
3641 rif->cursor_to (w->cursor.vpos, w->cursor.hpos, | |
3642 w->cursor.y, w->cursor.x); | |
3643 else | |
3644 { | |
3645 int x, y; | |
3646 x = (WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos) | |
3647 + (INTEGERP (w->left_margin_width) | |
3648 ? XFASTINT (w->left_margin_width) | |
3649 : 0)); | |
3650 y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos); | |
3651 cursor_to (y, x); | |
3652 } | |
3653 | |
3654 if (rif) | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3655 rif->update_window_end_hook (w, 1, 0); |
25012 | 3656 update_end (f); |
3657 updated_row = NULL; | |
3658 fflush (stdout); | |
3659 | |
3660 TRACE ((stderr, "direct output for insert\n")); | |
44260
64c67a3eebb2
(direct_output_for_insert): Call
Gerd Moellmann <gerd@gnu.org>
parents:
43729
diff
changeset
|
3661 mark_window_display_accurate (it.window, 1); |
25012 | 3662 redisplay_performed_directly_p = 1; |
314 | 3663 return 1; |
3664 } | |
3665 | |
25012 | 3666 |
3667 /* Perform a direct display update for moving PT by N positions | |
3668 left or right. N < 0 means a movement backwards. This function | |
3669 is currently only called for N == 1 or N == -1. */ | |
3670 | |
314 | 3671 int |
3672 direct_output_forward_char (n) | |
3673 int n; | |
3674 { | |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
3675 struct frame *f = SELECTED_FRAME (); |
25012 | 3676 struct window *w = XWINDOW (selected_window); |
3677 struct glyph_row *row; | |
3678 | |
26851
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3679 /* Give up if point moved out of or into a composition. */ |
28507
b6f06a755c7d
make_number/XINT/XUINT conversions; EQ/== fixes; ==Qnil -> NILP
Ken Raeburn <raeburn@raeburn.org>
parents:
28361
diff
changeset
|
3680 if (check_point_in_composition (current_buffer, XINT (w->last_point), |
26851
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3681 current_buffer, PT)) |
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3682 return 0; |
2513566d55fd
(direct_output_forward_char): Check point moving into
Kenichi Handa <handa@m17n.org>
parents:
26729
diff
changeset
|
3683 |
25012 | 3684 /* Give up if face attributes have been changed. */ |
3685 if (face_change_count) | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
3686 return 0; |
25012 | 3687 |
3688 /* Give up if current matrix is not up to date or we are | |
3689 displaying a message. */ | |
3690 if (!display_completed || cursor_in_echo_area) | |
3691 return 0; | |
3692 | |
3693 /* Give up if the buffer's direction is reversed. */ | |
3694 if (!NILP (XBUFFER (w->buffer)->direction_reversed)) | |
314 | 3695 return 0; |
11096
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
3696 |
2794
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3697 /* Can't use direct output if highlighting a region. */ |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3698 if (!NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active)) |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3699 return 0; |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
3700 |
25304
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3701 /* Can't use direct output if highlighting trailing whitespace. */ |
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3702 if (!NILP (Vshow_trailing_whitespace)) |
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3703 return 0; |
4b75c26bd356
(direct_output_for_insert): Use
Gerd Moellmann <gerd@gnu.org>
parents:
25241
diff
changeset
|
3704 |
25735
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3705 /* Give up if we are showing a message or just cleared the message |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3706 because we might need to resize the echo area window. */ |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3707 if (!NILP (echo_area_buffer[0]) || !NILP (echo_area_buffer[1])) |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3708 return 0; |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3709 |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3710 /* Give up if currently displaying a message instead of the |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3711 minibuffer contents. */ |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3712 if (XWINDOW (minibuf_window) == w |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3713 && EQ (minibuf_window, echo_area_window)) |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3714 return 0; |
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
3715 |
25735
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3716 /* Give up if we don't know where the cursor is. */ |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3717 if (w->cursor.vpos < 0) |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3718 return 0; |
fcb92c26acf2
(direct_output_forward_char): Don't use this method
Gerd Moellmann <gerd@gnu.org>
parents:
25725
diff
changeset
|
3719 |
25012 | 3720 row = MATRIX_ROW (w->current_matrix, w->cursor.vpos); |
3721 | |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
3722 /* Give up if PT is outside of the last known cursor row. */ |
41069
818a84568f83
(direct_output_forward_char): Fix character/byte
Gerd Moellmann <gerd@gnu.org>
parents:
41025
diff
changeset
|
3723 if (PT <= MATRIX_ROW_START_CHARPOS (row) |
818a84568f83
(direct_output_forward_char): Fix character/byte
Gerd Moellmann <gerd@gnu.org>
parents:
41025
diff
changeset
|
3724 || PT >= MATRIX_ROW_END_CHARPOS (row)) |
6069
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
3725 return 0; |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
3726 |
25012 | 3727 set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); |
31271
4f0c5eecc5a6
(build_frame_matrix_from_leaf_window): If a row of a
Gerd Moellmann <gerd@gnu.org>
parents:
31093
diff
changeset
|
3728 |
25012 | 3729 w->last_cursor = w->cursor; |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
3730 XSETFASTINT (w->last_point, PT); |
25012 | 3731 |
3732 xassert (w->cursor.hpos >= 0 | |
3733 && w->cursor.hpos < w->desired_matrix->matrix_w); | |
3734 | |
3735 if (FRAME_WINDOW_P (f)) | |
3736 rif->cursor_to (w->cursor.vpos, w->cursor.hpos, | |
3737 w->cursor.y, w->cursor.x); | |
3738 else | |
3739 { | |
3740 int x, y; | |
3741 x = (WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos) | |
3742 + (INTEGERP (w->left_margin_width) | |
3743 ? XFASTINT (w->left_margin_width) | |
3744 : 0)); | |
3745 y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos); | |
3746 cursor_to (y, x); | |
3747 } | |
3748 | |
314 | 3749 fflush (stdout); |
25012 | 3750 redisplay_performed_directly_p = 1; |
314 | 3751 return 1; |
3752 } | |
25012 | 3753 |
3754 | |
314 | 3755 |
25012 | 3756 /*********************************************************************** |
3757 Frame Update | |
3758 ***********************************************************************/ | |
3759 | |
3760 /* Update frame F based on the data in desired matrices. | |
3761 | |
3762 If FORCE_P is non-zero, don't let redisplay be stopped by detecting | |
3763 pending input. If INHIBIT_HAIRY_ID_P is non-zero, don't try | |
3764 scrolling. | |
3765 | |
3766 Value is non-zero if redisplay was stopped due to pending input. */ | |
314 | 3767 |
3768 int | |
25012 | 3769 update_frame (f, force_p, inhibit_hairy_id_p) |
3770 struct frame *f; | |
3771 int force_p; | |
3772 int inhibit_hairy_id_p; | |
3773 { | |
3774 /* 1 means display has been paused because of pending input. */ | |
3775 int paused_p; | |
3776 struct window *root_window = XWINDOW (f->root_window); | |
3777 | |
3778 if (FRAME_WINDOW_P (f)) | |
3779 { | |
3780 /* We are working on window matrix basis. All windows whose | |
3781 flag must_be_updated_p is set have to be updated. */ | |
3782 | |
3783 /* Record that we are not working on frame matrices. */ | |
3784 set_frame_matrix_frame (NULL); | |
3785 | |
3786 /* Update all windows in the window tree of F, maybe stopping | |
3787 when pending input is detected. */ | |
3788 update_begin (f); | |
3789 | |
3790 /* Update the menu bar on X frames that don't have toolkit | |
3791 support. */ | |
3792 if (WINDOWP (f->menu_bar_window)) | |
3793 update_window (XWINDOW (f->menu_bar_window), 1); | |
3794 | |
3795 /* Update the tool-bar window, if present. */ | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3796 if (WINDOWP (f->tool_bar_window)) |
25012 | 3797 { |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3798 struct window *w = XWINDOW (f->tool_bar_window); |
25012 | 3799 |
3800 /* Update tool-bar window. */ | |
3801 if (w->must_be_updated_p) | |
3802 { | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3803 Lisp_Object tem; |
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3804 |
25012 | 3805 update_window (w, 1); |
3806 w->must_be_updated_p = 0; | |
3807 | |
3808 /* Swap tool-bar strings. We swap because we want to | |
3809 reuse strings. */ | |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3810 tem = f->current_tool_bar_string; |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3811 f->current_tool_bar_string = f->desired_tool_bar_string; |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
3812 f->desired_tool_bar_string = tem; |
25012 | 3813 } |
3814 } | |
3815 | |
3816 | |
3817 /* Update windows. */ | |
3818 paused_p = update_window_tree (root_window, force_p); | |
3819 update_end (f); | |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3820 |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3821 #if 0 /* This flush is a performance bottleneck under X, |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3822 and it doesn't seem to be necessary anyway. */ |
25012 | 3823 rif->flush_display (f); |
3824 #endif | |
3825 } | |
3826 else | |
3827 { | |
3828 /* We are working on frame matrix basis. Set the frame on whose | |
3829 frame matrix we operate. */ | |
3830 set_frame_matrix_frame (f); | |
3831 | |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3832 /* Build F's desired matrix from window matrices. */ |
25012 | 3833 build_frame_matrix (f); |
3834 | |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3835 /* Update the display */ |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3836 update_begin (f); |
25012 | 3837 paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p); |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3838 update_end (f); |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3839 |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3840 if (termscript) |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3841 fflush (termscript); |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3842 fflush (stdout); |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3843 |
25012 | 3844 /* Check window matrices for lost pointers. */ |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
3845 #if GLYPH_DEBUG |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
3846 check_window_matrix_pointers (root_window); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
3847 add_frame_display_history (f, paused_p); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
3848 #endif |
25012 | 3849 } |
3850 | |
3851 /* Reset flags indicating that a window should be updated. */ | |
3852 set_window_update_flags (root_window, 0); | |
31295
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3853 |
d4f918f0b184
(update_frame): Only set display_completed here; use
Gerd Moellmann <gerd@gnu.org>
parents:
31271
diff
changeset
|
3854 display_completed = !paused_p; |
25012 | 3855 return paused_p; |
3856 } | |
3857 | |
3858 | |
3859 | |
3860 /************************************************************************ | |
3861 Window-based updates | |
3862 ************************************************************************/ | |
3863 | |
3864 /* Perform updates in window tree rooted at W. FORCE_P non-zero means | |
3865 don't stop updating when input is pending. */ | |
3866 | |
3867 static int | |
3868 update_window_tree (w, force_p) | |
3869 struct window *w; | |
3870 int force_p; | |
3871 { | |
3872 int paused_p = 0; | |
3873 | |
3874 while (w && !paused_p) | |
3875 { | |
3876 if (!NILP (w->hchild)) | |
3877 paused_p |= update_window_tree (XWINDOW (w->hchild), force_p); | |
3878 else if (!NILP (w->vchild)) | |
3879 paused_p |= update_window_tree (XWINDOW (w->vchild), force_p); | |
3880 else if (w->must_be_updated_p) | |
3881 paused_p |= update_window (w, force_p); | |
3882 | |
3883 w = NILP (w->next) ? 0 : XWINDOW (w->next); | |
3884 } | |
3885 | |
3886 return paused_p; | |
3887 } | |
3888 | |
3889 | |
3890 /* Update window W if its flag must_be_updated_p is non-zero. If | |
3891 FORCE_P is non-zero, don't stop updating if input is pending. */ | |
3892 | |
3893 void | |
3894 update_single_window (w, force_p) | |
3895 struct window *w; | |
3896 int force_p; | |
3897 { | |
3898 if (w->must_be_updated_p) | |
3899 { | |
3900 struct frame *f = XFRAME (WINDOW_FRAME (w)); | |
3901 | |
3902 /* Record that this is not a frame-based redisplay. */ | |
3903 set_frame_matrix_frame (NULL); | |
3904 | |
3905 /* Update W. */ | |
3906 update_begin (f); | |
3907 update_window (w, force_p); | |
3908 update_end (f); | |
3909 | |
3910 /* Reset flag in W. */ | |
3911 w->must_be_updated_p = 0; | |
3912 } | |
3913 } | |
3914 | |
3915 | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3916 /* Redraw lines from the current matrix of window W that are |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3917 overlapped by other rows. YB is bottom-most y-position in W. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3918 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3919 static void |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3920 redraw_overlapped_rows (w, yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3921 struct window *w; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3922 int yb; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3923 { |
30165
d7ec5b3caccc
(redraw_overlapped_rows): Add missing local.
Gerd Moellmann <gerd@gnu.org>
parents:
30161
diff
changeset
|
3924 int i; |
d7ec5b3caccc
(redraw_overlapped_rows): Add missing local.
Gerd Moellmann <gerd@gnu.org>
parents:
30161
diff
changeset
|
3925 |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3926 /* If rows overlapping others have been changed, the rows being |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3927 overlapped have to be redrawn. This won't draw lines that have |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3928 already been drawn in update_window_line because overlapped_p in |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3929 desired rows is 0, so after row assignment overlapped_p in |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3930 current rows is 0. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3931 for (i = 0; i < w->current_matrix->nrows; ++i) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3932 { |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3933 struct glyph_row *row = w->current_matrix->rows + i; |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3934 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3935 if (!row->enabled_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3936 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3937 else if (row->mode_line_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3938 continue; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3939 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3940 if (row->overlapped_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3941 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3942 enum glyph_row_area area; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3943 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3944 for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3945 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3946 updated_row = row; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3947 updated_area = area; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3948 rif->cursor_to (i, 0, row->y, area == TEXT_AREA ? row->x : 0); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3949 if (row->used[area]) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3950 rif->write_glyphs (row->glyphs[area], row->used[area]); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3951 rif->clear_end_of_line (-1); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3952 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3953 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3954 row->overlapped_p = 0; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3955 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3956 |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
3957 if (MATRIX_ROW_BOTTOM_Y (row) >= yb) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3958 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3959 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3960 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3961 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3962 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3963 /* Redraw lines from the current matrix of window W that overlap |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3964 others. YB is bottom-most y-position in W. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3965 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3966 static void |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3967 redraw_overlapping_rows (w, yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3968 struct window *w; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3969 int yb; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3970 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3971 int i, bottom_y; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3972 struct glyph_row *row; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3973 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3974 for (i = 0; i < w->current_matrix->nrows; ++i) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3975 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3976 row = w->current_matrix->rows + i; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3977 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3978 if (!row->enabled_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3979 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3980 else if (row->mode_line_p) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3981 continue; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3982 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3983 bottom_y = MATRIX_ROW_BOTTOM_Y (row); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3984 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3985 if (row->overlapping_p && i > 0 && bottom_y < yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3986 { |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3987 if (row->used[LEFT_MARGIN_AREA]) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3988 rif->fix_overlapping_area (w, row, LEFT_MARGIN_AREA); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3989 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3990 if (row->used[TEXT_AREA]) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3991 rif->fix_overlapping_area (w, row, TEXT_AREA); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3992 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3993 if (row->used[RIGHT_MARGIN_AREA]) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3994 rif->fix_overlapping_area (w, row, RIGHT_MARGIN_AREA); |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3995 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
3996 /* Record in neighbour rows that ROW overwrites part of their |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3997 display. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3998 if (row->phys_ascent > row->ascent && i > 0) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
3999 MATRIX_ROW (w->current_matrix, i - 1)->overlapped_p = 1; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4000 if ((row->phys_height - row->phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4001 > row->height - row->ascent) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4002 && bottom_y < yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4003 MATRIX_ROW (w->current_matrix, i + 1)->overlapped_p = 1; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4004 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4005 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4006 if (bottom_y >= yb) |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4007 break; |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4008 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4009 } |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4010 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4011 |
34929
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4012 #ifdef GLYPH_DEBUG |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4013 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4014 /* Check that no row in the current matrix of window W is enabled |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4015 which is below what's displayed in the window. */ |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4016 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4017 void |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4018 check_current_matrix_flags (w) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4019 struct window *w; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4020 { |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4021 int last_seen_p = 0; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4022 int i, yb = window_text_bottom_y (w); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4023 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4024 for (i = 0; i < w->current_matrix->nrows - 1; ++i) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4025 { |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4026 struct glyph_row *row = MATRIX_ROW (w->current_matrix, i); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4027 if (!last_seen_p && MATRIX_ROW_BOTTOM_Y (row) >= yb) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4028 last_seen_p = 1; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4029 else if (last_seen_p && row->enabled_p) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4030 abort (); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4031 } |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4032 } |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4033 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4034 #endif /* GLYPH_DEBUG */ |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4035 |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4036 |
25012 | 4037 /* Update display of window W. FORCE_P non-zero means that we should |
4038 not stop when detecting pending input. */ | |
4039 | |
4040 static int | |
4041 update_window (w, force_p) | |
4042 struct window *w; | |
4043 int force_p; | |
4044 { | |
4045 struct glyph_matrix *desired_matrix = w->desired_matrix; | |
4046 int paused_p; | |
4047 int preempt_count = baud_rate / 2400 + 1; | |
4048 extern int input_pending; | |
34517
7c8d2cec3d08
(update_window): If do_mouse_tracking is non-nil,
Gerd Moellmann <gerd@gnu.org>
parents:
34279
diff
changeset
|
4049 extern Lisp_Object do_mouse_tracking; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4050 #if GLYPH_DEBUG |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4051 struct frame *f = XFRAME (WINDOW_FRAME (w)); |
25012 | 4052 extern struct frame *updating_frame; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4053 #endif |
25012 | 4054 |
4055 /* Check that W's frame doesn't have glyph matrices. */ | |
4056 xassert (FRAME_WINDOW_P (f)); | |
4057 xassert (updating_frame != NULL); | |
4058 | |
4059 /* Check pending input the first time so that we can quickly return. */ | |
4060 if (redisplay_dont_pause) | |
4061 force_p = 1; | |
4062 else | |
4063 detect_input_pending (); | |
4064 | |
4065 /* If forced to complete the update, or if no input is pending, do | |
4066 the update. */ | |
34517
7c8d2cec3d08
(update_window): If do_mouse_tracking is non-nil,
Gerd Moellmann <gerd@gnu.org>
parents:
34279
diff
changeset
|
4067 if (force_p || !input_pending || !NILP (do_mouse_tracking)) |
25012 | 4068 { |
4069 struct glyph_row *row, *end; | |
4070 struct glyph_row *mode_line_row; | |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4071 struct glyph_row *header_line_row; |
34622
877ed6cab304
(update_window): Detect pending input every nth line
Gerd Moellmann <gerd@gnu.org>
parents:
34517
diff
changeset
|
4072 int yb, changed_p = 0, mouse_face_overwritten_p = 0, n_updated; |
25012 | 4073 |
4074 rif->update_window_begin_hook (w); | |
4075 yb = window_text_bottom_y (w); | |
4076 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4077 /* If window has a header line, update it before everything else. |
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4078 Adjust y-positions of other rows by the header line height. */ |
25012 | 4079 row = desired_matrix->rows; |
4080 end = row + desired_matrix->nrows - 1; | |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4081 |
25012 | 4082 if (row->mode_line_p) |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4083 { |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4084 header_line_row = row; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4085 ++row; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4086 } |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4087 else |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4088 header_line_row = NULL; |
25012 | 4089 |
4090 /* Update the mode line, if necessary. */ | |
4091 mode_line_row = MATRIX_MODE_LINE_ROW (desired_matrix); | |
4092 if (mode_line_row->mode_line_p && mode_line_row->enabled_p) | |
4093 { | |
4094 mode_line_row->y = yb; | |
4095 update_window_line (w, MATRIX_ROW_VPOS (mode_line_row, | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4096 desired_matrix), |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4097 &mouse_face_overwritten_p); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4098 changed_p = 1; |
25012 | 4099 } |
4100 | |
4101 /* Find first enabled row. Optimizations in redisplay_internal | |
4102 may lead to an update with only one row enabled. There may | |
4103 be also completely empty matrices. */ | |
4104 while (row < end && !row->enabled_p) | |
4105 ++row; | |
4106 | |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4107 /* Try reusing part of the display by copying. */ |
25012 | 4108 if (row < end && !desired_matrix->no_scrolling_p) |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4109 { |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4110 int rc = scrolling_window (w, header_line_row != NULL); |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4111 if (rc < 0) |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4112 { |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4113 /* All rows were found to be equal. */ |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4114 paused_p = 0; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4115 goto set_cursor; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4116 } |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4117 else if (rc > 0) |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4118 /* We've scrolled the display. */ |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4119 force_p = 1; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4120 changed_p = 1; |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4121 } |
25012 | 4122 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4123 /* Update the header line after scrolling because a new header |
25012 | 4124 line would otherwise overwrite lines at the top of the window |
4125 that can be scrolled. */ | |
25546 | 4126 if (header_line_row && header_line_row->enabled_p) |
25012 | 4127 { |
25546 | 4128 header_line_row->y = 0; |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4129 update_window_line (w, 0, &mouse_face_overwritten_p); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4130 changed_p = 1; |
25012 | 4131 } |
4132 | |
4133 /* Update the rest of the lines. */ | |
34622
877ed6cab304
(update_window): Detect pending input every nth line
Gerd Moellmann <gerd@gnu.org>
parents:
34517
diff
changeset
|
4134 for (n_updated = 0; row < end && (force_p || !input_pending); ++row) |
31653
2554afbeb88d
(update_window): Make sure to make desired rows
Gerd Moellmann <gerd@gnu.org>
parents:
31295
diff
changeset
|
4135 if (row->enabled_p) |
25012 | 4136 { |
4137 int vpos = MATRIX_ROW_VPOS (row, desired_matrix); | |
4138 int i; | |
4139 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4140 /* We'll have to play a little bit with when to |
25012 | 4141 detect_input_pending. If it's done too often, |
4142 scrolling large windows with repeated scroll-up | |
4143 commands will too quickly pause redisplay. */ | |
34622
877ed6cab304
(update_window): Detect pending input every nth line
Gerd Moellmann <gerd@gnu.org>
parents:
34517
diff
changeset
|
4144 if (!force_p && ++n_updated % preempt_count == 0) |
25012 | 4145 detect_input_pending (); |
4146 | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4147 changed_p |= update_window_line (w, vpos, |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4148 &mouse_face_overwritten_p); |
25012 | 4149 |
4150 /* Mark all rows below the last visible one in the current | |
4151 matrix as invalid. This is necessary because of | |
4152 variable line heights. Consider the case of three | |
4153 successive redisplays, where the first displays 5 | |
4154 lines, the second 3 lines, and the third 5 lines again. | |
4155 If the second redisplay wouldn't mark rows in the | |
4156 current matrix invalid, the third redisplay might be | |
4157 tempted to optimize redisplay based on lines displayed | |
4158 in the first redisplay. */ | |
4159 if (MATRIX_ROW_BOTTOM_Y (row) >= yb) | |
4160 for (i = vpos + 1; i < w->current_matrix->nrows - 1; ++i) | |
4161 MATRIX_ROW (w->current_matrix, i)->enabled_p = 0; | |
4162 } | |
4163 | |
4164 /* Was display preempted? */ | |
4165 paused_p = row < end; | |
4166 | |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4167 set_cursor: |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4168 |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4169 /* Fix the appearance of overlapping/overlapped rows. */ |
25012 | 4170 if (!paused_p && !w->pseudo_window_p) |
4171 { | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4172 if (changed_p && rif->fix_overlapping_area) |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4173 { |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4174 redraw_overlapped_rows (w, yb); |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4175 redraw_overlapping_rows (w, yb); |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4176 } |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4177 |
25012 | 4178 /* Make cursor visible at cursor position of W. */ |
4179 set_window_cursor_after_update (w); | |
4180 | |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4181 #if 0 /* Check that current matrix invariants are satisfied. This is |
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4182 for debugging only. See the comment of check_matrix_invariants. */ |
25012 | 4183 IF_DEBUG (check_matrix_invariants (w)); |
4184 #endif | |
4185 } | |
4186 | |
4187 #if GLYPH_DEBUG | |
4188 /* Remember the redisplay method used to display the matrix. */ | |
4189 strcpy (w->current_matrix->method, w->desired_matrix->method); | |
4190 #endif | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4191 |
38489
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4192 /* End the update of window W. Don't set the cursor if we |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4193 paused updating the display because in this case, |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4194 set_window_cursor_after_update hasn't been called, and |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4195 output_cursor doesn't contain the cursor location. */ |
19cb32759a2a
(update_window): Don't set the cursor at the end
Gerd Moellmann <gerd@gnu.org>
parents:
38354
diff
changeset
|
4196 rif->update_window_end_hook (w, !paused_p, mouse_face_overwritten_p); |
25012 | 4197 } |
4198 else | |
4199 paused_p = 1; | |
4200 | |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
4201 #if GLYPH_DEBUG |
34944
4fc804373f2a
(update_window): Don't check_current_matrix_flags.
Gerd Moellmann <gerd@gnu.org>
parents:
34929
diff
changeset
|
4202 /* check_current_matrix_flags (w); */ |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
4203 add_window_display_history (w, w->current_matrix->method, paused_p); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
4204 #endif |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
4205 |
25012 | 4206 clear_glyph_matrix (desired_matrix); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4207 |
25012 | 4208 return paused_p; |
4209 } | |
4210 | |
4211 | |
4212 /* Update the display of area AREA in window W, row number VPOS. | |
4213 AREA can be either LEFT_MARGIN_AREA or RIGHT_MARGIN_AREA. */ | |
4214 | |
4215 static void | |
4216 update_marginal_area (w, area, vpos) | |
4217 struct window *w; | |
4218 int area, vpos; | |
4219 { | |
4220 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos); | |
4221 | |
4222 /* Let functions in xterm.c know what area subsequent X positions | |
4223 will be relative to. */ | |
4224 updated_area = area; | |
4225 | |
4226 /* Set cursor to start of glyphs, write them, and clear to the end | |
4227 of the area. I don't think that something more sophisticated is | |
4228 necessary here, since marginal areas will not be the default. */ | |
4229 rif->cursor_to (vpos, 0, desired_row->y, 0); | |
4230 if (desired_row->used[area]) | |
4231 rif->write_glyphs (desired_row->glyphs[area], desired_row->used[area]); | |
4232 rif->clear_end_of_line (-1); | |
4233 } | |
4234 | |
4235 | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4236 /* Update the display of the text area of row VPOS in window W. |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4237 Value is non-zero if display has changed. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4238 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4239 static int |
25012 | 4240 update_text_area (w, vpos) |
4241 struct window *w; | |
4242 int vpos; | |
314 | 4243 { |
25012 | 4244 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos); |
4245 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4246 int changed_p = 0; |
25012 | 4247 |
4248 /* Let functions in xterm.c know what area subsequent X positions | |
4249 will be relative to. */ | |
4250 updated_area = TEXT_AREA; | |
4251 | |
4252 /* If rows are at different X or Y, or rows have different height, | |
4253 or the current row is marked invalid, write the entire line. */ | |
4254 if (!current_row->enabled_p | |
4255 || desired_row->y != current_row->y | |
4256 || desired_row->ascent != current_row->ascent | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4257 || desired_row->phys_ascent != current_row->phys_ascent |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4258 || desired_row->phys_height != current_row->phys_height |
25012 | 4259 || desired_row->visible_height != current_row->visible_height |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4260 || current_row->overlapped_p |
30307
faf4e303bab7
(update_text_area): Write the whole row if it
Gerd Moellmann <gerd@gnu.org>
parents:
30165
diff
changeset
|
4261 || current_row->mouse_face_p |
25012 | 4262 || current_row->x != desired_row->x) |
4263 { | |
4264 rif->cursor_to (vpos, 0, desired_row->y, desired_row->x); | |
4265 | |
4266 if (desired_row->used[TEXT_AREA]) | |
4267 rif->write_glyphs (desired_row->glyphs[TEXT_AREA], | |
4268 desired_row->used[TEXT_AREA]); | |
4269 | |
4270 /* Clear to end of window. */ | |
4271 rif->clear_end_of_line (-1); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4272 changed_p = 1; |
44815
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4273 |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4274 /* This erases the cursor. We do this here because |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4275 notice_overwritten_cursor cannot easily check this, which |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4276 might indicate that the whole functionality of |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4277 notice_overwritten_cursor would better be implemented here. |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4278 On the other hand, we need notice_overwritten_cursor as long |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4279 as mouse highlighting is done asynchronously outside of |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4280 redisplay. */ |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4281 if (vpos == w->phys_cursor.vpos) |
cf2454d3a103
(update_text_area): Set phys_cursor_on_p to 0 in the
Gerd Moellmann <gerd@gnu.org>
parents:
44580
diff
changeset
|
4282 w->phys_cursor_on_p = 0; |
25012 | 4283 } |
4284 else | |
4285 { | |
4286 int stop, i, x; | |
4287 struct glyph *current_glyph = current_row->glyphs[TEXT_AREA]; | |
4288 struct glyph *desired_glyph = desired_row->glyphs[TEXT_AREA]; | |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4289 int overlapping_glyphs_p = current_row->contains_overlapping_glyphs_p; |
35268
d93bf580d166
(update_text_area): Put code which decrements the
Gerd Moellmann <gerd@gnu.org>
parents:
35006
diff
changeset
|
4290 int desired_stop_pos = desired_row->used[TEXT_AREA]; |
d93bf580d166
(update_text_area): Put code which decrements the
Gerd Moellmann <gerd@gnu.org>
parents:
35006
diff
changeset
|
4291 |
25012 | 4292 /* If the desired row extends its face to the text area end, |
4293 make sure we write at least one glyph, so that the face | |
4294 extension actually takes place. */ | |
35269 | 4295 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row)) |
35268
d93bf580d166
(update_text_area): Put code which decrements the
Gerd Moellmann <gerd@gnu.org>
parents:
35006
diff
changeset
|
4296 --desired_stop_pos; |
25012 | 4297 |
4298 stop = min (current_row->used[TEXT_AREA], desired_stop_pos); | |
4299 i = 0; | |
4300 x = desired_row->x; | |
36097
1dfaaf6d6166
(update_text_area): Undo change of 2001-01-12.
Gerd Moellmann <gerd@gnu.org>
parents:
35924
diff
changeset
|
4301 |
1dfaaf6d6166
(update_text_area): Undo change of 2001-01-12.
Gerd Moellmann <gerd@gnu.org>
parents:
35924
diff
changeset
|
4302 /* Loop over glyphs that current and desired row may have |
1dfaaf6d6166
(update_text_area): Undo change of 2001-01-12.
Gerd Moellmann <gerd@gnu.org>
parents:
35924
diff
changeset
|
4303 in common. */ |
25012 | 4304 while (i < stop) |
4305 { | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4306 int can_skip_p = 1; |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4307 |
25012 | 4308 /* Skip over glyphs that both rows have in common. These |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4309 don't have to be written. We can't skip if the last |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4310 current glyph overlaps the glyph to its right. For |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4311 example, consider a current row of `if ' with the `f' in |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4312 Courier bold so that it overlaps the ` ' to its right. |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4313 If the desired row is ` ', we would skip over the space |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4314 after the `if' and there would remain a pixel from the |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4315 `f' on the screen. */ |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4316 if (overlapping_glyphs_p && i > 0) |
25012 | 4317 { |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4318 struct glyph *glyph = ¤t_row->glyphs[TEXT_AREA][i - 1]; |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4319 int left, right; |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4320 |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4321 rif->get_glyph_overhangs (glyph, XFRAME (w->frame), |
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4322 &left, &right); |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4323 can_skip_p = right == 0; |
25012 | 4324 } |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4325 |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4326 if (can_skip_p) |
25012 | 4327 { |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4328 while (i < stop |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4329 && GLYPH_EQUAL_P (desired_glyph, current_glyph)) |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4330 { |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4331 x += desired_glyph->pixel_width; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4332 ++desired_glyph, ++current_glyph, ++i; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4333 } |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4334 |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4335 /* Consider the case that the current row contains "xxx |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4336 ppp ggg" in italic Courier font, and the desired row |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4337 is "xxx ggg". The character `p' has lbearing, `g' |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4338 has not. The loop above will stop in front of the |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4339 first `p' in the current row. If we would start |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4340 writing glyphs there, we wouldn't erase the lbearing |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4341 of the `p'. The rest of the lbearing problem is then |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4342 taken care of by x_draw_glyphs. */ |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4343 if (overlapping_glyphs_p |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4344 && i > 0 |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4345 && i < current_row->used[TEXT_AREA] |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4346 && (current_row->used[TEXT_AREA] |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4347 != desired_row->used[TEXT_AREA])) |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4348 { |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4349 int left, right; |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4350 |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4351 rif->get_glyph_overhangs (current_glyph, XFRAME (w->frame), |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4352 &left, &right); |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4353 while (left > 0 && i > 0) |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4354 { |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4355 --i, --desired_glyph, --current_glyph; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4356 x -= desired_glyph->pixel_width; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4357 left -= desired_glyph->pixel_width; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4358 } |
25012 | 4359 } |
4360 } | |
4361 | |
4362 /* Try to avoid writing the entire rest of the desired row | |
4363 by looking for a resync point. This mainly prevents | |
4364 mode line flickering in the case the mode line is in | |
4365 fixed-pitch font, which it usually will be. */ | |
4366 if (i < desired_row->used[TEXT_AREA]) | |
4367 { | |
4368 int start_x = x, start_hpos = i; | |
4369 struct glyph *start = desired_glyph; | |
4370 int current_x = x; | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4371 int skip_first_p = !can_skip_p; |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4372 |
25012 | 4373 /* Find the next glyph that's equal again. */ |
4374 while (i < stop | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4375 && (skip_first_p |
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4376 || !GLYPH_EQUAL_P (desired_glyph, current_glyph)) |
25012 | 4377 && x == current_x) |
4378 { | |
4379 x += desired_glyph->pixel_width; | |
4380 current_x += current_glyph->pixel_width; | |
4381 ++desired_glyph, ++current_glyph, ++i; | |
33603
6697403d3c12
(update_text_area): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents:
33596
diff
changeset
|
4382 skip_first_p = 0; |
25012 | 4383 } |
4384 | |
4385 if (i == start_hpos || x != current_x) | |
4386 { | |
4387 i = start_hpos; | |
4388 x = start_x; | |
4389 desired_glyph = start; | |
4390 break; | |
4391 } | |
33596
680ddd4ab1f9
(update_text_area): Don't skip over equal glyphs
Gerd Moellmann <gerd@gnu.org>
parents:
33527
diff
changeset
|
4392 |
25012 | 4393 rif->cursor_to (vpos, start_hpos, desired_row->y, start_x); |
4394 rif->write_glyphs (start, i - start_hpos); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4395 changed_p = 1; |
25012 | 4396 } |
4397 } | |
4398 | |
4399 /* Write the rest. */ | |
4400 if (i < desired_row->used[TEXT_AREA]) | |
4401 { | |
4402 rif->cursor_to (vpos, i, desired_row->y, x); | |
4403 rif->write_glyphs (desired_glyph, desired_row->used[TEXT_AREA] - i); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4404 changed_p = 1; |
25012 | 4405 } |
4406 | |
4407 /* Maybe clear to end of line. */ | |
4408 if (MATRIX_ROW_EXTENDS_FACE_P (desired_row)) | |
4409 { | |
4410 /* If new row extends to the end of the text area, nothing | |
4411 has to be cleared, if and only if we did a write_glyphs | |
4412 above. This is made sure by setting desired_stop_pos | |
4413 appropriately above. */ | |
4414 xassert (i < desired_row->used[TEXT_AREA]); | |
4415 } | |
4416 else if (MATRIX_ROW_EXTENDS_FACE_P (current_row)) | |
4417 { | |
4418 /* If old row extends to the end of the text area, clear. */ | |
4419 if (i >= desired_row->used[TEXT_AREA]) | |
4420 rif->cursor_to (vpos, i, desired_row->y, | |
4421 desired_row->x + desired_row->pixel_width); | |
4422 rif->clear_end_of_line (-1); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4423 changed_p = 1; |
25012 | 4424 } |
4425 else if (desired_row->pixel_width < current_row->pixel_width) | |
4426 { | |
4427 /* Otherwise clear to the end of the old row. Everything | |
4428 after that position should be clear already. */ | |
4429 int x; | |
4430 | |
4431 if (i >= desired_row->used[TEXT_AREA]) | |
4432 rif->cursor_to (vpos, i, desired_row->y, | |
4433 desired_row->x + desired_row->pixel_width); | |
4434 | |
4435 /* If cursor is displayed at the end of the line, make sure | |
4436 it's cleared. Nowadays we don't have a phys_cursor_glyph | |
4437 with which to erase the cursor (because this method | |
4438 doesn't work with lbearing/rbearing), so we must do it | |
4439 this way. */ | |
4440 if (vpos == w->phys_cursor.vpos | |
4441 && w->phys_cursor.hpos >= desired_row->used[TEXT_AREA]) | |
4442 { | |
4443 w->phys_cursor_on_p = 0; | |
4444 x = -1; | |
4445 } | |
4446 else | |
4447 x = current_row->x + current_row->pixel_width; | |
4448 rif->clear_end_of_line (x); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4449 changed_p = 1; |
25012 | 4450 } |
4451 } | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4452 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4453 return changed_p; |
25012 | 4454 } |
4455 | |
4456 | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4457 /* Update row VPOS in window W. Value is non-zero if display has been |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4458 changed. */ |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4459 |
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4460 static int |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4461 update_window_line (w, vpos, mouse_face_overwritten_p) |
25012 | 4462 struct window *w; |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4463 int vpos, *mouse_face_overwritten_p; |
25012 | 4464 { |
4465 struct glyph_row *current_row = MATRIX_ROW (w->current_matrix, vpos); | |
4466 struct glyph_row *desired_row = MATRIX_ROW (w->desired_matrix, vpos); | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4467 int changed_p = 0; |
25012 | 4468 |
4469 /* Set the row being updated. This is important to let xterm.c | |
4470 know what line height values are in effect. */ | |
4471 updated_row = desired_row; | |
4472 | |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4473 /* A row can be completely invisible in case a desired matrix was |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4474 built with a vscroll and then make_cursor_line_fully_visible shifts |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4475 the matrix. Make sure to make such rows current anyway, since |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4476 we need the correct y-position, for example, in the current matrix. */ |
31726
59b455472b56
(update_window_line): Make sure to always draw
Gerd Moellmann <gerd@gnu.org>
parents:
31690
diff
changeset
|
4477 if (desired_row->mode_line_p |
59b455472b56
(update_window_line): Make sure to always draw
Gerd Moellmann <gerd@gnu.org>
parents:
31690
diff
changeset
|
4478 || desired_row->visible_height > 0) |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4479 { |
31690
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4480 xassert (desired_row->enabled_p); |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4481 |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4482 /* Update display of the left margin area, if there is one. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4483 if (!desired_row->full_width_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4484 && !NILP (w->left_margin_width)) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4485 { |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4486 changed_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4487 update_marginal_area (w, LEFT_MARGIN_AREA, vpos); |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4488 } |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4489 |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4490 /* Update the display of the text area. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4491 if (update_text_area (w, vpos)) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4492 { |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4493 changed_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4494 if (current_row->mouse_face_p) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4495 *mouse_face_overwritten_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4496 } |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4497 |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4498 /* Update display of the right margin area, if there is one. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4499 if (!desired_row->full_width_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4500 && !NILP (w->right_margin_width)) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4501 { |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4502 changed_p = 1; |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4503 update_marginal_area (w, RIGHT_MARGIN_AREA, vpos); |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4504 } |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4505 |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4506 /* Draw truncation marks etc. */ |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4507 if (!current_row->enabled_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4508 || desired_row->y != current_row->y |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4509 || desired_row->visible_height != current_row->visible_height |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4510 || desired_row->overlay_arrow_p != current_row->overlay_arrow_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4511 || desired_row->truncated_on_left_p != current_row->truncated_on_left_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4512 || desired_row->truncated_on_right_p != current_row->truncated_on_right_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4513 || desired_row->continued_p != current_row->continued_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4514 || desired_row->mode_line_p != current_row->mode_line_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4515 || (desired_row->indicate_empty_line_p |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4516 != current_row->indicate_empty_line_p) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4517 || (MATRIX_ROW_CONTINUATION_LINE_P (desired_row) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4518 != MATRIX_ROW_CONTINUATION_LINE_P (current_row))) |
6abff42174ea
(update_window): Move test for invisible lines
Gerd Moellmann <gerd@gnu.org>
parents:
31653
diff
changeset
|
4519 rif->after_update_window_line_hook (desired_row); |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
4520 } |
25012 | 4521 |
4522 /* Update current_row from desired_row. */ | |
4523 make_current (w->desired_matrix, w->current_matrix, vpos); | |
4524 updated_row = NULL; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
4525 return changed_p; |
25012 | 4526 } |
4527 | |
4528 | |
4529 /* Set the cursor after an update of window W. This function may only | |
4530 be called from update_window. */ | |
4531 | |
4532 static void | |
4533 set_window_cursor_after_update (w) | |
4534 struct window *w; | |
4535 { | |
4536 struct frame *f = XFRAME (w->frame); | |
4537 int cx, cy, vpos, hpos; | |
4538 | |
4539 /* Not intended for frame matrix updates. */ | |
4540 xassert (FRAME_WINDOW_P (f)); | |
4541 | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4542 if (cursor_in_echo_area |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4543 && !NILP (echo_area_buffer[0]) |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4544 /* If we are showing a message instead of the mini-buffer, |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4545 show the cursor for the message instead. */ |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4546 && XWINDOW (minibuf_window) == w |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4547 && EQ (minibuf_window, echo_area_window) |
25012 | 4548 /* These cases apply only to the frame that contains |
4549 the active mini-buffer window. */ | |
4550 && FRAME_HAS_MINIBUF_P (f) | |
4551 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window)) | |
4552 { | |
4553 cx = cy = vpos = hpos = 0; | |
4554 | |
4555 if (cursor_in_echo_area >= 0) | |
4556 { | |
4557 /* If the mini-buffer is several lines high, find the last | |
4558 line that has any text on it. Note: either all lines | |
4559 are enabled or none. Otherwise we wouldn't be able to | |
4560 determine Y. */ | |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4561 struct glyph_row *row, *last_row; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4562 struct glyph *glyph; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4563 int yb = window_text_bottom_y (w); |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4564 |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4565 last_row = NULL; |
39254
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4566 row = w->current_matrix->rows; |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4567 while (row->enabled_p |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4568 && (last_row == NULL |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4569 || MATRIX_ROW_BOTTOM_Y (row) <= yb)) |
25012 | 4570 { |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4571 if (row->used[TEXT_AREA] |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4572 && row->glyphs[TEXT_AREA][0].charpos >= 0) |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4573 last_row = row; |
39254
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4574 ++row; |
25012 | 4575 } |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4576 |
25012 | 4577 if (last_row) |
4578 { | |
39254
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4579 struct glyph *start = last_row->glyphs[TEXT_AREA]; |
73dd40615520
(set_window_cursor_after_update): Fix code
Gerd Moellmann <gerd@gnu.org>
parents:
39226
diff
changeset
|
4580 struct glyph *last = start + last_row->used[TEXT_AREA] - 1; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4581 |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
4582 while (last > start && last->charpos < 0) |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4583 --last; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4584 |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4585 for (glyph = start; glyph < last; ++glyph) |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4586 { |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4587 cx += glyph->pixel_width; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4588 ++hpos; |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4589 } |
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4590 |
25012 | 4591 cy = last_row->y; |
25190
a14edd4a5f4a
(set_window_cursor_after_update): Correct cursor
Gerd Moellmann <gerd@gnu.org>
parents:
25186
diff
changeset
|
4592 vpos = MATRIX_ROW_VPOS (last_row, w->current_matrix); |
25012 | 4593 } |
4594 } | |
4595 } | |
4596 else | |
4597 { | |
4598 cx = w->cursor.x; | |
4599 cy = w->cursor.y; | |
4600 hpos = w->cursor.hpos; | |
4601 vpos = w->cursor.vpos; | |
4602 } | |
4603 | |
4604 /* Window cursor can be out of sync for horizontally split windows. */ | |
4605 hpos = max (0, hpos); | |
4606 hpos = min (w->current_matrix->matrix_w - 1, hpos); | |
4607 vpos = max (0, vpos); | |
4608 vpos = min (w->current_matrix->nrows - 1, vpos); | |
4609 rif->cursor_to (vpos, hpos, cy, cx); | |
4610 } | |
4611 | |
4612 | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4613 /* Set WINDOW->must_be_updated_p to ON_P for all windows in the window |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4614 tree rooted at W. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4615 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4616 void |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4617 set_window_update_flags (w, on_p) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4618 struct window *w; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4619 int on_p; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4620 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4621 while (w) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4622 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4623 if (!NILP (w->hchild)) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4624 set_window_update_flags (XWINDOW (w->hchild), on_p); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4625 else if (!NILP (w->vchild)) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4626 set_window_update_flags (XWINDOW (w->vchild), on_p); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4627 else |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4628 w->must_be_updated_p = on_p; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4629 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4630 w = NILP (w->next) ? 0 : XWINDOW (w->next); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4631 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4632 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4633 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4634 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4635 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4636 /*********************************************************************** |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4637 Window-Based Scrolling |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4638 ***********************************************************************/ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4639 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4640 /* Structure describing rows in scrolling_window. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4641 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4642 struct row_entry |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4643 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4644 /* Number of occurrences of this row in desired and current matrix. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4645 int old_uses, new_uses; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4646 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4647 /* Vpos of row in new matrix. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4648 int new_line_number; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4649 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4650 /* Bucket index of this row_entry in the hash table row_table. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4651 int bucket; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4652 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4653 /* The row described by this entry. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4654 struct glyph_row *row; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4655 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4656 /* Hash collision chain. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4657 struct row_entry *next; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4658 }; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4659 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4660 /* A pool to allocate row_entry structures from, and the size of the |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4661 pool. The pool is reallocated in scrolling_window when we find |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4662 that we need a larger one. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4663 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4664 static struct row_entry *row_entry_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4665 static int row_entry_pool_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4666 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4667 /* Index of next free entry in row_entry_pool. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4668 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4669 static int row_entry_idx; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4670 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4671 /* The hash table used during scrolling, and the table's size. This |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4672 table is used to quickly identify equal rows in the desired and |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4673 current matrix. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4674 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4675 static struct row_entry **row_table; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4676 static int row_table_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4677 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4678 /* Vectors of pointers to row_entry structures belonging to the |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4679 current and desired matrix, and the size of the vectors. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4680 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4681 static struct row_entry **old_lines, **new_lines; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4682 static int old_lines_size, new_lines_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4683 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4684 /* A pool to allocate run structures from, and its size. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4685 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4686 static struct run *run_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4687 static int runs_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4688 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4689 /* A vector of runs of lines found during scrolling. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4690 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4691 static struct run **runs; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4692 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4693 /* Add glyph row ROW to the scrolling hash table during the scrolling |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4694 of window W. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4695 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4696 static INLINE struct row_entry * |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4697 add_row_entry (w, row) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4698 struct window *w; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4699 struct glyph_row *row; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4700 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4701 struct row_entry *entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4702 int i = row->hash % row_table_size; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4703 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4704 entry = row_table[i]; |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
4705 while (entry && !row_equal_p (w, entry->row, row, 1)) |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4706 entry = entry->next; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4707 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4708 if (entry == NULL) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4709 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4710 entry = row_entry_pool + row_entry_idx++; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4711 entry->row = row; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4712 entry->old_uses = entry->new_uses = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4713 entry->new_line_number = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4714 entry->bucket = i; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4715 entry->next = row_table[i]; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4716 row_table[i] = entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4717 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4718 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4719 return entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4720 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4721 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4722 |
25012 | 4723 /* Try to reuse part of the current display of W by scrolling lines. |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
4724 HEADER_LINE_P non-zero means W has a header line. |
25012 | 4725 |
4726 The algorithm is taken from Communications of the ACM, Apr78 "A | |
4727 Technique for Isolating Differences Between Files." It should take | |
4728 O(N) time. | |
4729 | |
4730 A short outline of the steps of the algorithm | |
4731 | |
4732 1. Skip lines equal at the start and end of both matrices. | |
4733 | |
4734 2. Enter rows in the current and desired matrix into a symbol | |
4735 table, counting how often they appear in both matrices. | |
4736 | |
4737 3. Rows that appear exactly once in both matrices serve as anchors, | |
4738 i.e. we assume that such lines are likely to have been moved. | |
4739 | |
4740 4. Starting from anchor lines, extend regions to be scrolled both | |
4741 forward and backward. | |
4742 | |
4743 Value is | |
4744 | |
4745 -1 if all rows were found to be equal. | |
4746 0 to indicate that we did not scroll the display, or | |
4747 1 if we did scroll. */ | |
4748 | |
4749 static int | |
25546 | 4750 scrolling_window (w, header_line_p) |
25012 | 4751 struct window *w; |
25546 | 4752 int header_line_p; |
25012 | 4753 { |
4754 struct glyph_matrix *desired_matrix = w->desired_matrix; | |
4755 struct glyph_matrix *current_matrix = w->current_matrix; | |
4756 int yb = window_text_bottom_y (w); | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4757 int i, j, first_old, first_new, last_old, last_new; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4758 int nruns, nbytes, n, run_idx; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4759 struct row_entry *entry; |
25012 | 4760 |
4761 /* Skip over rows equal at the start. */ | |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4762 for (i = header_line_p ? 1 : 0; i < current_matrix->nrows - 1; ++i) |
25012 | 4763 { |
31825
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4764 struct glyph_row *d = MATRIX_ROW (desired_matrix, i); |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4765 struct glyph_row *c = MATRIX_ROW (current_matrix, i); |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4766 |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4767 if (c->enabled_p |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4768 && d->enabled_p |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4769 && c->y == d->y |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4770 && MATRIX_ROW_BOTTOM_Y (c) <= yb |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4771 && MATRIX_ROW_BOTTOM_Y (d) <= yb |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4772 && row_equal_p (w, c, d, 1)) |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4773 { |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4774 assign_row (c, d); |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4775 d->enabled_p = 0; |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4776 } |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4777 else |
62830644b967
(scrolling_window): Compare y-positions of rows
Gerd Moellmann <gerd@gnu.org>
parents:
31726
diff
changeset
|
4778 break; |
25012 | 4779 } |
4780 | |
4781 /* Give up if some rows in the desired matrix are not enabled. */ | |
4782 if (!MATRIX_ROW (desired_matrix, i)->enabled_p) | |
4783 return -1; | |
4784 | |
4785 first_old = first_new = i; | |
4786 | |
4787 /* Set last_new to the index + 1 of the last enabled row in the | |
4788 desired matrix. */ | |
4789 i = first_new + 1; | |
4790 while (i < desired_matrix->nrows - 1 | |
4791 && MATRIX_ROW (desired_matrix, i)->enabled_p | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4792 && MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (desired_matrix, i)) <= yb) |
25012 | 4793 ++i; |
4794 | |
4795 if (!MATRIX_ROW (desired_matrix, i)->enabled_p) | |
4796 return 0; | |
4797 | |
4798 last_new = i; | |
4799 | |
4800 /* Set last_old to the index + 1 of the last enabled row in the | |
4801 current matrix. We don't look at the enabled flag here because | |
4802 we plan to reuse part of the display even if other parts are | |
4803 disabled. */ | |
4804 i = first_old + 1; | |
34929
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4805 while (i < current_matrix->nrows - 1) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4806 { |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4807 int bottom = MATRIX_ROW_BOTTOM_Y (MATRIX_ROW (current_matrix, i)); |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4808 if (bottom <= yb) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4809 ++i; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4810 if (bottom >= yb) |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4811 break; |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4812 } |
b116257b3b28
(check_current_matrix_flags) [GLYPH_DEBUG]: New
Gerd Moellmann <gerd@gnu.org>
parents:
34895
diff
changeset
|
4813 |
25012 | 4814 last_old = i; |
4815 | |
4816 /* Skip over rows equal at the bottom. */ | |
4817 i = last_new; | |
4818 j = last_old; | |
4819 while (i - 1 > first_new | |
4820 && j - 1 > first_old | |
4821 && MATRIX_ROW (current_matrix, i - 1)->enabled_p | |
4822 && (MATRIX_ROW (current_matrix, i - 1)->y | |
4823 == MATRIX_ROW (desired_matrix, j - 1)->y) | |
4824 && row_equal_p (w, | |
4825 MATRIX_ROW (desired_matrix, i - 1), | |
30152
f6270e5282da
(direct_output_forward_char): Give up if currently
Gerd Moellmann <gerd@gnu.org>
parents:
30041
diff
changeset
|
4826 MATRIX_ROW (current_matrix, j - 1), 1)) |
25012 | 4827 --i, --j; |
4828 last_new = i; | |
4829 last_old = j; | |
4830 | |
4831 /* Nothing to do if all rows are equal. */ | |
4832 if (last_new == first_new) | |
4833 return 0; | |
4834 | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4835 /* Reallocate vectors, tables etc. if necessary. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4836 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4837 if (current_matrix->nrows > old_lines_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4838 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4839 old_lines_size = current_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4840 nbytes = old_lines_size * sizeof *old_lines; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4841 old_lines = (struct row_entry **) xrealloc (old_lines, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4842 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4843 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4844 if (desired_matrix->nrows > new_lines_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4845 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4846 new_lines_size = desired_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4847 nbytes = new_lines_size * sizeof *new_lines; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4848 new_lines = (struct row_entry **) xrealloc (new_lines, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4849 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4850 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4851 n = desired_matrix->nrows + current_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4852 if (3 * n > row_table_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4853 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4854 row_table_size = next_almost_prime (3 * n); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4855 nbytes = row_table_size * sizeof *row_table; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4856 row_table = (struct row_entry **) xrealloc (row_table, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4857 bzero (row_table, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4858 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4859 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4860 if (n > row_entry_pool_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4861 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4862 row_entry_pool_size = n; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4863 nbytes = row_entry_pool_size * sizeof *row_entry_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4864 row_entry_pool = (struct row_entry *) xrealloc (row_entry_pool, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4865 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4866 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4867 if (desired_matrix->nrows > runs_size) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4868 { |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4869 runs_size = desired_matrix->nrows; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4870 nbytes = runs_size * sizeof *runs; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4871 runs = (struct run **) xrealloc (runs, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4872 nbytes = runs_size * sizeof *run_pool; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4873 run_pool = (struct run *) xrealloc (run_pool, nbytes); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4874 } |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4875 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4876 nruns = run_idx = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4877 row_entry_idx = 0; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4878 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4879 /* Add rows from the current and desired matrix to the hash table |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4880 row_hash_table to be able to find equal ones quickly. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4881 |
25012 | 4882 for (i = first_old; i < last_old; ++i) |
4883 { | |
4884 if (MATRIX_ROW (current_matrix, i)->enabled_p) | |
4885 { | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4886 entry = add_row_entry (w, MATRIX_ROW (current_matrix, i)); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4887 old_lines[i] = entry; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4888 ++entry->old_uses; |
25012 | 4889 } |
4890 else | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4891 old_lines[i] = NULL; |
25012 | 4892 } |
4893 | |
4894 for (i = first_new; i < last_new; ++i) | |
4895 { | |
4896 xassert (MATRIX_ROW_ENABLED_P (desired_matrix, i)); | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4897 entry = add_row_entry (w, MATRIX_ROW (desired_matrix, i)); |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4898 ++entry->new_uses; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4899 entry->new_line_number = i; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4900 new_lines[i] = entry; |
25012 | 4901 } |
4902 | |
4903 /* Identify moves based on lines that are unique and equal | |
4904 in both matrices. */ | |
4905 for (i = first_old; i < last_old;) | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4906 if (old_lines[i] |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4907 && old_lines[i]->old_uses == 1 |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4908 && old_lines[i]->new_uses == 1) |
25012 | 4909 { |
4910 int j, k; | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4911 int new_line = old_lines[i]->new_line_number; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4912 struct run *run = run_pool + run_idx++; |
25012 | 4913 |
4914 /* Record move. */ | |
4915 run->current_vpos = i; | |
4916 run->current_y = MATRIX_ROW (current_matrix, i)->y; | |
4917 run->desired_vpos = new_line; | |
4918 run->desired_y = MATRIX_ROW (desired_matrix, new_line)->y; | |
4919 run->nrows = 1; | |
4920 run->height = MATRIX_ROW (current_matrix, i)->height; | |
4921 | |
4922 /* Extend backward. */ | |
4923 j = i - 1; | |
4924 k = new_line - 1; | |
4925 while (j > first_old | |
4926 && k > first_new | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4927 && old_lines[j] == new_lines[k]) |
25012 | 4928 { |
4929 int h = MATRIX_ROW (current_matrix, j)->height; | |
4930 --run->current_vpos; | |
4931 --run->desired_vpos; | |
4932 ++run->nrows; | |
4933 run->height += h; | |
4934 run->desired_y -= h; | |
4935 run->current_y -= h; | |
4936 --j, --k; | |
4937 } | |
4938 | |
4939 /* Extend forward. */ | |
4940 j = i + 1; | |
4941 k = new_line + 1; | |
4942 while (j < last_old | |
4943 && k < last_new | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
4944 && old_lines[j] == new_lines[k]) |
25012 | 4945 { |
4946 int h = MATRIX_ROW (current_matrix, j)->height; | |
4947 ++run->nrows; | |
4948 run->height += h; | |
4949 ++j, ++k; | |
4950 } | |
4951 | |
4952 /* Insert run into list of all runs. Order runs by copied | |
4953 pixel lines. Note that we record runs that don't have to | |
4954 be copied because they are already in place. This is done | |
4955 because we can avoid calling update_window_line in this | |
4956 case. */ | |
4957 for (j = 0; j < nruns && runs[j]->height > run->height; ++j) | |
4958 ; | |
34203
e55480843a8e
(scrolling_window): Fix code inserting runs in list of all runs.
Gerd Moellmann <gerd@gnu.org>
parents:
33763
diff
changeset
|
4959 for (k = nruns; k > j; --k) |
25012 | 4960 runs[k] = runs[k - 1]; |
4961 runs[j] = run; | |
4962 ++nruns; | |
4963 | |
4964 i += run->nrows; | |
4965 } | |
4966 else | |
4967 ++i; | |
4968 | |
4969 /* Do the moves. Do it in a way that we don't overwrite something | |
4970 we want to copy later on. This is not solvable in general | |
4971 because there is only one display and we don't have a way to | |
4972 exchange areas on this display. Example: | |
4973 | |
4974 +-----------+ +-----------+ | |
4975 | A | | B | | |
4976 +-----------+ --> +-----------+ | |
4977 | B | | A | | |
4978 +-----------+ +-----------+ | |
4979 | |
4980 Instead, prefer bigger moves, and invalidate moves that would | |
4981 copy from where we copied to. */ | |
4982 | |
4983 for (i = 0; i < nruns; ++i) | |
4984 if (runs[i]->nrows > 0) | |
4985 { | |
4986 struct run *r = runs[i]; | |
4987 | |
4988 /* Copy on the display. */ | |
4989 if (r->current_y != r->desired_y) | |
4990 { | |
4991 rif->scroll_run_hook (w, r); | |
4992 | |
4993 /* Invalidate runs that copy from where we copied to. */ | |
4994 for (j = i + 1; j < nruns; ++j) | |
4995 { | |
4996 struct run *p = runs[j]; | |
4997 | |
4998 if ((p->current_y >= r->desired_y | |
4999 && p->current_y < r->desired_y + r->height) | |
5000 || (p->current_y + p->height >= r->desired_y | |
5001 && (p->current_y + p->height | |
5002 < r->desired_y + r->height))) | |
5003 p->nrows = 0; | |
5004 } | |
5005 } | |
5006 | |
5007 /* Assign matrix rows. */ | |
5008 for (j = 0; j < r->nrows; ++j) | |
5009 { | |
5010 struct glyph_row *from, *to; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
5011 int to_overlapped_p; |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
5012 |
25012 | 5013 to = MATRIX_ROW (current_matrix, r->desired_vpos + j); |
30161
8be2bf27e9ad
(make_current): Preserve the mouse_face_p flag of the
Gerd Moellmann <gerd@gnu.org>
parents:
30152
diff
changeset
|
5014 from = MATRIX_ROW (desired_matrix, r->desired_vpos + j); |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
5015 to_overlapped_p = to->overlapped_p; |
25012 | 5016 assign_row (to, from); |
5017 to->enabled_p = 1, from->enabled_p = 0; | |
25186
d6c941334567
(redraw_overlapping_rows): Use flag overlapping_p.
Gerd Moellmann <gerd@gnu.org>
parents:
25118
diff
changeset
|
5018 to->overlapped_p = to_overlapped_p; |
25012 | 5019 } |
5020 } | |
5021 | |
29980
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5022 /* Clear the hash table, for the next time. */ |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5023 for (i = 0; i < row_entry_idx; ++i) |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5024 row_table[row_entry_pool[i].bucket] = NULL; |
171ba59e1cb0
(struct row_entry): New structure.
Gerd Moellmann <gerd@gnu.org>
parents:
29687
diff
changeset
|
5025 |
25012 | 5026 /* Value is non-zero to indicate that we scrolled the display. */ |
5027 return 1; | |
5028 } | |
5029 | |
5030 | |
5031 | |
5032 /************************************************************************ | |
5033 Frame-Based Updates | |
5034 ************************************************************************/ | |
5035 | |
5036 /* Update the desired frame matrix of frame F. | |
5037 | |
5038 FORCE_P non-zero means that the update should not be stopped by | |
5039 pending input. INHIBIT_HAIRY_ID_P non-zero means that scrolling | |
5040 should not be tried. | |
5041 | |
5042 Value is non-zero if update was stopped due to pending input. */ | |
5043 | |
5044 static int | |
5045 update_frame_1 (f, force_p, inhibit_id_p) | |
5046 struct frame *f; | |
5047 int force_p; | |
5048 int inhibit_id_p; | |
5049 { | |
5050 /* Frame matrices to work on. */ | |
5051 struct glyph_matrix *current_matrix = f->current_matrix; | |
5052 struct glyph_matrix *desired_matrix = f->desired_matrix; | |
5053 int i; | |
314 | 5054 int pause; |
5055 int preempt_count = baud_rate / 2400 + 1; | |
21514 | 5056 extern int input_pending; |
25012 | 5057 |
5058 xassert (current_matrix && desired_matrix); | |
314 | 5059 |
10122
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
5060 if (baud_rate != FRAME_COST_BAUD_RATE (f)) |
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
5061 calculate_costs (f); |
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
5062 |
3357
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5063 if (preempt_count <= 0) |
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5064 preempt_count = 1; |
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5065 |
30720
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
5066 if (redisplay_dont_pause) |
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
5067 force_p = 1; |
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
5068 else if (!force_p && detect_input_pending ()) |
314 | 5069 { |
5070 pause = 1; | |
5071 goto do_pause; | |
5072 } | |
5073 | |
25012 | 5074 /* If we cannot insert/delete lines, it's no use trying it. */ |
314 | 5075 if (!line_ins_del_ok) |
25012 | 5076 inhibit_id_p = 1; |
7188
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
5077 |
493 | 5078 /* See if any of the desired lines are enabled; don't compute for |
25012 | 5079 i/d line if just want cursor motion. */ |
5080 for (i = 0; i < desired_matrix->nrows; i++) | |
5081 if (MATRIX_ROW_ENABLED_P (desired_matrix, i)) | |
314 | 5082 break; |
5083 | |
5084 /* Try doing i/d line, if not yet inhibited. */ | |
25012 | 5085 if (!inhibit_id_p && i < desired_matrix->nrows) |
5086 force_p |= scrolling (f); | |
314 | 5087 |
5088 /* Update the individual lines as needed. Do bottom line first. */ | |
25012 | 5089 if (MATRIX_ROW_ENABLED_P (desired_matrix, desired_matrix->nrows - 1)) |
5090 update_frame_line (f, desired_matrix->nrows - 1); | |
5091 | |
5092 /* Now update the rest of the lines. */ | |
5093 for (i = 0; i < desired_matrix->nrows - 1 && (force_p || !input_pending); i++) | |
314 | 5094 { |
25012 | 5095 if (MATRIX_ROW_ENABLED_P (desired_matrix, i)) |
314 | 5096 { |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5097 if (FRAME_TERMCAP_P (f)) |
314 | 5098 { |
5099 /* Flush out every so many lines. | |
5100 Also flush out if likely to have more than 1k buffered | |
5101 otherwise. I'm told that some telnet connections get | |
5102 really screwed by more than 1k output at once. */ | |
5103 int outq = PENDING_OUTPUT_COUNT (stdout); | |
5104 if (outq > 900 | |
5105 || (outq > 20 && ((i - 1) % preempt_count == 0))) | |
5106 { | |
5107 fflush (stdout); | |
5108 if (preempt_count == 1) | |
5109 { | |
554 | 5110 #ifdef EMACS_OUTQSIZE |
5111 if (EMACS_OUTQSIZE (0, &outq) < 0) | |
314 | 5112 /* Probably not a tty. Ignore the error and reset |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
5113 the outq count. */ |
314 | 5114 outq = PENDING_OUTPUT_COUNT (stdout); |
5115 #endif | |
5116 outq *= 10; | |
7530
57c2345a9002
(update_frame): Fix test of outq and baud_rate some more.
Richard M. Stallman <rms@gnu.org>
parents:
7529
diff
changeset
|
5117 if (baud_rate <= outq && baud_rate > 0) |
3357
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
5118 sleep (outq / baud_rate); |
314 | 5119 } |
5120 } | |
5121 } | |
5122 | |
16822
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
5123 if ((i - 1) % preempt_count == 0) |
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
5124 detect_input_pending (); |
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
5125 |
25012 | 5126 update_frame_line (f, i); |
314 | 5127 } |
5128 } | |
25012 | 5129 |
764 | 5130 pause = (i < FRAME_HEIGHT (f) - 1) ? i : 0; |
314 | 5131 |
5132 /* Now just clean up termcap drivers and set cursor, etc. */ | |
5133 if (!pause) | |
5134 { | |
12409
6e374b28ecc3
(update_frame): Pretend cursor is in echo area
Richard M. Stallman <rms@gnu.org>
parents:
12193
diff
changeset
|
5135 if ((cursor_in_echo_area |
25012 | 5136 /* If we are showing a message instead of the mini-buffer, |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5137 show the cursor for the message instead of for the |
25012 | 5138 (now hidden) mini-buffer contents. */ |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5139 || (EQ (minibuf_window, selected_window) |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5140 && EQ (minibuf_window, echo_area_window) |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5141 && !NILP (echo_area_buffer[0]))) |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5142 /* These cases apply only to the frame that contains |
25012 | 5143 the active mini-buffer window. */ |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
5144 && FRAME_HAS_MINIBUF_P (f) |
14459
c1d25453a95f
(update_frame): Compare FRAME_MINIBUF_WINDOW(f)
Richard M. Stallman <rms@gnu.org>
parents:
14286
diff
changeset
|
5145 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window)) |
708 | 5146 { |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5147 int top = XINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5148 int row, col; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5149 |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5150 if (cursor_in_echo_area < 0) |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5151 { |
25012 | 5152 /* Negative value of cursor_in_echo_area means put |
5153 cursor at beginning of line. */ | |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5154 row = top; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5155 col = 0; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5156 } |
708 | 5157 else |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5158 { |
25012 | 5159 /* Positive value of cursor_in_echo_area means put |
5160 cursor at the end of the prompt. If the mini-buffer | |
5161 is several lines high, find the last line that has | |
5162 any text on it. */ | |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5163 row = FRAME_HEIGHT (f); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5164 do |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5165 { |
25012 | 5166 --row; |
5167 col = 0; | |
5168 | |
5169 if (MATRIX_ROW_ENABLED_P (current_matrix, row)) | |
5170 { | |
5171 /* Frame rows are filled up with spaces that | |
5172 must be ignored here. */ | |
5173 struct glyph_row *r = MATRIX_ROW (current_matrix, | |
5174 row); | |
5175 struct glyph *start = r->glyphs[TEXT_AREA]; | |
5176 struct glyph *last = start + r->used[TEXT_AREA]; | |
5177 | |
5178 while (last > start | |
5179 && (last - 1)->charpos < 0) | |
5180 --last; | |
5181 | |
5182 col = last - start; | |
5183 } | |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5184 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5185 while (row > top && col == 0); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5186 |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5187 /* Make sure COL is not out of range. */ |
21763
b685f9451792
(change_frame_size_1): Use FRAME_CURSOR_X_LIMIT.
Richard M. Stallman <rms@gnu.org>
parents:
21757
diff
changeset
|
5188 if (col >= FRAME_CURSOR_X_LIMIT (f)) |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5189 { |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5190 /* If we have another row, advance cursor into it. */ |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5191 if (row < FRAME_HEIGHT (f) - 1) |
21757
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5192 { |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5193 col = FRAME_LEFT_SCROLL_BAR_WIDTH (f); |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5194 row++; |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5195 } |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5196 /* Otherwise move it back in range. */ |
629f6df4a329
(update_frame): Move echo area cursor into range.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
5197 else |
21763
b685f9451792
(change_frame_size_1): Use FRAME_CURSOR_X_LIMIT.
Richard M. Stallman <rms@gnu.org>
parents:
21757
diff
changeset
|
5198 col = FRAME_CURSOR_X_LIMIT (f) - 1; |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5199 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5200 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5201 |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
5202 cursor_to (row, col); |
708 | 5203 } |
314 | 5204 else |
25012 | 5205 { |
5206 /* We have only one cursor on terminal frames. Use it to | |
5207 display the cursor of the selected window. */ | |
5208 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); | |
29687
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5209 if (w->cursor.vpos >= 0 |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5210 /* The cursor vpos may be temporarily out of bounds |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5211 in the following situation: There is one window, |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5212 with the cursor in the lower half of it. The window |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5213 is split, and a message causes a redisplay before |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5214 a new cursor position has been computed. */ |
5d67ef29764b
(update_frame_1): Handle case that cursor vpos is
Gerd Moellmann <gerd@gnu.org>
parents:
29437
diff
changeset
|
5215 && w->cursor.vpos < XFASTINT (w->height)) |
25012 | 5216 { |
5217 int x = WINDOW_TO_FRAME_HPOS (w, w->cursor.hpos); | |
5218 int y = WINDOW_TO_FRAME_VPOS (w, w->cursor.vpos); | |
5219 | |
5220 if (INTEGERP (w->left_margin_width)) | |
5221 x += XFASTINT (w->left_margin_width); | |
5222 | |
5223 /* x = max (min (x, FRAME_WINDOW_WIDTH (f) - 1), 0); */ | |
5224 cursor_to (y, x); | |
5225 } | |
5226 } | |
314 | 5227 } |
5228 | |
5229 do_pause: | |
5230 | |
25012 | 5231 clear_desired_matrices (f); |
314 | 5232 return pause; |
5233 } | |
5234 | |
25012 | 5235 |
5236 /* Do line insertions/deletions on frame F for frame-based redisplay. */ | |
314 | 5237 |
21514 | 5238 int |
764 | 5239 scrolling (frame) |
25012 | 5240 struct frame *frame; |
314 | 5241 { |
5242 int unchanged_at_top, unchanged_at_bottom; | |
5243 int window_size; | |
5244 int changed_lines; | |
764 | 5245 int *old_hash = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); |
5246 int *new_hash = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); | |
5247 int *draw_cost = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); | |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
5248 int *old_draw_cost = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); |
314 | 5249 register int i; |
764 | 5250 int free_at_end_vpos = FRAME_HEIGHT (frame); |
25012 | 5251 struct glyph_matrix *current_matrix = frame->current_matrix; |
5252 struct glyph_matrix *desired_matrix = frame->desired_matrix; | |
5253 | |
5254 if (!current_matrix) | |
5255 abort (); | |
5256 | |
5257 /* Compute hash codes of all the lines. Also calculate number of | |
5258 changed lines, number of unchanged lines at the beginning, and | |
5259 number of unchanged lines at the end. */ | |
314 | 5260 changed_lines = 0; |
5261 unchanged_at_top = 0; | |
764 | 5262 unchanged_at_bottom = FRAME_HEIGHT (frame); |
5263 for (i = 0; i < FRAME_HEIGHT (frame); i++) | |
314 | 5264 { |
5265 /* Give up on this scrolling if some old lines are not enabled. */ | |
25012 | 5266 if (!MATRIX_ROW_ENABLED_P (current_matrix, i)) |
314 | 5267 return 0; |
25012 | 5268 old_hash[i] = line_hash_code (MATRIX_ROW (current_matrix, i)); |
5269 if (! MATRIX_ROW_ENABLED_P (desired_matrix, i)) | |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5270 { |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5271 /* This line cannot be redrawn, so don't let scrolling mess it. */ |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5272 new_hash[i] = old_hash[i]; |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5273 #define INFINITY 1000000 /* Taken from scroll.c */ |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5274 draw_cost[i] = INFINITY; |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5275 } |
314 | 5276 else |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5277 { |
25012 | 5278 new_hash[i] = line_hash_code (MATRIX_ROW (desired_matrix, i)); |
5279 draw_cost[i] = line_draw_cost (desired_matrix, i); | |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
5280 } |
314 | 5281 |
5282 if (old_hash[i] != new_hash[i]) | |
5283 { | |
5284 changed_lines++; | |
764 | 5285 unchanged_at_bottom = FRAME_HEIGHT (frame) - i - 1; |
314 | 5286 } |
5287 else if (i == unchanged_at_top) | |
5288 unchanged_at_top++; | |
25012 | 5289 old_draw_cost[i] = line_draw_cost (current_matrix, i); |
314 | 5290 } |
5291 | |
5292 /* If changed lines are few, don't allow preemption, don't scroll. */ | |
25012 | 5293 if ((!scroll_region_ok && changed_lines < baud_rate / 2400) |
764 | 5294 || unchanged_at_bottom == FRAME_HEIGHT (frame)) |
314 | 5295 return 1; |
5296 | |
764 | 5297 window_size = (FRAME_HEIGHT (frame) - unchanged_at_top |
314 | 5298 - unchanged_at_bottom); |
5299 | |
5300 if (scroll_region_ok) | |
5301 free_at_end_vpos -= unchanged_at_bottom; | |
764 | 5302 else if (memory_below_frame) |
314 | 5303 free_at_end_vpos = -1; |
5304 | |
5305 /* If large window, fast terminal and few lines in common between | |
25012 | 5306 current frame and desired frame, don't bother with i/d calc. */ |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
5307 if (!scroll_region_ok && window_size >= 18 && baud_rate > 2400 |
314 | 5308 && (window_size >= |
5309 10 * scrolling_max_lines_saved (unchanged_at_top, | |
764 | 5310 FRAME_HEIGHT (frame) - unchanged_at_bottom, |
314 | 5311 old_hash, new_hash, draw_cost))) |
5312 return 0; | |
5313 | |
25012 | 5314 if (window_size < 2) |
5315 return 0; | |
5316 | |
764 | 5317 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom, |
314 | 5318 draw_cost + unchanged_at_top - 1, |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
5319 old_draw_cost + unchanged_at_top - 1, |
314 | 5320 old_hash + unchanged_at_top - 1, |
5321 new_hash + unchanged_at_top - 1, | |
5322 free_at_end_vpos - unchanged_at_top); | |
5323 | |
5324 return 0; | |
5325 } | |
25012 | 5326 |
5327 | |
5328 /* Count the number of blanks at the start of the vector of glyphs R | |
5329 which is LEN glyphs long. */ | |
5330 | |
5331 static int | |
5332 count_blanks (r, len) | |
5333 struct glyph *r; | |
5334 int len; | |
314 | 5335 { |
25012 | 5336 int i; |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5337 |
25012 | 5338 for (i = 0; i < len; ++i) |
5339 if (!CHAR_GLYPH_SPACE_P (r[i])) | |
5340 break; | |
5341 | |
5342 return i; | |
314 | 5343 } |
25012 | 5344 |
5345 | |
5346 /* Count the number of glyphs in common at the start of the glyph | |
5347 vectors STR1 and STR2. END1 is the end of STR1 and END2 is the end | |
5348 of STR2. Value is the number of equal glyphs equal at the start. */ | |
314 | 5349 |
5350 static int | |
25012 | 5351 count_match (str1, end1, str2, end2) |
5352 struct glyph *str1, *end1, *str2, *end2; | |
314 | 5353 { |
25012 | 5354 struct glyph *p1 = str1; |
5355 struct glyph *p2 = str2; | |
5356 | |
5357 while (p1 < end1 | |
5358 && p2 < end2 | |
26998
02e902f732d1
(line_hash_code) (direct_output_for_insert): Adjusted
Kenichi Handa <handa@m17n.org>
parents:
26902
diff
changeset
|
5359 && GLYPH_CHAR_AND_FACE_EQUAL_P (p1, p2)) |
25012 | 5360 ++p1, ++p2; |
5361 | |
5362 return p1 - str1; | |
314 | 5363 } |
5364 | |
25012 | 5365 |
314 | 5366 /* Char insertion/deletion cost vector, from term.c */ |
25012 | 5367 |
314 | 5368 extern int *char_ins_del_vector; |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
5369 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WINDOW_WIDTH((f))]) |
314 | 5370 |
25012 | 5371 |
5372 /* Perform a frame-based update on line VPOS in frame FRAME. */ | |
5373 | |
314 | 5374 static void |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5375 update_frame_line (f, vpos) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5376 struct frame *f; |
314 | 5377 int vpos; |
5378 { | |
25012 | 5379 struct glyph *obody, *nbody, *op1, *op2, *np1, *nend; |
314 | 5380 int tem; |
5381 int osp, nsp, begmatch, endmatch, olen, nlen; | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5382 struct glyph_matrix *current_matrix = f->current_matrix; |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5383 struct glyph_matrix *desired_matrix = f->desired_matrix; |
25012 | 5384 struct glyph_row *current_row = MATRIX_ROW (current_matrix, vpos); |
5385 struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, vpos); | |
5386 int must_write_whole_line_p; | |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5387 int write_spaces_p = must_write_spaces; |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5388 int colored_spaces_p = (FACE_FROM_ID (f, DEFAULT_FACE_ID)->background |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5389 != FACE_TTY_DEFAULT_BG_COLOR); |
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5390 |
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5391 if (colored_spaces_p) |
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5392 write_spaces_p = 1; |
25012 | 5393 |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5394 /* Current row not enabled means it has unknown contents. We must |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5395 write the whole desired line in that case. */ |
25012 | 5396 must_write_whole_line_p = !current_row->enabled_p; |
5397 if (must_write_whole_line_p) | |
314 | 5398 { |
25012 | 5399 obody = 0; |
314 | 5400 olen = 0; |
5401 } | |
5402 else | |
5403 { | |
25012 | 5404 obody = MATRIX_ROW_GLYPH_START (current_matrix, vpos); |
5405 olen = current_row->used[TEXT_AREA]; | |
5406 | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5407 /* Ignore trailing spaces, if we can. */ |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5408 if (!write_spaces_p) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5409 while (olen > 0 && CHAR_GLYPH_SPACE_P (obody[olen-1])) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5410 olen--; |
314 | 5411 } |
5412 | |
25012 | 5413 current_row->enabled_p = 1; |
5414 current_row->used[TEXT_AREA] = desired_row->used[TEXT_AREA]; | |
5415 | |
5416 /* If desired line is empty, just clear the line. */ | |
5417 if (!desired_row->enabled_p) | |
314 | 5418 { |
5419 nlen = 0; | |
5420 goto just_erase; | |
5421 } | |
5422 | |
25012 | 5423 nbody = desired_row->glyphs[TEXT_AREA]; |
5424 nlen = desired_row->used[TEXT_AREA]; | |
5425 nend = nbody + nlen; | |
5426 | |
5427 /* If display line has unknown contents, write the whole line. */ | |
5428 if (must_write_whole_line_p) | |
5429 { | |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5430 /* Ignore spaces at the end, if we can. */ |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5431 if (!write_spaces_p) |
25313
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5432 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1])) |
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5433 --nlen; |
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5434 |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5435 /* Write the contents of the desired line. */ |
25313
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5436 if (nlen) |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5437 { |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5438 cursor_to (vpos, 0); |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5439 write_glyphs (nbody, nlen); |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5440 } |
25313
6b4475fbef86
(update_frame_line): If writing whole line,
Gerd Moellmann <gerd@gnu.org>
parents:
25304
diff
changeset
|
5441 |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5442 /* Don't call clear_end_of_line if we already wrote the whole |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5443 line. The cursor will not be at the right margin in that |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5444 case but in the line below. */ |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5445 if (nlen < FRAME_WINDOW_WIDTH (f)) |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5446 { |
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5447 cursor_to (vpos, nlen); |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5448 clear_end_of_line (FRAME_WINDOW_WIDTH (f)); |
25725
b7468dc89ccb
(update_frame_line): If writing whole desired line,
Gerd Moellmann <gerd@gnu.org>
parents:
25666
diff
changeset
|
5449 } |
28682
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5450 else |
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5451 /* Make sure we are in the right row, otherwise cursor movement |
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5452 with cmgoto might use `ch' in the wrong row. */ |
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5453 cursor_to (vpos, 0); |
f05d48759416
(update_frame_line): When writing a whole line, make
Gerd Moellmann <gerd@gnu.org>
parents:
28507
diff
changeset
|
5454 |
25012 | 5455 make_current (desired_matrix, current_matrix, vpos); |
5456 return; | |
5457 } | |
314 | 5458 |
5459 /* Pretend trailing spaces are not there at all, | |
5460 unless for one reason or another we must write all spaces. */ | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5461 if (!write_spaces_p) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5462 while (nlen > 0 && CHAR_GLYPH_SPACE_P (nbody[nlen - 1])) |
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5463 nlen--; |
314 | 5464 |
5465 /* If there's no i/d char, quickly do the best we can without it. */ | |
5466 if (!char_ins_del_ok) | |
5467 { | |
25012 | 5468 int i, j; |
5469 | |
5470 /* Find the first glyph in desired row that doesn't agree with | |
5471 a glyph in the current row, and write the rest from there on. */ | |
314 | 5472 for (i = 0; i < nlen; i++) |
5473 { | |
25012 | 5474 if (i >= olen || !GLYPH_EQUAL_P (nbody + i, obody + i)) |
314 | 5475 { |
25012 | 5476 /* Find the end of the run of different glyphs. */ |
5477 j = i + 1; | |
5478 while (j < nlen | |
5479 && (j >= olen | |
5480 || !GLYPH_EQUAL_P (nbody + j, obody + j) | |
5481 || CHAR_GLYPH_PADDING_P (nbody[j]))) | |
5482 ++j; | |
5483 | |
5484 /* Output this run of non-matching chars. */ | |
314 | 5485 cursor_to (vpos, i); |
25012 | 5486 write_glyphs (nbody + i, j - i); |
5487 i = j - 1; | |
314 | 5488 |
5489 /* Now find the next non-match. */ | |
5490 } | |
5491 } | |
5492 | |
5493 /* Clear the rest of the line, or the non-clear part of it. */ | |
5494 if (olen > nlen) | |
5495 { | |
5496 cursor_to (vpos, nlen); | |
5497 clear_end_of_line (olen); | |
5498 } | |
5499 | |
25012 | 5500 /* Make current row = desired row. */ |
5501 make_current (desired_matrix, current_matrix, vpos); | |
314 | 5502 return; |
5503 } | |
5504 | |
25012 | 5505 /* Here when CHAR_INS_DEL_OK != 0, i.e. we can insert or delete |
5506 characters in a row. */ | |
5507 | |
314 | 5508 if (!olen) |
5509 { | |
25012 | 5510 /* If current line is blank, skip over initial spaces, if |
5511 possible, and write the rest. */ | |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5512 if (write_spaces_p) |
25012 | 5513 nsp = 0; |
5514 else | |
5515 nsp = count_blanks (nbody, nlen); | |
5516 | |
314 | 5517 if (nlen > nsp) |
5518 { | |
5519 cursor_to (vpos, nsp); | |
5520 write_glyphs (nbody + nsp, nlen - nsp); | |
5521 } | |
5522 | |
764 | 5523 /* Exchange contents between current_frame and new_frame. */ |
25012 | 5524 make_current (desired_matrix, current_matrix, vpos); |
314 | 5525 return; |
5526 } | |
5527 | |
5528 /* Compute number of leading blanks in old and new contents. */ | |
25012 | 5529 osp = count_blanks (obody, olen); |
40075
c1d88076fa85
(update_frame_line): Don't call reassert_line_highlight.
Miles Bader <miles@gnu.org>
parents:
39988
diff
changeset
|
5530 nsp = (colored_spaces_p ? 0 : count_blanks (nbody, nlen)); |
25012 | 5531 |
5532 /* Compute number of matching chars starting with first non-blank. */ | |
5533 begmatch = count_match (obody + osp, obody + olen, | |
5534 nbody + nsp, nbody + nlen); | |
314 | 5535 |
5536 /* Spaces in new match implicit space past the end of old. */ | |
5537 /* A bug causing this to be a no-op was fixed in 18.29. */ | |
33101
39cd5f99c67d
(update_frame_line): Handle case where spaces in
Gerd Moellmann <gerd@gnu.org>
parents:
32752
diff
changeset
|
5538 if (!write_spaces_p && osp + begmatch == olen) |
314 | 5539 { |
5540 np1 = nbody + nsp; | |
25012 | 5541 while (np1 + begmatch < nend && CHAR_GLYPH_SPACE_P (np1[begmatch])) |
5542 ++begmatch; | |
314 | 5543 } |
5544 | |
5545 /* Avoid doing insert/delete char | |
5546 just cause number of leading spaces differs | |
25012 | 5547 when the following text does not match. */ |
314 | 5548 if (begmatch == 0 && osp != nsp) |
5549 osp = nsp = min (osp, nsp); | |
5550 | |
5551 /* Find matching characters at end of line */ | |
5552 op1 = obody + olen; | |
5553 np1 = nbody + nlen; | |
5554 op2 = op1 + begmatch - min (olen - osp, nlen - nsp); | |
25012 | 5555 while (op1 > op2 |
5556 && GLYPH_EQUAL_P (op1 - 1, np1 - 1)) | |
314 | 5557 { |
5558 op1--; | |
5559 np1--; | |
5560 } | |
5561 endmatch = obody + olen - op1; | |
5562 | |
5563 /* tem gets the distance to insert or delete. | |
5564 endmatch is how many characters we save by doing so. | |
5565 Is it worth it? */ | |
5566 | |
5567 tem = (nlen - nsp) - (olen - osp); | |
5568 if (endmatch && tem | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5569 && (!char_ins_del_ok || endmatch <= char_ins_del_cost (f)[tem])) |
314 | 5570 endmatch = 0; |
5571 | |
5572 /* nsp - osp is the distance to insert or delete. | |
5573 If that is nonzero, begmatch is known to be nonzero also. | |
5574 begmatch + endmatch is how much we save by doing the ins/del. | |
5575 Is it worth it? */ | |
5576 | |
5577 if (nsp != osp | |
5578 && (!char_ins_del_ok | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5579 || begmatch + endmatch <= char_ins_del_cost (f)[nsp - osp])) |
314 | 5580 { |
5581 begmatch = 0; | |
5582 endmatch = 0; | |
5583 osp = nsp = min (osp, nsp); | |
5584 } | |
5585 | |
5586 /* Now go through the line, inserting, writing and | |
5587 deleting as appropriate. */ | |
5588 | |
5589 if (osp > nsp) | |
5590 { | |
5591 cursor_to (vpos, nsp); | |
5592 delete_glyphs (osp - nsp); | |
5593 } | |
5594 else if (nsp > osp) | |
5595 { | |
5596 /* If going to delete chars later in line | |
5597 and insert earlier in the line, | |
5598 must delete first to avoid losing data in the insert */ | |
5599 if (endmatch && nlen < olen + nsp - osp) | |
5600 { | |
5601 cursor_to (vpos, nlen - endmatch + osp - nsp); | |
5602 delete_glyphs (olen + nsp - osp - nlen); | |
5603 olen = nlen - (nsp - osp); | |
5604 } | |
5605 cursor_to (vpos, osp); | |
25012 | 5606 insert_glyphs (0, nsp - osp); |
314 | 5607 } |
5608 olen += nsp - osp; | |
5609 | |
5610 tem = nsp + begmatch + endmatch; | |
5611 if (nlen != tem || olen != tem) | |
5612 { | |
5613 if (!endmatch || nlen == olen) | |
5614 { | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5615 /* If new text being written reaches right margin, there is |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5616 no need to do clear-to-eol at the end of this function |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5617 (and it would not be safe, since cursor is not going to |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5618 be "at the margin" after the text is done). */ |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5619 if (nlen == FRAME_WINDOW_WIDTH (f)) |
314 | 5620 olen = 0; |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5621 |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5622 /* Function write_glyphs is prepared to do nothing |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5623 if passed a length <= 0. Check it here to avoid |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5624 unnecessary cursor movement. */ |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5625 if (nlen - tem > 0) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5626 { |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5627 cursor_to (vpos, nsp + begmatch); |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5628 write_glyphs (nbody + nsp + begmatch, nlen - tem); |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5629 } |
314 | 5630 } |
5631 else if (nlen > olen) | |
5632 { | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5633 /* Here, we used to have the following simple code: |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5634 ---------------------------------------- |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5635 write_glyphs (nbody + nsp + begmatch, olen - tem); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5636 insert_glyphs (nbody + nsp + begmatch + olen - tem, nlen - olen); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5637 ---------------------------------------- |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5638 but it doesn't work if nbody[nsp + begmatch + olen - tem] |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5639 is a padding glyph. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5640 int out = olen - tem; /* Columns to be overwritten originally. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5641 int del; |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5642 |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5643 cursor_to (vpos, nsp + begmatch); |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5644 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5645 /* Calculate columns we can actually overwrite. */ |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5646 while (CHAR_GLYPH_PADDING_P (nbody[nsp + begmatch + out])) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5647 out--; |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5648 write_glyphs (nbody + nsp + begmatch, out); |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5649 |
25012 | 5650 /* If we left columns to be overwritten, we must delete them. */ |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5651 del = olen - tem - out; |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5652 if (del > 0) |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5653 delete_glyphs (del); |
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5654 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5655 /* At last, we insert columns not yet written out. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
5656 insert_glyphs (nbody + nsp + begmatch + out, nlen - olen + del); |
314 | 5657 olen = nlen; |
5658 } | |
5659 else if (olen > nlen) | |
5660 { | |
35924
32198b7c21e1
(update_frame_line): Rename parameter FRAME to F.
Gerd Moellmann <gerd@gnu.org>
parents:
35609
diff
changeset
|
5661 cursor_to (vpos, nsp + begmatch); |
314 | 5662 write_glyphs (nbody + nsp + begmatch, nlen - tem); |
5663 delete_glyphs (olen - nlen); | |
5664 olen = nlen; | |
5665 } | |
5666 } | |
5667 | |
5668 just_erase: | |
5669 /* If any unerased characters remain after the new line, erase them. */ | |
5670 if (olen > nlen) | |
5671 { | |
5672 cursor_to (vpos, nlen); | |
5673 clear_end_of_line (olen); | |
5674 } | |
5675 | |
764 | 5676 /* Exchange contents between current_frame and new_frame. */ |
25012 | 5677 make_current (desired_matrix, current_matrix, vpos); |
314 | 5678 } |
25012 | 5679 |
5680 | |
314 | 5681 |
25012 | 5682 /*********************************************************************** |
5683 X/Y Position -> Buffer Position | |
5684 ***********************************************************************/ | |
5685 | |
36697
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5686 /* Determine what's under window-relative pixel position (*X, *Y). |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5687 Return in *OBJECT the object (string or buffer) that's there. |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5688 Return in *POS the position in that object. Adjust *X and *Y |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5689 to character boundaries. */ |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5690 |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5691 void |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5692 buffer_posn_from_coords (w, x, y, object, pos) |
25012 | 5693 struct window *w; |
5694 int *x, *y; | |
36697
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5695 Lisp_Object *object; |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5696 struct display_pos *pos; |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
5697 { |
25012 | 5698 struct it it; |
5699 struct buffer *old_current_buffer = current_buffer; | |
5700 struct text_pos startp; | |
5701 int left_area_width; | |
5702 | |
5703 current_buffer = XBUFFER (w->buffer); | |
5704 SET_TEXT_POS_FROM_MARKER (startp, w->start); | |
5705 CHARPOS (startp) = min (ZV, max (BEGV, CHARPOS (startp))); | |
5706 BYTEPOS (startp) = min (ZV_BYTE, max (BEGV_BYTE, BYTEPOS (startp))); | |
5707 start_display (&it, w, startp); | |
5708 | |
5709 left_area_width = WINDOW_DISPLAY_LEFT_AREA_PIXEL_WIDTH (w); | |
5710 move_it_to (&it, -1, *x + it.first_visible_x - left_area_width, *y, -1, | |
5711 MOVE_TO_X | MOVE_TO_Y); | |
5712 | |
5713 *x = it.current_x - it.first_visible_x + left_area_width; | |
5714 *y = it.current_y; | |
5715 current_buffer = old_current_buffer; | |
36697
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5716 |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5717 *object = STRINGP (it.string) ? it.string : w->buffer; |
7526acd3385c
(buffer_posn_from_coords): Add parameters OBJECT and
Gerd Moellmann <gerd@gnu.org>
parents:
36590
diff
changeset
|
5718 *pos = it.current; |
25012 | 5719 } |
5720 | |
5721 | |
5722 /* Value is the string under window-relative coordinates X/Y in the | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
5723 mode or header line of window W, or nil if none. MODE_LINE_P non-zero |
25012 | 5724 means look at the mode line. *CHARPOS is set to the position in |
5725 the string returned. */ | |
5726 | |
5727 Lisp_Object | |
5728 mode_line_string (w, x, y, mode_line_p, charpos) | |
5729 struct window *w; | |
30713
fee809f81f97
(mode_line_string): Declare parameter MODE_LINE_P.
Gerd Moellmann <gerd@gnu.org>
parents:
30323
diff
changeset
|
5730 int x, y, mode_line_p; |
25012 | 5731 int *charpos; |
5732 { | |
5733 struct glyph_row *row; | |
5734 struct glyph *glyph, *end; | |
5735 struct frame *f = XFRAME (w->frame); | |
5736 int x0; | |
5737 Lisp_Object string = Qnil; | |
5738 | |
5739 if (mode_line_p) | |
5740 row = MATRIX_MODE_LINE_ROW (w->current_matrix); | |
5741 else | |
25546 | 5742 row = MATRIX_HEADER_LINE_ROW (w->current_matrix); |
25012 | 5743 |
5744 if (row->mode_line_p && row->enabled_p) | |
11919
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
5745 { |
41120 | 5746 /* The mode lines are displayed over scroll bars and fringes, |
5747 and X is window-relative. Correct X by the scroll bar | |
5748 and fringe width. */ | |
25012 | 5749 if (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f)) |
5750 x += FRAME_SCROLL_BAR_COLS (f) * CANON_X_UNIT (f); | |
41120 | 5751 x += FRAME_LEFT_FRINGE_WIDTH (f); |
25012 | 5752 |
5753 /* Find the glyph under X. If we find one with a string object, | |
5754 it's the one we were looking for. */ | |
5755 glyph = row->glyphs[TEXT_AREA]; | |
5756 end = glyph + row->used[TEXT_AREA]; | |
5757 for (x0 = 0; glyph < end; x0 += glyph->pixel_width, ++glyph) | |
5758 if (x >= x0 && x < x0 + glyph->pixel_width) | |
5759 { | |
5760 string = glyph->object; | |
5761 *charpos = glyph->charpos; | |
5762 break; | |
5763 } | |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
5764 } |
25012 | 5765 |
5766 return string; | |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
5767 } |
25012 | 5768 |
5769 | |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5770 /* Value is the string under window-relative coordinates X/Y in either |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5771 marginal area, or nil if none. *CHARPOS is set to the position in |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5772 the string returned. */ |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5773 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5774 Lisp_Object |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5775 marginal_area_string (w, x, y, area, charpos) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5776 struct window *w; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5777 int x, y; |
44580
79c7463828d6
(marginal_area_string): Sort arguments.
Pavel Janík <Pavel@Janik.cz>
parents:
44536
diff
changeset
|
5778 int area; |
44536
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5779 int *charpos; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5780 { |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5781 struct glyph_row *row = w->current_matrix->rows; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5782 struct glyph *glyph, *end; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5783 int x0, i, wy = y; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5784 Lisp_Object string = Qnil; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5785 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5786 if (area == 6) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5787 area = LEFT_MARGIN_AREA; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5788 else if (area == 7) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5789 area = RIGHT_MARGIN_AREA; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5790 else |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5791 abort (); |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5792 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5793 for (i = 0; row->enabled_p && i < w->current_matrix->nrows; ++i, ++row) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5794 if (wy >= row->y && wy < MATRIX_ROW_BOTTOM_Y (row)) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5795 break; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5796 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5797 if (row->enabled_p) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5798 { |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5799 /* Find the glyph under X. If we find one with a string object, |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5800 it's the one we were looking for. */ |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5801 glyph = row->glyphs[area]; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5802 end = glyph + row->used[area]; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5803 if (area == RIGHT_MARGIN_AREA) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5804 x0 = (window_box_width (w, TEXT_AREA) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5805 + window_box_width (w, LEFT_MARGIN_AREA)); |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5806 else |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5807 x0 = 0; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5808 for (; glyph < end; x0 += glyph->pixel_width, ++glyph) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5809 if (x >= x0 && x < x0 + glyph->pixel_width) |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5810 { |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5811 string = glyph->object; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5812 *charpos = glyph->charpos; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5813 break; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5814 } |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5815 } |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5816 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5817 return string; |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5818 } |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5819 |
f7b9d913406b
(marginal_area_string): New.
Gerd Moellmann <gerd@gnu.org>
parents:
44261
diff
changeset
|
5820 |
25012 | 5821 /*********************************************************************** |
5822 Changing Frame Sizes | |
5823 ***********************************************************************/ | |
314 | 5824 |
5825 #ifdef SIGWINCH | |
25012 | 5826 |
493 | 5827 SIGTYPE |
10745
a553a08f5785
(window_change_signal): Add ignored argument.
Richard M. Stallman <rms@gnu.org>
parents:
10259
diff
changeset
|
5828 window_change_signal (signalnum) /* If we don't have an argument, */ |
25012 | 5829 int signalnum; /* some compilers complain in signal calls. */ |
314 | 5830 { |
5831 int width, height; | |
31093
6da961dff718
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30720
diff
changeset
|
5832 #ifndef USE_CRT_DLL |
314 | 5833 extern int errno; |
31093
6da961dff718
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
30720
diff
changeset
|
5834 #endif |
314 | 5835 int old_errno = errno; |
5836 | |
764 | 5837 get_frame_size (&width, &height); |
314 | 5838 |
764 | 5839 /* The frame size change obviously applies to a termcap-controlled |
5840 frame. Find such a frame in the list, and assume it's the only | |
314 | 5841 one (since the redisplay code always writes to stdout, not a |
764 | 5842 FILE * specified in the frame structure). Record the new size, |
314 | 5843 but don't reallocate the data structures now. Let that be done |
5844 later outside of the signal handler. */ | |
5845 | |
5846 { | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
5847 Lisp_Object tail, frame; |
314 | 5848 |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
5849 FOR_EACH_FRAME (tail, frame) |
314 | 5850 { |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
5851 if (FRAME_TERMCAP_P (XFRAME (frame))) |
314 | 5852 { |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5853 change_frame_size (XFRAME (frame), height, width, 0, 1, 0); |
314 | 5854 break; |
5855 } | |
5856 } | |
5857 } | |
5858 | |
5859 signal (SIGWINCH, window_change_signal); | |
5860 errno = old_errno; | |
5861 } | |
5862 #endif /* SIGWINCH */ | |
5863 | |
5864 | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5865 /* Do any change in frame size that was requested by a signal. SAFE |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5866 non-zero means this function is called from a place where it is |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5867 safe to change frame sizes while a redisplay is in progress. */ |
314 | 5868 |
21514 | 5869 void |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5870 do_pending_window_change (safe) |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5871 int safe; |
314 | 5872 { |
5873 /* If window_change_signal should have run before, run it now. */ | |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5874 if (redisplaying_p && !safe) |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5875 return; |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5876 |
314 | 5877 while (delayed_size_change) |
5878 { | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
5879 Lisp_Object tail, frame; |
314 | 5880 |
5881 delayed_size_change = 0; | |
5882 | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
5883 FOR_EACH_FRAME (tail, frame) |
314 | 5884 { |
25012 | 5885 struct frame *f = XFRAME (frame); |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
5886 |
764 | 5887 int height = FRAME_NEW_HEIGHT (f); |
5888 int width = FRAME_NEW_WIDTH (f); | |
314 | 5889 |
3449
ad455da9b789
(do_pending_window_change): No need to clear
Richard M. Stallman <rms@gnu.org>
parents:
3357
diff
changeset
|
5890 if (height != 0 || width != 0) |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5891 change_frame_size (f, height, width, 0, 0, safe); |
314 | 5892 } |
5893 } | |
5894 } | |
5895 | |
5896 | |
764 | 5897 /* Change the frame height and/or width. Values may be given as zero to |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5898 indicate no change is to take place. |
314 | 5899 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5900 If DELAY is non-zero, then assume we're being called from a signal |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5901 handler, and queue the change for later - perhaps the next |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5902 redisplay. Since this tries to resize windows, we can't call it |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5903 from a signal handler. |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5904 |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5905 SAFE non-zero means this function is called from a place where it's |
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5906 safe to change frame sizes while a redisplay is in progress. */ |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5907 |
21514 | 5908 void |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5909 change_frame_size (f, newheight, newwidth, pretend, delay, safe) |
25012 | 5910 register struct frame *f; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5911 int newheight, newwidth, pretend, delay, safe; |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5912 { |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5913 Lisp_Object tail, frame; |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
5914 |
15395
b584c2db055f
(change_frame_size, remake_frame_glyphs): Use FRAME_WINDOW_P.
Richard M. Stallman <rms@gnu.org>
parents:
15394
diff
changeset
|
5915 if (! FRAME_WINDOW_P (f)) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5916 { |
15394
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
5917 /* When using termcap, or on MS-DOS, all frames use |
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
5918 the same screen, so a change in size affects all frames. */ |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5919 FOR_EACH_FRAME (tail, frame) |
15395
b584c2db055f
(change_frame_size, remake_frame_glyphs): Use FRAME_WINDOW_P.
Richard M. Stallman <rms@gnu.org>
parents:
15394
diff
changeset
|
5920 if (! FRAME_WINDOW_P (XFRAME (frame))) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5921 change_frame_size_1 (XFRAME (frame), newheight, newwidth, |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5922 pretend, delay, safe); |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5923 } |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5924 else |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5925 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe); |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5926 } |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5927 |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
5928 static void |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5929 change_frame_size_1 (f, newheight, newwidth, pretend, delay, safe) |
25012 | 5930 register struct frame *f; |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5931 int newheight, newwidth, pretend, delay, safe; |
314 | 5932 { |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
5933 int new_frame_window_width; |
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
44890
diff
changeset
|
5934 int count = SPECPDL_INDEX (); |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
5935 |
314 | 5936 /* If we can't deal with the change now, queue it for later. */ |
25345
ca828f89fd6e
(do_pending_window_change): Add parameter `safe'.
Gerd Moellmann <gerd@gnu.org>
parents:
25318
diff
changeset
|
5937 if (delay || (redisplaying_p && !safe)) |
314 | 5938 { |
25012 | 5939 FRAME_NEW_HEIGHT (f) = newheight; |
5940 FRAME_NEW_WIDTH (f) = newwidth; | |
314 | 5941 delayed_size_change = 1; |
5942 return; | |
5943 } | |
5944 | |
764 | 5945 /* This size-change overrides any pending one for this frame. */ |
25012 | 5946 FRAME_NEW_HEIGHT (f) = 0; |
5947 FRAME_NEW_WIDTH (f) = 0; | |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5948 |
3449
ad455da9b789
(do_pending_window_change): No need to clear
Richard M. Stallman <rms@gnu.org>
parents:
3357
diff
changeset
|
5949 /* If an argument is zero, set it to the current value. */ |
15896
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
5950 if (newheight == 0) |
25012 | 5951 newheight = FRAME_HEIGHT (f); |
15896
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
5952 if (newwidth == 0) |
25012 | 5953 newwidth = FRAME_WIDTH (f); |
5954 | |
5955 /* Compute width of windows in F. | |
5956 This is the width of the frame without vertical scroll bars. */ | |
5957 new_frame_window_width = FRAME_WINDOW_WIDTH_ARG (f, newwidth); | |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
5958 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5959 /* Round up to the smallest acceptable size. */ |
25012 | 5960 check_frame_size (f, &newheight, &newwidth); |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5961 |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5962 /* If we're not changing the frame size, quit now. */ |
25012 | 5963 if (newheight == FRAME_HEIGHT (f) |
5964 && new_frame_window_width == FRAME_WINDOW_WIDTH (f)) | |
314 | 5965 return; |
5966 | |
15078 | 5967 BLOCK_INPUT; |
5968 | |
14286
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5969 #ifdef MSDOS |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5970 /* We only can set screen dimensions to certain values supported |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5971 by our video hardware. Try to find the smallest size greater |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5972 or equal to the requested dimensions. */ |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5973 dos_set_window_size (&newheight, &newwidth); |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5974 #endif |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
5975 |
25012 | 5976 if (newheight != FRAME_HEIGHT (f)) |
314 | 5977 { |
25012 | 5978 if (FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f)) |
314 | 5979 { |
25012 | 5980 /* Frame has both root and mini-buffer. */ |
5981 XSETFASTINT (XWINDOW (FRAME_ROOT_WINDOW (f))->top, | |
5982 FRAME_TOP_MARGIN (f)); | |
5983 set_window_height (FRAME_ROOT_WINDOW (f), | |
5984 (newheight | |
5985 - 1 | |
5986 - FRAME_TOP_MARGIN (f)), | |
5987 0); | |
5988 XSETFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top, | |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
5989 newheight - 1); |
25012 | 5990 set_window_height (FRAME_MINIBUF_WINDOW (f), 1, 0); |
314 | 5991 } |
5992 else | |
764 | 5993 /* Frame has just one top-level window. */ |
25012 | 5994 set_window_height (FRAME_ROOT_WINDOW (f), |
5995 newheight - FRAME_TOP_MARGIN (f), 0); | |
5996 | |
5997 if (FRAME_TERMCAP_P (f) && !pretend) | |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
5998 FrameRows = newheight; |
314 | 5999 } |
6000 | |
25012 | 6001 if (new_frame_window_width != FRAME_WINDOW_WIDTH (f)) |
314 | 6002 { |
25012 | 6003 set_window_width (FRAME_ROOT_WINDOW (f), new_frame_window_width, 0); |
6004 if (FRAME_HAS_MINIBUF_P (f)) | |
6005 set_window_width (FRAME_MINIBUF_WINDOW (f), new_frame_window_width, 0); | |
6006 | |
6007 if (FRAME_TERMCAP_P (f) && !pretend) | |
764 | 6008 FrameCols = newwidth; |
25012 | 6009 |
25544
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
6010 if (WINDOWP (f->tool_bar_window)) |
693ca9ba497a
Change spelling of `toolbar' to `tool_bar' or `tool-bar'.
Gerd Moellmann <gerd@gnu.org>
parents:
25514
diff
changeset
|
6011 XSETFASTINT (XWINDOW (f->tool_bar_window)->width, newwidth); |
314 | 6012 } |
6013 | |
25012 | 6014 FRAME_HEIGHT (f) = newheight; |
6015 SET_FRAME_WIDTH (f, newwidth); | |
6016 | |
6017 { | |
6018 struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); | |
6019 int text_area_x, text_area_y, text_area_width, text_area_height; | |
6020 | |
6021 window_box (w, TEXT_AREA, &text_area_x, &text_area_y, &text_area_width, | |
6022 &text_area_height); | |
6023 if (w->cursor.x >= text_area_x + text_area_width) | |
6024 w->cursor.hpos = w->cursor.x = 0; | |
6025 if (w->cursor.y >= text_area_y + text_area_height) | |
6026 w->cursor.vpos = w->cursor.y = 0; | |
6027 } | |
6028 | |
6029 adjust_glyphs (f); | |
40512
d256f6fc9c05
(change_frame_size_1): Set frame's resized_p.
Gerd Moellmann <gerd@gnu.org>
parents:
40334
diff
changeset
|
6030 calculate_costs (f); |
25012 | 6031 SET_FRAME_GARBAGED (f); |
40512
d256f6fc9c05
(change_frame_size_1): Set frame's resized_p.
Gerd Moellmann <gerd@gnu.org>
parents:
40334
diff
changeset
|
6032 f->resized_p = 1; |
15065 | 6033 |
6034 UNBLOCK_INPUT; | |
17282
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
6035 |
19627
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6036 record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); |
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6037 |
17282
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
6038 /* This isn't quite a no-op: it runs window-configuration-change-hook. */ |
25012 | 6039 Fset_window_buffer (FRAME_SELECTED_WINDOW (f), |
6040 XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer); | |
19627
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6041 |
c6343f7a9c6c
(change_frame_size_1): Save current buffer
Richard M. Stallman <rms@gnu.org>
parents:
19063
diff
changeset
|
6042 unbind_to (count, Qnil); |
314 | 6043 } |
25012 | 6044 |
6045 | |
314 | 6046 |
25012 | 6047 /*********************************************************************** |
6048 Terminal Related Lisp Functions | |
6049 ***********************************************************************/ | |
6050 | |
6051 DEFUN ("open-termscript", Fopen_termscript, Sopen_termscript, | |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6052 1, 1, "FOpen termscript file: ", |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6053 doc: /* Start writing all terminal output to FILE as well as the terminal. |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6054 FILE = nil means just close any termscript file currently open. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6055 (file) |
25012 | 6056 Lisp_Object file; |
6057 { | |
6058 if (termscript != 0) fclose (termscript); | |
6059 termscript = 0; | |
6060 | |
6061 if (! NILP (file)) | |
6062 { | |
6063 file = Fexpand_file_name (file, Qnil); | |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6064 termscript = fopen (SDATA (file), "w"); |
25012 | 6065 if (termscript == 0) |
6066 report_file_error ("Opening termscript", Fcons (file, Qnil)); | |
6067 } | |
6068 return Qnil; | |
6069 } | |
6070 | |
6071 | |
314 | 6072 DEFUN ("send-string-to-terminal", Fsend_string_to_terminal, |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6073 Ssend_string_to_terminal, 1, 1, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6074 doc: /* Send STRING to the terminal without alteration. |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6075 Control characters in STRING will have terminal-dependent effects. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6076 (string) |
14068
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
6077 Lisp_Object string; |
314 | 6078 { |
20618
d5acac3af6e3
(Fsend_string_to_terminal): Use size_byte.
Richard M. Stallman <rms@gnu.org>
parents:
19627
diff
changeset
|
6079 /* ??? Perhaps we should do something special for multibyte strings here. */ |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6080 CHECK_STRING (string); |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6081 fwrite (SDATA (string), 1, SBYTES (string), stdout); |
314 | 6082 fflush (stdout); |
6083 if (termscript) | |
6084 { | |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6085 fwrite (SDATA (string), 1, SBYTES (string), |
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
20708
diff
changeset
|
6086 termscript); |
314 | 6087 fflush (termscript); |
6088 } | |
6089 return Qnil; | |
6090 } | |
6091 | |
25012 | 6092 |
314 | 6093 DEFUN ("ding", Fding, Sding, 0, 1, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6094 doc: /* Beep, or flash the screen. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6095 Also, unless an argument is given, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6096 terminate any keyboard macro currently executing. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6097 (arg) |
314 | 6098 Lisp_Object arg; |
6099 { | |
493 | 6100 if (!NILP (arg)) |
314 | 6101 { |
649
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6102 if (noninteractive) |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6103 putchar (07); |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6104 else |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
6105 ring_bell (); |
314 | 6106 fflush (stdout); |
6107 } | |
6108 else | |
6109 bitch_at_user (); | |
6110 | |
6111 return Qnil; | |
6112 } | |
6113 | |
21514 | 6114 void |
314 | 6115 bitch_at_user () |
6116 { | |
6117 if (noninteractive) | |
6118 putchar (07); | |
25012 | 6119 else if (!INTERACTIVE) /* Stop executing a keyboard macro. */ |
314 | 6120 error ("Keyboard macro terminated by a command ringing the bell"); |
6121 else | |
6122 ring_bell (); | |
6123 fflush (stdout); | |
6124 } | |
6125 | |
25012 | 6126 |
6127 | |
6128 /*********************************************************************** | |
6129 Sleeping, Waiting | |
6130 ***********************************************************************/ | |
6131 | |
314 | 6132 DEFUN ("sleep-for", Fsleep_for, Ssleep_for, 1, 2, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6133 doc: /* Pause, without updating display, for SECONDS seconds. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6134 SECONDS may be a floating-point value, meaning that you can wait for a |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6135 fraction of a second. Optional second arg MILLISECONDS specifies an |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6136 additional wait period, in milliseconds; this may be useful if your |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6137 Emacs was built without floating point support. |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6138 \(Not all operating systems support waiting for a fraction of a second.) */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6139 (seconds, milliseconds) |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6140 Lisp_Object seconds, milliseconds; |
314 | 6141 { |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6142 int sec, usec; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6143 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6144 if (NILP (milliseconds)) |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
6145 XSETINT (milliseconds, 0); |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6146 else |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6147 CHECK_NUMBER (milliseconds); |
2648 | 6148 usec = XINT (milliseconds) * 1000; |
6149 | |
6150 { | |
6151 double duration = extract_float (seconds); | |
6152 sec = (int) duration; | |
6153 usec += (duration - sec) * 1000000; | |
6154 } | |
314 | 6155 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6156 #ifndef EMACS_HAS_USECS |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6157 if (sec == 0 && usec != 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6158 error ("millisecond `sleep-for' not supported on %s", SYSTEM_TYPE); |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6159 #endif |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6160 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6161 /* Assure that 0 <= usec < 1000000. */ |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6162 if (usec < 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6163 { |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
6164 /* We can't rely on the rounding being correct if usec is negative. */ |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6165 if (-1000000 < usec) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6166 sec--, usec += 1000000; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6167 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6168 sec -= -usec / 1000000, usec = 1000000 - (-usec % 1000000); |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6169 } |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6170 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6171 sec += usec / 1000000, usec %= 1000000; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6172 |
14646
68fe10d1abd0
(Fsleep_for): Accept sub-second intervals.
Erik Naggum <erik@naggum.no>
parents:
14459
diff
changeset
|
6173 if (sec < 0 || (sec == 0 && usec == 0)) |
314 | 6174 return Qnil; |
6175 | |
650 | 6176 { |
6177 Lisp_Object zero; | |
6178 | |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
6179 XSETFASTINT (zero, 0); |
650 | 6180 wait_reading_process_input (sec, usec, zero, 0); |
6181 } | |
587 | 6182 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6183 /* We should always have wait_reading_process_input; we have a dummy |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6184 implementation for systems which don't support subprocesses. */ |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6185 #if 0 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6186 /* No wait_reading_process_input */ |
314 | 6187 immediate_quit = 1; |
6188 QUIT; | |
6189 | |
6190 #ifdef VMS | |
6191 sys_sleep (sec); | |
6192 #else /* not VMS */ | |
6193 /* The reason this is done this way | |
6194 (rather than defined (H_S) && defined (H_T)) | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
6195 is because the VMS preprocessor doesn't grok `defined'. */ |
314 | 6196 #ifdef HAVE_SELECT |
554 | 6197 EMACS_GET_TIME (end_time); |
6198 EMACS_SET_SECS_USECS (timeout, sec, usec); | |
587 | 6199 EMACS_ADD_TIME (end_time, end_time, timeout); |
554 | 6200 |
314 | 6201 while (1) |
6202 { | |
554 | 6203 EMACS_GET_TIME (timeout); |
6204 EMACS_SUB_TIME (timeout, end_time, timeout); | |
6205 if (EMACS_TIME_NEG_P (timeout) | |
6206 || !select (1, 0, 0, 0, &timeout)) | |
314 | 6207 break; |
6208 } | |
6209 #else /* not HAVE_SELECT */ | |
6210 sleep (sec); | |
6211 #endif /* HAVE_SELECT */ | |
6212 #endif /* not VMS */ | |
6213 | |
6214 immediate_quit = 0; | |
6215 #endif /* no subprocesses */ | |
6216 | |
6217 return Qnil; | |
6218 } | |
6219 | |
25012 | 6220 |
650 | 6221 /* This is just like wait_reading_process_input, except that |
6222 it does the redisplay. | |
6223 | |
5223
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
6224 It's also much like Fsit_for, except that it can be used for |
11411
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
6225 waiting for input as well. */ |
650 | 6226 |
6227 Lisp_Object | |
17961
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
6228 sit_for (sec, usec, reading, display, initial_display) |
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
6229 int sec, usec, reading, display, initial_display; |
314 | 6230 { |
650 | 6231 Lisp_Object read_kbd; |
314 | 6232 |
14964
9938201005a3
(sit_for): Call swallow_events.
Richard M. Stallman <rms@gnu.org>
parents:
14903
diff
changeset
|
6233 swallow_events (display); |
9938201005a3
(sit_for): Call swallow_events.
Richard M. Stallman <rms@gnu.org>
parents:
14903
diff
changeset
|
6234 |
43729
5b4c5b84bb9d
(sit_for): Don't wait if executing a kbd macro.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
43713
diff
changeset
|
6235 if (detect_input_pending_run_timers (display) || !NILP (Vexecuting_macro)) |
314 | 6236 return Qnil; |
650 | 6237 |
17961
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
6238 if (initial_display) |
35336
002c02db42d3
Call redisplay_preserve_echo_area with additional arg.
Gerd Moellmann <gerd@gnu.org>
parents:
35307
diff
changeset
|
6239 redisplay_preserve_echo_area (2); |
314 | 6240 |
673 | 6241 if (sec == 0 && usec == 0) |
6242 return Qt; | |
6243 | |
314 | 6244 #ifdef SIGIO |
1915
98ecf99d7b1a
* dispnew.c (sit_for): Pass the correct number of arguments to
Jim Blandy <jimb@redhat.com>
parents:
1872
diff
changeset
|
6245 gobble_input (0); |
650 | 6246 #endif |
6247 | |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
6248 XSETINT (read_kbd, reading ? -1 : 1); |
650 | 6249 wait_reading_process_input (sec, usec, read_kbd, display); |
6250 | |
314 | 6251 return detect_input_pending () ? Qnil : Qt; |
6252 } | |
6253 | |
25012 | 6254 |
650 | 6255 DEFUN ("sit-for", Fsit_for, Ssit_for, 1, 3, 0, |
40979 | 6256 doc: /* Perform redisplay, then wait for SECONDS seconds or until input is available. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6257 SECONDS may be a floating-point value, meaning that you can wait for a |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6258 fraction of a second. Optional second arg MILLISECONDS specifies an |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6259 additional wait period, in milliseconds; this may be useful if your |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6260 Emacs was built without floating point support. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6261 \(Not all operating systems support waiting for a fraction of a second.) |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6262 Optional third arg NODISP non-nil means don't redisplay, just wait for input. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6263 Redisplay is preempted as always if input arrives, and does not happen |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6264 if input is available before it starts. |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6265 Value is t if waited the full time with no input arriving. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6266 (seconds, milliseconds, nodisp) |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6267 Lisp_Object seconds, milliseconds, nodisp; |
650 | 6268 { |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6269 int sec, usec; |
650 | 6270 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6271 if (NILP (milliseconds)) |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
6272 XSETINT (milliseconds, 0); |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6273 else |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6274 CHECK_NUMBER (milliseconds); |
2648 | 6275 usec = XINT (milliseconds) * 1000; |
6276 | |
6277 { | |
6278 double duration = extract_float (seconds); | |
6279 sec = (int) duration; | |
6280 usec += (duration - sec) * 1000000; | |
6281 } | |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6282 |
650 | 6283 #ifndef EMACS_HAS_USECS |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6284 if (usec != 0 && sec == 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
6285 error ("millisecond `sit-for' not supported on %s", SYSTEM_TYPE); |
650 | 6286 #endif |
6287 | |
17961
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
6288 return sit_for (sec, usec, 0, NILP (nodisp), NILP (nodisp)); |
650 | 6289 } |
25012 | 6290 |
6291 | |
314 | 6292 |
25012 | 6293 /*********************************************************************** |
6294 Other Lisp Functions | |
6295 ***********************************************************************/ | |
6296 | |
6297 /* A vector of size >= 2 * NFRAMES + 3 * NBUFFERS + 1, containing the | |
6298 session's frames, frame names, buffers, buffer-read-only flags, and | |
6299 buffer-modified-flags, and a trailing sentinel (so we don't need to | |
6300 add length checks). */ | |
6301 | |
6302 static Lisp_Object frame_and_buffer_state; | |
6303 | |
6304 | |
6305 DEFUN ("frame-or-buffer-changed-p", Fframe_or_buffer_changed_p, | |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6306 Sframe_or_buffer_changed_p, 0, 0, 0, |
40979 | 6307 doc: /* Return non-nil if the frame and buffer state appears to have changed. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6308 The state variable is an internal vector containing all frames and buffers, |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6309 aside from buffers whose names start with space, |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6310 along with the buffers' read-only and modified flags, which allows a fast |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6311 check to see whether the menu bars might need to be recomputed. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6312 If this function returns non-nil, it updates the internal vector to reflect |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6313 the current state. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6314 () |
25012 | 6315 { |
6316 Lisp_Object tail, frame, buf; | |
6317 Lisp_Object *vecp; | |
6318 int n; | |
6319 | |
6320 vecp = XVECTOR (frame_and_buffer_state)->contents; | |
6321 FOR_EACH_FRAME (tail, frame) | |
6322 { | |
6323 if (!EQ (*vecp++, frame)) | |
6324 goto changed; | |
6325 if (!EQ (*vecp++, XFRAME (frame)->name)) | |
6326 goto changed; | |
6327 } | |
6328 /* Check that the buffer info matches. | |
6329 No need to test for the end of the vector | |
6330 because the last element of the vector is lambda | |
6331 and that will always cause a mismatch. */ | |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6332 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) |
25012 | 6333 { |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6334 buf = XCDR (XCAR (tail)); |
25012 | 6335 /* Ignore buffers that aren't included in buffer lists. */ |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6336 if (SREF (XBUFFER (buf)->name, 0) == ' ') |
25012 | 6337 continue; |
6338 if (!EQ (*vecp++, buf)) | |
6339 goto changed; | |
6340 if (!EQ (*vecp++, XBUFFER (buf)->read_only)) | |
6341 goto changed; | |
6342 if (!EQ (*vecp++, Fbuffer_modified_p (buf))) | |
6343 goto changed; | |
6344 } | |
6345 /* Detect deletion of a buffer at the end of the list. */ | |
6346 if (EQ (*vecp, Qlambda)) | |
6347 return Qnil; | |
6348 changed: | |
6349 /* Start with 1 so there is room for at least one lambda at the end. */ | |
6350 n = 1; | |
6351 FOR_EACH_FRAME (tail, frame) | |
6352 n += 2; | |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6353 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) |
25012 | 6354 n += 3; |
6355 /* Reallocate the vector if it's grown, or if it's shrunk a lot. */ | |
6356 if (n > XVECTOR (frame_and_buffer_state)->size | |
6357 || n + 20 < XVECTOR (frame_and_buffer_state)->size / 2) | |
6358 /* Add 20 extra so we grow it less often. */ | |
6359 frame_and_buffer_state = Fmake_vector (make_number (n + 20), Qlambda); | |
6360 vecp = XVECTOR (frame_and_buffer_state)->contents; | |
6361 FOR_EACH_FRAME (tail, frame) | |
6362 { | |
6363 *vecp++ = frame; | |
6364 *vecp++ = XFRAME (frame)->name; | |
6365 } | |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6366 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail)) |
25012 | 6367 { |
26164
d39ec0a27081
more XCAR/XCDR/XFLOAT_DATA uses, to help isolete lisp engine
Ken Raeburn <raeburn@raeburn.org>
parents:
26088
diff
changeset
|
6368 buf = XCDR (XCAR (tail)); |
25012 | 6369 /* Ignore buffers that aren't included in buffer lists. */ |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
6370 if (SREF (XBUFFER (buf)->name, 0) == ' ') |
25012 | 6371 continue; |
6372 *vecp++ = buf; | |
6373 *vecp++ = XBUFFER (buf)->read_only; | |
6374 *vecp++ = Fbuffer_modified_p (buf); | |
6375 } | |
6376 /* Fill up the vector with lambdas (always at least one). */ | |
6377 *vecp++ = Qlambda; | |
6378 while (vecp - XVECTOR (frame_and_buffer_state)->contents | |
6379 < XVECTOR (frame_and_buffer_state)->size) | |
6380 *vecp++ = Qlambda; | |
6381 /* Make sure we didn't overflow the vector. */ | |
6382 if (vecp - XVECTOR (frame_and_buffer_state)->contents | |
6383 > XVECTOR (frame_and_buffer_state)->size) | |
6384 abort (); | |
6385 return Qt; | |
6386 } | |
6387 | |
6388 | |
6389 | |
6390 /*********************************************************************** | |
6391 Initialization | |
6392 ***********************************************************************/ | |
6393 | |
314 | 6394 char *terminal_type; |
6395 | |
25012 | 6396 /* Initialization done when Emacs fork is started, before doing stty. |
6397 Determine terminal type and set terminal_driver. Then invoke its | |
6398 decoding routine to set up variables in the terminal package. */ | |
314 | 6399 |
21514 | 6400 void |
314 | 6401 init_display () |
6402 { | |
6403 #ifdef HAVE_X_WINDOWS | |
6404 extern int display_arg; | |
6405 #endif | |
6406 | |
25012 | 6407 /* Construct the space glyph. */ |
6408 space_glyph.type = CHAR_GLYPH; | |
6409 SET_CHAR_GLYPH_FROM_GLYPH (space_glyph, ' '); | |
6410 space_glyph.charpos = -1; | |
6411 | |
314 | 6412 meta_key = 0; |
6413 inverse_video = 0; | |
6414 cursor_in_echo_area = 0; | |
6415 terminal_type = (char *) 0; | |
6416 | |
2339
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6417 /* Now is the time to initialize this; it's used by init_sys_modes |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6418 during startup. */ |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6419 Vwindow_system = Qnil; |
314 | 6420 |
2339
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6421 /* If the user wants to use a window system, we shouldn't bother |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6422 initializing the terminal. This is especially important when the |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6423 terminal is so dumb that emacs gives up before and doesn't bother |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6424 using the window system. |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
6425 |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6426 If the DISPLAY environment variable is set and nonempty, |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6427 try to use X, and die with an error message if that doesn't work. */ |
314 | 6428 |
6429 #ifdef HAVE_X_WINDOWS | |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6430 if (! display_arg) |
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6431 { |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6432 char *display; |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6433 #ifdef VMS |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6434 display = getenv ("DECW$DISPLAY"); |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6435 #else |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6436 display = getenv ("DISPLAY"); |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6437 #endif |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6438 |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
6439 display_arg = (display != 0 && *display != 0); |
2364 | 6440 } |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
6441 |
18774
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6442 if (!inhibit_window_system && display_arg |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6443 #ifndef CANNOT_DUMP |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6444 && initialized |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6445 #endif |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
6446 ) |
314 | 6447 { |
6448 Vwindow_system = intern ("x"); | |
6449 #ifdef HAVE_X11 | |
6450 Vwindow_system_version = make_number (11); | |
6451 #else | |
6452 Vwindow_system_version = make_number (10); | |
6453 #endif | |
41969
e669966d496e
Test GNU_LINUX, not LINUX.
Richard M. Stallman <rms@gnu.org>
parents:
41120
diff
changeset
|
6454 #if defined (GNU_LINUX) && defined (HAVE_LIBNCURSES) |
15273
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6455 /* In some versions of ncurses, |
15282 | 6456 tputs crashes if we have not called tgetent. |
15273
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6457 So call tgetent. */ |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6458 { char b[2044]; tgetent (b, "xterm");} |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
6459 #endif |
25012 | 6460 adjust_frame_glyphs_initially (); |
314 | 6461 return; |
6462 } | |
6463 #endif /* HAVE_X_WINDOWS */ | |
6464 | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6465 #ifdef HAVE_NTGUI |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6466 if (!inhibit_window_system) |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6467 { |
16589
ec300a10e407
(init_display) [HAVE_NTGUI]: Use w32 for window-system.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16412
diff
changeset
|
6468 Vwindow_system = intern ("w32"); |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6469 Vwindow_system_version = make_number (1); |
25012 | 6470 adjust_frame_glyphs_initially (); |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6471 return; |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6472 } |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6473 #endif /* HAVE_NTGUI */ |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
6474 |
44890
01b93e5e53a7
Patch for building Emacs on Mac OS X. April 26, 2002. See ChangeLog,
Andrew Choi <akochoi@shaw.ca>
parents:
44815
diff
changeset
|
6475 #ifdef MAC_OS |
32752
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6476 if (!inhibit_window_system) |
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6477 { |
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6478 Vwindow_system = intern ("mac"); |
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6479 Vwindow_system_version = make_number (1); |
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6480 adjust_frame_glyphs_initially (); |
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6481 return; |
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6482 } |
44890
01b93e5e53a7
Patch for building Emacs on Mac OS X. April 26, 2002. See ChangeLog,
Andrew Choi <akochoi@shaw.ca>
parents:
44815
diff
changeset
|
6483 #endif /* MAC_OS */ |
32752
923b8d6d8277
Initial check-in: changes for building Emacs under Mac OS.
Andrew Choi <akochoi@shaw.ca>
parents:
32468
diff
changeset
|
6484 |
314 | 6485 /* If no window system has been specified, try to use the terminal. */ |
6486 if (! isatty (0)) | |
6487 { | |
16896
b2c51d6de440
(init_display): Use `fatal'.
Richard M. Stallman <rms@gnu.org>
parents:
16891
diff
changeset
|
6488 fatal ("standard input is not a tty"); |
314 | 6489 exit (1); |
6490 } | |
6491 | |
42835
38f2be5a65fd
(update_frame): Move the variable `tem' to the block where it is used.
Pavel Janík <Pavel@Janik.cz>
parents:
41969
diff
changeset
|
6492 /* Look at the TERM variable. */ |
314 | 6493 terminal_type = (char *) getenv ("TERM"); |
6494 if (!terminal_type) | |
6495 { | |
6496 #ifdef VMS | |
6497 fprintf (stderr, "Please specify your terminal type.\n\ | |
6498 For types defined in VMS, use set term /device=TYPE.\n\ | |
6499 For types not defined in VMS, use define emacs_term \"TYPE\".\n\ | |
6500 \(The quotation marks are necessary since terminal types are lower case.)\n"); | |
6501 #else | |
6502 fprintf (stderr, "Please set the environment variable TERM; see tset(1).\n"); | |
6503 #endif | |
6504 exit (1); | |
6505 } | |
6506 | |
6507 #ifdef VMS | |
25012 | 6508 /* VMS DCL tends to up-case things, so down-case term type. |
314 | 6509 Hardly any uppercase letters in terminal types; should be none. */ |
6510 { | |
6511 char *new = (char *) xmalloc (strlen (terminal_type) + 1); | |
6512 char *p; | |
6513 | |
6514 strcpy (new, terminal_type); | |
6515 | |
6516 for (p = new; *p; p++) | |
6517 if (isupper (*p)) | |
6518 *p = tolower (*p); | |
6519 | |
6520 terminal_type = new; | |
6521 } | |
25012 | 6522 #endif /* VMS */ |
314 | 6523 |
6524 term_init (terminal_type); | |
25012 | 6525 |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
6526 { |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
6527 struct frame *sf = SELECTED_FRAME (); |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
6528 int width = FRAME_WINDOW_WIDTH (sf); |
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
6529 int height = FRAME_HEIGHT (sf); |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
6530 |
25012 | 6531 unsigned int total_glyphs = height * (width + 2) * sizeof (struct glyph); |
6532 | |
6533 /* If these sizes are so big they cause overflow, just ignore the | |
6534 change. It's not clear what better we could do. */ | |
6535 if (total_glyphs / sizeof (struct glyph) / height != width + 2) | |
16896
b2c51d6de440
(init_display): Use `fatal'.
Richard M. Stallman <rms@gnu.org>
parents:
16891
diff
changeset
|
6536 fatal ("screen size %dx%d too big", width, height); |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
6537 } |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
6538 |
25012 | 6539 adjust_frame_glyphs_initially (); |
25666
063da8f6a487
(selected_frame): Make it a Lisp_Object.
Gerd Moellmann <gerd@gnu.org>
parents:
25546
diff
changeset
|
6540 calculate_costs (XFRAME (selected_frame)); |
314 | 6541 |
6542 #ifdef SIGWINCH | |
6543 #ifndef CANNOT_DUMP | |
6544 if (initialized) | |
6545 #endif /* CANNOT_DUMP */ | |
6546 signal (SIGWINCH, window_change_signal); | |
6547 #endif /* SIGWINCH */ | |
25012 | 6548 |
6549 /* Set up faces of the initial terminal frame of a dumped Emacs. */ | |
6550 if (initialized | |
6551 && !noninteractive | |
25118
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6552 #ifdef MSDOS |
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6553 /* The MSDOS terminal turns on its ``window system'' relatively |
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6554 late into the startup, so we cannot do the frame faces' |
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6555 initialization just yet. It will be done later by pc-win.el |
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6556 and internal_terminal_init. */ |
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6557 && (strcmp (terminal_type, "internal") != 0 || inhibit_window_system) |
08ae9ffe6763
(init_display) [MSDOS]: Don't initialize frame faces,
Eli Zaretskii <eliz@gnu.org>
parents:
25012
diff
changeset
|
6558 #endif |
25012 | 6559 && NILP (Vwindow_system)) |
26729
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6560 { |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6561 /* For the initial frame, we don't have any way of knowing what |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6562 are the foreground and background colors of the terminal. */ |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6563 struct frame *sf = SELECTED_FRAME(); |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6564 |
26902
264b83a3a688
Changes for separate unspecified foreground and background colors
Eli Zaretskii <eliz@gnu.org>
parents:
26851
diff
changeset
|
6565 FRAME_FOREGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_FG_COLOR; |
264b83a3a688
Changes for separate unspecified foreground and background colors
Eli Zaretskii <eliz@gnu.org>
parents:
26851
diff
changeset
|
6566 FRAME_BACKGROUND_PIXEL (sf) = FACE_TTY_DEFAULT_BG_COLOR; |
26729
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6567 call0 (intern ("tty-set-up-initial-frame-faces")); |
f5dded41adcc
Changes for automatic remapping of X colors on terminal frames:
Eli Zaretskii <eliz@gnu.org>
parents:
26591
diff
changeset
|
6568 } |
314 | 6569 } |
25012 | 6570 |
6571 | |
314 | 6572 |
25012 | 6573 /*********************************************************************** |
6574 Blinking cursor | |
6575 ***********************************************************************/ | |
6576 | |
26280
083835afced5
(Finternal_show_cursor): Renamed from Fshow_cursor.
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
6577 DEFUN ("internal-show-cursor", Finternal_show_cursor, |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6578 Sinternal_show_cursor, 2, 2, 0, |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6579 doc: /* Set the cursor-visibility flag of WINDOW to SHOW. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6580 WINDOW nil means use the selected window. SHOW non-nil means |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6581 show a cursor in WINDOW in the next redisplay. SHOW nil means |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6582 don't show a cursor. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6583 (window, show) |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6584 Lisp_Object window, show; |
25012 | 6585 { |
6586 /* Don't change cursor state while redisplaying. This could confuse | |
6587 output routines. */ | |
6588 if (!redisplaying_p) | |
6589 { | |
6590 if (NILP (window)) | |
6591 window = selected_window; | |
6592 else | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6593 CHECK_WINDOW (window); |
25012 | 6594 |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6595 XWINDOW (window)->cursor_off_p = NILP (show); |
25012 | 6596 } |
6597 | |
6598 return Qnil; | |
6599 } | |
6600 | |
6601 | |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6602 DEFUN ("internal-show-cursor-p", Finternal_show_cursor_p, |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6603 Sinternal_show_cursor_p, 0, 1, 0, |
40979 | 6604 doc: /* Value is non-nil if next redisplay will display a cursor in WINDOW. |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6605 WINDOW nil or omitted means report on the selected window. */) |
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6606 (window) |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6607 Lisp_Object window; |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6608 { |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6609 struct window *w; |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6610 |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6611 if (NILP (window)) |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6612 window = selected_window; |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6613 else |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40512
diff
changeset
|
6614 CHECK_WINDOW (window); |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6615 |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6616 w = XWINDOW (window); |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6617 return w->cursor_off_p ? Qnil : Qt; |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6618 } |
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6619 |
25012 | 6620 |
6621 /*********************************************************************** | |
6622 Initialization | |
6623 ***********************************************************************/ | |
6624 | |
21514 | 6625 void |
314 | 6626 syms_of_display () |
6627 { | |
764 | 6628 defsubr (&Sredraw_frame); |
314 | 6629 defsubr (&Sredraw_display); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
6630 defsubr (&Sframe_or_buffer_changed_p); |
314 | 6631 defsubr (&Sopen_termscript); |
6632 defsubr (&Sding); | |
6633 defsubr (&Ssit_for); | |
6634 defsubr (&Ssleep_for); | |
6635 defsubr (&Ssend_string_to_terminal); | |
26280
083835afced5
(Finternal_show_cursor): Renamed from Fshow_cursor.
Gerd Moellmann <gerd@gnu.org>
parents:
26164
diff
changeset
|
6636 defsubr (&Sinternal_show_cursor); |
26334
e3a9ceb7a557
(Finternal_show_cursor): Change it to set the
Gerd Moellmann <gerd@gnu.org>
parents:
26280
diff
changeset
|
6637 defsubr (&Sinternal_show_cursor_p); |
314 | 6638 |
34893
779bd3fa820e
Use #if GLYPH_DEBUG instead of #ifdef GLYPH_DEBUG.
Gerd Moellmann <gerd@gnu.org>
parents:
34866
diff
changeset
|
6639 #if GLYPH_DEBUG |
34866
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
6640 defsubr (&Sdump_redisplay_history); |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
6641 #endif |
4f47fc699608
(struct redisplay_history) [GLYPH_DEBUG]: New.
Gerd Moellmann <gerd@gnu.org>
parents:
34849
diff
changeset
|
6642 |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
6643 frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
6644 staticpro (&frame_and_buffer_state); |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
6645 |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
6646 Qdisplay_table = intern ("display-table"); |
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
6647 staticpro (&Qdisplay_table); |
30720
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
6648 Qredisplay_dont_pause = intern ("redisplay-dont-pause"); |
64f3338f72d8
(Qredisplay_dont_pause): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
30713
diff
changeset
|
6649 staticpro (&Qredisplay_dont_pause); |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
6650 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6651 DEFVAR_INT ("baud-rate", &baud_rate, |
40979 | 6652 doc: /* *The output baud rate of the terminal. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6653 On most systems, changing this value will affect the amount of padding |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6654 and the other strategic decisions made during redisplay. */); |
25012 | 6655 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6656 DEFVAR_BOOL ("inverse-video", &inverse_video, |
40979 | 6657 doc: /* *Non-nil means invert the entire frame display. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6658 This means everything is in inverse video which otherwise would not be. */); |
25012 | 6659 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6660 DEFVAR_BOOL ("visible-bell", &visible_bell, |
40979 | 6661 doc: /* *Non-nil means try to flash the frame to represent a bell. |
40334
bee6cc2e8a90
(syms_of_display) <visible-bell>: Add a reference to
Eli Zaretskii <eliz@gnu.org>
parents:
40271
diff
changeset
|
6662 |
bee6cc2e8a90
(syms_of_display) <visible-bell>: Add a reference to
Eli Zaretskii <eliz@gnu.org>
parents:
40271
diff
changeset
|
6663 See also `ring-bell-function'. */); |
25012 | 6664 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6665 DEFVAR_BOOL ("no-redraw-on-reenter", &no_redraw_on_reenter, |
40979 | 6666 doc: /* *Non-nil means no need to redraw entire frame after suspending. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6667 A non-nil value is useful if the terminal can automatically preserve |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6668 Emacs's frame display when you reenter Emacs. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6669 It is up to you to set this variable if your terminal can do that. */); |
25012 | 6670 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6671 DEFVAR_LISP ("window-system", &Vwindow_system, |
41025
4feeae90afa4
(syms_of_display): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40979
diff
changeset
|
6672 doc: /* Name of window system that Emacs is displaying through. |
4feeae90afa4
(syms_of_display): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40979
diff
changeset
|
6673 The value is a symbol--for instance, `x' for X windows. |
4feeae90afa4
(syms_of_display): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
40979
diff
changeset
|
6674 The value is nil if Emacs is using a text-only terminal. */); |
25012 | 6675 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6676 DEFVAR_LISP ("window-system-version", &Vwindow_system_version, |
40979 | 6677 doc: /* The version number of the window system in use. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6678 For X windows, this is 10 or 11. */); |
25012 | 6679 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6680 DEFVAR_BOOL ("cursor-in-echo-area", &cursor_in_echo_area, |
40979 | 6681 doc: /* Non-nil means put cursor in minibuffer, at end of any message there. */); |
25012 | 6682 |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6683 DEFVAR_LISP ("glyph-table", &Vglyph_table, |
40979 | 6684 doc: /* Table defining how to output a glyph code to the frame. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6685 If not nil, this is a vector indexed by glyph code to define the glyph. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6686 Each element can be: |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6687 integer: a glyph code which this glyph is an alias for. |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6688 string: output this glyph using that string (not impl. in X windows). |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6689 nil: this glyph mod 524288 is the code of a character to output, |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6690 and this glyph / 524288 is the face number (see `face-id') to use |
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6691 while outputting it. */); |
314 | 6692 Vglyph_table = Qnil; |
6693 | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6694 DEFVAR_LISP ("standard-display-table", &Vstandard_display_table, |
40979 | 6695 doc: /* Display table to use for buffers that specify none. |
39914
91951fb5b9e5
Put doc strings in comments.
Gerd Moellmann <gerd@gnu.org>
parents:
39682
diff
changeset
|
6696 See `buffer-display-table' for more information. */); |
314 | 6697 Vstandard_display_table = Qnil; |
6698 | |
39988
eac4e9ae201c
Change doc-string comments to `new style' [w/`doc:' keyword].
Miles Bader <miles@gnu.org>
parents:
39954
diff
changeset
|
6699 DEFVAR_BOOL ("redisplay-dont-pause", &redisplay_dont_pause, |
40979 | 6700 doc: /* *Non-nil means update isn't paused when input is detected. */); |
25012 | 6701 redisplay_dont_pause = 0; |
6702 | |
314 | 6703 /* Initialize `window-system', unless init_display already decided it. */ |
6704 #ifdef CANNOT_DUMP | |
6705 if (noninteractive) | |
6706 #endif | |
6707 { | |
6708 Vwindow_system = Qnil; | |
6709 Vwindow_system_version = Qnil; | |
6710 } | |
6711 } |