Mercurial > emacs
annotate src/xdisp.c @ 5020:94de08fd8a7c
(Fnext_single_property_change): Fix missing \n\.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Mon, 15 Nov 1993 06:41:45 +0000 |
| parents | 1fc792473491 |
| children | 47a76678bf4d |
| rev | line source |
|---|---|
| 277 | 1 /* Display generation from window structure and buffer text. |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
2 Copyright (C) 1985, 1986, 1987, 1988, 1993 Free Software Foundation, Inc. |
| 277 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | |
| 7 it under the terms of the GNU General Public License as published by | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option) |
| 277 | 9 any later version. |
| 10 | |
| 11 GNU Emacs is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
| 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
| 19 | |
| 20 | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4423
diff
changeset
|
21 #include <config.h> |
| 277 | 22 #include <stdio.h> |
| 23 /*#include <ctype.h>*/ | |
| 24 #undef NULL | |
| 25 #include "lisp.h" | |
| 769 | 26 #include "frame.h" |
| 277 | 27 #include "window.h" |
| 28 #include "termchar.h" | |
| 29 #include "dispextern.h" | |
| 30 #include "buffer.h" | |
| 31 #include "indent.h" | |
| 32 #include "commands.h" | |
| 33 #include "macros.h" | |
| 34 #include "disptab.h" | |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
35 #include "termhooks.h" |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
36 #include "intervals.h" |
| 277 | 37 |
| 38 extern int interrupt_input; | |
| 39 extern int command_loop_level; | |
| 40 | |
| 41 /* Nonzero means print newline before next minibuffer message. */ | |
| 42 | |
| 43 int noninteractive_need_newline; | |
| 44 | |
| 45 #define min(a, b) ((a) < (b) ? (a) : (b)) | |
| 46 #define max(a, b) ((a) > (b) ? (a) : (b)) | |
| 47 | |
| 48 /* The buffer position of the first character appearing | |
| 769 | 49 entirely or partially on the current frame line. |
| 50 Or zero, which disables the optimization for the current frame line. */ | |
| 277 | 51 static int this_line_bufpos; |
| 52 | |
| 53 /* Number of characters past the end of this line, | |
| 54 including the terminating newline */ | |
| 55 static int this_line_endpos; | |
| 56 | |
| 769 | 57 /* The vertical position of this frame line. */ |
| 277 | 58 static int this_line_vpos; |
| 59 | |
| 769 | 60 /* Hpos value for start of display on this frame line. |
| 277 | 61 Usually zero, but negative if first character really began |
| 62 on previous line */ | |
| 63 static int this_line_start_hpos; | |
| 64 | |
| 65 /* Buffer that this_line variables are describing. */ | |
| 66 static struct buffer *this_line_buffer; | |
| 67 | |
| 68 /* Set by try_window_id to the vpos of first of any lines | |
| 769 | 69 scrolled on to the bottom of the frame. These lines should |
| 277 | 70 not be included in any general scroll computation. */ |
| 71 static int scroll_bottom_vpos; | |
| 72 | |
| 73 /* Value of echo_area_glyphs when it was last acted on. | |
| 769 | 74 If this is nonzero, there is a message on the frame |
| 277 | 75 in the minibuffer and it should be erased as soon |
| 76 as it is no longer requested to appear. */ | |
| 77 char *previous_echo_glyphs; | |
| 78 | |
| 769 | 79 /* Nonzero means truncate lines in all windows less wide than the frame */ |
| 277 | 80 int truncate_partial_width_windows; |
| 81 | |
| 82 Lisp_Object Vglobal_mode_string; | |
| 83 | |
| 84 /* Marker for where to display an arrow on top of the buffer text. */ | |
| 85 Lisp_Object Voverlay_arrow_position; | |
| 86 | |
| 87 /* String to display for the arrow. */ | |
| 88 Lisp_Object Voverlay_arrow_string; | |
| 89 | |
| 90 /* Values of those variables at last redisplay. */ | |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
91 static Lisp_Object last_arrow_position, last_arrow_string; |
| 277 | 92 |
| 93 /* Nonzero if overlay arrow has been displayed once in this window. */ | |
| 94 static int overlay_arrow_seen; | |
| 95 | |
|
3265
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
96 /* Nonzero means highlight the region even in nonselected windows. */ |
|
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
97 static int highlight_nonselected_windows; |
|
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
98 |
| 769 | 99 /* If cursor motion alone moves point off frame, |
| 277 | 100 Try scrolling this many lines up or down if that will bring it back. */ |
| 101 int scroll_step; | |
| 102 | |
| 103 /* Nonzero if try_window_id has made blank lines at window bottom | |
| 104 since the last redisplay that paused */ | |
| 105 static int blank_end_of_window; | |
| 106 | |
| 107 /* Number of windows showing the buffer of the selected window. | |
| 108 keyboard.c refers to this. */ | |
| 109 int buffer_shared; | |
| 110 | |
| 769 | 111 /* display_text_line sets these to the frame position (origin 0) of point, |
| 277 | 112 whether the window is selected or not. |
| 113 Set one to -1 first to determine whether point was found afterwards. */ | |
| 114 | |
| 115 static int cursor_vpos; | |
| 116 static int cursor_hpos; | |
| 117 | |
| 118 int debug_end_pos; | |
| 119 | |
| 120 /* Nonzero means display mode line highlighted */ | |
| 121 int mode_line_inverse_video; | |
| 122 | |
| 123 static void echo_area_display (); | |
| 124 void mark_window_display_accurate (); | |
| 125 static void redisplay_windows (); | |
| 126 static void redisplay_window (); | |
| 127 static void try_window (); | |
| 128 static int try_window_id (); | |
| 129 static struct position *display_text_line (); | |
| 130 static void display_mode_line (); | |
| 131 static int display_mode_element (); | |
| 132 static char *fmodetrunc (); | |
| 133 static char *decode_mode_spec (); | |
| 134 static int display_string (); | |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
135 static void display_menu_bar (); |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
136 static int display_count_lines (); |
| 277 | 137 |
| 138 /* Prompt to display in front of the minibuffer contents */ | |
| 139 char *minibuf_prompt; | |
| 140 | |
| 141 /* Width in columns of current minibuffer prompt. */ | |
| 142 int minibuf_prompt_width; | |
| 143 | |
| 144 /* Message to display instead of minibuffer contents | |
| 145 This is what the functions error and message make, | |
| 146 and command echoing uses it as well. | |
| 147 It overrides the minibuf_prompt as well as the buffer. */ | |
| 148 char *echo_area_glyphs; | |
| 149 | |
| 150 /* true iff we should redraw the mode lines on the next redisplay */ | |
| 151 int update_mode_lines; | |
| 152 | |
| 153 /* Smallest number of characters before the gap | |
| 154 at any time since last redisplay that finished. | |
| 155 Valid for current buffer when try_window_id can be called. */ | |
| 156 int beg_unchanged; | |
| 157 | |
| 158 /* Smallest number of characters after the gap | |
| 159 at any time since last redisplay that finished. | |
| 160 Valid for current buffer when try_window_id can be called. */ | |
| 161 int end_unchanged; | |
| 162 | |
| 163 /* MODIFF as of last redisplay that finished; | |
| 164 if it matches MODIFF, beg_unchanged and end_unchanged | |
| 165 contain no useful information */ | |
| 166 int unchanged_modified; | |
| 167 | |
| 168 /* Nonzero if head_clip or tail_clip of current buffer has changed | |
| 169 since last redisplay that finished */ | |
| 170 int clip_changed; | |
| 171 | |
| 172 /* Nonzero if window sizes or contents have changed | |
| 173 since last redisplay that finished */ | |
| 174 int windows_or_buffers_changed; | |
| 175 | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
176 /* Nonzero after display_mode_line if %l was used |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
177 and it displayed a line number. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
178 int line_number_displayed; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
179 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
180 /* Maximum buffer size for which to display line numbers. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
181 int line_number_display_limit; |
| 277 | 182 |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
183 /* Specify m, a string, as a message in the minibuf. If m is 0, clear out |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
184 any existing message, and let the minibuffer text show through. */ |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
185 void |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
186 message1 (m) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
187 char *m; |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
188 { |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
189 if (noninteractive) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
190 { |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
191 if (noninteractive_need_newline) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
192 putc ('\n', stderr); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
193 noninteractive_need_newline = 0; |
|
2526
bcba821c17bc
(message, message1): If noninteractive and
Richard M. Stallman <rms@gnu.org>
parents:
2324
diff
changeset
|
194 if (cursor_in_echo_area != 0) |
|
bcba821c17bc
(message, message1): If noninteractive and
Richard M. Stallman <rms@gnu.org>
parents:
2324
diff
changeset
|
195 fprintf (stderr, "%s", m); |
|
bcba821c17bc
(message, message1): If noninteractive and
Richard M. Stallman <rms@gnu.org>
parents:
2324
diff
changeset
|
196 else |
|
bcba821c17bc
(message, message1): If noninteractive and
Richard M. Stallman <rms@gnu.org>
parents:
2324
diff
changeset
|
197 fprintf (stderr, "%s\n", m); |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
198 fflush (stderr); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
199 } |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
200 /* A null message buffer means that the frame hasn't really been |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
201 initialized yet. Error messages get reported properly by |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
202 cmd_error, so this must be just an informative message; toss it. */ |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
203 else if (INTERACTIVE && FRAME_MESSAGE_BUF (selected_frame)) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
204 { |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
205 #ifdef MULTI_FRAME |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
206 Lisp_Object minibuf_frame; |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
207 |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
208 choose_minibuf_frame (); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
209 minibuf_frame = WINDOW_FRAME (XWINDOW (minibuf_window)); |
|
1656
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
210 FRAME_SAMPLE_VISIBILITY (XFRAME (minibuf_frame)); |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
211 if (FRAME_VISIBLE_P (selected_frame) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
212 && ! FRAME_VISIBLE_P (XFRAME (minibuf_frame))) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
213 Fmake_frame_visible (WINDOW_FRAME (XWINDOW (minibuf_window))); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
214 #endif |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
215 |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
216 if (m) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
217 echo_area_glyphs = m; |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
218 else |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
219 echo_area_glyphs = previous_echo_glyphs = 0; |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
220 |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
221 do_pending_window_change (); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
222 echo_area_display (); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
223 update_frame (XFRAME (XWINDOW (minibuf_window)->frame), 1, 1); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
224 do_pending_window_change (); |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
225 } |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
226 } |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
227 |
| 769 | 228 /* Nonzero if FRAME_MESSAGE_BUF (selected_frame) is being used by print; |
| 331 | 229 zero if being used by message. */ |
| 230 int message_buf_print; | |
| 231 | |
|
1446
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
232 /* Dump an informative message to the minibuf. If m is 0, clear out |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
233 any existing message, and let the minibuffer text show through. */ |
| 277 | 234 /* VARARGS 1 */ |
| 235 void | |
| 236 message (m, a1, a2, a3) | |
| 237 char *m; | |
| 238 { | |
| 239 if (noninteractive) | |
| 240 { | |
|
1446
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
241 if (m) |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
242 { |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
243 if (noninteractive_need_newline) |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
244 putc ('\n', stderr); |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
245 noninteractive_need_newline = 0; |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
246 fprintf (stderr, m, a1, a2, a3); |
|
2526
bcba821c17bc
(message, message1): If noninteractive and
Richard M. Stallman <rms@gnu.org>
parents:
2324
diff
changeset
|
247 if (cursor_in_echo_area == 0) |
|
bcba821c17bc
(message, message1): If noninteractive and
Richard M. Stallman <rms@gnu.org>
parents:
2324
diff
changeset
|
248 fprintf (stderr, "\n"); |
|
1446
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
249 fflush (stderr); |
|
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
250 } |
| 277 | 251 } |
|
1873
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
252 else if (INTERACTIVE) |
| 277 | 253 { |
|
1873
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
254 /* The frame whose minibuffer we're going to display the message on. |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
255 It may be larger than the selected frame, so we need |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
256 to use its buffer, not the selected frame's buffer. */ |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
257 FRAME_PTR echo_frame; |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
258 #ifdef MULTI_FRAME |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
259 choose_minibuf_frame (); |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
260 echo_frame = XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window))); |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
261 #else |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
262 echo_frame = selected_frame; |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
263 #endif |
| 277 | 264 |
|
1873
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
265 /* A null message buffer means that the frame hasn't really been |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
266 initialized yet. Error messages get reported properly by |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
267 cmd_error, so this must be just an informative message; toss it. */ |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
268 if (FRAME_MESSAGE_BUF (echo_frame)) |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
269 { |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
270 if (m) |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
271 { |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
272 { |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
273 #ifdef NO_ARG_ARRAY |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
274 int a[3]; |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
275 a[0] = a1; |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
276 a[1] = a2; |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
277 a[2] = a3; |
| 277 | 278 |
|
1873
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
279 doprnt (FRAME_MESSAGE_BUF (echo_frame), |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
280 FRAME_WIDTH (echo_frame), m, 0, 3, a); |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
281 #else |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
282 doprnt (FRAME_MESSAGE_BUF (echo_frame), |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
283 FRAME_WIDTH (echo_frame), m, 0, 3, &a1); |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
284 #endif /* NO_ARG_ARRAY */ |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
285 } |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
286 |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
287 message1 (FRAME_MESSAGE_BUF (echo_frame)); |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
288 } |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
289 else |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
290 message1 (0); |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
291 |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
292 /* Print should start at the beginning of the message |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
293 buffer next time. */ |
|
c5038f47c602
* xdisp.c (message): Set echo_frame to the frame whose message buf
Jim Blandy <jimb@redhat.com>
parents:
1785
diff
changeset
|
294 message_buf_print = 0; |
|
1446
37b3c2981b40
* xdisp.c (message): If M is zero, clear echo_area_glyphs and
Jim Blandy <jimb@redhat.com>
parents:
1124
diff
changeset
|
295 } |
| 277 | 296 } |
| 297 } | |
| 298 | |
| 299 static void | |
| 300 echo_area_display () | |
| 301 { | |
| 302 register int vpos; | |
| 769 | 303 FRAME_PTR f; |
| 277 | 304 |
| 769 | 305 #ifdef MULTI_FRAME |
| 306 choose_minibuf_frame (); | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
307 #endif |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
308 |
| 769 | 309 f = XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window))); |
| 277 | 310 |
| 769 | 311 if (! FRAME_VISIBLE_P (f)) |
| 277 | 312 return; |
| 313 | |
| 769 | 314 if (frame_garbaged) |
| 277 | 315 { |
|
3516
f1ca34ddfd84
(redisplay, echo_area_display): Use redraw_garbaged_frames.
Richard M. Stallman <rms@gnu.org>
parents:
3266
diff
changeset
|
316 redraw_garbaged_frames (); |
| 769 | 317 frame_garbaged = 0; |
| 277 | 318 } |
| 319 | |
| 320 if (echo_area_glyphs || minibuf_level == 0) | |
| 321 { | |
| 322 vpos = XFASTINT (XWINDOW (minibuf_window)->top); | |
| 769 | 323 get_display_line (f, vpos, 0); |
| 277 | 324 display_string (XWINDOW (minibuf_window), vpos, |
| 325 echo_area_glyphs ? echo_area_glyphs : "", | |
| 769 | 326 0, 0, 0, FRAME_WIDTH (f)); |
| 277 | 327 |
| 328 /* If desired cursor location is on this line, put it at end of text */ | |
| 769 | 329 if (FRAME_CURSOR_Y (f) == vpos) |
| 330 FRAME_CURSOR_X (f) = FRAME_DESIRED_GLYPHS (f)->used[vpos]; | |
| 727 | 331 |
| 332 /* Fill the rest of the minibuffer window with blank lines. */ | |
| 333 { | |
| 334 int i; | |
| 335 | |
|
3689
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
336 for (i = vpos + 1; |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
337 i < vpos + XFASTINT (XWINDOW (minibuf_window)->height); i++) |
| 727 | 338 { |
| 769 | 339 get_display_line (f, i, 0); |
| 727 | 340 display_string (XWINDOW (minibuf_window), vpos, |
| 769 | 341 "", 0, 0, 0, FRAME_WIDTH (f)); |
| 727 | 342 } |
| 343 } | |
| 277 | 344 } |
| 345 else if (!EQ (minibuf_window, selected_window)) | |
| 346 windows_or_buffers_changed++; | |
| 347 | |
| 348 if (EQ (minibuf_window, selected_window)) | |
| 349 this_line_bufpos = 0; | |
| 350 | |
| 351 previous_echo_glyphs = echo_area_glyphs; | |
| 352 } | |
| 353 | |
| 769 | 354 /* Do a frame update, taking possible shortcuts into account. |
| 277 | 355 This is the main external entry point for redisplay. |
| 356 | |
| 357 If the last redisplay displayed an echo area message and that | |
| 358 message is no longer requested, we clear the echo area | |
| 359 or bring back the minibuffer if that is in use. | |
| 360 | |
| 361 Everyone would like to have a hook here to call eval, | |
| 362 but that cannot be done safely without a lot of changes elsewhere. | |
| 363 This can be called from signal handlers; with alarms set up; | |
| 364 or with synchronous processes running. | |
| 365 See the function `echo' in keyboard.c. | |
| 366 See Fcall_process; if you called it from here, it could be | |
| 367 entered recursively. */ | |
| 368 | |
| 369 void | |
| 370 redisplay () | |
| 371 { | |
| 372 register struct window *w = XWINDOW (selected_window); | |
| 373 register int pause; | |
| 374 int must_finish = 0; | |
| 375 int all_windows; | |
| 376 register int tlbufpos, tlendpos; | |
| 377 struct position pos; | |
| 378 extern int input_pending; | |
| 379 | |
| 380 if (noninteractive) | |
| 381 return; | |
| 382 | |
|
1656
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
383 /* Set the visible flags for all frames. |
|
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
384 Do this before checking for resized or garbaged frames; they want |
|
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
385 to know if their frames are visible. |
|
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
386 See the comment in frame.h for FRAME_SAMPLE_VISIBILITY. */ |
|
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
387 { |
|
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
388 Lisp_Object tail, frame; |
|
1656
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
389 |
|
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
390 FOR_EACH_FRAME (tail, frame) |
|
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
391 FRAME_SAMPLE_VISIBILITY (XFRAME (frame)); |
|
1656
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
392 } |
|
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
393 |
| 769 | 394 /* Notice any pending interrupt request to change frame size. */ |
| 277 | 395 do_pending_window_change (); |
| 396 | |
| 769 | 397 if (frame_garbaged) |
| 277 | 398 { |
|
3516
f1ca34ddfd84
(redisplay, echo_area_display): Use redraw_garbaged_frames.
Richard M. Stallman <rms@gnu.org>
parents:
3266
diff
changeset
|
399 redraw_garbaged_frames (); |
| 769 | 400 frame_garbaged = 0; |
| 277 | 401 } |
| 402 | |
| 368 | 403 /* Normally the message* functions will have already displayed and |
| 769 | 404 updated the echo area, but the frame may have been trashed, or |
| 368 | 405 the update may have been preempted, so display the echo area |
| 406 again here. */ | |
| 277 | 407 if (echo_area_glyphs || previous_echo_glyphs) |
| 408 { | |
| 409 echo_area_display (); | |
| 410 must_finish = 1; | |
| 411 } | |
| 412 | |
| 413 if (clip_changed || windows_or_buffers_changed) | |
| 414 update_mode_lines++; | |
| 415 | |
| 416 /* Detect case that we need to write a star in the mode line. */ | |
| 417 if (XFASTINT (w->last_modified) < MODIFF | |
| 418 && XFASTINT (w->last_modified) <= current_buffer->save_modified) | |
| 419 { | |
| 420 w->update_mode_line = Qt; | |
| 421 if (buffer_shared > 1) | |
| 422 update_mode_lines++; | |
| 423 } | |
| 424 | |
| 769 | 425 FRAME_SCROLL_BOTTOM_VPOS (XFRAME (w->frame)) = -1; |
| 277 | 426 |
| 427 all_windows = update_mode_lines || buffer_shared > 1; | |
| 428 | |
| 429 /* If specs for an arrow have changed, do thorough redisplay | |
| 430 to ensure we remove any arrow that should no longer exist. */ | |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
431 if (! EQ (Voverlay_arrow_position, last_arrow_position) |
|
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
432 || ! EQ (Voverlay_arrow_string, last_arrow_string)) |
| 277 | 433 all_windows = 1, clip_changed = 1; |
| 434 | |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
435 /* If showing region, and mark has changed, must redisplay whole window. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
436 if (((!NILP (Vtransient_mark_mode) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
437 && !NILP (XBUFFER (w->buffer)->mark_active)) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
438 != !NILP (w->region_showing)) |
|
3937
adcbf7680a35
* xdisp.c (redisplay): If we're not already showing the region,
Jim Blandy <jimb@redhat.com>
parents:
3880
diff
changeset
|
439 || (!NILP (w->region_showing) |
|
adcbf7680a35
* xdisp.c (redisplay): If we're not already showing the region,
Jim Blandy <jimb@redhat.com>
parents:
3880
diff
changeset
|
440 && !EQ (w->region_showing, |
|
adcbf7680a35
* xdisp.c (redisplay): If we're not already showing the region,
Jim Blandy <jimb@redhat.com>
parents:
3880
diff
changeset
|
441 Fmarker_position (XBUFFER (w->buffer)->mark)))) |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
442 this_line_bufpos = -1; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
443 |
| 277 | 444 tlbufpos = this_line_bufpos; |
| 445 tlendpos = this_line_endpos; | |
| 485 | 446 if (!all_windows && tlbufpos > 0 && NILP (w->update_mode_line) |
| 769 | 447 && FRAME_VISIBLE_P (XFRAME (w->frame)) |
| 277 | 448 /* Make sure recorded data applies to current buffer, etc */ |
| 449 && this_line_buffer == current_buffer | |
| 450 && current_buffer == XBUFFER (w->buffer) | |
| 485 | 451 && NILP (w->force_start) |
| 277 | 452 /* Point must be on the line that we have info recorded about */ |
| 453 && point >= tlbufpos | |
| 454 && point <= Z - tlendpos | |
| 455 /* All text outside that line, including its final newline, | |
| 456 must be unchanged */ | |
| 457 && (XFASTINT (w->last_modified) >= MODIFF | |
| 458 || (beg_unchanged >= tlbufpos - 1 | |
| 459 && GPT >= tlbufpos | |
| 528 | 460 /* If selective display, can't optimize |
| 461 if the changes start at the beginning of the line. */ | |
| 462 && ((XTYPE (current_buffer->selective_display) == Lisp_Int | |
| 463 && XINT (current_buffer->selective_display) > 0 | |
| 464 ? (beg_unchanged >= tlbufpos | |
| 465 && GPT > tlbufpos) | |
| 466 : 1)) | |
| 277 | 467 && end_unchanged >= tlendpos |
| 468 && Z - GPT >= tlendpos))) | |
| 469 { | |
| 470 if (tlbufpos > BEGV && FETCH_CHAR (tlbufpos - 1) != '\n' | |
| 471 && (tlbufpos == ZV | |
| 472 || FETCH_CHAR (tlbufpos) == '\n')) | |
| 473 /* Former continuation line has disappeared by becoming empty */ | |
| 474 goto cancel; | |
| 475 else if (XFASTINT (w->last_modified) < MODIFF | |
| 476 || MINI_WINDOW_P (w)) | |
| 477 { | |
| 478 cursor_vpos = -1; | |
| 479 overlay_arrow_seen = 0; | |
| 480 display_text_line (w, tlbufpos, this_line_vpos, this_line_start_hpos, | |
| 481 pos_tab_offset (w, tlbufpos)); | |
| 482 /* If line contains point, is not continued, | |
| 483 and ends at same distance from eob as before, we win */ | |
| 484 if (cursor_vpos >= 0 && this_line_bufpos | |
| 485 && this_line_endpos == tlendpos) | |
| 486 { | |
| 769 | 487 if (XFASTINT (w->width) != FRAME_WIDTH (XFRAME (WINDOW_FRAME (w)))) |
| 277 | 488 preserve_other_columns (w); |
| 489 goto update; | |
| 490 } | |
| 491 else | |
| 492 goto cancel; | |
| 493 } | |
| 494 else if (point == XFASTINT (w->last_point)) | |
| 495 { | |
| 496 if (!must_finish) | |
| 497 { | |
| 498 do_pending_window_change (); | |
| 499 return; | |
| 500 } | |
| 501 goto update; | |
| 502 } | |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
503 /* If highlighting the region, we can't just move the cursor. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
504 else if (! (!NILP (Vtransient_mark_mode) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
505 && !NILP (current_buffer->mark_active)) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
506 && NILP (w->region_showing)) |
| 277 | 507 { |
| 508 pos = *compute_motion (tlbufpos, 0, | |
| 509 XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0, | |
| 510 point, 2, - (1 << (SHORTBITS - 1)), | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
511 window_internal_width (w) - 1, |
| 574 | 512 XINT (w->hscroll), |
| 513 pos_tab_offset (w, tlbufpos)); | |
| 277 | 514 if (pos.vpos < 1) |
| 515 { | |
| 769 | 516 FRAME_CURSOR_X (selected_frame) |
| 277 | 517 = XFASTINT (w->left) + max (pos.hpos, 0); |
| 769 | 518 FRAME_CURSOR_Y (selected_frame) = this_line_vpos; |
| 277 | 519 goto update; |
| 520 } | |
| 521 else | |
| 522 goto cancel; | |
| 523 } | |
| 524 cancel: | |
| 525 /* Text changed drastically or point moved off of line */ | |
| 769 | 526 cancel_line (this_line_vpos, selected_frame); |
| 277 | 527 } |
| 528 | |
| 529 this_line_bufpos = 0; | |
| 530 all_windows |= buffer_shared > 1; | |
| 531 | |
| 532 if (all_windows) | |
| 533 { | |
|
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
534 Lisp_Object tail, frame; |
| 277 | 535 |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
536 #ifdef HAVE_X_WINDOWS |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
537 /* Since we're doing a thorough redisplay, we might as well |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
538 recompute all our display faces. */ |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
539 clear_face_vector (); |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
540 #endif |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
541 |
| 277 | 542 /* Recompute # windows showing selected buffer. |
| 433 | 543 This will be incremented each time such a window is displayed. */ |
| 277 | 544 buffer_shared = 0; |
| 545 | |
|
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
546 FOR_EACH_FRAME (tail, frame) |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
547 { |
|
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
548 FRAME_PTR f = XFRAME (frame); |
|
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2189
diff
changeset
|
549 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
550 /* Mark all the scroll bars to be removed; we'll redeem the ones |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
551 we want when we redisplay their windows. */ |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
552 if (condemn_scroll_bars_hook) |
|
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
553 (*condemn_scroll_bars_hook) (f); |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
554 |
|
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
555 if (FRAME_VISIBLE_P (f)) |
|
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
556 redisplay_windows (FRAME_ROOT_WINDOW (f)); |
|
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
557 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
558 /* Any scroll bars which redisplay_windows should have nuked |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
559 should now go away. */ |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
560 if (judge_scroll_bars_hook) |
|
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
561 (*judge_scroll_bars_hook) (f); |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
562 } |
| 277 | 563 } |
| 769 | 564 else if (FRAME_VISIBLE_P (selected_frame)) |
| 277 | 565 { |
| 566 redisplay_window (selected_window, 1); | |
| 769 | 567 if (XFASTINT (w->width) != FRAME_WIDTH (selected_frame)) |
| 277 | 568 preserve_other_columns (w); |
| 569 } | |
| 570 | |
| 571 update: | |
| 572 /* Prevent various kinds of signals during display update. | |
| 573 stdio is not robust about handling signals, | |
| 574 which can cause an apparent I/O error. */ | |
| 575 if (interrupt_input) | |
| 576 unrequest_sigio (); | |
| 577 stop_polling (); | |
| 578 | |
| 769 | 579 #ifdef MULTI_FRAME |
| 277 | 580 if (all_windows) |
| 581 { | |
| 582 Lisp_Object tail; | |
| 583 | |
| 584 pause = 0; | |
| 585 | |
| 769 | 586 for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr) |
| 277 | 587 { |
| 769 | 588 FRAME_PTR f; |
| 277 | 589 |
| 769 | 590 if (XTYPE (XCONS (tail)->car) != Lisp_Frame) |
| 277 | 591 continue; |
| 592 | |
| 769 | 593 f = XFRAME (XCONS (tail)->car); |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
594 if (FRAME_VISIBLE_P (f)) |
| 277 | 595 { |
| 769 | 596 pause |= update_frame (f, 0, 0); |
| 277 | 597 if (!pause) |
| 769 | 598 mark_window_display_accurate (f->root_window, 1); |
| 277 | 599 } |
| 600 } | |
| 601 } | |
| 602 else | |
| 769 | 603 #endif /* MULTI_FRAME */ |
| 368 | 604 { |
| 769 | 605 if (FRAME_VISIBLE_P (selected_frame)) |
| 606 pause = update_frame (selected_frame, 0, 0); | |
|
1656
a532c5a23984
* xdisp.c (redisplay): Call FRAME_SAMPLE_VISIBILITY to set the
Jim Blandy <jimb@redhat.com>
parents:
1600
diff
changeset
|
607 |
| 433 | 608 /* We may have called echo_area_display at the top of this |
| 769 | 609 function. If the echo area is on another frame, that may |
| 610 have put text on a frame other than the selected one, so the | |
| 611 above call to update_frame would not have caught it. Catch | |
| 433 | 612 it here. */ |
| 613 { | |
| 769 | 614 FRAME_PTR mini_frame = |
| 615 XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window))); | |
| 433 | 616 |
| 769 | 617 if (mini_frame != selected_frame) |
| 618 pause |= update_frame (mini_frame, 0, 0); | |
| 433 | 619 } |
| 368 | 620 } |
| 277 | 621 |
| 769 | 622 /* If frame does not match, prevent doing single-line-update next time. |
| 277 | 623 Also, don't forget to check every line to update the arrow. */ |
| 624 if (pause) | |
| 625 { | |
| 626 this_line_bufpos = 0; | |
| 485 | 627 if (!NILP (last_arrow_position)) |
| 277 | 628 { |
| 629 last_arrow_position = Qt; | |
| 630 last_arrow_string = Qt; | |
| 631 } | |
| 769 | 632 /* If we pause after scrolling, some lines in current_frame |
| 277 | 633 may be null, so preserve_other_columns won't be able to |
| 634 preserve all the vertical-bar separators. So, avoid using it | |
| 635 in that case. */ | |
| 769 | 636 if (XFASTINT (w->width) != FRAME_WIDTH (selected_frame)) |
| 277 | 637 update_mode_lines = 1; |
| 638 } | |
| 639 | |
| 769 | 640 /* Now text on frame agrees with windows, so |
| 277 | 641 put info into the windows for partial redisplay to follow */ |
| 642 | |
| 643 if (!pause) | |
| 644 { | |
| 645 register struct buffer *b = XBUFFER (w->buffer); | |
| 646 | |
| 647 blank_end_of_window = 0; | |
| 648 clip_changed = 0; | |
| 649 unchanged_modified = BUF_MODIFF (b); | |
| 650 beg_unchanged = BUF_GPT (b) - BUF_BEG (b); | |
| 651 end_unchanged = BUF_Z (b) - BUF_GPT (b); | |
| 652 | |
| 653 XFASTINT (w->last_point) = BUF_PT (b); | |
| 769 | 654 XFASTINT (w->last_point_x) = FRAME_CURSOR_X (selected_frame); |
| 655 XFASTINT (w->last_point_y) = FRAME_CURSOR_Y (selected_frame); | |
| 277 | 656 |
| 657 if (all_windows) | |
|
1017
d42877206c0a
* xdisp.c (display_mode_line): Use x_implicitly_set_name here.
Jim Blandy <jimb@redhat.com>
parents:
973
diff
changeset
|
658 mark_window_display_accurate (FRAME_ROOT_WINDOW (selected_frame), 1); |
| 277 | 659 else |
| 660 { | |
| 661 w->update_mode_line = Qnil; | |
| 662 XFASTINT (w->last_modified) = BUF_MODIFF (b); | |
| 663 w->window_end_valid = Qt; | |
| 664 last_arrow_position = Voverlay_arrow_position; | |
| 665 last_arrow_string = Voverlay_arrow_string; | |
| 666 } | |
| 667 update_mode_lines = 0; | |
| 668 windows_or_buffers_changed = 0; | |
| 669 } | |
| 670 | |
| 671 /* Start SIGIO interrupts coming again. | |
| 672 Having them off during the code above | |
| 673 makes it less likely one will discard output, | |
| 674 but not impossible, since there might be stuff | |
| 675 in the system buffer here. | |
| 676 But it is much hairier to try to do anything about that. */ | |
| 677 | |
| 678 if (interrupt_input) | |
| 679 request_sigio (); | |
| 680 start_polling (); | |
| 681 | |
| 769 | 682 /* Change frame size now if a change is pending. */ |
| 277 | 683 do_pending_window_change (); |
| 684 } | |
| 685 | |
| 686 /* Redisplay, but leave alone any recent echo area message | |
| 687 unless another message has been requested in its place. | |
| 688 | |
| 689 This is useful in situations where you need to redisplay but no | |
| 690 user action has occurred, making it inappropriate for the message | |
| 691 area to be cleared. See tracking_off and | |
| 692 wait_reading_process_input for examples of these situations. */ | |
| 693 | |
| 694 redisplay_preserve_echo_area () | |
| 695 { | |
| 696 if (echo_area_glyphs == 0 && previous_echo_glyphs != 0) | |
| 697 { | |
| 698 echo_area_glyphs = previous_echo_glyphs; | |
| 699 redisplay (); | |
| 700 echo_area_glyphs = 0; | |
| 701 } | |
| 702 else | |
| 703 redisplay (); | |
| 704 } | |
| 705 | |
| 706 void | |
| 707 mark_window_display_accurate (window, flag) | |
| 708 Lisp_Object window; | |
| 709 int flag; | |
| 710 { | |
| 711 register struct window *w; | |
| 712 | |
| 485 | 713 for (;!NILP (window); window = w->next) |
| 277 | 714 { |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
715 if (XTYPE (window) != Lisp_Window) abort (); |
| 277 | 716 w = XWINDOW (window); |
| 717 | |
| 485 | 718 if (!NILP (w->buffer)) |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
719 { |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
720 XFASTINT (w->last_modified) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
721 = !flag ? 0 |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
722 : XBUFFER (w->buffer) == current_buffer |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
723 ? MODIFF : BUF_MODIFF (XBUFFER (w->buffer)); |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
724 |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
725 /* Record if we are showing a region, so can make sure to |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
726 update it fully at next redisplay. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
727 w->region_showing = (!NILP (Vtransient_mark_mode) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
728 && !NILP (XBUFFER (w->buffer)->mark_active) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
729 ? Fmarker_position (XBUFFER (w->buffer)->mark) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
730 : Qnil); |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
731 } |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
732 |
| 277 | 733 w->window_end_valid = Qt; |
| 734 w->update_mode_line = Qnil; | |
| 735 | |
| 485 | 736 if (!NILP (w->vchild)) |
| 277 | 737 mark_window_display_accurate (w->vchild, flag); |
| 485 | 738 if (!NILP (w->hchild)) |
| 277 | 739 mark_window_display_accurate (w->hchild, flag); |
| 740 } | |
| 741 | |
| 742 if (flag) | |
| 743 { | |
| 744 last_arrow_position = Voverlay_arrow_position; | |
| 745 last_arrow_string = Voverlay_arrow_string; | |
| 746 } | |
| 747 else | |
| 748 { | |
| 749 /* t is unequal to any useful value of Voverlay_arrow_... */ | |
| 750 last_arrow_position = Qt; | |
| 751 last_arrow_string = Qt; | |
| 752 } | |
| 753 } | |
| 754 | |
| 755 int do_id = 1; | |
| 756 | |
| 757 static void | |
| 758 redisplay_windows (window) | |
| 759 Lisp_Object window; | |
| 760 { | |
| 485 | 761 for (; !NILP (window); window = XWINDOW (window)->next) |
| 277 | 762 redisplay_window (window, 0); |
| 763 } | |
| 764 | |
| 765 static void | |
| 766 redisplay_window (window, just_this_one) | |
| 767 Lisp_Object window; | |
| 768 int just_this_one; | |
| 769 { | |
| 770 register struct window *w = XWINDOW (window); | |
|
1718
f80c1f73f5b9
* xdisp.c: #include "termhooks.h".
Jim Blandy <jimb@redhat.com>
parents:
1656
diff
changeset
|
771 FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); |
| 277 | 772 int height; |
| 773 register int lpoint = point; | |
| 774 struct buffer *old = current_buffer; | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
775 register int width = window_internal_width (w) - 1; |
| 277 | 776 register int startp; |
| 777 register int hscroll = XINT (w->hscroll); | |
| 778 struct position pos; | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
779 int opoint = point; |
| 277 | 780 int tem; |
| 781 int window_needs_modeline; | |
| 782 | |
| 769 | 783 if (FRAME_HEIGHT (f) == 0) abort (); /* Some bug zeros some core */ |
| 277 | 784 |
| 785 /* If this is a combination window, do its children; that's all. */ | |
| 786 | |
| 485 | 787 if (!NILP (w->vchild)) |
| 277 | 788 { |
| 789 redisplay_windows (w->vchild); | |
| 790 return; | |
| 791 } | |
| 485 | 792 if (!NILP (w->hchild)) |
| 277 | 793 { |
| 794 redisplay_windows (w->hchild); | |
| 795 return; | |
| 796 } | |
| 485 | 797 if (NILP (w->buffer)) |
| 277 | 798 abort (); |
| 433 | 799 |
| 800 height = window_internal_height (w); | |
| 801 | |
| 802 if (MINI_WINDOW_P (w)) | |
| 803 { | |
| 804 if (w == XWINDOW (minibuf_window)) | |
| 805 { | |
| 806 if (echo_area_glyphs) | |
| 807 /* We've already displayed the echo area glyphs, if any. */ | |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
808 goto finish_scroll_bars; |
| 433 | 809 } |
| 810 else | |
| 811 { | |
| 812 /* This is a minibuffer, but it's not the currently active one, so | |
| 813 clear it. */ | |
| 769 | 814 int vpos = XFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top); |
| 433 | 815 int i; |
| 816 | |
| 817 for (i = 0; i < height; i++) | |
| 818 { | |
| 769 | 819 get_display_line (f, vpos + i, 0); |
| 433 | 820 display_string (w, vpos + i, "", 0, 0, 0, width); |
| 821 } | |
| 822 | |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
823 goto finish_scroll_bars; |
| 433 | 824 } |
| 825 } | |
| 277 | 826 |
| 827 if (update_mode_lines) | |
| 828 w->update_mode_line = Qt; | |
| 829 | |
| 830 /* Otherwise set up data on this window; select its buffer and point value */ | |
| 831 | |
| 832 current_buffer = XBUFFER (w->buffer); | |
| 833 opoint = point; | |
| 834 | |
| 835 /* Count number of windows showing the selected buffer. */ | |
| 836 | |
| 837 if (!just_this_one | |
| 838 && current_buffer == XBUFFER (XWINDOW (selected_window)->buffer)) | |
| 839 buffer_shared++; | |
| 840 | |
| 841 /* POINT refers normally to the selected window. | |
| 842 For any other window, set up appropriate value. */ | |
| 843 | |
| 844 if (!EQ (window, selected_window)) | |
| 845 { | |
| 846 SET_PT (marker_position (w->pointm)); | |
| 847 if (point < BEGV) | |
| 848 { | |
| 485 | 849 SET_PT (BEGV); |
| 277 | 850 Fset_marker (w->pointm, make_number (point), Qnil); |
| 851 } | |
| 852 else if (point > (ZV - 1)) | |
| 853 { | |
| 485 | 854 SET_PT (ZV); |
| 277 | 855 Fset_marker (w->pointm, make_number (point), Qnil); |
| 856 } | |
| 857 } | |
| 858 | |
| 859 /* If window-start is screwed up, choose a new one. */ | |
| 860 if (XMARKER (w->start)->buffer != current_buffer) | |
| 861 goto recenter; | |
| 862 | |
| 863 startp = marker_position (w->start); | |
| 864 | |
| 433 | 865 /* Handle case where place to start displaying has been specified, |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
866 unless the specified location is outside the accessible range. */ |
| 485 | 867 if (!NILP (w->force_start)) |
| 277 | 868 { |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
869 /* Forget any recorded base line for line number display. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
870 w->base_line_number = Qnil; |
| 277 | 871 w->update_mode_line = Qt; |
| 872 w->force_start = Qnil; | |
| 873 XFASTINT (w->last_modified) = 0; | |
| 433 | 874 if (startp < BEGV) startp = BEGV; |
| 875 if (startp > ZV) startp = ZV; | |
| 277 | 876 try_window (window, startp); |
| 877 if (cursor_vpos < 0) | |
| 878 { | |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
879 /* ??? What should happen here if highlighting a region? */ |
| 277 | 880 /* If point does not appear, move point so it does appear */ |
| 881 pos = *compute_motion (startp, 0, | |
| 882 ((EQ (window, minibuf_window) && startp == 1) | |
| 883 ? minibuf_prompt_width : 0) | |
| 884 + | |
| 885 (hscroll ? 1 - hscroll : 0), | |
| 886 ZV, height / 2, | |
| 887 - (1 << (SHORTBITS - 1)), | |
| 888 width, hscroll, pos_tab_offset (w, startp)); | |
| 889 SET_PT (pos.bufpos); | |
| 769 | 890 if (w != XWINDOW (FRAME_SELECTED_WINDOW (f))) |
| 277 | 891 Fset_marker (w->pointm, make_number (point), Qnil); |
| 892 else | |
| 893 { | |
| 894 lpoint = point; | |
| 769 | 895 FRAME_CURSOR_X (f) = max (0, pos.hpos) + XFASTINT (w->left); |
| 896 FRAME_CURSOR_Y (f) = pos.vpos + XFASTINT (w->top); | |
| 277 | 897 } |
| 898 } | |
| 899 goto done; | |
| 900 } | |
| 901 | |
| 902 /* Handle case where text has not changed, only point, | |
| 769 | 903 and it has not moved off the frame */ |
| 277 | 904 |
| 905 /* This code is not used for minibuffer for the sake of | |
| 906 the case of redisplaying to replace an echo area message; | |
| 907 since in that case the minibuffer contents per se are usually unchanged. | |
| 908 This code is of no real use in the minibuffer since | |
| 909 the handling of this_line_bufpos, etc., | |
| 910 in redisplay handles the same cases. */ | |
| 911 | |
| 912 if (XFASTINT (w->last_modified) >= MODIFF | |
| 913 && point >= startp && !clip_changed | |
| 769 | 914 && (just_this_one || XFASTINT (w->width) == FRAME_WIDTH (f)) |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
915 /* Can't use this case if highlighting a region. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
916 && !(!NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active)) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
917 && NILP (w->region_showing) |
| 277 | 918 && !EQ (window, minibuf_window)) |
| 919 { | |
| 920 pos = *compute_motion (startp, 0, (hscroll ? 1 - hscroll : 0), | |
| 921 point, height + 1, 10000, width, hscroll, | |
| 922 pos_tab_offset (w, startp)); | |
| 923 | |
| 924 if (pos.vpos < height) | |
| 925 { | |
| 769 | 926 /* Ok, point is still on frame */ |
| 927 if (w == XWINDOW (FRAME_SELECTED_WINDOW (f))) | |
| 277 | 928 { |
| 929 /* These variables are supposed to be origin 1 */ | |
| 769 | 930 FRAME_CURSOR_X (f) = max (0, pos.hpos) + XFASTINT (w->left); |
| 931 FRAME_CURSOR_Y (f) = pos.vpos + XFASTINT (w->top); | |
| 277 | 932 } |
| 933 /* This doesn't do the trick, because if a window to the right of | |
| 934 this one must be redisplayed, this does nothing because there | |
| 769 | 935 is nothing in DesiredFrame yet, and then the other window is |
| 277 | 936 redisplayed, making likes that are empty in this window's columns. |
| 769 | 937 if (XFASTINT (w->width) != FRAME_WIDTH (f)) |
| 277 | 938 preserve_my_columns (w); |
| 939 */ | |
| 940 goto done; | |
| 941 } | |
| 942 /* Don't bother trying redisplay with same start; | |
| 943 we already know it will lose */ | |
| 944 } | |
| 945 /* If current starting point was originally the beginning of a line | |
| 946 but no longer is, find a new starting point. */ | |
| 485 | 947 else if (!NILP (w->start_at_line_beg) |
| 277 | 948 && !(startp == BEGV |
| 949 || FETCH_CHAR (startp - 1) == '\n')) | |
| 950 { | |
| 951 goto recenter; | |
| 952 } | |
| 953 else if (just_this_one && !MINI_WINDOW_P (w) | |
| 954 && point >= startp | |
| 955 && XFASTINT (w->last_modified) | |
|
3648
9838d64cc5ae
* xdisp.c (redisplay_window): Don't call try_window_id if the
Jim Blandy <jimb@redhat.com>
parents:
3586
diff
changeset
|
956 /* or else vmotion on first line won't work. */ |
|
9838d64cc5ae
* xdisp.c (redisplay_window): Don't call try_window_id if the
Jim Blandy <jimb@redhat.com>
parents:
3586
diff
changeset
|
957 && ! NILP (w->start_at_line_beg) |
| 277 | 958 && ! EQ (w->window_end_valid, Qnil) |
| 959 && do_id && !clip_changed | |
| 960 && !blank_end_of_window | |
| 769 | 961 && XFASTINT (w->width) == FRAME_WIDTH (f) |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
962 /* Can't use this case if highlighting a region. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
963 && !(!NILP (Vtransient_mark_mode) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
964 && !NILP (current_buffer->mark_active)) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
965 && NILP (w->region_showing) |
| 277 | 966 && EQ (last_arrow_position, Voverlay_arrow_position) |
| 967 && EQ (last_arrow_string, Voverlay_arrow_string) | |
| 769 | 968 && (tem = try_window_id (FRAME_SELECTED_WINDOW (f))) |
| 277 | 969 && tem != -2) |
| 970 { | |
| 971 /* tem > 0 means success. tem == -1 means choose new start. | |
| 972 tem == -2 means try again with same start, | |
| 973 and nothing but whitespace follows the changed stuff. | |
| 974 tem == 0 means try again with same start. */ | |
| 975 if (tem > 0) | |
| 976 goto done; | |
| 977 } | |
| 978 else if (startp >= BEGV && startp <= ZV | |
| 979 /* Avoid starting display at end of buffer! */ | |
| 433 | 980 && (startp < ZV || startp == BEGV |
| 277 | 981 || (XFASTINT (w->last_modified) >= MODIFF))) |
| 982 { | |
| 983 /* Try to redisplay starting at same place as before */ | |
| 769 | 984 /* If point has not moved off frame, accept the results */ |
| 277 | 985 try_window (window, startp); |
| 986 if (cursor_vpos >= 0) | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
987 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
988 if (!just_this_one || clip_changed || beg_unchanged < startp) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
989 /* Forget any recorded base line for line number display. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
990 w->base_line_number = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
991 goto done; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
992 } |
| 277 | 993 else |
| 994 cancel_my_columns (w); | |
| 995 } | |
| 996 | |
| 997 XFASTINT (w->last_modified) = 0; | |
| 998 w->update_mode_line = Qt; | |
| 999 | |
| 1000 /* Try to scroll by specified few lines */ | |
| 1001 | |
| 1002 if (scroll_step && !clip_changed) | |
| 1003 { | |
| 1004 if (point > startp) | |
| 1005 { | |
| 1006 pos = *vmotion (Z - XFASTINT (w->window_end_pos), | |
| 1007 scroll_step, width, hscroll, window); | |
| 1008 if (pos.vpos >= height) | |
| 1009 goto scroll_fail; | |
| 1010 } | |
| 1011 | |
| 1012 pos = *vmotion (startp, point < startp ? - scroll_step : scroll_step, | |
| 1013 width, hscroll, window); | |
| 1014 | |
| 1015 if (point >= pos.bufpos) | |
| 1016 { | |
| 1017 try_window (window, pos.bufpos); | |
| 1018 if (cursor_vpos >= 0) | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1019 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1020 if (!just_this_one || clip_changed || beg_unchanged < startp) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1021 /* Forget any recorded base line for line number display. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1022 w->base_line_number = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1023 goto done; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1024 } |
| 277 | 1025 else |
| 1026 cancel_my_columns (w); | |
| 1027 } | |
| 1028 scroll_fail: ; | |
| 1029 } | |
| 1030 | |
| 1031 /* Finally, just choose place to start which centers point */ | |
| 1032 | |
| 1033 recenter: | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1034 /* Forget any previously recorded base line for line number display. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1035 w->base_line_number = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1036 |
| 277 | 1037 pos = *vmotion (point, - height / 2, width, hscroll, window); |
| 1038 try_window (window, pos.bufpos); | |
| 1039 | |
| 1040 startp = marker_position (w->start); | |
| 1041 w->start_at_line_beg = | |
| 1042 (startp == BEGV || FETCH_CHAR (startp - 1) == '\n') ? Qt : Qnil; | |
| 1043 | |
| 1044 done: | |
| 485 | 1045 if ((!NILP (w->update_mode_line) |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1046 /* If window not full width, must redo its mode line |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1047 if the window to its side is being redone */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1048 || (!just_this_one && width < FRAME_WIDTH (f) - 1) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1049 || INTEGERP (w->base_line_pos)) |
| 277 | 1050 && height != XFASTINT (w->height)) |
| 1051 display_mode_line (w); | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1052 if (! line_number_displayed |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1053 && ! BUFFERP (w->base_line_pos)) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1054 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1055 w->base_line_pos = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1056 w->base_line_number = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
1057 } |
| 277 | 1058 |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
1059 /* When we reach a frame's selected window, redo the frame's menu bar. */ |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
1060 if (!NILP (w->update_mode_line) |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
1061 && FRAME_MENU_BAR_LINES (f) > 0 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
1062 && EQ (FRAME_SELECTED_WINDOW (f), window)) |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
1063 display_menu_bar (w); |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
1064 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
1065 finish_scroll_bars: |
|
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
1066 if (FRAME_HAS_VERTICAL_SCROLL_BARS (f)) |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1067 { |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1068 int start, end, whole; |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1069 |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1070 /* Calculate the start and end positions for the current window. |
|
2874
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1071 At some point, it would be nice to choose between scrollbars |
|
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1072 which reflect the whole buffer size, with special markers |
|
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1073 indicating narrowing, and scrollbars which reflect only the |
|
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1074 visible region. |
|
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1075 |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1076 Note that minibuffers sometimes aren't displaying any text. */ |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1077 if (! MINI_WINDOW_P (w) |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1078 || (w == XWINDOW (minibuf_window) && ! echo_area_glyphs)) |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1079 { |
|
2929
f3c44426bed2
Fix the fix to scrollbar computaaFix the fix to the fix for scrollbar computation.
Jim Blandy <jimb@redhat.com>
parents:
2904
diff
changeset
|
1080 whole = ZV - BEGV; |
|
2904
d9f7768b0d89
* xdisp.c (redisplay_window): Compute the scrollbar start and end
Jim Blandy <jimb@redhat.com>
parents:
2884
diff
changeset
|
1081 start = startp - BEGV; |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1082 /* I don't think this is guaranteed to be right. For the |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1083 moment, we'll pretend it is. */ |
|
3880
ef6a4d39634b
* xdisp.c (redisplay_window): Remember to compute end relative to
Jim Blandy <jimb@redhat.com>
parents:
3788
diff
changeset
|
1084 end = (Z - XINT (w->window_end_pos)) - BEGV; |
|
2874
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1085 |
|
80805283464a
* xdisp.c (redisplay_window): Make the scrollbar reflect the
Jim Blandy <jimb@redhat.com>
parents:
2848
diff
changeset
|
1086 if (end < start) end = start; |
|
2929
f3c44426bed2
Fix the fix to scrollbar computaaFix the fix to the fix for scrollbar computation.
Jim Blandy <jimb@redhat.com>
parents:
2904
diff
changeset
|
1087 if (whole < (end - start)) whole = end - start; |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1088 } |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1089 else |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1090 start = end = whole = 0; |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1091 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
1092 /* Indicate what this scroll bar ought to be displaying now. */ |
|
3788
41a297faf4ac
* xdisp.c (redisplay_window): No need to subtract one from start
Jim Blandy <jimb@redhat.com>
parents:
3750
diff
changeset
|
1093 (*set_vertical_scroll_bar_hook) (w, end - start, whole, start); |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1094 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
1095 /* Note that we actually used the scroll bar attached to this window, |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1096 so it shouldn't be deleted at the end of redisplay. */ |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
1097 (*redeem_scroll_bar_hook) (w); |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1098 } |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1099 |
| 277 | 1100 SET_PT (opoint); |
| 1101 current_buffer = old; | |
| 1102 SET_PT (lpoint); | |
| 1103 } | |
| 1104 | |
| 1105 /* Do full redisplay on one window, starting at position `pos'. */ | |
| 1106 | |
| 1107 static void | |
| 1108 try_window (window, pos) | |
| 1109 Lisp_Object window; | |
| 1110 register int pos; | |
| 1111 { | |
| 1112 register struct window *w = XWINDOW (window); | |
| 1113 register int height = window_internal_height (w); | |
| 1114 register int vpos = XFASTINT (w->top); | |
| 1115 register int last_text_vpos = vpos; | |
| 1116 int tab_offset = pos_tab_offset (w, pos); | |
| 769 | 1117 FRAME_PTR f = XFRAME (w->frame); |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1118 int width = window_internal_width (w) - 1; |
| 277 | 1119 struct position val; |
| 1120 | |
| 1121 Fset_marker (w->start, make_number (pos), Qnil); | |
| 1122 cursor_vpos = -1; | |
| 1123 overlay_arrow_seen = 0; | |
| 1124 val.hpos = XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0; | |
| 1125 | |
| 1126 while (--height >= 0) | |
| 1127 { | |
| 1128 val = *display_text_line (w, pos, vpos, val.hpos, tab_offset); | |
| 1129 tab_offset += width; | |
| 1130 if (val.vpos) tab_offset = 0; | |
| 1131 vpos++; | |
| 1132 if (pos != val.bufpos) | |
| 1133 last_text_vpos | |
| 1134 /* Next line, unless prev line ended in end of buffer with no cr */ | |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1135 = vpos - (val.vpos && (FETCH_CHAR (val.bufpos - 1) != '\n' |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1136 || ! NILP (Fget_text_property (val.bufpos-1, |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1137 Qinvisible, |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1138 Fcurrent_buffer ())))); |
| 277 | 1139 pos = val.bufpos; |
| 1140 } | |
| 1141 | |
| 1142 /* If last line is continued in middle of character, | |
| 769 | 1143 include the split character in the text considered on the frame */ |
| 277 | 1144 if (val.hpos < (XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0)) |
| 1145 pos++; | |
| 1146 | |
| 769 | 1147 /* If bottom just moved off end of frame, change mode line percentage. */ |
| 277 | 1148 if (XFASTINT (w->window_end_pos) == 0 |
| 1149 && Z != pos) | |
| 1150 w->update_mode_line = Qt; | |
| 1151 | |
| 769 | 1152 /* Say where last char on frame will be, once redisplay is finished. */ |
| 277 | 1153 XFASTINT (w->window_end_pos) = Z - pos; |
| 1154 XFASTINT (w->window_end_vpos) = last_text_vpos - XFASTINT (w->top); | |
| 1155 /* But that is not valid info until redisplay finishes. */ | |
| 1156 w->window_end_valid = Qnil; | |
| 1157 } | |
| 1158 | |
| 1159 /* Try to redisplay when buffer is modified locally, | |
| 1160 computing insert/delete line to preserve text outside | |
| 1161 the bounds of the changes. | |
| 1162 Return 1 if successful, 0 if if cannot tell what to do, | |
| 1163 or -1 to tell caller to find a new window start, | |
| 1164 or -2 to tell caller to do normal redisplay with same window start. */ | |
| 1165 | |
| 1166 static int | |
| 1167 try_window_id (window) | |
| 1168 Lisp_Object window; | |
| 1169 { | |
| 1170 int pos; | |
| 1171 register struct window *w = XWINDOW (window); | |
| 1172 register int height = window_internal_height (w); | |
| 769 | 1173 FRAME_PTR f = XFRAME (w->frame); |
| 277 | 1174 int top = XFASTINT (w->top); |
| 1175 int start = marker_position (w->start); | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1176 int width = window_internal_width (w) - 1; |
| 277 | 1177 int hscroll = XINT (w->hscroll); |
| 1178 int lmargin = hscroll > 0 ? 1 - hscroll : 0; | |
| 1179 register int vpos; | |
| 1180 register int i, tem; | |
| 1181 int last_text_vpos = 0; | |
| 1182 int stop_vpos; | |
| 1183 | |
| 1184 struct position val, bp, ep, xp, pp; | |
| 1185 int scroll_amount = 0; | |
| 1186 int delta; | |
| 1187 int tab_offset, epto; | |
| 1188 | |
| 1189 if (GPT - BEG < beg_unchanged) | |
| 1190 beg_unchanged = GPT - BEG; | |
| 1191 if (Z - GPT < end_unchanged) | |
| 1192 end_unchanged = Z - GPT; | |
| 1193 | |
| 1194 if (beg_unchanged + 1 < start) | |
| 1195 return 0; /* Give up if changes go above top of window */ | |
| 1196 | |
| 1197 /* Find position before which nothing is changed. */ | |
| 1198 bp = *compute_motion (start, 0, lmargin, | |
| 371 | 1199 beg_unchanged + 1, height + 1, 0, width, hscroll, |
| 277 | 1200 pos_tab_offset (w, start)); |
| 1201 if (bp.vpos >= height) | |
| 368 | 1202 { |
| 1203 if (point < bp.bufpos && !bp.contin) | |
| 1204 { | |
| 769 | 1205 /* All changes are below the frame, and point is on the frame. |
| 1206 We don't need to change the frame at all. | |
| 368 | 1207 But we need to update window_end_pos to account for |
| 1208 any change in buffer size. */ | |
| 371 | 1209 bp = *compute_motion (start, 0, lmargin, |
| 1210 Z, height, 0, | |
| 1211 width, hscroll, pos_tab_offset (w, start)); | |
| 368 | 1212 XFASTINT (w->window_end_vpos) = height; |
| 1213 XFASTINT (w->window_end_pos) = Z - bp.bufpos; | |
| 1214 return 1; | |
| 1215 } | |
| 1216 return 0; | |
| 1217 } | |
| 277 | 1218 |
| 1219 vpos = bp.vpos; | |
| 1220 | |
| 769 | 1221 /* Find beginning of that frame line. Must display from there. */ |
| 277 | 1222 bp = *vmotion (bp.bufpos, 0, width, hscroll, window); |
| 1223 | |
| 1224 pos = bp.bufpos; | |
| 1225 val.hpos = lmargin; | |
| 1226 if (pos < start) | |
| 1227 return -1; | |
| 1228 | |
| 1229 /* If about to start displaying at the beginning of a continuation line, | |
| 769 | 1230 really start with previous frame line, in case it was not |
| 277 | 1231 continued when last redisplayed */ |
| 528 | 1232 if ((bp.contin && bp.bufpos - 1 == beg_unchanged && vpos > 0) |
| 1233 || | |
| 1234 /* Likewise if we have to worry about selective display. */ | |
| 1235 (XTYPE (current_buffer->selective_display) == Lisp_Int | |
| 1236 && XINT (current_buffer->selective_display) > 0 | |
| 1237 && bp.bufpos - 1 == beg_unchanged && vpos > 0)) | |
| 277 | 1238 { |
| 1239 bp = *vmotion (bp.bufpos, -1, width, hscroll, window); | |
| 1240 --vpos; | |
| 1241 pos = bp.bufpos; | |
| 1242 } | |
| 1243 | |
| 1244 if (bp.contin && bp.hpos != lmargin) | |
| 1245 { | |
| 1246 val.hpos = bp.prevhpos - width + lmargin; | |
| 1247 pos--; | |
| 1248 } | |
| 1249 | |
| 1250 bp.vpos = vpos; | |
| 1251 | |
| 1252 /* Find first visible newline after which no more is changed. */ | |
| 1253 tem = find_next_newline (Z - max (end_unchanged, Z - ZV), 1); | |
| 1254 if (XTYPE (current_buffer->selective_display) == Lisp_Int | |
| 1255 && XINT (current_buffer->selective_display) > 0) | |
| 1256 while (tem < ZV - 1 | |
| 1257 && (position_indentation (tem) | |
| 1258 >= XINT (current_buffer->selective_display))) | |
| 1259 tem = find_next_newline (tem, 1); | |
| 1260 | |
| 1261 /* Compute the cursor position after that newline. */ | |
| 1262 ep = *compute_motion (pos, vpos, val.hpos, tem, | |
| 1263 height, - (1 << (SHORTBITS - 1)), | |
| 1264 width, hscroll, pos_tab_offset (w, bp.bufpos)); | |
| 1265 | |
| 769 | 1266 /* If changes reach past the text available on the frame, |
| 1267 just display rest of frame. */ | |
| 277 | 1268 if (ep.bufpos > Z - XFASTINT (w->window_end_pos)) |
| 1269 stop_vpos = height; | |
| 1270 else | |
| 1271 stop_vpos = ep.vpos; | |
| 1272 | |
| 1273 /* If no newline before ep, the line ep is on includes some changes | |
| 1274 that must be displayed. Make sure we don't stop before it. */ | |
| 1275 /* Also, if changes reach all the way until ep.bufpos, | |
| 1276 it is possible that something was deleted after the | |
| 1277 newline before it, so the following line must be redrawn. */ | |
| 1278 if (stop_vpos == ep.vpos | |
| 1279 && (ep.bufpos == BEGV | |
| 1280 || FETCH_CHAR (ep.bufpos - 1) != '\n' | |
| 1281 || ep.bufpos == Z - end_unchanged)) | |
| 1282 stop_vpos = ep.vpos + 1; | |
| 1283 | |
| 1284 cursor_vpos = -1; | |
| 1285 overlay_arrow_seen = 0; | |
| 1286 | |
| 1287 /* If changes do not reach to bottom of window, | |
| 1288 figure out how much to scroll the rest of the window */ | |
| 1289 if (stop_vpos < height) | |
| 1290 { | |
| 1291 /* Now determine how far up or down the rest of the window has moved */ | |
| 1292 epto = pos_tab_offset (w, ep.bufpos); | |
| 1293 xp = *compute_motion (ep.bufpos, ep.vpos, ep.hpos, | |
| 1294 Z - XFASTINT (w->window_end_pos), | |
| 1295 10000, 0, width, hscroll, epto); | |
| 1296 scroll_amount = xp.vpos - XFASTINT (w->window_end_vpos); | |
| 1297 | |
| 769 | 1298 /* Is everything on frame below the changes whitespace? |
| 277 | 1299 If so, no scrolling is really necessary. */ |
| 1300 for (i = ep.bufpos; i < xp.bufpos; i++) | |
| 1301 { | |
| 1302 tem = FETCH_CHAR (i); | |
| 1303 if (tem != ' ' && tem != '\n' && tem != '\t') | |
| 1304 break; | |
| 1305 } | |
| 1306 if (i == xp.bufpos) | |
| 1307 return -2; | |
| 1308 | |
| 1309 XFASTINT (w->window_end_vpos) += scroll_amount; | |
| 1310 | |
| 769 | 1311 /* Before doing any scrolling, verify that point will be on frame. */ |
| 277 | 1312 if (point > ep.bufpos && !(point <= xp.bufpos && xp.bufpos < height)) |
| 1313 { | |
| 1314 if (point <= xp.bufpos) | |
| 1315 { | |
| 1316 pp = *compute_motion (ep.bufpos, ep.vpos, ep.hpos, | |
| 1317 point, height, - (1 << (SHORTBITS - 1)), | |
| 1318 width, hscroll, epto); | |
| 1319 } | |
| 1320 else | |
| 1321 { | |
| 1322 pp = *compute_motion (xp.bufpos, xp.vpos, xp.hpos, | |
| 1323 point, height, - (1 << (SHORTBITS - 1)), | |
| 1324 width, hscroll, pos_tab_offset (w, xp.bufpos)); | |
| 1325 } | |
| 1326 if (pp.bufpos < point || pp.vpos == height) | |
| 1327 return 0; | |
| 1328 cursor_vpos = pp.vpos + top; | |
| 1329 cursor_hpos = pp.hpos + XFASTINT (w->left); | |
| 1330 } | |
| 1331 | |
| 1332 if (stop_vpos - scroll_amount >= height | |
| 1333 || ep.bufpos == xp.bufpos) | |
| 1334 { | |
| 1335 if (scroll_amount < 0) | |
| 1336 stop_vpos -= scroll_amount; | |
| 1337 scroll_amount = 0; | |
| 1338 /* In this path, we have altered window_end_vpos | |
| 1339 and not left it negative. | |
| 1340 We must make sure that, in case display is preempted | |
| 769 | 1341 before the frame changes to reflect what we do here, |
| 277 | 1342 further updates will not come to try_window_id |
| 769 | 1343 and assume the frame and window_end_vpos match. */ |
| 277 | 1344 blank_end_of_window = 1; |
| 1345 } | |
| 1346 else if (!scroll_amount) | |
| 1347 {} | |
| 1348 else if (bp.bufpos == Z - end_unchanged) | |
| 1349 { | |
| 1350 /* If reprinting everything is nearly as fast as scrolling, | |
| 1351 don't bother scrolling. Can happen if lines are short. */ | |
| 769 | 1352 if (scroll_cost (f, bp.vpos + top - scroll_amount, |
| 277 | 1353 top + height - max (0, scroll_amount), |
| 1354 scroll_amount) | |
| 1355 > xp.bufpos - bp.bufpos - 20) | |
| 1356 /* Return "try normal display with same window-start." | |
| 1357 Too bad we can't prevent further scroll-thinking. */ | |
| 1358 return -2; | |
| 1359 /* If pure deletion, scroll up as many lines as possible. | |
| 1360 In common case of killing a line, this can save the | |
| 1361 following line from being overwritten by scrolling | |
| 1362 and therefore having to be redrawn. */ | |
| 769 | 1363 tem = scroll_frame_lines (f, bp.vpos + top - scroll_amount, |
| 277 | 1364 top + height - max (0, scroll_amount), |
| 1365 scroll_amount); | |
| 1366 if (!tem) stop_vpos = height; | |
| 1367 } | |
| 1368 else if (scroll_amount) | |
| 1369 { | |
| 1370 /* If reprinting everything is nearly as fast as scrolling, | |
| 1371 don't bother scrolling. Can happen if lines are short. */ | |
| 1372 /* Note that if scroll_amount > 0, xp.bufpos - bp.bufpos is an | |
| 1373 overestimate of cost of reprinting, since xp.bufpos | |
| 1374 would end up below the bottom of the window. */ | |
| 769 | 1375 if (scroll_cost (f, ep.vpos + top - scroll_amount, |
| 277 | 1376 top + height - max (0, scroll_amount), |
| 1377 scroll_amount) | |
| 1378 > xp.bufpos - ep.bufpos - 20) | |
| 1379 /* Return "try normal display with same window-start." | |
| 1380 Too bad we can't prevent further scroll-thinking. */ | |
| 1381 return -2; | |
| 769 | 1382 tem = scroll_frame_lines (f, ep.vpos + top - scroll_amount, |
| 277 | 1383 top + height - max (0, scroll_amount), |
| 1384 scroll_amount); | |
| 1385 if (!tem) stop_vpos = height; | |
| 1386 } | |
| 1387 } | |
| 1388 | |
| 1389 /* In any case, do not display past bottom of window */ | |
| 1390 if (stop_vpos >= height) | |
| 1391 { | |
| 1392 stop_vpos = height; | |
| 1393 scroll_amount = 0; | |
| 1394 } | |
| 1395 | |
| 1396 /* Handle case where pos is before w->start -- | |
| 1397 can happen if part of line had been clipped and is not clipped now */ | |
| 1398 if (vpos == 0 && pos < marker_position (w->start)) | |
| 1399 Fset_marker (w->start, make_number (pos), Qnil); | |
| 1400 | |
| 1401 /* Redisplay the lines where the text was changed */ | |
| 1402 last_text_vpos = vpos; | |
| 1403 tab_offset = pos_tab_offset (w, pos); | |
| 1404 /* If we are starting display in mid-character, correct tab_offset | |
| 1405 to account for passing the line that that character really starts in. */ | |
| 1406 if (val.hpos < lmargin) | |
| 1407 tab_offset += width; | |
| 1408 while (vpos < stop_vpos) | |
| 1409 { | |
| 1410 val = *display_text_line (w, pos, top + vpos++, val.hpos, tab_offset); | |
| 1411 tab_offset += width; | |
| 1412 if (val.vpos) tab_offset = 0; | |
| 1413 if (pos != val.bufpos) | |
| 1414 last_text_vpos | |
| 1415 /* Next line, unless prev line ended in end of buffer with no cr */ | |
| 1416 = vpos - (val.vpos && FETCH_CHAR (val.bufpos - 1) != '\n'); | |
| 1417 pos = val.bufpos; | |
| 1418 } | |
| 1419 | |
| 1420 /* There are two cases: | |
| 1421 1) we have displayed down to the bottom of the window | |
| 1422 2) we have scrolled lines below stop_vpos by scroll_amount */ | |
| 1423 | |
| 1424 if (vpos == height) | |
| 1425 { | |
| 1426 /* If last line is continued in middle of character, | |
| 769 | 1427 include the split character in the text considered on the frame */ |
| 277 | 1428 if (val.hpos < lmargin) |
| 1429 val.bufpos++; | |
| 1430 XFASTINT (w->window_end_vpos) = last_text_vpos; | |
| 1431 XFASTINT (w->window_end_pos) = Z - val.bufpos; | |
| 1432 } | |
| 1433 | |
| 1434 /* If scrolling made blank lines at window bottom, | |
| 1435 redisplay to fill those lines */ | |
| 1436 if (scroll_amount < 0) | |
| 1437 { | |
| 1438 /* Don't consider these lines for general-purpose scrolling. | |
| 1439 That will save time in the scrolling computation. */ | |
| 769 | 1440 FRAME_SCROLL_BOTTOM_VPOS (f) = xp.vpos; |
| 277 | 1441 vpos = xp.vpos; |
| 1442 pos = xp.bufpos; | |
| 1443 val.hpos = lmargin; | |
| 1444 if (pos == ZV) | |
| 1445 vpos = height + scroll_amount; | |
| 1446 else if (xp.contin && xp.hpos != lmargin) | |
| 1447 { | |
| 1448 val.hpos = xp.prevhpos - width + lmargin; | |
| 1449 pos--; | |
| 1450 } | |
| 1451 | |
| 1452 blank_end_of_window = 1; | |
| 1453 tab_offset = pos_tab_offset (w, pos); | |
| 1454 /* If we are starting display in mid-character, correct tab_offset | |
| 1455 to account for passing the line that that character starts in. */ | |
| 1456 if (val.hpos < lmargin) | |
| 1457 tab_offset += width; | |
| 1458 | |
| 1459 while (vpos < height) | |
| 1460 { | |
| 1461 val = *display_text_line (w, pos, top + vpos++, val.hpos, tab_offset); | |
| 1462 tab_offset += width; | |
| 1463 if (val.vpos) tab_offset = 0; | |
| 1464 pos = val.bufpos; | |
| 1465 } | |
| 1466 | |
| 1467 /* Here is a case where display_text_line sets cursor_vpos wrong. | |
| 1468 Make it be fixed up, below. */ | |
| 1469 if (xp.bufpos == ZV | |
| 1470 && xp.bufpos == point) | |
| 1471 cursor_vpos = -1; | |
| 1472 } | |
| 1473 | |
| 769 | 1474 /* If bottom just moved off end of frame, change mode line percentage. */ |
| 277 | 1475 if (XFASTINT (w->window_end_pos) == 0 |
| 1476 && Z != val.bufpos) | |
| 1477 w->update_mode_line = Qt; | |
| 1478 | |
| 1479 /* Attempt to adjust end-of-text positions to new bottom line */ | |
| 1480 if (scroll_amount) | |
| 1481 { | |
| 1482 delta = height - xp.vpos; | |
| 1483 if (delta < 0 | |
| 1484 || (delta > 0 && xp.bufpos <= ZV) | |
| 1485 || (delta == 0 && xp.hpos)) | |
| 1486 { | |
| 1487 val = *vmotion (Z - XFASTINT (w->window_end_pos), | |
| 1488 delta, width, hscroll, window); | |
| 1489 XFASTINT (w->window_end_pos) = Z - val.bufpos; | |
| 1490 XFASTINT (w->window_end_vpos) += val.vpos; | |
| 1491 } | |
| 1492 } | |
| 1493 | |
| 1494 w->window_end_valid = Qnil; | |
| 1495 | |
| 1496 /* If point was not in a line that was displayed, find it */ | |
| 1497 if (cursor_vpos < 0) | |
| 1498 { | |
| 1499 val = *compute_motion (start, 0, lmargin, point, 10000, 10000, | |
| 1500 width, hscroll, pos_tab_offset (w, start)); | |
| 769 | 1501 /* Admit failure if point is off frame now */ |
| 277 | 1502 if (val.vpos >= height) |
| 1503 { | |
| 1504 for (vpos = 0; vpos < height; vpos++) | |
| 769 | 1505 cancel_line (vpos + top, f); |
| 277 | 1506 return 0; |
| 1507 } | |
| 1508 cursor_vpos = val.vpos + top; | |
| 1509 cursor_hpos = val.hpos + XFASTINT (w->left); | |
| 1510 } | |
| 1511 | |
| 769 | 1512 FRAME_CURSOR_X (f) = max (0, cursor_hpos); |
| 1513 FRAME_CURSOR_Y (f) = cursor_vpos; | |
| 277 | 1514 |
| 1515 if (debug_end_pos) | |
| 1516 { | |
| 1517 val = *compute_motion (start, 0, lmargin, ZV, | |
| 1518 height, - (1 << (SHORTBITS - 1)), | |
| 1519 width, hscroll, pos_tab_offset (w, start)); | |
| 1520 if (val.vpos != XFASTINT (w->window_end_vpos)) | |
| 1521 abort (); | |
| 1522 if (XFASTINT (w->window_end_pos) | |
| 1523 != Z - val.bufpos) | |
| 1524 abort (); | |
| 1525 } | |
| 1526 | |
| 1527 return 1; | |
| 1528 } | |
| 1529 | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1530 /* Mark a section of BUF as modified, but only for the sake of redisplay. |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1531 This is useful for recording changes to overlays. |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1532 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1533 We increment the buffer's modification timestamp and set the |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1534 redisplay caches (windows_or_buffers_changed, beg_unchanged, etc) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1535 as if the region of text between START and END had been modified; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1536 the redisplay code will check this against the windows' timestamps, |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1537 and redraw the appropriate area of the buffer. |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1538 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1539 However, if the buffer is unmodified, we bump the last-save |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1540 timestamp as well, so that incrementing the timestamp doesn't fool |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1541 Emacs into thinking that the buffer's text has been modified. |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1542 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1543 Tweaking the timestamps shouldn't hurt the first-modification |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1544 timestamps recorded in the undo records; those values aren't |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1545 written until just before a real text modification is made, so they |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1546 will never catch the timestamp value just before this function gets |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1547 called. */ |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1548 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1549 void |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1550 redisplay_region (buf, start, end) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1551 struct buffer *buf; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1552 int start, end; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1553 { |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1554 if (start == end) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1555 return; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1556 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1557 if (start > end) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1558 { |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1559 int temp = start; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1560 start = end; end = temp; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1561 } |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1562 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1563 if (buf != current_buffer) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1564 windows_or_buffers_changed = 1; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1565 else |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1566 { |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1567 if (unchanged_modified == MODIFF) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1568 { |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1569 beg_unchanged = start - BEG; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1570 end_unchanged = Z - end; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1571 } |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1572 else |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1573 { |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1574 if (Z - end < end_unchanged) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1575 end_unchanged = Z - end; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1576 if (start - BEG < beg_unchanged) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1577 beg_unchanged = start - BEG; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1578 } |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1579 } |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1580 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1581 /* Increment the buffer's time stamp, but also increment the save |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1582 and autosave timestamps, so as not to screw up that timekeeping. */ |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1583 if (BUF_MODIFF (buf) == buf->save_modified) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1584 buf->save_modified++; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1585 if (BUF_MODIFF (buf) == buf->auto_save_modified) |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1586 buf->auto_save_modified++; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1587 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1588 BUF_MODIFF (buf) ++; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1589 } |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1590 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1591 |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1592 /* Copy glyphs from the vector FROM to the rope T. |
| 301 | 1593 But don't actually copy the parts that would come in before S. |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1594 Value is T, advanced past the copied data. */ |
| 277 | 1595 |
| 1596 GLYPH * | |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1597 copy_rope (t, s, from, face) |
| 277 | 1598 register GLYPH *t; /* Copy to here. */ |
| 1599 register GLYPH *s; /* Starting point. */ | |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1600 Lisp_Object from; /* Data to copy; known to be a vector. */ |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1601 int face; /* Face to apply to glyphs which don't specify one. */ |
| 277 | 1602 { |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1603 register int n = XVECTOR (from)->size; |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1604 register Lisp_Object *f = XVECTOR (from)->contents; |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1605 |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1606 while (n--) |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1607 { |
|
3689
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1608 int glyph = XFASTINT (*f); |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1609 |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1610 if (t >= s) *t = MAKE_GLYPH (GLYPH_CHAR (glyph), |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1611 (GLYPH_FACE (glyph) |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1612 ? GLYPH_FACE (glyph) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1613 : face)); |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1614 ++t; |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1615 ++f; |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1616 } |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1617 return t; |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1618 } |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1619 |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1620 /* Copy exactly LEN glyphs from FROM into data at T. |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1621 But don't alter words before S. */ |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1622 |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1623 GLYPH * |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1624 copy_part_of_rope (t, s, from, len, face) |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1625 register GLYPH *t; /* Copy to here. */ |
|
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1626 register GLYPH *s; /* Starting point. */ |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1627 Lisp_Object *from; /* Data to copy. */ |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1628 int len; |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1629 int face; /* Face to apply to glyphs which don't specify one. */ |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1630 { |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1631 int n = len; |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1632 register Lisp_Object *f = from; |
| 277 | 1633 |
| 1634 while (n--) | |
| 1635 { | |
|
3689
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1636 int glyph = XFASTINT (*f); |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1637 |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1638 if (t >= s) *t = MAKE_GLYPH (GLYPH_CHAR (glyph), |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1639 (GLYPH_FACE (glyph) |
|
82856e3ea14d
(echo_area_display): Use XFASTINT on ->height.
Richard M. Stallman <rms@gnu.org>
parents:
3648
diff
changeset
|
1640 ? GLYPH_FACE (glyph) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1641 : face)); |
| 277 | 1642 ++t; |
| 1643 ++f; | |
| 1644 } | |
| 1645 return t; | |
| 1646 } | |
| 1647 | |
| 1648 /* Display one line of window w, starting at position START in W's buffer. | |
| 1649 Display starting at horizontal position HPOS, which is normally zero | |
| 1650 or negative. A negative value causes output up to hpos = 0 to be discarded. | |
| 1651 This is done for negative hscroll, or when this is a continuation line | |
| 1652 and the continuation occurred in the middle of a multi-column character. | |
| 1653 | |
| 1654 TABOFFSET is an offset for ostensible hpos, used in tab stop calculations. | |
| 1655 | |
| 769 | 1656 Display on position VPOS on the frame. (origin 0). |
| 277 | 1657 |
| 1658 Returns a STRUCT POSITION giving character to start next line with | |
| 1659 and where to display it, including a zero or negative hpos. | |
| 1660 The vpos field is not really a vpos; it is 1 unless the line is continued */ | |
| 1661 | |
| 1662 struct position val_display_text_line; | |
| 1663 | |
| 1664 static struct position * | |
| 1665 display_text_line (w, start, vpos, hpos, taboffset) | |
| 1666 struct window *w; | |
| 1667 int start; | |
| 1668 int vpos; | |
| 1669 int hpos; | |
| 1670 int taboffset; | |
| 1671 { | |
| 1672 register int pos = start; | |
| 1673 register int c; | |
| 1674 register GLYPH *p1; | |
| 1675 int end; | |
| 1676 register int pause; | |
| 1677 register unsigned char *p; | |
| 1678 GLYPH *endp; | |
| 1679 register GLYPH *startp; | |
|
3586
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1680 register GLYPH *p1prev = 0; |
| 769 | 1681 FRAME_PTR f = XFRAME (w->frame); |
| 277 | 1682 int tab_width = XINT (current_buffer->tab_width); |
| 485 | 1683 int ctl_arrow = !NILP (current_buffer->ctl_arrow); |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
1684 int width = window_internal_width (w) - 1; |
| 277 | 1685 struct position val; |
| 1686 int lastpos; | |
| 1687 int invis; | |
| 1688 int hscroll = XINT (w->hscroll); | |
| 1689 int truncate = hscroll | |
| 1690 || (truncate_partial_width_windows | |
| 769 | 1691 && XFASTINT (w->width) < FRAME_WIDTH (f)) |
| 485 | 1692 || !NILP (current_buffer->truncate_lines); |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1693 |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1694 /* 1 if we should highlight the region. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1695 int highlight_region |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1696 = !NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active); |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1697 int region_beg, region_end; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1698 |
| 277 | 1699 int selective |
| 1700 = XTYPE (current_buffer->selective_display) == Lisp_Int | |
| 1701 ? XINT (current_buffer->selective_display) | |
| 485 | 1702 : !NILP (current_buffer->selective_display) ? -1 : 0; |
| 769 | 1703 register struct frame_glyphs *desired_glyphs = FRAME_DESIRED_GLYPHS (f); |
| 277 | 1704 register struct Lisp_Vector *dp = window_display_table (w); |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1705 |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1706 Lisp_Object default_invis_vector[3]; |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1707 /* Nonzero means display something where there are invisible lines. |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1708 The precise value is the number of glyphs to display. */ |
| 277 | 1709 int selective_rlen |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1710 = (selective && dp && XTYPE (DISP_INVIS_VECTOR (dp)) == Lisp_Vector |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1711 ? XVECTOR (DISP_INVIS_VECTOR (dp))->size |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1712 : selective && !NILP (current_buffer->selective_display_ellipses) |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1713 ? 3 : 0); |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1714 /* This is the sequence of Lisp objects to display |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1715 when there are invisible lines. */ |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1716 Lisp_Object *invis_vector_contents |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1717 = (dp && XTYPE (DISP_INVIS_VECTOR (dp)) == Lisp_Vector |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1718 ? XVECTOR (DISP_INVIS_VECTOR (dp))->contents |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1719 : default_invis_vector); |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1720 |
| 277 | 1721 GLYPH truncator = (dp == 0 || XTYPE (DISP_TRUNC_GLYPH (dp)) != Lisp_Int |
| 1722 ? '$' : XINT (DISP_TRUNC_GLYPH (dp))); | |
| 1723 GLYPH continuer = (dp == 0 || XTYPE (DISP_CONTINUE_GLYPH (dp)) != Lisp_Int | |
| 1724 ? '\\' : XINT (DISP_CONTINUE_GLYPH (dp))); | |
| 1725 | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1726 /* The next buffer location at which the face should change, due |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1727 to overlays or text property changes. */ |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1728 int next_face_change; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1729 |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1730 #ifdef USE_TEXT_PROPERTIES |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1731 /* The next location where the `invisible' property changes */ |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1732 int next_invisible; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1733 Lisp_Object prop, position, endpos; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1734 #endif |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1735 |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1736 /* The face we're currently using. */ |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1737 int current_face = 0; |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1738 |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1739 XFASTINT (default_invis_vector[2]) = '.'; |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1740 default_invis_vector[0] = default_invis_vector[1] = default_invis_vector[2]; |
|
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1741 |
| 277 | 1742 hpos += XFASTINT (w->left); |
| 769 | 1743 get_display_line (f, vpos, XFASTINT (w->left)); |
|
2324
24cd3df6f184
(display_string, display_text_line): Allow tab_width up to 1000.
Richard M. Stallman <rms@gnu.org>
parents:
2303
diff
changeset
|
1744 if (tab_width <= 0 || tab_width > 1000) tab_width = 8; |
| 277 | 1745 |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1746 /* Show where to highlight the region. */ |
|
2965
5314fdcd87bc
(display_text_line): Highlight in any frame's sel window.
Richard M. Stallman <rms@gnu.org>
parents:
2929
diff
changeset
|
1747 if (highlight_region && XMARKER (current_buffer->mark)->buffer != 0 |
|
3265
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
1748 /* Maybe highlight only in selected window. */ |
|
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
1749 && (highlight_nonselected_windows |
|
3266
1173bc4814da
(display_text_line): Really check for just the selected window.
Richard M. Stallman <rms@gnu.org>
parents:
3265
diff
changeset
|
1750 || w == XWINDOW (selected_window))) |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1751 { |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1752 region_beg = marker_position (current_buffer->mark); |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1753 if (PT < region_beg) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1754 { |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1755 region_end = region_beg; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1756 region_beg = PT; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1757 } |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1758 else |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1759 region_end = PT; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1760 w->region_showing = Qt; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1761 } |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1762 else |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1763 region_beg = region_end = -1; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1764 |
| 277 | 1765 if (MINI_WINDOW_P (w) && start == 1 |
| 1766 && vpos == XFASTINT (w->top)) | |
| 1767 { | |
| 1768 if (minibuf_prompt) | |
| 1769 hpos = display_string (w, vpos, minibuf_prompt, hpos, | |
| 1770 (!truncate ? continuer : truncator), | |
| 1771 -1, -1); | |
| 1772 minibuf_prompt_width = hpos; | |
| 1773 } | |
| 1774 | |
| 1775 desired_glyphs->bufp[vpos] = pos; | |
| 1776 p1 = desired_glyphs->glyphs[vpos] + hpos; | |
| 1777 end = ZV; | |
| 1778 startp = desired_glyphs->glyphs[vpos] + XFASTINT (w->left); | |
| 1779 endp = startp + width; | |
| 1780 | |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1781 /* Arrange the overlays nicely for our purposes. Usually, we call |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1782 display_text_line on only one line at a time, in which case this |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1783 can't really hurt too much, or we call it on lines which appear |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1784 one after another in the buffer, in which case all calls to |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1785 recenter_overlay_lists but the first will be pretty cheap. */ |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1786 recenter_overlay_lists (current_buffer, pos); |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1787 |
| 277 | 1788 /* Loop generating characters. |
| 1789 Stop at end of buffer, before newline, | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1790 if reach or pass continuation column, |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1791 or at face change. */ |
| 277 | 1792 pause = pos; |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1793 next_face_change = pos; |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1794 #ifdef USE_TEXT_PROPERTIES |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1795 next_invisible = pos; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1796 #endif |
| 277 | 1797 while (p1 < endp) |
| 1798 { | |
| 1799 p1prev = p1; | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1800 if (pos >= pause) |
| 277 | 1801 { |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1802 /* Did we hit the end of the visible region of the buffer? |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1803 Stop here. */ |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1804 if (pos >= end) |
| 277 | 1805 break; |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1806 |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1807 /* Did we reach point? Record the cursor location. */ |
| 277 | 1808 if (pos == point && cursor_vpos < 0) |
| 1809 { | |
| 1810 cursor_vpos = vpos; | |
| 1811 cursor_hpos = p1 - startp; | |
| 1812 } | |
| 1813 | |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1814 #ifdef USE_TEXT_PROPERTIES |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1815 /* if the `invisible' property is set to t, we can skip to |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1816 the next property change */ |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1817 while (pos == next_invisible && pos < end) |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1818 { |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1819 XFASTINT (position) = pos; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1820 prop = Fget_text_property (position, |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1821 Qinvisible, |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1822 Fcurrent_buffer ()); |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1823 endpos = Fnext_single_property_change (position, |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1824 Qinvisible, |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1825 Fcurrent_buffer ()); |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1826 if (INTEGERP (endpos)) |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1827 next_invisible = XINT (endpos); |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1828 else |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1829 next_invisible = end; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1830 if (! NILP (prop)) |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1831 { |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1832 if (pos < point && next_invisible >= point) |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1833 { |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1834 cursor_vpos = vpos; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1835 cursor_hpos = p1 - startp; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1836 } |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1837 pos = next_invisible; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1838 } |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1839 } |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1840 if (pos >= end) |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1841 break; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1842 #endif |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1843 |
|
2742
7800e6a86421
* xdisp.c (display_text_line): Make face-handling code conditional
Jim Blandy <jimb@redhat.com>
parents:
2729
diff
changeset
|
1844 #ifdef HAVE_X_WINDOWS |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1845 /* Did we hit a face change? Figure out what face we should |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1846 use now. We also hit this the first time through the |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1847 loop, to see what face we should start with. */ |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1848 if (pos >= next_face_change && FRAME_X_P (f)) |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1849 current_face = compute_char_face (f, w, pos, |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1850 region_beg, region_end, |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
1851 &next_face_change); |
|
2742
7800e6a86421
* xdisp.c (display_text_line): Make face-handling code conditional
Jim Blandy <jimb@redhat.com>
parents:
2729
diff
changeset
|
1852 #endif |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1853 |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1854 pause = end; |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1855 |
|
4386
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1856 #ifdef USE_TEXT_PROPERTIES |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1857 if (pos < next_invisible && next_invisible < pause) |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1858 pause = next_invisible; |
|
abd79e187610
(try_window): Handle invisible newline at end of buffer.
Richard M. Stallman <rms@gnu.org>
parents:
3937
diff
changeset
|
1859 #endif |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1860 if (pos < next_face_change && next_face_change < pause) |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1861 pause = next_face_change; |
|
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1862 |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1863 /* Wouldn't you hate to read the next line to someone over |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1864 the phone? */ |
| 277 | 1865 if (pos < point && point < pause) |
| 1866 pause = point; | |
| 1867 if (pos < GPT && GPT < pause) | |
| 1868 pause = GPT; | |
| 1869 | |
| 1870 p = &FETCH_CHAR (pos); | |
| 1871 } | |
| 1872 c = *p++; | |
| 1873 if (c >= 040 && c < 0177 | |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1874 && (dp == 0 || XTYPE (DISP_CHAR_VECTOR (dp, c)) != Lisp_Vector)) |
| 277 | 1875 { |
| 1876 if (p1 >= startp) | |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1877 *p1 = MAKE_GLYPH (c, current_face); |
| 277 | 1878 p1++; |
| 1879 } | |
| 1880 else if (c == '\n') | |
| 1881 { | |
| 1882 invis = 0; | |
| 1883 while (pos < end | |
| 1884 && selective > 0 | |
| 1885 && position_indentation (pos + 1) >= selective) | |
| 1886 { | |
| 1887 invis = 1; | |
| 1888 pos = find_next_newline (pos + 1, 1); | |
| 1889 if (FETCH_CHAR (pos - 1) == '\n') | |
| 1890 pos--; | |
| 1891 } | |
| 1892 if (invis && selective_rlen > 0 && p1 >= startp) | |
| 1893 { | |
| 1894 p1 += selective_rlen; | |
| 1895 if (p1 - startp > width) | |
| 1896 p1 = endp; | |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1897 copy_part_of_rope (p1prev, p1prev, invis_vector_contents, |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1898 (p1 - p1prev), current_face); |
| 277 | 1899 } |
|
2884
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1900 #if 1 |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1901 /* Draw the face of the newline character as extending all the |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1902 way to the end of the frame line. */ |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1903 if (current_face) |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1904 while (p1 < endp) |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1905 *p1++ = MAKE_GLYPH (' ', current_face); |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1906 #endif |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1907 break; |
| 277 | 1908 } |
| 1909 else if (c == '\t') | |
| 1910 { | |
| 1911 do | |
| 1912 { | |
| 1913 if (p1 >= startp && p1 < endp) | |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1914 *p1 = MAKE_GLYPH (' ', current_face); |
| 277 | 1915 p1++; |
| 1916 } | |
| 1917 while ((p1 - startp + taboffset + hscroll - (hscroll > 0)) | |
| 1918 % tab_width); | |
| 1919 } | |
| 368 | 1920 else if (c == Ctl ('M') && selective == -1) |
| 277 | 1921 { |
| 1922 pos = find_next_newline (pos, 1); | |
| 1923 if (FETCH_CHAR (pos - 1) == '\n') | |
| 1924 pos--; | |
| 1925 if (selective_rlen > 0) | |
| 1926 { | |
| 1927 p1 += selective_rlen; | |
| 1928 if (p1 - startp > width) | |
| 1929 p1 = endp; | |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1930 copy_part_of_rope (p1prev, p1prev, invis_vector_contents, |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1931 (p1 - p1prev), current_face); |
| 277 | 1932 } |
|
2884
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1933 #if 1 |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1934 /* Draw the face of the newline character as extending all the |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1935 way to the end of the frame line. */ |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1936 if (current_face) |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1937 while (p1 < endp) |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1938 *p1++ = MAKE_GLYPH (' ', current_face); |
|
e52ea063421a
* xdisp.c (display_text_line): If the newline (or C-m, in
Jim Blandy <jimb@redhat.com>
parents:
2874
diff
changeset
|
1939 #endif |
|
2754
af06c054b48f
(display_text_line): Use break; to exit loop at eol.
Richard M. Stallman <rms@gnu.org>
parents:
2742
diff
changeset
|
1940 break; |
| 277 | 1941 } |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
1942 else if (dp != 0 && XTYPE (DISP_CHAR_VECTOR (dp, c)) == Lisp_Vector) |
| 277 | 1943 { |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1944 p1 = copy_rope (p1, startp, DISP_CHAR_VECTOR (dp, c), current_face); |
| 277 | 1945 } |
| 1946 else if (c < 0200 && ctl_arrow) | |
| 1947 { | |
| 1948 if (p1 >= startp) | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1949 *p1 = MAKE_GLYPH ((dp && XTYPE (DISP_CTRL_GLYPH (dp)) == Lisp_Int |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1950 ? XINT (DISP_CTRL_GLYPH (dp)) : '^'), |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1951 current_face); |
| 277 | 1952 p1++; |
| 368 | 1953 if (p1 >= startp && p1 < endp) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1954 *p1 = MAKE_GLYPH (c ^ 0100, current_face); |
| 277 | 1955 p1++; |
| 1956 } | |
| 1957 else | |
| 1958 { | |
| 1959 if (p1 >= startp) | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1960 *p1 = MAKE_GLYPH ((dp && XTYPE (DISP_ESCAPE_GLYPH (dp)) == Lisp_Int |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1961 ? XINT (DISP_ESCAPE_GLYPH (dp)) : '\\'), |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1962 current_face); |
| 277 | 1963 p1++; |
| 368 | 1964 if (p1 >= startp && p1 < endp) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1965 *p1 = MAKE_GLYPH ((c >> 6) + '0', current_face); |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1966 p1++; |
|
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1967 if (p1 >= startp && p1 < endp) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1968 *p1 = MAKE_GLYPH ((7 & (c >> 3)) + '0', current_face); |
| 277 | 1969 p1++; |
| 368 | 1970 if (p1 >= startp && p1 < endp) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
1971 *p1 = MAKE_GLYPH ((7 & c) + '0', current_face); |
| 277 | 1972 p1++; |
| 1973 } | |
|
2729
76afd3322533
Arrange to tell redisplay about changes in overlays.
Jim Blandy <jimb@redhat.com>
parents:
2526
diff
changeset
|
1974 |
| 277 | 1975 pos++; |
| 1976 } | |
| 1977 | |
| 1978 val.hpos = - XINT (w->hscroll); | |
| 1979 if (val.hpos) | |
| 1980 val.hpos++; | |
| 1981 | |
| 1982 val.vpos = 1; | |
| 1983 | |
| 1984 lastpos = pos; | |
| 1985 | |
| 1986 /* Handle continuation in middle of a character */ | |
| 1987 /* by backing up over it */ | |
| 1988 if (p1 > endp) | |
| 1989 { | |
|
3586
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1990 /* Don't back up if we never actually displayed any text. |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1991 This occurs when the minibuffer prompt takes up the whole line. */ |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1992 if (p1prev) |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1993 { |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1994 /* Start the next line with that same character */ |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1995 pos--; |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1996 /* but at negative hpos, to skip the columns output on this line. */ |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1997 val.hpos += p1prev - endp; |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1998 } |
|
7d077274d4bb
* xdisp.c (display_text_line): Handle case where line ends in a
Jim Blandy <jimb@redhat.com>
parents:
3516
diff
changeset
|
1999 |
| 277 | 2000 /* Keep in this line everything up to the continuation column. */ |
| 2001 p1 = endp; | |
| 2002 } | |
| 2003 | |
| 2004 /* Finish deciding which character to start the next line on, | |
| 2005 and what hpos to start it at. | |
| 2006 Also set `lastpos' to the last position which counts as "on this line" | |
| 2007 for cursor-positioning. */ | |
| 2008 | |
| 2009 if (pos < ZV) | |
| 2010 { | |
| 2011 if (FETCH_CHAR (pos) == '\n') | |
| 2012 /* If stopped due to a newline, start next line after it */ | |
| 2013 pos++; | |
| 2014 else | |
| 2015 /* Stopped due to right margin of window */ | |
| 2016 { | |
| 2017 if (truncate) | |
| 2018 { | |
| 2019 *p1++ = truncator; | |
| 2020 /* Truncating => start next line after next newline, | |
| 2021 and point is on this line if it is before the newline, | |
| 2022 and skip none of first char of next line */ | |
| 2023 pos = find_next_newline (pos, 1); | |
| 2024 val.hpos = XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0; | |
| 2025 | |
| 2026 lastpos = pos - (FETCH_CHAR (pos - 1) == '\n'); | |
| 2027 } | |
| 2028 else | |
| 2029 { | |
| 2030 *p1++ = continuer; | |
| 2031 val.vpos = 0; | |
| 2032 lastpos--; | |
| 2033 } | |
| 2034 } | |
| 2035 } | |
| 2036 | |
| 2037 /* If point is at eol or in invisible text at eol, | |
| 769 | 2038 record its frame location now. */ |
| 277 | 2039 |
| 2040 if (start <= point && point <= lastpos && cursor_vpos < 0) | |
| 2041 { | |
| 2042 cursor_vpos = vpos; | |
| 2043 cursor_hpos = p1 - startp; | |
| 2044 } | |
| 2045 | |
| 2046 if (cursor_vpos == vpos) | |
| 2047 { | |
| 2048 if (cursor_hpos < 0) cursor_hpos = 0; | |
| 2049 if (cursor_hpos > width) cursor_hpos = width; | |
| 2050 cursor_hpos += XFASTINT (w->left); | |
| 769 | 2051 if (w == XWINDOW (FRAME_SELECTED_WINDOW (f))) |
| 277 | 2052 { |
| 769 | 2053 FRAME_CURSOR_Y (f) = cursor_vpos; |
| 2054 FRAME_CURSOR_X (f) = cursor_hpos; | |
| 277 | 2055 |
| 2056 if (w == XWINDOW (selected_window)) | |
| 2057 { | |
| 2058 /* Line is not continued and did not start | |
| 2059 in middle of character */ | |
| 2060 if ((hpos - XFASTINT (w->left) | |
| 2061 == (XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0)) | |
| 2062 && val.vpos) | |
| 2063 { | |
| 2064 this_line_bufpos = start; | |
| 2065 this_line_buffer = current_buffer; | |
| 2066 this_line_vpos = cursor_vpos; | |
| 2067 this_line_start_hpos = hpos; | |
| 2068 this_line_endpos = Z - lastpos; | |
| 2069 } | |
| 2070 else | |
| 2071 this_line_bufpos = 0; | |
| 2072 } | |
| 2073 } | |
| 2074 } | |
| 2075 | |
| 2076 /* If hscroll and line not empty, insert truncation-at-left marker */ | |
| 2077 if (hscroll && lastpos != start) | |
| 2078 { | |
| 2079 *startp = truncator; | |
| 2080 if (p1 <= startp) | |
| 2081 p1 = startp + 1; | |
| 2082 } | |
| 2083 | |
| 769 | 2084 if (XFASTINT (w->width) + XFASTINT (w->left) != FRAME_WIDTH (f)) |
| 277 | 2085 { |
| 2086 endp++; | |
| 2087 if (p1 < startp) p1 = startp; | |
| 2088 while (p1 < endp) *p1++ = SPACEGLYPH; | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2089 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
2090 /* Don't draw vertical bars if we're using scroll bars. They're |
|
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
2091 covered up by the scroll bars, and it's distracting to see |
|
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
2092 them when the scroll bar windows are flickering around to be |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2093 reconfigured. */ |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
2094 *p1++ = (FRAME_HAS_VERTICAL_SCROLL_BARS (f) |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2095 ? ' ' : '|'); |
| 277 | 2096 } |
| 2097 desired_glyphs->used[vpos] = max (desired_glyphs->used[vpos], | |
| 2098 p1 - desired_glyphs->glyphs[vpos]); | |
| 2099 desired_glyphs->glyphs[vpos][desired_glyphs->used[vpos]] = 0; | |
| 2100 | |
| 2101 /* If the start of this line is the overlay arrow-position, | |
| 2102 then put the arrow string into the display-line. */ | |
| 2103 | |
| 2104 if (XTYPE (Voverlay_arrow_position) == Lisp_Marker | |
| 2105 && current_buffer == XMARKER (Voverlay_arrow_position)->buffer | |
| 2106 && start == marker_position (Voverlay_arrow_position) | |
| 2107 && XTYPE (Voverlay_arrow_string) == Lisp_String | |
| 2108 && ! overlay_arrow_seen) | |
| 2109 { | |
| 2110 unsigned char *p = XSTRING (Voverlay_arrow_string)->data; | |
| 2111 int i; | |
| 2112 int len = XSTRING (Voverlay_arrow_string)->size; | |
|
3726
33e82e88a210
* xdisp.c (display_text_line): Use temporary variable.
Jim Blandy <jimb@redhat.com>
parents:
3689
diff
changeset
|
2113 int arrow_end; |
| 277 | 2114 |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2115 if (len > width) |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2116 len = width; |
| 277 | 2117 for (i = 0; i < len; i++) |
| 2118 startp[i] = p[i]; | |
|
3726
33e82e88a210
* xdisp.c (display_text_line): Use temporary variable.
Jim Blandy <jimb@redhat.com>
parents:
3689
diff
changeset
|
2119 |
|
33e82e88a210
* xdisp.c (display_text_line): Use temporary variable.
Jim Blandy <jimb@redhat.com>
parents:
3689
diff
changeset
|
2120 /* Bug in SunOS 4.1.1 compiler requires this intermediate variable. */ |
|
33e82e88a210
* xdisp.c (display_text_line): Use temporary variable.
Jim Blandy <jimb@redhat.com>
parents:
3689
diff
changeset
|
2121 arrow_end = (startp - desired_glyphs->glyphs[vpos]) + len; |
|
33e82e88a210
* xdisp.c (display_text_line): Use temporary variable.
Jim Blandy <jimb@redhat.com>
parents:
3689
diff
changeset
|
2122 if (desired_glyphs->used[vpos] < arrow_end) |
|
33e82e88a210
* xdisp.c (display_text_line): Use temporary variable.
Jim Blandy <jimb@redhat.com>
parents:
3689
diff
changeset
|
2123 desired_glyphs->used[vpos] = arrow_end; |
| 277 | 2124 |
| 2125 overlay_arrow_seen = 1; | |
| 2126 } | |
| 2127 | |
| 2128 val.bufpos = pos; | |
| 2129 val_display_text_line = val; | |
| 2130 return &val_display_text_line; | |
| 2131 } | |
| 2132 | |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2133 /* Redisplay the menu bar in the frame for window W. */ |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2134 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2135 static void |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2136 display_menu_bar (w) |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2137 struct window *w; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2138 { |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2139 Lisp_Object items, tail; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2140 register int vpos = 0; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2141 register FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2142 int maxendcol = FRAME_WIDTH (f); |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2143 int hpos = 0; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2144 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2145 if (FRAME_MENU_BAR_LINES (f) <= 0) |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2146 return; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2147 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2148 get_display_line (f, vpos, 0); |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2149 |
|
2848
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2150 /* If the user has switched buffers or windows, we need to |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2151 recompute to reflect the new bindings. But we'll |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2152 recompute when update_mode_lines is set too; that means |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2153 that people can use force-mode-line-update to request |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2154 that the menu bar be recomputed. The adverse effect on |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2155 the rest of the redisplay algorithm is about the same as |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2156 windows_or_buffers_changed anyway. */ |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2157 if (windows_or_buffers_changed |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2158 || update_mode_lines |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2159 || (XFASTINT (w->last_modified) < MODIFF |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2160 && (XFASTINT (w->last_modified) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2161 <= XBUFFER (w->buffer)->save_modified))) |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2162 { |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2163 struct buffer *prev = current_buffer; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2164 current_buffer = XBUFFER (w->buffer); |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2165 FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (); |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2166 current_buffer = prev; |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2167 } |
|
3bcbd1795280
(mark_window_display_accurate): Set region_showing fields.
Richard M. Stallman <rms@gnu.org>
parents:
2766
diff
changeset
|
2168 |
|
2189
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2169 for (tail = FRAME_MENU_BAR_ITEMS (f); CONSP (tail); tail = XCONS (tail)->cdr) |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2170 { |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2171 Lisp_Object string; |
|
2189
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2172 |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2173 string = XCONS (XCONS (XCONS (tail)->car)->cdr)->car; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2174 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2175 /* Record in each item its hpos. */ |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2176 XFASTINT (XCONS (XCONS (XCONS (tail)->car)->cdr)->cdr) = hpos; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2177 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2178 if (hpos < maxendcol) |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2179 hpos = display_string (XWINDOW (FRAME_ROOT_WINDOW (f)), vpos, |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2180 XSTRING (string)->data, |
|
2189
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2181 hpos, 0, hpos, maxendcol); |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2182 /* Put a gap of 3 spaces between items. */ |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2183 if (hpos < maxendcol) |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2184 { |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2185 int hpos1 = hpos + 3; |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2186 hpos = display_string (w, vpos, "", hpos, 0, |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2187 min (hpos1, maxendcol), maxendcol); |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2188 } |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2189 } |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2190 |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2191 FRAME_DESIRED_GLYPHS (f)->bufp[vpos] = 0; |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2192 FRAME_DESIRED_GLYPHS (f)->highlight[vpos] = mode_line_inverse_video; |
|
2189
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2193 |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2194 /* Fill out the line with spaces. */ |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2195 if (maxendcol > hpos) |
|
cb92d253a599
(display_menu_bar): Assume FRAME_MENU_BAR_ITEMS already set.
Richard M. Stallman <rms@gnu.org>
parents:
2150
diff
changeset
|
2196 hpos = display_string (w, vpos, "", hpos, 0, maxendcol, -1); |
|
4423
53f7c5b30816
* xdisp.c (display_menu_bar): Redisplay all lines occupied by the
Jim Blandy <jimb@redhat.com>
parents:
4386
diff
changeset
|
2197 |
|
53f7c5b30816
* xdisp.c (display_menu_bar): Redisplay all lines occupied by the
Jim Blandy <jimb@redhat.com>
parents:
4386
diff
changeset
|
2198 /* Clear the rest of the lines allocated to the menu bar. */ |
|
53f7c5b30816
* xdisp.c (display_menu_bar): Redisplay all lines occupied by the
Jim Blandy <jimb@redhat.com>
parents:
4386
diff
changeset
|
2199 vpos++; |
|
53f7c5b30816
* xdisp.c (display_menu_bar): Redisplay all lines occupied by the
Jim Blandy <jimb@redhat.com>
parents:
4386
diff
changeset
|
2200 while (vpos < FRAME_MENU_BAR_LINES (f)) |
|
53f7c5b30816
* xdisp.c (display_menu_bar): Redisplay all lines occupied by the
Jim Blandy <jimb@redhat.com>
parents:
4386
diff
changeset
|
2201 get_display_line (f, vpos++, 0); |
|
2150
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2202 } |
|
cb8205e30dda
(display_menu_bar): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2065
diff
changeset
|
2203 |
| 277 | 2204 /* Display the mode line for window w */ |
| 2205 | |
| 2206 static void | |
| 2207 display_mode_line (w) | |
| 2208 struct window *w; | |
| 2209 { | |
| 2210 register int vpos = XFASTINT (w->height) + XFASTINT (w->top) - 1; | |
| 2211 register int left = XFASTINT (w->left); | |
| 2212 register int right = XFASTINT (w->width) + left; | |
| 769 | 2213 register FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); |
| 277 | 2214 |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2215 line_number_displayed = 0; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2216 |
| 769 | 2217 get_display_line (f, vpos, left); |
| 277 | 2218 display_mode_element (w, vpos, left, 0, right, right, |
| 2219 current_buffer->mode_line_format); | |
| 769 | 2220 FRAME_DESIRED_GLYPHS (f)->bufp[vpos] = 0; |
| 277 | 2221 |
| 2222 /* Make the mode line inverse video if the entire line | |
| 2223 is made of mode lines. | |
| 2224 I.e. if this window is full width, | |
| 2225 or if it is the child of a full width window | |
| 2226 (which implies that that window is split side-by-side | |
| 2227 and the rest of this line is mode lines of the sibling windows). */ | |
| 769 | 2228 if (XFASTINT (w->width) == FRAME_WIDTH (f) |
| 2229 || XFASTINT (XWINDOW (w->parent)->width) == FRAME_WIDTH (f)) | |
| 2230 FRAME_DESIRED_GLYPHS (f)->highlight[vpos] = mode_line_inverse_video; | |
| 277 | 2231 |
| 2232 #ifdef HAVE_X_WINDOWS | |
| 2233 /* I'm trying this out because I saw Unimpress use it, but it's | |
|
1124
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2234 possible that this may mess adversely with some window managers. -jla |
| 277 | 2235 |
|
1124
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2236 Wouldn't it be nice to use something like mode-line-format to |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2237 describe frame titles? -JimB */ |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2238 |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2239 /* Change the title of the frame to the name of the buffer displayed |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2240 in the currently selected window. Don't do this for minibuffer frames, |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2241 and don't do it when there's only one non-minibuffer frame. */ |
|
973
52267046b144
* xdisp.c (FRAME_IS_TERMCAP, FRAME_IS_X, FRAME_HAS_MINIBUF):
Jim Blandy <jimb@redhat.com>
parents:
831
diff
changeset
|
2242 if (FRAME_X_P (f) |
| 769 | 2243 && ! FRAME_MINIBUF_ONLY_P (f) |
| 831 | 2244 && w == XWINDOW (f->selected_window)) |
|
1124
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2245 x_implicitly_set_name (f, (EQ (Fnext_frame (WINDOW_FRAME (w), Qnil), |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2246 WINDOW_FRAME (w)) |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2247 ? Qnil |
|
453c24f2bdaa
* xdisp.c (display_mode_line): If the only other frames are
Jim Blandy <jimb@redhat.com>
parents:
1017
diff
changeset
|
2248 : XBUFFER (w->buffer)->name), |
|
1017
d42877206c0a
* xdisp.c (display_mode_line): Use x_implicitly_set_name here.
Jim Blandy <jimb@redhat.com>
parents:
973
diff
changeset
|
2249 Qnil); |
| 277 | 2250 #endif |
| 2251 } | |
| 2252 | |
| 2253 /* Contribute ELT to the mode line for window W. | |
| 2254 How it translates into text depends on its data type. | |
| 2255 | |
| 2256 VPOS is the position of the mode line being displayed. | |
| 2257 | |
| 769 | 2258 HPOS is the position (absolute on frame) where this element's text |
| 277 | 2259 should start. The output is truncated automatically at the right |
| 2260 edge of window W. | |
| 2261 | |
| 2262 DEPTH is the depth in recursion. It is used to prevent | |
| 2263 infinite recursion here. | |
| 2264 | |
| 2265 MINENDCOL is the hpos before which the element may not end. | |
| 2266 The element is padded at the right with spaces if nec | |
| 2267 to reach this column. | |
| 2268 | |
| 2269 MAXENDCOL is the hpos past which this element may not extend. | |
| 2270 If MINENDCOL is > MAXENDCOL, MINENDCOL takes priority. | |
| 2271 (This is necessary to make nested padding and truncation work.) | |
| 2272 | |
| 2273 Returns the hpos of the end of the text generated by ELT. | |
| 2274 The next element will receive that value as its HPOS arg, | |
| 2275 so as to concatenate the elements. */ | |
| 2276 | |
| 2277 static int | |
| 2278 display_mode_element (w, vpos, hpos, depth, minendcol, maxendcol, elt) | |
| 2279 struct window *w; | |
| 2280 register int vpos, hpos; | |
| 2281 int depth; | |
| 2282 int minendcol; | |
| 2283 register int maxendcol; | |
| 2284 register Lisp_Object elt; | |
| 2285 { | |
| 2286 tail_recurse: | |
| 2287 if (depth > 10) | |
| 2288 goto invalid; | |
| 2289 | |
| 2290 depth++; | |
| 2291 | |
| 2292 #ifdef SWITCH_ENUM_BUG | |
| 2293 switch ((int) XTYPE (elt)) | |
| 2294 #else | |
| 2295 switch (XTYPE (elt)) | |
| 2296 #endif | |
| 2297 { | |
| 2298 case Lisp_String: | |
| 2299 { | |
| 2300 /* A string: output it and check for %-constructs within it. */ | |
| 2301 register unsigned char c; | |
| 2302 register unsigned char *this = XSTRING (elt)->data; | |
| 2303 | |
| 2304 while (hpos < maxendcol && *this) | |
| 2305 { | |
| 2306 unsigned char *last = this; | |
| 2307 while ((c = *this++) != '\0' && c != '%') | |
| 2308 ; | |
| 2309 if (this - 1 != last) | |
| 2310 { | |
| 2311 register int lim = --this - last + hpos; | |
| 2312 hpos = display_string (w, vpos, last, hpos, 0, hpos, | |
| 2313 min (lim, maxendcol)); | |
| 2314 } | |
| 2315 else /* c == '%' */ | |
| 2316 { | |
| 2317 register int spec_width = 0; | |
| 2318 | |
| 2319 /* We can't allow -ve args due to the "%-" construct */ | |
| 2320 /* Argument specifies minwidth but not maxwidth | |
| 2321 (maxwidth can be specified by | |
| 2322 (<negative-number> . <stuff>) mode-line elements) */ | |
| 2323 | |
| 2324 while ((c = *this++) >= '0' && c <= '9') | |
| 2325 { | |
| 2326 spec_width = spec_width * 10 + (c - '0'); | |
| 2327 } | |
| 2328 | |
| 2329 spec_width += hpos; | |
| 2330 if (spec_width > maxendcol) | |
| 2331 spec_width = maxendcol; | |
| 2332 | |
| 2333 if (c == 'M') | |
| 2334 hpos = display_mode_element (w, vpos, hpos, depth, | |
| 2335 spec_width, maxendcol, | |
| 2336 Vglobal_mode_string); | |
| 2337 else if (c != 0) | |
| 2338 hpos = display_string (w, vpos, | |
| 2339 decode_mode_spec (w, c, | |
| 2340 maxendcol - hpos), | |
| 2341 hpos, 0, spec_width, maxendcol); | |
| 2342 } | |
| 2343 } | |
| 2344 } | |
| 2345 break; | |
| 2346 | |
| 2347 case Lisp_Symbol: | |
| 2348 /* A symbol: process the value of the symbol recursively | |
| 2349 as if it appeared here directly. Avoid error if symbol void. | |
| 2350 Special case: if value of symbol is a string, output the string | |
| 2351 literally. */ | |
| 2352 { | |
| 2353 register Lisp_Object tem; | |
| 2354 tem = Fboundp (elt); | |
| 485 | 2355 if (!NILP (tem)) |
| 277 | 2356 { |
| 2357 tem = Fsymbol_value (elt); | |
| 2358 /* If value is a string, output that string literally: | |
| 2359 don't check for % within it. */ | |
| 2360 if (XTYPE (tem) == Lisp_String) | |
| 2361 hpos = display_string (w, vpos, XSTRING (tem)->data, | |
| 2362 hpos, 0, minendcol, maxendcol); | |
| 2363 /* Give up right away for nil or t. */ | |
| 2364 else if (!EQ (tem, elt)) | |
| 2365 { elt = tem; goto tail_recurse; } | |
| 2366 } | |
| 2367 } | |
| 2368 break; | |
| 2369 | |
| 2370 case Lisp_Cons: | |
| 2371 { | |
| 2372 register Lisp_Object car, tem; | |
| 2373 | |
| 2374 /* A cons cell: three distinct cases. | |
| 2375 If first element is a string or a cons, process all the elements | |
| 2376 and effectively concatenate them. | |
| 2377 If first element is a negative number, truncate displaying cdr to | |
| 2378 at most that many characters. If positive, pad (with spaces) | |
| 2379 to at least that many characters. | |
| 2380 If first element is a symbol, process the cadr or caddr recursively | |
| 2381 according to whether the symbol's value is non-nil or nil. */ | |
| 2382 car = XCONS (elt)->car; | |
| 2383 if (XTYPE (car) == Lisp_Symbol) | |
| 2384 { | |
| 2385 tem = Fboundp (car); | |
| 2386 elt = XCONS (elt)->cdr; | |
| 2387 if (XTYPE (elt) != Lisp_Cons) | |
| 2388 goto invalid; | |
| 2389 /* elt is now the cdr, and we know it is a cons cell. | |
| 2390 Use its car if CAR has a non-nil value. */ | |
| 485 | 2391 if (!NILP (tem)) |
| 277 | 2392 { |
| 2393 tem = Fsymbol_value (car); | |
| 485 | 2394 if (!NILP (tem)) |
| 277 | 2395 { elt = XCONS (elt)->car; goto tail_recurse; } |
| 2396 } | |
| 2397 /* Symbol's value is nil (or symbol is unbound) | |
| 2398 Get the cddr of the original list | |
| 2399 and if possible find the caddr and use that. */ | |
| 2400 elt = XCONS (elt)->cdr; | |
| 485 | 2401 if (NILP (elt)) |
| 277 | 2402 break; |
| 2403 else if (XTYPE (elt) != Lisp_Cons) | |
| 2404 goto invalid; | |
| 2405 elt = XCONS (elt)->car; | |
| 2406 goto tail_recurse; | |
| 2407 } | |
| 2408 else if (XTYPE (car) == Lisp_Int) | |
| 2409 { | |
| 2410 register int lim = XINT (car); | |
| 2411 elt = XCONS (elt)->cdr; | |
| 2412 if (lim < 0) | |
| 2413 /* Negative int means reduce maximum width. | |
| 2414 DO NOT change MINENDCOL here! | |
| 2415 (20 -10 . foo) should truncate foo to 10 col | |
| 2416 and then pad to 20. */ | |
| 2417 maxendcol = min (maxendcol, hpos - lim); | |
| 2418 else if (lim > 0) | |
| 2419 { | |
| 2420 /* Padding specified. Don't let it be more than | |
| 2421 current maximum. */ | |
| 2422 lim += hpos; | |
| 2423 if (lim > maxendcol) | |
| 2424 lim = maxendcol; | |
| 2425 /* If that's more padding than already wanted, queue it. | |
| 2426 But don't reduce padding already specified even if | |
| 2427 that is beyond the current truncation point. */ | |
| 2428 if (lim > minendcol) | |
| 2429 minendcol = lim; | |
| 2430 } | |
| 2431 goto tail_recurse; | |
| 2432 } | |
| 2433 else if (XTYPE (car) == Lisp_String || XTYPE (car) == Lisp_Cons) | |
| 2434 { | |
| 2435 register int limit = 50; | |
| 2436 /* LIMIT is to protect against circular lists. */ | |
| 2437 while (XTYPE (elt) == Lisp_Cons && --limit > 0 | |
| 2438 && hpos < maxendcol) | |
| 2439 { | |
| 2440 hpos = display_mode_element (w, vpos, hpos, depth, | |
| 2441 hpos, maxendcol, | |
| 2442 XCONS (elt)->car); | |
| 2443 elt = XCONS (elt)->cdr; | |
| 2444 } | |
| 2445 } | |
| 2446 } | |
| 2447 break; | |
| 2448 | |
| 2449 default: | |
| 2450 invalid: | |
| 2451 return (display_string (w, vpos, "*invalid*", hpos, 0, | |
| 2452 minendcol, maxendcol)); | |
| 2453 } | |
| 2454 | |
| 2455 end: | |
| 2456 if (minendcol > hpos) | |
| 2457 hpos = display_string (w, vpos, "", hpos, 0, minendcol, -1); | |
| 2458 return hpos; | |
| 2459 } | |
| 2460 | |
| 2461 /* Return a string for the output of a mode line %-spec for window W, | |
| 2462 generated by character C and width MAXWIDTH. */ | |
| 2463 | |
|
1017
d42877206c0a
* xdisp.c (display_mode_line): Use x_implicitly_set_name here.
Jim Blandy <jimb@redhat.com>
parents:
973
diff
changeset
|
2464 static char lots_of_dashes[] = "--------------------------------------------------------------------------------------------------------------------------------------------"; |
|
d42877206c0a
* xdisp.c (display_mode_line): Use x_implicitly_set_name here.
Jim Blandy <jimb@redhat.com>
parents:
973
diff
changeset
|
2465 |
| 277 | 2466 static char * |
| 2467 decode_mode_spec (w, c, maxwidth) | |
| 2468 struct window *w; | |
| 2469 register char c; | |
| 2470 register int maxwidth; | |
| 2471 { | |
| 2472 Lisp_Object obj = Qnil; | |
| 769 | 2473 FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); |
| 2474 char *decode_mode_spec_buf = (char *) FRAME_TEMP_GLYPHS (f)->total_contents; | |
| 277 | 2475 |
| 769 | 2476 if (maxwidth > FRAME_WIDTH (f)) |
| 2477 maxwidth = FRAME_WIDTH (f); | |
| 277 | 2478 |
| 2479 switch (c) | |
| 2480 { | |
| 2481 case 'b': | |
| 2482 obj = current_buffer->name; | |
| 2483 #if 0 | |
| 2484 if (maxwidth >= 3 && XSTRING (obj)->size > maxwidth) | |
| 2485 { | |
| 2486 bcopy (XSTRING (obj)->data, decode_mode_spec_buf, maxwidth - 1); | |
| 2487 decode_mode_spec_buf[maxwidth - 1] = '\\'; | |
| 2488 decode_mode_spec_buf[maxwidth] = '\0'; | |
| 2489 return decode_mode_spec_buf; | |
| 2490 } | |
| 2491 #endif | |
| 2492 break; | |
| 2493 | |
| 2494 case 'f': | |
| 2495 obj = current_buffer->filename; | |
| 2496 #if 0 | |
| 485 | 2497 if (NILP (obj)) |
| 277 | 2498 return "[none]"; |
| 2499 else if (XTYPE (obj) == Lisp_String && XSTRING (obj)->size > maxwidth) | |
| 2500 { | |
| 2501 bcopy ("...", decode_mode_spec_buf, 3); | |
| 2502 bcopy (XSTRING (obj)->data + XSTRING (obj)->size - maxwidth + 3, | |
| 2503 decode_mode_spec_buf + 3, maxwidth - 3); | |
| 2504 return decode_mode_spec_buf; | |
| 2505 } | |
| 2506 #endif | |
| 2507 break; | |
| 2508 | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2509 case 'l': |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2510 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2511 int startpos = marker_position (w->start); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2512 int line, linepos, topline; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2513 int nlines, junk; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2514 Lisp_Object tem; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2515 int height = XFASTINT (w->height); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2516 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2517 /* If we decided that this buffer isn't suitable for line numbers, |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2518 don't forget that too fast. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2519 if (EQ (w->base_line_pos, w->buffer)) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2520 return "??"; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2521 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2522 /* If the buffer is very big, don't waste time. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2523 if (ZV - BEGV > line_number_display_limit) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2524 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2525 w->base_line_pos = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2526 w->base_line_number = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2527 return "??"; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2528 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2529 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2530 if (!NILP (w->base_line_number) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2531 && !NILP (w->base_line_pos) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2532 && XFASTINT (w->base_line_pos) <= marker_position (w->start)) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2533 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2534 line = XFASTINT (w->base_line_number); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2535 linepos = XFASTINT (w->base_line_pos); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2536 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2537 else |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2538 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2539 line = 1; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2540 linepos = BEGV; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2541 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2542 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2543 /* Count lines from base line to window start position. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2544 nlines = display_count_lines (linepos, startpos, startpos, &junk); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2545 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2546 topline = nlines + line; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2547 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2548 /* Determine a new base line, if the old one is too close |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2549 or too far away, or if we did not have one. |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2550 "Too close" means it's plausible a scroll-down would |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2551 go back past it. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2552 if (startpos == BEGV) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2553 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2554 XFASTINT (w->base_line_number) = topline; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2555 XFASTINT (w->base_line_pos) = BEGV; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2556 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2557 else if (nlines < height + 25 || nlines > height * 3 + 50 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2558 || linepos == BEGV) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2559 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2560 int limit = BEGV; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2561 int position; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2562 int distance = (height * 2 + 30) * 200; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2563 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2564 if (startpos - distance > limit) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2565 limit = startpos - distance; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2566 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2567 nlines = display_count_lines (startpos, limit, |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2568 -(height * 2 + 30), |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2569 &position); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2570 /* If we couldn't find the lines we wanted within |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2571 200 chars per line, |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2572 give up on line numbers for this window. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2573 if (position == startpos - distance) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2574 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2575 w->base_line_pos = w->buffer; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2576 w->base_line_number = Qnil; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2577 return "??"; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2578 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2579 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2580 XFASTINT (w->base_line_number) = topline - nlines; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2581 XFASTINT (w->base_line_pos) = position; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2582 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2583 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2584 /* Now count lines from the start pos to point. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2585 nlines = display_count_lines (startpos, PT, PT, &junk); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2586 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2587 /* Record that we did display the line number. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2588 line_number_displayed = 1; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2589 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2590 /* Make the string to show. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2591 sprintf (decode_mode_spec_buf, "%d", topline + nlines); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2592 return decode_mode_spec_buf; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2593 } |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2594 break; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2595 |
| 277 | 2596 case 'm': |
| 2597 obj = current_buffer->mode_name; | |
| 2598 break; | |
| 2599 | |
| 2600 case 'n': | |
| 2601 if (BEGV > BEG || ZV < Z) | |
| 2602 return " Narrow"; | |
| 2603 break; | |
| 2604 | |
| 2605 case '*': | |
| 485 | 2606 if (!NILP (current_buffer->read_only)) |
| 277 | 2607 return "%"; |
| 2608 if (MODIFF > current_buffer->save_modified) | |
| 2609 return "*"; | |
| 2610 return "-"; | |
| 2611 | |
| 2612 case 's': | |
| 2613 /* status of process */ | |
| 2614 obj = Fget_buffer_process (Fcurrent_buffer ()); | |
| 485 | 2615 if (NILP (obj)) |
| 277 | 2616 return "no process"; |
| 2617 obj = Fsymbol_name (Fprocess_status (obj)); | |
| 2618 break; | |
| 2619 | |
| 2620 case 'p': | |
| 2621 { | |
| 2622 int pos = marker_position (w->start); | |
| 2623 int total = ZV - BEGV; | |
| 2624 | |
| 2625 if (XFASTINT (w->window_end_pos) <= Z - ZV) | |
| 2626 { | |
| 2627 if (pos <= BEGV) | |
| 2628 return "All"; | |
| 2629 else | |
| 2630 return "Bottom"; | |
| 2631 } | |
| 2632 else if (pos <= BEGV) | |
| 2633 return "Top"; | |
| 2634 else | |
| 2635 { | |
| 2636 total = ((pos - BEGV) * 100 + total - 1) / total; | |
| 2637 /* We can't normally display a 3-digit number, | |
| 2638 so get us a 2-digit number that is close. */ | |
| 2639 if (total == 100) | |
| 2640 total = 99; | |
| 2641 sprintf (decode_mode_spec_buf, "%2d%%", total); | |
| 2642 return decode_mode_spec_buf; | |
| 2643 } | |
| 2644 } | |
| 2645 | |
| 2646 case '%': | |
| 2647 return "%"; | |
| 2648 | |
| 2649 case '[': | |
| 2650 { | |
| 2651 int i; | |
| 2652 char *p; | |
| 2653 | |
| 2654 if (command_loop_level > 5) | |
| 2655 return "[[[... "; | |
| 2656 p = decode_mode_spec_buf; | |
| 2657 for (i = 0; i < command_loop_level; i++) | |
| 2658 *p++ = '['; | |
| 2659 *p = 0; | |
| 2660 return decode_mode_spec_buf; | |
| 2661 } | |
| 2662 | |
| 2663 case ']': | |
| 2664 { | |
| 2665 int i; | |
| 2666 char *p; | |
| 2667 | |
| 2668 if (command_loop_level > 5) | |
| 2669 return " ...]]]"; | |
| 2670 p = decode_mode_spec_buf; | |
| 2671 for (i = 0; i < command_loop_level; i++) | |
| 2672 *p++ = ']'; | |
| 2673 *p = 0; | |
| 2674 return decode_mode_spec_buf; | |
| 2675 } | |
| 2676 | |
| 2677 case '-': | |
| 2678 { | |
| 2679 register char *p; | |
| 2680 register int i; | |
| 2681 | |
| 2682 if (maxwidth < sizeof (lots_of_dashes)) | |
| 2683 return lots_of_dashes; | |
| 2684 else | |
| 2685 { | |
| 2686 for (p = decode_mode_spec_buf, i = maxwidth; i > 0; i--) | |
| 2687 *p++ = '-'; | |
| 2688 *p = '\0'; | |
| 2689 } | |
| 2690 return decode_mode_spec_buf; | |
| 2691 } | |
| 2692 } | |
| 2693 | |
| 2694 if (XTYPE (obj) == Lisp_String) | |
| 2695 return (char *) XSTRING (obj)->data; | |
| 2696 else | |
| 2697 return ""; | |
| 2698 } | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2699 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2700 /* Count up to N lines starting from FROM. |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2701 But don't go beyond LIMIT. |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2702 Return the number of lines thus found (always positive). |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2703 Store the position after what was found into *POS_PTR. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2704 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2705 static int |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2706 display_count_lines (from, limit, n, pos_ptr) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2707 int from, limit, n; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2708 int *pos_ptr; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2709 { |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2710 int oldbegv = BEGV; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2711 int oldzv = ZV; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2712 int shortage = 0; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2713 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2714 if (limit < from) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2715 BEGV = limit; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2716 else |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2717 ZV = limit; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2718 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2719 *pos_ptr = scan_buffer ('\n', from, n, &shortage); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2720 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2721 ZV = oldzv; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2722 BEGV = oldbegv; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2723 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2724 if (n < 0) |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2725 /* When scanning backwards, scan_buffer stops *after* the last newline |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2726 it finds, but does count it. Compensate for that. */ |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2727 return - n - shortage - (*pos_ptr != limit); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2728 return n - shortage; |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2729 } |
| 277 | 2730 |
| 2731 /* Display STRING on one line of window W, starting at HPOS. | |
| 2732 Display at position VPOS. Caller should have done get_display_line. | |
|
1017
d42877206c0a
* xdisp.c (display_mode_line): Use x_implicitly_set_name here.
Jim Blandy <jimb@redhat.com>
parents:
973
diff
changeset
|
2733 If VPOS == -1, display it as the current frame's title. |
| 277 | 2734 |
| 2735 TRUNCATE is GLYPH to display at end if truncated. Zero for none. | |
| 2736 | |
| 2737 MINCOL is the first column ok to end at. (Pad with spaces to this col.) | |
| 2738 MAXCOL is the last column ok to end at. Truncate here. | |
| 2739 -1 for MINCOL or MAXCOL means no explicit minimum or maximum. | |
| 769 | 2740 Both count from the left edge of the frame, as does HPOS. |
| 277 | 2741 The right edge of W is an implicit maximum. |
| 2742 If TRUNCATE is nonzero, the implicit maximum is one column before the edge. | |
| 2743 | |
| 2744 Returns ending hpos */ | |
| 2745 | |
| 2746 static int | |
| 2747 display_string (w, vpos, string, hpos, truncate, mincol, maxcol) | |
| 2748 struct window *w; | |
| 2749 unsigned char *string; | |
| 2750 int vpos, hpos; | |
| 2751 GLYPH truncate; | |
| 2752 int mincol, maxcol; | |
| 2753 { | |
| 2754 register int c; | |
| 2755 register GLYPH *p1; | |
| 2756 int hscroll = XINT (w->hscroll); | |
|
1600
775c2ab9800f
* xdisp.c (display_string): Use w's buffer's value of
Jim Blandy <jimb@redhat.com>
parents:
1527
diff
changeset
|
2757 int tab_width = XINT (XBUFFER (w->buffer)->tab_width); |
| 277 | 2758 register GLYPH *start; |
| 2759 register GLYPH *end; | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2760 FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2761 struct frame_glyphs *desired_glyphs = FRAME_DESIRED_GLYPHS (f); |
| 277 | 2762 GLYPH *p1start = desired_glyphs->glyphs[vpos] + hpos; |
| 2763 int window_width = XFASTINT (w->width); | |
| 2764 | |
| 2765 /* Use the standard display table, not the window's display table. | |
| 2766 We don't want the mode line in rot13. */ | |
| 2767 register struct Lisp_Vector *dp = 0; | |
| 2768 | |
| 2769 if (XTYPE (Vstandard_display_table) == Lisp_Vector | |
| 2770 && XVECTOR (Vstandard_display_table)->size == DISP_TABLE_SIZE) | |
| 2771 dp = XVECTOR (Vstandard_display_table); | |
| 2772 | |
|
2324
24cd3df6f184
(display_string, display_text_line): Allow tab_width up to 1000.
Richard M. Stallman <rms@gnu.org>
parents:
2303
diff
changeset
|
2773 if (tab_width <= 0 || tab_width > 1000) tab_width = 8; |
| 277 | 2774 |
| 2775 p1 = p1start; | |
| 2776 start = desired_glyphs->glyphs[vpos] + XFASTINT (w->left); | |
| 2777 end = start + window_width - (truncate != 0); | |
| 2778 | |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2779 if ((window_width + XFASTINT (w->left)) != FRAME_WIDTH (f)) |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2780 { |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
2781 if (FRAME_HAS_VERTICAL_SCROLL_BARS (f)) |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2782 { |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2783 int i; |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2784 |
|
1992
37c45885540a
* xdisp.c (redisplay): Protect calls to request_sigio and
Jim Blandy <jimb@redhat.com>
parents:
1873
diff
changeset
|
2785 for (i = 0; i < VERTICAL_SCROLL_BAR_WIDTH; i++) |
|
1785
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2786 *end-- = ' '; |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2787 } |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2788 else |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2789 *end-- = '|'; |
|
19755499df90
* window.c (window_internal_width): New function, which accounts
Jim Blandy <jimb@redhat.com>
parents:
1718
diff
changeset
|
2790 } |
| 277 | 2791 |
| 2792 if (maxcol >= 0 && end - desired_glyphs->glyphs[vpos] > maxcol) | |
| 2793 end = desired_glyphs->glyphs[vpos] + maxcol; | |
| 2794 if (maxcol >= 0 && mincol > maxcol) | |
| 2795 mincol = maxcol; | |
| 2796 | |
| 2797 while (p1 < end) | |
| 2798 { | |
| 2799 c = *string++; | |
| 2800 if (!c) break; | |
| 2801 if (c >= 040 && c < 0177 | |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
2802 && (dp == 0 || XTYPE (DISP_CHAR_VECTOR (dp, c)) != Lisp_Vector)) |
| 277 | 2803 { |
| 2804 if (p1 >= start) | |
| 2805 *p1 = c; | |
| 2806 p1++; | |
| 2807 } | |
| 2808 else if (c == '\t') | |
| 2809 { | |
| 2810 do | |
| 2811 { | |
| 2812 if (p1 >= start && p1 < end) | |
| 2813 *p1 = SPACEGLYPH; | |
| 2814 p1++; | |
| 2815 } | |
| 2816 while ((p1 - start + hscroll - (hscroll > 0)) % tab_width); | |
| 2817 } | |
|
2065
32afcdd08efe
(copy_rope): Expect FROM to be a vector.
Richard M. Stallman <rms@gnu.org>
parents:
1992
diff
changeset
|
2818 else if (dp != 0 && XTYPE (DISP_CHAR_VECTOR (dp, c)) == Lisp_Vector) |
|
2766
aa7b6f6aa20a
* xdisp.c (copy_rope, copy_part_of_rope): Add face argument.
Jim Blandy <jimb@redhat.com>
parents:
2754
diff
changeset
|
2819 p1 = copy_rope (p1, start, DISP_CHAR_VECTOR (dp, c), 0); |
|
1527
00109911b040
* xdisp.c (redisplay): Use ! EQ to compare the old and new arrow
Jim Blandy <jimb@redhat.com>
parents:
1446
diff
changeset
|
2820 else if (c < 0200 && ! NILP (buffer_defaults.ctl_arrow)) |
| 277 | 2821 { |
| 2822 if (p1 >= start) | |
| 2823 *p1 = (dp && XTYPE (DISP_CTRL_GLYPH (dp)) == Lisp_Int | |
| 2824 ? XINT (DISP_CTRL_GLYPH (dp)) : '^'); | |
| 2825 p1++; | |
| 368 | 2826 if (p1 >= start && p1 < end) |
| 277 | 2827 *p1 = c ^ 0100; |
| 2828 p1++; | |
| 2829 } | |
| 2830 else | |
| 2831 { | |
| 2832 if (p1 >= start) | |
| 2833 *p1 = (dp && XTYPE (DISP_ESCAPE_GLYPH (dp)) == Lisp_Int | |
| 2834 ? XINT (DISP_ESCAPE_GLYPH (dp)) : '\\'); | |
| 2835 p1++; | |
| 368 | 2836 if (p1 >= start && p1 < end) |
| 277 | 2837 *p1 = (c >> 6) + '0'; |
| 2838 p1++; | |
| 368 | 2839 if (p1 >= start && p1 < end) |
| 277 | 2840 *p1 = (7 & (c >> 3)) + '0'; |
| 2841 p1++; | |
| 368 | 2842 if (p1 >= start && p1 < end) |
| 277 | 2843 *p1 = (7 & c) + '0'; |
| 2844 p1++; | |
| 2845 } | |
| 2846 } | |
| 2847 | |
| 2848 if (c) | |
| 2849 { | |
| 2850 p1 = end; | |
| 2851 if (truncate) *p1++ = truncate; | |
| 2852 } | |
| 2853 else if (mincol >= 0) | |
| 2854 { | |
| 2855 end = desired_glyphs->glyphs[vpos] + mincol; | |
| 2856 while (p1 < end) | |
| 2857 *p1++ = SPACEGLYPH; | |
| 2858 } | |
| 2859 | |
| 2860 { | |
| 2861 register int len = p1 - desired_glyphs->glyphs[vpos]; | |
| 2862 | |
| 2863 if (len > desired_glyphs->used[vpos]) | |
| 2864 desired_glyphs->used[vpos] = len; | |
| 2865 desired_glyphs->glyphs[vpos][desired_glyphs->used[vpos]] = 0; | |
| 2866 | |
| 2867 return len; | |
| 2868 } | |
| 2869 } | |
| 2870 | |
| 2871 void | |
| 2872 syms_of_xdisp () | |
| 2873 { | |
| 2874 staticpro (&last_arrow_position); | |
| 2875 staticpro (&last_arrow_string); | |
| 2876 last_arrow_position = Qnil; | |
| 2877 last_arrow_string = Qnil; | |
| 2878 | |
| 2879 DEFVAR_LISP ("global-mode-string", &Vglobal_mode_string, | |
|
782
a6d00bdb2b60
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
781
diff
changeset
|
2880 "String (or mode line construct) included (normally) in `mode-line-format'."); |
| 277 | 2881 Vglobal_mode_string = Qnil; |
| 2882 | |
| 2883 DEFVAR_LISP ("overlay-arrow-position", &Voverlay_arrow_position, | |
| 2884 "Marker for where to display an arrow on top of the buffer text.\n\ | |
| 2885 This must be the beginning of a line in order to work.\n\ | |
| 2886 See also `overlay-arrow-string'."); | |
| 2887 Voverlay_arrow_position = Qnil; | |
| 2888 | |
| 2889 DEFVAR_LISP ("overlay-arrow-string", &Voverlay_arrow_string, | |
| 2890 "String to display as an arrow. See also `overlay-arrow-position'."); | |
| 2891 Voverlay_arrow_string = Qnil; | |
| 2892 | |
| 2893 DEFVAR_INT ("scroll-step", &scroll_step, | |
| 2894 "*The number of lines to try scrolling a window by when point moves out.\n\ | |
| 769 | 2895 If that fails to bring point back on frame, point is centered instead.\n\ |
| 2896 If this is zero, point is always centered after it moves off frame."); | |
| 277 | 2897 |
| 2898 DEFVAR_INT ("debug-end-pos", &debug_end_pos, "Don't ask"); | |
| 2899 | |
| 2900 DEFVAR_BOOL ("truncate-partial-width-windows", | |
| 2901 &truncate_partial_width_windows, | |
| 769 | 2902 "*Non-nil means truncate lines in all windows less than full frame wide."); |
| 277 | 2903 truncate_partial_width_windows = 1; |
| 2904 | |
| 2905 DEFVAR_BOOL ("mode-line-inverse-video", &mode_line_inverse_video, | |
| 2906 "*Non-nil means use inverse video for the mode line."); | |
| 2907 mode_line_inverse_video = 1; | |
|
2303
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2908 |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2909 DEFVAR_INT ("line-number-display-limit", &line_number_display_limit, |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2910 "*Maximum buffer size for which line number should be displayed."); |
|
00e3cc81c1be
(decode_mode_spec): Handle `%l'.
Richard M. Stallman <rms@gnu.org>
parents:
2252
diff
changeset
|
2911 line_number_display_limit = 1000000; |
|
3265
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
2912 |
|
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
2913 DEFVAR_BOOL ("highlight-nonselected-windows", &highlight_nonselected_windows, |
|
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
2914 "*Non-nil means highlight region even in nonselected windows."); |
|
80f57ae8d44e
(syms_of_xdisp): Make highlight-nonselected-windows Lisp var.
Richard M. Stallman <rms@gnu.org>
parents:
3165
diff
changeset
|
2915 highlight_nonselected_windows = 1; |
| 277 | 2916 } |
| 2917 | |
| 2918 /* initialize the window system */ | |
| 2919 init_xdisp () | |
| 2920 { | |
| 2921 Lisp_Object root_window; | |
| 2922 #ifndef COMPILER_REGISTER_BUG | |
| 2923 register | |
| 2924 #endif /* COMPILER_REGISTER_BUG */ | |
| 2925 struct window *mini_w; | |
| 2926 | |
| 2927 this_line_bufpos = 0; | |
| 2928 | |
| 2929 mini_w = XWINDOW (minibuf_window); | |
|
1017
d42877206c0a
* xdisp.c (display_mode_line): Use x_implicitly_set_name here.
Jim Blandy <jimb@redhat.com>
parents:
973
diff
changeset
|
2930 root_window = FRAME_ROOT_WINDOW (XFRAME (WINDOW_FRAME (mini_w))); |
| 277 | 2931 |
| 2932 echo_area_glyphs = 0; | |
| 2933 previous_echo_glyphs = 0; | |
| 2934 | |
| 2935 if (!noninteractive) | |
| 2936 { | |
| 769 | 2937 FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (root_window))); |
| 277 | 2938 XFASTINT (XWINDOW (root_window)->top) = 0; |
| 769 | 2939 set_window_height (root_window, FRAME_HEIGHT (f) - 1, 0); |
| 2940 XFASTINT (mini_w->top) = FRAME_HEIGHT (f) - 1; | |
| 277 | 2941 set_window_height (minibuf_window, 1, 0); |
| 2942 | |
| 769 | 2943 XFASTINT (XWINDOW (root_window)->width) = FRAME_WIDTH (f); |
| 2944 XFASTINT (mini_w->width) = FRAME_WIDTH (f); | |
| 277 | 2945 } |
| 2946 } |
