Mercurial > emacs
annotate src/dispnew.c @ 18989:6253a99afd95
(rmail-pop-password-error): New variable.
(rmail-insert-inbox-text): If there's an error getting mail from
the POP server, and the error matches rmail-pop-password-error or
we prompted for the POP password, assume that the password is
incorrect and erase it so that the user will be prompted again the
next time he gets mail.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 25 Jul 1997 22:08:24 +0000 |
parents | 4501a367a887 |
children | 35cddfda2ba8 |
rev | line source |
---|---|
314 | 1 /* Updating of data structures for redisplay. |
18853
4501a367a887
(direct_output_forward_char): Reenable check against
Richard M. Stallman <rms@gnu.org>
parents:
18774
diff
changeset
|
2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 1997 |
4501a367a887
(direct_output_forward_char): Reenable check against
Richard M. Stallman <rms@gnu.org>
parents:
18774
diff
changeset
|
3 Free Software Foundation, Inc. |
314 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
7 GNU Emacs is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU General Public License as published by | |
1777
4edfaa19c7a7
* window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents:
1766
diff
changeset
|
9 the Free Software Foundation; either version 2, or (at your option) |
314 | 10 any later version. |
11 | |
12 GNU Emacs is distributed in the hope that it will be useful, | |
13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 GNU General Public License for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14125
diff
changeset
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14125
diff
changeset
|
20 Boston, MA 02111-1307, USA. */ |
314 | 21 |
22 | |
23 #include <signal.h> | |
24 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4551
diff
changeset
|
25 #include <config.h> |
7900
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7814
diff
changeset
|
26 |
60795e826dad
Put stdio.h after config.h.
Richard M. Stallman <rms@gnu.org>
parents:
7814
diff
changeset
|
27 #include <stdio.h> |
314 | 28 #include <ctype.h> |
29 | |
3525
58e789baa27a
Include lisp.h earlier (before termhooks.h).
Richard M. Stallman <rms@gnu.org>
parents:
3517
diff
changeset
|
30 #include "lisp.h" |
314 | 31 #include "termchar.h" |
32 #include "termopts.h" | |
2198 | 33 #include "termhooks.h" |
13526
34382f4e23cb
Always include dispextern.h before cm.h.
Richard M. Stallman <rms@gnu.org>
parents:
13448
diff
changeset
|
34 /* cm.h must come after dispextern.h on Windows. */ |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
35 #include "dispextern.h" |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
36 #include "cm.h" |
314 | 37 #include "buffer.h" |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
38 #include "charset.h" |
764 | 39 #include "frame.h" |
314 | 40 #include "window.h" |
41 #include "commands.h" | |
42 #include "disptab.h" | |
43 #include "indent.h" | |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
44 #include "intervals.h" |
15065 | 45 #include "blockinput.h" |
314 | 46 |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
47 /* I don't know why DEC Alpha OSF1 fail to compile this file if we |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
48 include the following file. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
49 /* #include "systty.h" */ |
12917 | 50 #include "syssignal.h" |
554 | 51 |
314 | 52 #ifdef HAVE_X_WINDOWS |
53 #include "xterm.h" | |
54 #endif /* HAVE_X_WINDOWS */ | |
55 | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
56 #ifdef HAVE_NTGUI |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
57 #include "w32term.h" |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
58 #endif /* HAVE_NTGUI */ |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
59 |
7808
52e2eb6245d4
Include systime.h after xterm.h.
Richard M. Stallman <rms@gnu.org>
parents:
7648
diff
changeset
|
60 /* Include systime.h after xterm.h to avoid double inclusion of time.h. */ |
52e2eb6245d4
Include systime.h after xterm.h.
Richard M. Stallman <rms@gnu.org>
parents:
7648
diff
changeset
|
61 #include "systime.h" |
52e2eb6245d4
Include systime.h after xterm.h.
Richard M. Stallman <rms@gnu.org>
parents:
7648
diff
changeset
|
62 |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
63 #include <errno.h> |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
64 |
314 | 65 #define max(a, b) ((a) > (b) ? (a) : (b)) |
66 #define min(a, b) ((a) < (b) ? (a) : (b)) | |
67 | |
68 /* Get number of chars of output now in the buffer of a stdio stream. | |
69 This ought to be built in in stdio, but it isn't. | |
70 Some s- files override this because their stdio internals differ. */ | |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
71 #ifdef __GNU_LIBRARY__ |
7444 | 72 /* The s- file might have overridden the definition with one that works for |
73 the system's C library. But we are using the GNU C library, so this is | |
74 the right definition for every system. */ | |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
75 #ifdef GNU_LIBRARY_PENDING_OUTPUT_COUNT |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
76 #define PENDING_OUTPUT_COUNT GNU_LIBRARY_PENDING_OUTPUT_COUNT |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
77 #else |
7443
a9cb818e5316
[__GNU_LIBRARY__]: Redefine PENDING_OUTPUT_COUNT even if already defined.
Roland McGrath <roland@gnu.org>
parents:
7247
diff
changeset
|
78 #undef PENDING_OUTPUT_COUNT |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
79 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->__bufp - (FILE)->__buffer) |
7558
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
80 #endif |
8497bcb9fb8e
(PENDING_OUTPUT_COUNT): If __GNU_LIBRARY__,
Richard M. Stallman <rms@gnu.org>
parents:
7530
diff
changeset
|
81 #else /* not __GNU_LIBRARY__ */ |
7443
a9cb818e5316
[__GNU_LIBRARY__]: Redefine PENDING_OUTPUT_COUNT even if already defined.
Roland McGrath <roland@gnu.org>
parents:
7247
diff
changeset
|
82 #ifndef PENDING_OUTPUT_COUNT |
314 | 83 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_ptr - (FILE)->_base) |
84 #endif | |
5214
c4bf07b226be
(PENDING_OUTPUT_COUNT) [__GNU_LIBRARY__]: Alternate definition for the GNU
Roland McGrath <roland@gnu.org>
parents:
5083
diff
changeset
|
85 #endif |
314 | 86 |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
87 static void change_frame_size_1 (); |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
88 |
554 | 89 /* Nonzero upon entry to redisplay means do not assume anything about |
764 | 90 current contents of actual terminal frame; clear and redraw it. */ |
314 | 91 |
764 | 92 int frame_garbaged; |
314 | 93 |
94 /* Nonzero means last display completed. Zero means it was preempted. */ | |
95 | |
96 int display_completed; | |
97 | |
98 /* Lisp variable visible-bell; enables use of screen-flash | |
99 instead of audible bell. */ | |
100 | |
101 int visible_bell; | |
102 | |
764 | 103 /* Invert the color of the whole frame, at a low level. */ |
314 | 104 |
105 int inverse_video; | |
106 | |
107 /* Line speed of the terminal. */ | |
108 | |
109 int baud_rate; | |
110 | |
111 /* nil or a symbol naming the window system under which emacs is | |
112 running ('x is the only current possibility). */ | |
113 | |
114 Lisp_Object Vwindow_system; | |
115 | |
116 /* Version number of X windows: 10, 11 or nil. */ | |
117 Lisp_Object Vwindow_system_version; | |
118 | |
119 /* Vector of glyph definitions. Indexed by glyph number, | |
120 the contents are a string which is how to output the glyph. | |
121 | |
122 If Vglyph_table is nil, a glyph is output by using its low 8 bits | |
123 as a character code. */ | |
124 | |
125 Lisp_Object Vglyph_table; | |
126 | |
127 /* Display table to use for vectors that don't specify their own. */ | |
128 | |
129 Lisp_Object Vstandard_display_table; | |
130 | |
131 /* Nonzero means reading single-character input with prompt | |
708 | 132 so put cursor on minibuffer after the prompt. |
133 positive means at end of text in echo area; | |
134 negative means at beginning of line. */ | |
314 | 135 int cursor_in_echo_area; |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
136 |
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
137 Lisp_Object Qdisplay_table; |
314 | 138 |
764 | 139 /* The currently selected frame. |
9572 | 140 In a single-frame version, this variable always holds the address of |
141 the_only_frame. */ | |
314 | 142 |
764 | 143 FRAME_PTR selected_frame; |
314 | 144 |
764 | 145 /* A frame which is not just a minibuffer, or 0 if there are no such |
146 frames. This is usually the most recent such frame that was | |
9572 | 147 selected. In a single-frame version, this variable always holds |
148 the address of the_only_frame. */ | |
764 | 149 FRAME_PTR last_nonminibuf_frame; |
732 | 150 |
314 | 151 /* This is a vector, made larger whenever it isn't large enough, |
764 | 152 which is used inside `update_frame' to hold the old contents |
153 of the FRAME_PHYS_LINES of the frame being updated. */ | |
154 struct frame_glyphs **ophys_lines; | |
314 | 155 /* Length of vector currently allocated. */ |
156 int ophys_lines_length; | |
157 | |
158 FILE *termscript; /* Stdio stream being used for copy of all output. */ | |
159 | |
160 struct cm Wcm; /* Structure for info on cursor positioning */ | |
161 | |
162 int delayed_size_change; /* 1 means SIGWINCH happened when not safe. */ | |
163 | |
764 | 164 DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0, |
165 "Clear frame FRAME and output again what is supposed to appear on it.") | |
166 (frame) | |
167 Lisp_Object frame; | |
314 | 168 { |
764 | 169 FRAME_PTR f; |
314 | 170 |
764 | 171 CHECK_LIVE_FRAME (frame, 0); |
172 f = XFRAME (frame); | |
173 update_begin (f); | |
15394
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
174 if (FRAME_MSDOS_P (f)) |
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
175 set_terminal_modes (); |
764 | 176 clear_frame (); |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
177 clear_frame_records (f); |
764 | 178 update_end (f); |
314 | 179 fflush (stdout); |
180 windows_or_buffers_changed++; | |
181 /* Mark all windows as INaccurate, | |
182 so that every window will have its redisplay done. */ | |
764 | 183 mark_window_display_accurate (FRAME_ROOT_WINDOW (f), 0); |
184 f->garbaged = 0; | |
314 | 185 return Qnil; |
186 } | |
187 | |
764 | 188 redraw_frame (f) |
189 FRAME_PTR f; | |
314 | 190 { |
764 | 191 Lisp_Object frame; |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
192 XSETFRAME (frame, f); |
764 | 193 Fredraw_frame (frame); |
314 | 194 } |
195 | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
196 DEFUN ("redraw-display", Fredraw_display, Sredraw_display, 0, 0, "", |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
197 "Clear and redisplay all visible frames.") |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
198 () |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
199 { |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
200 Lisp_Object tail, frame; |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
201 |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
202 FOR_EACH_FRAME (tail, frame) |
3517
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
203 if (FRAME_VISIBLE_P (XFRAME (frame))) |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
204 Fredraw_frame (frame); |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
205 |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
206 return Qnil; |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
207 } |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
208 |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
209 /* This is used when frame_garbaged is set. |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
210 Redraw the individual frames marked as garbaged. */ |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
211 |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
212 void |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
213 redraw_garbaged_frames () |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
214 { |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
215 Lisp_Object tail, frame; |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
216 |
657a74662346
(Fredraw_display): Redraw all visible frames.
Richard M. Stallman <rms@gnu.org>
parents:
3449
diff
changeset
|
217 FOR_EACH_FRAME (tail, frame) |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
218 if (FRAME_VISIBLE_P (XFRAME (frame)) |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
219 && FRAME_GARBAGED_P (XFRAME (frame))) |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
220 Fredraw_frame (frame); |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
221 } |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
222 |
314 | 223 |
764 | 224 static struct frame_glyphs * |
225 make_frame_glyphs (frame, empty) | |
226 register FRAME_PTR frame; | |
314 | 227 int empty; |
228 { | |
229 register int i; | |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
230 register width = FRAME_WINDOW_WIDTH (frame); |
764 | 231 register height = FRAME_HEIGHT (frame); |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
232 register struct frame_glyphs *new |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
233 = (struct frame_glyphs *) xmalloc (sizeof (struct frame_glyphs)); |
314 | 234 |
764 | 235 SET_GLYPHS_FRAME (new, frame); |
314 | 236 new->height = height; |
237 new->width = width; | |
238 new->used = (int *) xmalloc (height * sizeof (int)); | |
239 new->glyphs = (GLYPH **) xmalloc (height * sizeof (GLYPH *)); | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
240 new->charstarts = (int **) xmalloc (height * sizeof (int *)); |
314 | 241 new->highlight = (char *) xmalloc (height * sizeof (char)); |
242 new->enable = (char *) xmalloc (height * sizeof (char)); | |
243 bzero (new->enable, height * sizeof (char)); | |
244 new->bufp = (int *) xmalloc (height * sizeof (int)); | |
245 | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
246 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
247 if (FRAME_WINDOW_P (frame)) |
314 | 248 { |
249 new->top_left_x = (short *) xmalloc (height * sizeof (short)); | |
250 new->top_left_y = (short *) xmalloc (height * sizeof (short)); | |
251 new->pix_width = (short *) xmalloc (height * sizeof (short)); | |
252 new->pix_height = (short *) xmalloc (height * sizeof (short)); | |
1407
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
253 new->max_ascent = (short *) xmalloc (height * sizeof (short)); |
314 | 254 } |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
255 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 256 |
257 if (empty) | |
258 { | |
259 /* Make the buffer used by decode_mode_spec. This buffer is also | |
764 | 260 used as temporary storage when updating the frame. See scroll.c. */ |
314 | 261 unsigned int total_glyphs = (width + 2) * sizeof (GLYPH); |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
262 unsigned int total_charstarts = (width + 2) * sizeof (int); |
314 | 263 |
264 new->total_contents = (GLYPH *) xmalloc (total_glyphs); | |
265 bzero (new->total_contents, total_glyphs); | |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
266 |
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
267 new->total_charstarts = (int *) xmalloc (total_charstarts); |
14903
13c3adcb1c13
(make_frame_glyphs): Zero the correct number of bytes.
Richard M. Stallman <rms@gnu.org>
parents:
14757
diff
changeset
|
268 bzero (new->total_charstarts, total_charstarts); |
314 | 269 } |
270 else | |
271 { | |
272 unsigned int total_glyphs = height * (width + 2) * sizeof (GLYPH); | |
273 | |
274 new->total_contents = (GLYPH *) xmalloc (total_glyphs); | |
275 bzero (new->total_contents, total_glyphs); | |
276 for (i = 0; i < height; i++) | |
277 new->glyphs[i] = new->total_contents + i * (width + 2) + 1; | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
278 |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
279 if (!FRAME_TERMCAP_P (frame)) |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
280 { |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
281 unsigned int total_charstarts = height * (width + 2) * sizeof (int); |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
282 |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
283 new->total_charstarts = (int *) xmalloc (total_charstarts); |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
284 bzero (new->total_charstarts, total_charstarts); |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
285 for (i = 0; i < height; i++) |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
286 new->charstarts[i] = new->total_charstarts + i * (width + 2) + 1; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
287 } |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
288 else |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
289 { |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
290 /* Without a window system, we don't really need charstarts. |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
291 So use a small amount of space to make enough data structure |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
292 to prevent crashes in display_text_line. */ |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
293 new->total_charstarts = (int *) xmalloc ((width + 2) * sizeof (int)); |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
294 for (i = 0; i < height; i++) |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
295 new->charstarts[i] = new->total_charstarts; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
296 } |
314 | 297 } |
298 | |
299 return new; | |
300 } | |
301 | |
8665
f06ea671bacb
(free_frame_glyphs): No longer static.
Richard M. Stallman <rms@gnu.org>
parents:
8395
diff
changeset
|
302 void |
764 | 303 free_frame_glyphs (frame, glyphs) |
304 FRAME_PTR frame; | |
305 struct frame_glyphs *glyphs; | |
314 | 306 { |
307 if (glyphs->total_contents) | |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
308 xfree (glyphs->total_contents); |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
309 if (glyphs->total_charstarts) |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
310 xfree (glyphs->total_charstarts); |
314 | 311 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
312 xfree (glyphs->used); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
313 xfree (glyphs->glyphs); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
314 xfree (glyphs->highlight); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
315 xfree (glyphs->enable); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
316 xfree (glyphs->bufp); |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
317 if (glyphs->charstarts) |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
318 xfree (glyphs->charstarts); |
314 | 319 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
320 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
321 if (FRAME_WINDOW_P (frame)) |
314 | 322 { |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
323 xfree (glyphs->top_left_x); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
324 xfree (glyphs->top_left_y); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
325 xfree (glyphs->pix_width); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
326 xfree (glyphs->pix_height); |
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
327 xfree (glyphs->max_ascent); |
314 | 328 } |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
329 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 330 |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2365
diff
changeset
|
331 xfree (glyphs); |
314 | 332 } |
333 | |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
334 void |
764 | 335 remake_frame_glyphs (frame) |
336 FRAME_PTR frame; | |
314 | 337 { |
764 | 338 if (FRAME_CURRENT_GLYPHS (frame)) |
339 free_frame_glyphs (frame, FRAME_CURRENT_GLYPHS (frame)); | |
340 if (FRAME_DESIRED_GLYPHS (frame)) | |
341 free_frame_glyphs (frame, FRAME_DESIRED_GLYPHS (frame)); | |
342 if (FRAME_TEMP_GLYPHS (frame)) | |
343 free_frame_glyphs (frame, FRAME_TEMP_GLYPHS (frame)); | |
314 | 344 |
764 | 345 if (FRAME_MESSAGE_BUF (frame)) |
1872
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
346 { |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
347 /* Reallocate the frame's message buffer; remember that |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
348 echo_area_glyphs may be pointing here. */ |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
349 char *old_message_buf = FRAME_MESSAGE_BUF (frame); |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
350 |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
351 FRAME_MESSAGE_BUF (frame) |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
352 = (char *) xrealloc (FRAME_MESSAGE_BUF (frame), |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
353 FRAME_MESSAGE_BUF_SIZE (frame) + 1); |
1872
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
354 |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
355 if (echo_area_glyphs == old_message_buf) |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
356 echo_area_glyphs = FRAME_MESSAGE_BUF (frame); |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
357 if (previous_echo_glyphs == old_message_buf) |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
358 previous_echo_glyphs = FRAME_MESSAGE_BUF (frame); |
ad692b76edf4
* dispnew.c (remake_frame_glyphs): When re-allocating the frame's
Jim Blandy <jimb@redhat.com>
parents:
1849
diff
changeset
|
359 } |
314 | 360 else |
764 | 361 FRAME_MESSAGE_BUF (frame) |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
362 = (char *) xmalloc (FRAME_MESSAGE_BUF_SIZE (frame) + 1); |
314 | 363 |
764 | 364 FRAME_CURRENT_GLYPHS (frame) = make_frame_glyphs (frame, 0); |
365 FRAME_DESIRED_GLYPHS (frame) = make_frame_glyphs (frame, 0); | |
366 FRAME_TEMP_GLYPHS (frame) = make_frame_glyphs (frame, 1); | |
15395
b584c2db055f
(change_frame_size, remake_frame_glyphs): Use FRAME_WINDOW_P.
Richard M. Stallman <rms@gnu.org>
parents:
15394
diff
changeset
|
367 if (FRAME_WINDOW_P (frame) || frame == selected_frame) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
368 SET_FRAME_GARBAGED (frame); |
314 | 369 } |
370 | |
764 | 371 /* Return the hash code of contents of line VPOS in frame-matrix M. */ |
314 | 372 |
373 static int | |
374 line_hash_code (m, vpos) | |
764 | 375 register struct frame_glyphs *m; |
314 | 376 int vpos; |
377 { | |
378 register GLYPH *body, *end; | |
379 register int h = 0; | |
380 | |
381 if (!m->enable[vpos]) | |
382 return 0; | |
383 | |
1495
f17665e7347e
(count_blanks): Leave argument r constant, and increment p.
Richard M. Stallman <rms@gnu.org>
parents:
1407
diff
changeset
|
384 /* Give all highlighted lines the same hash code |
314 | 385 so as to encourage scrolling to leave them in place. */ |
386 if (m->highlight[vpos]) | |
387 return -1; | |
388 | |
389 body = m->glyphs[vpos]; | |
390 | |
391 if (must_write_spaces) | |
392 while (1) | |
393 { | |
394 GLYPH g = *body++; | |
395 | |
396 if (g == 0) | |
397 break; | |
398 h = (((h << 4) + (h >> 24)) & 0x0fffffff) + g - SPACEGLYPH; | |
399 } | |
400 else | |
401 while (1) | |
402 { | |
403 GLYPH g = *body++; | |
404 | |
405 if (g == 0) | |
406 break; | |
407 h = (((h << 4) + (h >> 24)) & 0x0fffffff) + g; | |
408 } | |
409 | |
410 if (h) | |
411 return h; | |
412 return 1; | |
413 } | |
414 | |
415 /* Return number of characters in line in M at vpos VPOS, | |
416 except don't count leading and trailing spaces | |
417 unless the terminal requires those to be explicitly output. */ | |
418 | |
419 static unsigned int | |
420 line_draw_cost (m, vpos) | |
764 | 421 struct frame_glyphs *m; |
314 | 422 int vpos; |
423 { | |
424 register GLYPH *beg = m->glyphs[vpos]; | |
425 register GLYPH *end = m->glyphs[vpos] + m->used[vpos]; | |
426 register int i; | |
427 register int tlen = GLYPH_TABLE_LENGTH; | |
428 register Lisp_Object *tbase = GLYPH_TABLE_BASE; | |
429 | |
430 /* Ignore trailing and leading spaces if we can. */ | |
431 if (!must_write_spaces) | |
432 { | |
433 while ((end != beg) && (*end == SPACEGLYPH)) | |
434 --end; | |
435 if (end == beg) | |
436 return (0); /* All blank line. */ | |
437 | |
438 while (*beg == SPACEGLYPH) | |
439 ++beg; | |
440 } | |
441 | |
442 /* If we don't have a glyph-table, each glyph is one character, | |
443 so return the number of glyphs. */ | |
444 if (tbase == 0) | |
445 return end - beg; | |
446 | |
447 /* Otherwise, scan the glyphs and accumulate their total size in I. */ | |
448 i = 0; | |
449 while ((beg <= end) && *beg) | |
450 { | |
451 register GLYPH g = *beg++; | |
452 | |
453 if (GLYPH_SIMPLE_P (tbase, tlen, g)) | |
454 i += 1; | |
455 else | |
456 i += GLYPH_LENGTH (tbase, g); | |
457 } | |
458 return i; | |
459 } | |
460 | |
461 /* The functions on this page are the interface from xdisp.c to redisplay. | |
462 | |
463 The only other interface into redisplay is through setting | |
764 | 464 FRAME_CURSOR_X (frame) and FRAME_CURSOR_Y (frame) |
465 and SET_FRAME_GARBAGED (frame). */ | |
314 | 466 |
467 /* cancel_line eliminates any request to display a line at position `vpos' */ | |
468 | |
764 | 469 cancel_line (vpos, frame) |
314 | 470 int vpos; |
764 | 471 register FRAME_PTR frame; |
314 | 472 { |
764 | 473 FRAME_DESIRED_GLYPHS (frame)->enable[vpos] = 0; |
314 | 474 } |
475 | |
764 | 476 clear_frame_records (frame) |
477 register FRAME_PTR frame; | |
314 | 478 { |
764 | 479 bzero (FRAME_CURRENT_GLYPHS (frame)->enable, FRAME_HEIGHT (frame)); |
314 | 480 } |
481 | |
11411
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
482 /* Clear out all display lines for a coming redisplay. */ |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
483 |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
484 void |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
485 init_desired_glyphs (frame) |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
486 register FRAME_PTR frame; |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
487 { |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
488 register struct frame_glyphs *desired_glyphs = FRAME_DESIRED_GLYPHS (frame); |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
489 int vpos; |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
490 int height = FRAME_HEIGHT (frame); |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
491 |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
492 for (vpos = 0; vpos < height; vpos++) |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
493 desired_glyphs->enable[vpos] = 0; |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
494 } |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
495 |
314 | 496 /* Prepare to display on line VPOS starting at HPOS within it. */ |
497 | |
498 void | |
764 | 499 get_display_line (frame, vpos, hpos) |
500 register FRAME_PTR frame; | |
314 | 501 int vpos; |
502 register int hpos; | |
503 { | |
764 | 504 register struct frame_glyphs *glyphs; |
505 register struct frame_glyphs *desired_glyphs = FRAME_DESIRED_GLYPHS (frame); | |
314 | 506 register GLYPH *p; |
507 | |
1192
5c380ec3cfc6
* dispnew.c (get_display_line): Don't abort if the frame is
Jim Blandy <jimb@redhat.com>
parents:
1042
diff
changeset
|
508 if (vpos < 0) |
314 | 509 abort (); |
510 | |
511 if (! desired_glyphs->enable[vpos]) | |
512 { | |
513 desired_glyphs->used[vpos] = 0; | |
514 desired_glyphs->highlight[vpos] = 0; | |
515 desired_glyphs->enable[vpos] = 1; | |
516 } | |
517 | |
518 if (hpos > desired_glyphs->used[vpos]) | |
519 { | |
520 GLYPH *g = desired_glyphs->glyphs[vpos] + desired_glyphs->used[vpos]; | |
521 GLYPH *end = desired_glyphs->glyphs[vpos] + hpos; | |
522 | |
523 desired_glyphs->used[vpos] = hpos; | |
524 while (g != end) | |
525 *g++ = SPACEGLYPH; | |
526 } | |
527 } | |
528 | |
529 /* Like bcopy except never gets confused by overlap. */ | |
530 | |
531 void | |
532 safe_bcopy (from, to, size) | |
533 char *from, *to; | |
534 int size; | |
535 { | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
536 if (size <= 0 || from == to) |
314 | 537 return; |
538 | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
539 /* If the source and destination don't overlap, then bcopy can |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
540 handle it. If they do overlap, but the destination is lower in |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
541 memory than the source, we'll assume bcopy can handle that. */ |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
542 if (to < from || from + size <= to) |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
543 bcopy (from, to, size); |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
544 |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
545 /* Otherwise, we'll copy from the end. */ |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
546 else |
314 | 547 { |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
548 register char *endf = from + size; |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
549 register char *endt = to + size; |
314 | 550 |
551 /* If TO - FROM is large, then we should break the copy into | |
552 nonoverlapping chunks of TO - FROM bytes each. However, if | |
553 TO - FROM is small, then the bcopy function call overhead | |
554 makes this not worth it. The crossover point could be about | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
555 anywhere. Since I don't think the obvious copy loop is too |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
556 bad, I'm trying to err in its favor. */ |
314 | 557 if (to - from < 64) |
558 { | |
559 do | |
560 *--endt = *--endf; | |
561 while (endf != from); | |
562 } | |
563 else | |
564 { | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
565 for (;;) |
314 | 566 { |
567 endt -= (to - from); | |
568 endf -= (to - from); | |
569 | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
570 if (endt < to) |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
571 break; |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
572 |
314 | 573 bcopy (endf, endt, to - from); |
574 } | |
1588
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
575 |
732a88db381f
* dispnew.c [not MULTI_FRAME] (Fredraw_display): Pass the correct
Jim Blandy <jimb@redhat.com>
parents:
1495
diff
changeset
|
576 /* If SIZE wasn't a multiple of TO - FROM, there will be a |
314 | 577 little left over. The amount left over is |
578 (endt + (to - from)) - to, which is endt - from. */ | |
579 bcopy (from, to, endt - from); | |
580 } | |
581 } | |
582 } | |
583 | |
352 | 584 /* Rotate a vector of SIZE bytes right, by DISTANCE bytes. |
314 | 585 DISTANCE may be negative. */ |
586 | |
587 static void | |
588 rotate_vector (vector, size, distance) | |
589 char *vector; | |
590 int size; | |
591 int distance; | |
592 { | |
593 char *temp = (char *) alloca (size); | |
594 | |
595 if (distance < 0) | |
596 distance += size; | |
597 | |
598 bcopy (vector, temp + distance, size - distance); | |
599 bcopy (vector + size - distance, temp, distance); | |
600 bcopy (temp, vector, size); | |
601 } | |
602 | |
603 /* Scroll lines from vpos FROM up to but not including vpos END | |
604 down by AMOUNT lines (AMOUNT may be negative). | |
605 Returns nonzero if done, zero if terminal cannot scroll them. */ | |
606 | |
607 int | |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
608 scroll_frame_lines (frame, from, end, amount, newpos) |
764 | 609 register FRAME_PTR frame; |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
610 int from, end, amount, newpos; |
314 | 611 { |
612 register int i; | |
764 | 613 register struct frame_glyphs *current_frame |
614 = FRAME_CURRENT_GLYPHS (frame); | |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
615 int pos_adjust; |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
616 int width = FRAME_WINDOW_WIDTH (frame); |
314 | 617 |
618 if (!line_ins_del_ok) | |
619 return 0; | |
620 | |
621 if (amount == 0) | |
622 return 1; | |
623 | |
624 if (amount > 0) | |
625 { | |
764 | 626 update_begin (frame); |
314 | 627 set_terminal_window (end + amount); |
628 if (!scroll_region_ok) | |
629 ins_del_lines (end, -amount); | |
630 ins_del_lines (from, amount); | |
631 set_terminal_window (0); | |
632 | |
764 | 633 rotate_vector (current_frame->glyphs + from, |
314 | 634 sizeof (GLYPH *) * (end + amount - from), |
635 amount * sizeof (GLYPH *)); | |
636 | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
637 rotate_vector (current_frame->charstarts + from, |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
638 sizeof (int *) * (end + amount - from), |
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
639 amount * sizeof (int *)); |
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
640 |
764 | 641 safe_bcopy (current_frame->used + from, |
642 current_frame->used + from + amount, | |
643 (end - from) * sizeof current_frame->used[0]); | |
314 | 644 |
764 | 645 safe_bcopy (current_frame->highlight + from, |
646 current_frame->highlight + from + amount, | |
647 (end - from) * sizeof current_frame->highlight[0]); | |
314 | 648 |
764 | 649 safe_bcopy (current_frame->enable + from, |
650 current_frame->enable + from + amount, | |
651 (end - from) * sizeof current_frame->enable[0]); | |
314 | 652 |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
653 /* Adjust the lines by an amount |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
654 that puts the first of them at NEWPOS. */ |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
655 pos_adjust = newpos - current_frame->charstarts[from + amount][0]; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
656 |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
657 /* Offset each char position in the charstarts lines we moved |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
658 by pos_adjust. */ |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
659 for (i = from + amount; i < end + amount; i++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
660 { |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
661 int *line = current_frame->charstarts[i]; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
662 int col; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
663 for (col = 0; col < width; col++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
664 if (line[col] > 0) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
665 line[col] += pos_adjust; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
666 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
667 for (i = from; i < from + amount; i++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
668 { |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
669 int *line = current_frame->charstarts[i]; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
670 int col; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
671 line[0] = -1; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
672 for (col = 0; col < width; col++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
673 line[col] = 0; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
674 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
675 |
314 | 676 /* Mark the lines made empty by scrolling as enabled, empty and |
677 normal video. */ | |
764 | 678 bzero (current_frame->used + from, |
679 amount * sizeof current_frame->used[0]); | |
680 bzero (current_frame->highlight + from, | |
681 amount * sizeof current_frame->highlight[0]); | |
314 | 682 for (i = from; i < from + amount; i++) |
683 { | |
764 | 684 current_frame->glyphs[i][0] = '\0'; |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
685 current_frame->charstarts[i][0] = -1; |
764 | 686 current_frame->enable[i] = 1; |
314 | 687 } |
688 | |
764 | 689 safe_bcopy (current_frame->bufp + from, |
690 current_frame->bufp + from + amount, | |
691 (end - from) * sizeof current_frame->bufp[0]); | |
314 | 692 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
693 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
694 if (FRAME_WINDOW_P (frame)) |
314 | 695 { |
764 | 696 safe_bcopy (current_frame->top_left_x + from, |
697 current_frame->top_left_x + from + amount, | |
698 (end - from) * sizeof current_frame->top_left_x[0]); | |
314 | 699 |
764 | 700 safe_bcopy (current_frame->top_left_y + from, |
701 current_frame->top_left_y + from + amount, | |
702 (end - from) * sizeof current_frame->top_left_y[0]); | |
314 | 703 |
764 | 704 safe_bcopy (current_frame->pix_width + from, |
705 current_frame->pix_width + from + amount, | |
706 (end - from) * sizeof current_frame->pix_width[0]); | |
314 | 707 |
764 | 708 safe_bcopy (current_frame->pix_height + from, |
709 current_frame->pix_height + from + amount, | |
710 (end - from) * sizeof current_frame->pix_height[0]); | |
1407
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
711 |
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
712 safe_bcopy (current_frame->max_ascent + from, |
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
713 current_frame->max_ascent + from + amount, |
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
714 (end - from) * sizeof current_frame->max_ascent[0]); |
314 | 715 } |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
716 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 717 |
764 | 718 update_end (frame); |
314 | 719 } |
720 if (amount < 0) | |
721 { | |
764 | 722 update_begin (frame); |
314 | 723 set_terminal_window (end); |
724 ins_del_lines (from + amount, amount); | |
725 if (!scroll_region_ok) | |
726 ins_del_lines (end + amount, -amount); | |
727 set_terminal_window (0); | |
728 | |
764 | 729 rotate_vector (current_frame->glyphs + from + amount, |
314 | 730 sizeof (GLYPH *) * (end - from - amount), |
731 amount * sizeof (GLYPH *)); | |
732 | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
733 rotate_vector (current_frame->charstarts + from + amount, |
6627
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
734 sizeof (int *) * (end - from - amount), |
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
735 amount * sizeof (int *)); |
f8471ecf787b
(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts.
Richard M. Stallman <rms@gnu.org>
parents:
6620
diff
changeset
|
736 |
764 | 737 safe_bcopy (current_frame->used + from, |
738 current_frame->used + from + amount, | |
739 (end - from) * sizeof current_frame->used[0]); | |
314 | 740 |
764 | 741 safe_bcopy (current_frame->highlight + from, |
742 current_frame->highlight + from + amount, | |
743 (end - from) * sizeof current_frame->highlight[0]); | |
314 | 744 |
764 | 745 safe_bcopy (current_frame->enable + from, |
746 current_frame->enable + from + amount, | |
747 (end - from) * sizeof current_frame->enable[0]); | |
314 | 748 |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
749 /* Adjust the lines by an amount |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
750 that puts the first of them at NEWPOS. */ |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
751 pos_adjust = newpos - current_frame->charstarts[from + amount][0]; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
752 |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
753 /* Offset each char position in the charstarts lines we moved |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
754 by pos_adjust. */ |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
755 for (i = from + amount; i < end + amount; i++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
756 { |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
757 int *line = current_frame->charstarts[i]; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
758 int col; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
759 for (col = 0; col < width; col++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
760 if (line[col] > 0) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
761 line[col] += pos_adjust; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
762 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
763 for (i = end + amount; i < end; i++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
764 { |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
765 int *line = current_frame->charstarts[i]; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
766 int col; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
767 line[0] = -1; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
768 for (col = 0; col < width; col++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
769 line[col] = 0; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
770 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
771 |
314 | 772 /* Mark the lines made empty by scrolling as enabled, empty and |
773 normal video. */ | |
764 | 774 bzero (current_frame->used + end + amount, |
775 - amount * sizeof current_frame->used[0]); | |
776 bzero (current_frame->highlight + end + amount, | |
777 - amount * sizeof current_frame->highlight[0]); | |
314 | 778 for (i = end + amount; i < end; i++) |
779 { | |
764 | 780 current_frame->glyphs[i][0] = '\0'; |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
781 current_frame->charstarts[i][0] = 0; |
764 | 782 current_frame->enable[i] = 1; |
314 | 783 } |
784 | |
764 | 785 safe_bcopy (current_frame->bufp + from, |
786 current_frame->bufp + from + amount, | |
787 (end - from) * sizeof current_frame->bufp[0]); | |
314 | 788 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
789 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
790 if (FRAME_WINDOW_P (frame)) |
314 | 791 { |
764 | 792 safe_bcopy (current_frame->top_left_x + from, |
793 current_frame->top_left_x + from + amount, | |
794 (end - from) * sizeof current_frame->top_left_x[0]); | |
314 | 795 |
764 | 796 safe_bcopy (current_frame->top_left_y + from, |
797 current_frame->top_left_y + from + amount, | |
798 (end - from) * sizeof current_frame->top_left_y[0]); | |
314 | 799 |
764 | 800 safe_bcopy (current_frame->pix_width + from, |
801 current_frame->pix_width + from + amount, | |
802 (end - from) * sizeof current_frame->pix_width[0]); | |
314 | 803 |
764 | 804 safe_bcopy (current_frame->pix_height + from, |
805 current_frame->pix_height + from + amount, | |
806 (end - from) * sizeof current_frame->pix_height[0]); | |
1407
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
807 |
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
808 safe_bcopy (current_frame->max_ascent + from, |
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
809 current_frame->max_ascent + from + amount, |
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
810 (end - from) * sizeof current_frame->max_ascent[0]); |
314 | 811 } |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
812 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 813 |
764 | 814 update_end (frame); |
314 | 815 } |
816 return 1; | |
817 } | |
818 | |
764 | 819 /* After updating a window W that isn't the full frame wide, |
314 | 820 copy all the columns that W does not occupy |
764 | 821 into the FRAME_DESIRED_GLYPHS (frame) from the FRAME_PHYS_GLYPHS (frame) |
822 so that update_frame will not change those columns. */ | |
314 | 823 |
824 preserve_other_columns (w) | |
825 struct window *w; | |
826 { | |
827 register int vpos; | |
764 | 828 register struct frame_glyphs *current_frame, *desired_frame; |
829 register FRAME_PTR frame = XFRAME (w->frame); | |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
830 int start = WINDOW_LEFT_MARGIN (w); |
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
831 int end = WINDOW_RIGHT_EDGE (w); |
314 | 832 int bot = XFASTINT (w->top) + XFASTINT (w->height); |
833 | |
764 | 834 current_frame = FRAME_CURRENT_GLYPHS (frame); |
835 desired_frame = FRAME_DESIRED_GLYPHS (frame); | |
314 | 836 |
837 for (vpos = XFASTINT (w->top); vpos < bot; vpos++) | |
838 { | |
764 | 839 if (current_frame->enable[vpos] && desired_frame->enable[vpos]) |
314 | 840 { |
841 if (start > 0) | |
842 { | |
843 int len; | |
844 | |
764 | 845 bcopy (current_frame->glyphs[vpos], |
2930
839f3d132ee0
* dispnew.c (preserve_other_columns): Remember to multiply the
Jim Blandy <jimb@redhat.com>
parents:
2794
diff
changeset
|
846 desired_frame->glyphs[vpos], |
8878
066fab036ab5
(preserve_other_columns): Fix arg to sizeof in bcopy call.
Richard M. Stallman <rms@gnu.org>
parents:
8665
diff
changeset
|
847 start * sizeof (current_frame->glyphs[vpos][0])); |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
848 bcopy (current_frame->charstarts[vpos], |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
849 desired_frame->charstarts[vpos], |
8878
066fab036ab5
(preserve_other_columns): Fix arg to sizeof in bcopy call.
Richard M. Stallman <rms@gnu.org>
parents:
8665
diff
changeset
|
850 start * sizeof (current_frame->charstarts[vpos][0])); |
764 | 851 len = min (start, current_frame->used[vpos]); |
852 if (desired_frame->used[vpos] < len) | |
853 desired_frame->used[vpos] = len; | |
314 | 854 } |
764 | 855 if (current_frame->used[vpos] > end |
856 && desired_frame->used[vpos] < current_frame->used[vpos]) | |
314 | 857 { |
764 | 858 while (desired_frame->used[vpos] < end) |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
859 { |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
860 int used = desired_frame->used[vpos]++; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
861 desired_frame->glyphs[vpos][used] = SPACEGLYPH; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
862 desired_frame->glyphs[vpos][used] = 0; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
863 } |
764 | 864 bcopy (current_frame->glyphs[vpos] + end, |
865 desired_frame->glyphs[vpos] + end, | |
2930
839f3d132ee0
* dispnew.c (preserve_other_columns): Remember to multiply the
Jim Blandy <jimb@redhat.com>
parents:
2794
diff
changeset
|
866 ((current_frame->used[vpos] - end) |
8878
066fab036ab5
(preserve_other_columns): Fix arg to sizeof in bcopy call.
Richard M. Stallman <rms@gnu.org>
parents:
8665
diff
changeset
|
867 * sizeof (current_frame->glyphs[vpos][0]))); |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
868 bcopy (current_frame->charstarts[vpos] + end, |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
869 desired_frame->charstarts[vpos] + end, |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
870 ((current_frame->used[vpos] - end) |
8878
066fab036ab5
(preserve_other_columns): Fix arg to sizeof in bcopy call.
Richard M. Stallman <rms@gnu.org>
parents:
8665
diff
changeset
|
871 * sizeof (current_frame->charstarts[vpos][0]))); |
764 | 872 desired_frame->used[vpos] = current_frame->used[vpos]; |
314 | 873 } |
874 } | |
875 } | |
876 } | |
877 | |
878 #if 0 | |
879 | |
764 | 880 /* If window w does not need to be updated and isn't the full frame wide, |
314 | 881 copy all the columns that w does occupy |
764 | 882 into the FRAME_DESIRED_LINES (frame) from the FRAME_PHYS_LINES (frame) |
883 so that update_frame will not change those columns. | |
314 | 884 |
885 Have not been able to figure out how to use this correctly. */ | |
886 | |
887 preserve_my_columns (w) | |
888 struct window *w; | |
889 { | |
890 register int vpos, fin; | |
764 | 891 register struct frame_glyphs *l1, *l2; |
892 register FRAME_PTR frame = XFRAME (w->frame); | |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
893 int start = WINDOW_LEFT_MARGIN (w); |
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
894 int end = WINDOW_RIGHT_EDGE (w); |
314 | 895 int bot = XFASTINT (w->top) + XFASTINT (w->height); |
896 | |
897 for (vpos = XFASTINT (w->top); vpos < bot; vpos++) | |
898 { | |
764 | 899 if ((l1 = FRAME_DESIRED_GLYPHS (frame)->glyphs[vpos + 1]) |
900 && (l2 = FRAME_PHYS_GLYPHS (frame)->glyphs[vpos + 1])) | |
314 | 901 { |
902 if (l2->length > start && l1->length < l2->length) | |
903 { | |
904 fin = l2->length; | |
905 if (fin > end) fin = end; | |
906 while (l1->length < start) | |
907 l1->body[l1->length++] = ' '; | |
908 bcopy (l2->body + start, l1->body + start, fin - start); | |
909 l1->length = fin; | |
910 } | |
911 } | |
912 } | |
913 } | |
914 | |
915 #endif | |
916 | |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
917 /* Adjust by ADJUST the charstart values in window W |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
918 after vpos VPOS, which counts relative to the frame |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
919 (not relative to W itself). */ |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
920 |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
921 void |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
922 adjust_window_charstarts (w, vpos, adjust) |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
923 struct window *w; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
924 int vpos; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
925 int adjust; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
926 { |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
927 int left = WINDOW_LEFT_MARGIN (w); |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
928 int top = XFASTINT (w->top); |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
929 int right = left + window_internal_width (w); |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
930 int bottom = top + window_internal_height (w); |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
931 int i; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
932 |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
933 for (i = vpos + 1; i < bottom; i++) |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
934 { |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
935 int *charstart |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
936 = FRAME_CURRENT_GLYPHS (XFRAME (WINDOW_FRAME (w)))->charstarts[i]; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
937 int j; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
938 for (j = left; j < right; j++) |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
939 if (charstart[j] > 0) |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
940 charstart[j] += adjust; |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
941 } |
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
942 } |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
943 |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
944 /* Check the charstarts values in the area of window W |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
945 for internal consistency. We cannot check that they are "right"; |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
946 we can only look for something nonsensical. */ |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
947 |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
948 verify_charstarts (w) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
949 struct window *w; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
950 { |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
951 FRAME_PTR f = XFRAME (WINDOW_FRAME (w)); |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
952 int i; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
953 int top = XFASTINT (w->top); |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
954 int bottom = top + window_internal_height (w); |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
955 int left = WINDOW_LEFT_MARGIN (w); |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
956 int right = left + window_internal_width (w); |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
957 int next_line; |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
958 int truncate = (XINT (w->hscroll) |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
959 || (truncate_partial_width_windows |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
960 && !WINDOW_FULL_WIDTH_P (w)) |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
961 || !NILP (XBUFFER (w->buffer)->truncate_lines)); |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
962 |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
963 for (i = top; i < bottom; i++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
964 { |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
965 int j; |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
966 int last; |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
967 int *charstart = FRAME_CURRENT_GLYPHS (f)->charstarts[i]; |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
968 |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
969 if (i != top) |
6682
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
970 { |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
971 if (truncate) |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
972 { |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
973 /* If we are truncating lines, allow a jump |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
974 in charstarts from one line to the next. */ |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
975 if (charstart[left] < next_line) |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
976 abort (); |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
977 } |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
978 else |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
979 { |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
980 if (charstart[left] != next_line) |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
981 abort (); |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
982 } |
16ab14205588
(verify_charstarts): Handle truncation of lines.
Richard M. Stallman <rms@gnu.org>
parents:
6648
diff
changeset
|
983 } |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
984 |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
985 for (j = left; j < right; j++) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
986 if (charstart[j] > 0) |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
987 last = charstart[j]; |
6645
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
988 /* Record where the next line should start. */ |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
989 next_line = last; |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
990 if (BUF_ZV (XBUFFER (w->buffer)) != last) |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
991 { |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
992 /* If there's a newline between the two lines, count that. */ |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
993 int endchar = *BUF_CHAR_ADDRESS (XBUFFER (w->buffer), last); |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
994 if (endchar == '\n') |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
995 next_line++; |
ba0c1af167e6
(verify_charstarts): Count right for continued lines.
Richard M. Stallman <rms@gnu.org>
parents:
6642
diff
changeset
|
996 } |
6642
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
997 } |
2fda5dd17356
(verify_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6627
diff
changeset
|
998 } |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
999 |
314 | 1000 /* On discovering that the redisplay for a window was no good, |
1001 cancel the columns of that window, so that when the window is | |
1002 displayed over again get_display_line will not complain. */ | |
1003 | |
1004 cancel_my_columns (w) | |
1005 struct window *w; | |
1006 { | |
1007 register int vpos; | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1008 register struct frame_glyphs *desired_glyphs |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1009 = FRAME_DESIRED_GLYPHS (XFRAME (w->frame)); |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1010 register int start = WINDOW_LEFT_MARGIN (w); |
314 | 1011 register int bot = XFASTINT (w->top) + XFASTINT (w->height); |
1012 | |
1013 for (vpos = XFASTINT (w->top); vpos < bot; vpos++) | |
1014 if (desired_glyphs->enable[vpos] | |
1015 && desired_glyphs->used[vpos] >= start) | |
1016 desired_glyphs->used[vpos] = start; | |
1017 } | |
1018 | |
764 | 1019 /* These functions try to perform directly and immediately on the frame |
314 | 1020 the necessary output for one change in the buffer. |
1021 They may return 0 meaning nothing was done if anything is difficult, | |
1022 or 1 meaning the output was performed properly. | |
764 | 1023 They assume that the frame was up to date before the buffer |
1495
f17665e7347e
(count_blanks): Leave argument r constant, and increment p.
Richard M. Stallman <rms@gnu.org>
parents:
1407
diff
changeset
|
1024 change being displayed. They make various other assumptions too; |
314 | 1025 see command_loop_1 where these are called. */ |
1026 | |
1027 int | |
1028 direct_output_for_insert (g) | |
1029 int g; | |
1030 { | |
764 | 1031 register FRAME_PTR frame = selected_frame; |
1032 register struct frame_glyphs *current_frame | |
1033 = FRAME_CURRENT_GLYPHS (frame); | |
314 | 1034 |
1035 #ifndef COMPILER_REGISTER_BUG | |
1036 register | |
1037 #endif /* COMPILER_REGISTER_BUG */ | |
1038 struct window *w = XWINDOW (selected_window); | |
1039 #ifndef COMPILER_REGISTER_BUG | |
1040 register | |
1041 #endif /* COMPILER_REGISTER_BUG */ | |
764 | 1042 int hpos = FRAME_CURSOR_X (frame); |
314 | 1043 #ifndef COMPILER_REGISTER_BUG |
1044 register | |
1045 #endif /* COMPILER_REGISTER_BUG */ | |
764 | 1046 int vpos = FRAME_CURSOR_Y (frame); |
314 | 1047 |
1777
4edfaa19c7a7
* window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents:
1766
diff
changeset
|
1048 /* Give up if about to continue line. */ |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1049 if (hpos >= WINDOW_LEFT_MARGIN (w) + window_internal_width (w) - 1 |
1777
4edfaa19c7a7
* window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents:
1766
diff
changeset
|
1050 |
314 | 1051 /* Avoid losing if cursor is in invisible text off left margin */ |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1052 || (XINT (w->hscroll) && hpos == WINDOW_LEFT_MARGIN (w)) |
314 | 1053 |
1054 /* Give up if cursor outside window (in minibuf, probably) */ | |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1055 || cursor_in_echo_area |
764 | 1056 || FRAME_CURSOR_Y (frame) < XFASTINT (w->top) |
1057 || FRAME_CURSOR_Y (frame) >= XFASTINT (w->top) + XFASTINT (w->height) | |
314 | 1058 |
764 | 1059 /* Give up if cursor not really at FRAME_CURSOR_X, FRAME_CURSOR_Y */ |
314 | 1060 || !display_completed |
1061 | |
1062 /* Give up if buffer appears in two places. */ | |
1063 || buffer_shared > 1 | |
1064 | |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1065 #ifdef USE_TEXT_PROPERTIES |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1066 /* Intervals have already been adjusted, point is after the |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1067 character that was just inserted. */ |
6068
f67817990735
(direct_output_for_insert): Fix comment.
Karl Heuer <kwzh@gnu.org>
parents:
5885
diff
changeset
|
1068 /* Give up if character is invisible. */ |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1069 /* Give up if character has a face property. |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1070 At the moment we only lose at end of line or end of buffer |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1071 and only with faces that have some background */ |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1072 /* Instead of wasting time, give up if character has any text properties */ |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1073 || ! NILP (Ftext_properties_at (make_number (PT - 1), Qnil)) |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1074 #endif |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1075 |
314 | 1076 /* Give up if w is minibuffer and a message is being displayed there */ |
1077 || (MINI_WINDOW_P (w) && echo_area_glyphs)) | |
1078 return 0; | |
1079 | |
2778
071fa2f469d7
* dispnew.c (direct_output_for_insert): Compute the face of the
Jim Blandy <jimb@redhat.com>
parents:
2648
diff
changeset
|
1080 { |
8301
c01188c50e70
(direct_output_for_insert): Dpn't call compute_char_face
Richard M. Stallman <rms@gnu.org>
parents:
8286
diff
changeset
|
1081 int face = 0; |
9572 | 1082 #ifdef HAVE_FACES |
2778
071fa2f469d7
* dispnew.c (direct_output_for_insert): Compute the face of the
Jim Blandy <jimb@redhat.com>
parents:
2648
diff
changeset
|
1083 int dummy; |
8301
c01188c50e70
(direct_output_for_insert): Dpn't call compute_char_face
Richard M. Stallman <rms@gnu.org>
parents:
8286
diff
changeset
|
1084 |
15394
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
1085 if (FRAME_WINDOW_P (frame) || FRAME_MSDOS_P (frame)) |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1086 face = compute_char_face (frame, w, PT - 1, -1, -1, &dummy, PT, 0); |
2778
071fa2f469d7
* dispnew.c (direct_output_for_insert): Compute the face of the
Jim Blandy <jimb@redhat.com>
parents:
2648
diff
changeset
|
1087 #endif |
6414
d681b16231a8
(direct_output_for_insert): Handle termcap frames as well as X.
Karl Heuer <kwzh@gnu.org>
parents:
6349
diff
changeset
|
1088 current_frame->glyphs[vpos][hpos] = MAKE_GLYPH (frame, g, face); |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1089 current_frame->charstarts[vpos][hpos] = PT - 1; |
6648
c7eefaee311c
(direct_output_for_insert): Add charstarts entry after the new char.
Richard M. Stallman <rms@gnu.org>
parents:
6645
diff
changeset
|
1090 /* Record the entry for after the newly inserted character. */ |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1091 current_frame->charstarts[vpos][hpos + 1] = PT; |
6620
990d7d5095dc
(adjust_window_charstarts): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6617
diff
changeset
|
1092 adjust_window_charstarts (w, vpos, 1); |
2778
071fa2f469d7
* dispnew.c (direct_output_for_insert): Compute the face of the
Jim Blandy <jimb@redhat.com>
parents:
2648
diff
changeset
|
1093 } |
314 | 1094 unchanged_modified = MODIFF; |
1095 beg_unchanged = GPT - BEG; | |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1096 XSETFASTINT (w->last_point, PT); |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
1097 XSETFASTINT (w->last_point_x, hpos); |
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
1098 XSETFASTINT (w->last_modified, MODIFF); |
16195
e15e4bdcb8cc
(direct_output_for_insert): Set last_overlay_modified field in window.
Richard M. Stallman <rms@gnu.org>
parents:
16051
diff
changeset
|
1099 XSETFASTINT (w->last_overlay_modified, OVERLAY_MODIFF); |
314 | 1100 |
1101 reassert_line_highlight (0, vpos); | |
764 | 1102 write_glyphs (¤t_frame->glyphs[vpos][hpos], 1); |
314 | 1103 fflush (stdout); |
764 | 1104 ++FRAME_CURSOR_X (frame); |
1105 if (hpos == current_frame->used[vpos]) | |
314 | 1106 { |
764 | 1107 current_frame->used[vpos] = hpos + 1; |
1108 current_frame->glyphs[vpos][hpos + 1] = 0; | |
314 | 1109 } |
1110 | |
1111 return 1; | |
1112 } | |
1113 | |
1114 int | |
1115 direct_output_forward_char (n) | |
1116 int n; | |
1117 { | |
764 | 1118 register FRAME_PTR frame = selected_frame; |
314 | 1119 register struct window *w = XWINDOW (selected_window); |
8903
03597c3eb63b
(direct_output_for_insert, direct_output_forward_char): Fix Lisp_Object
Karl Heuer <kwzh@gnu.org>
parents:
8878
diff
changeset
|
1120 Lisp_Object position; |
5223
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
1121 int hpos = FRAME_CURSOR_X (frame); |
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
1122 |
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
1123 /* Give up if in truncated text at end of line. */ |
18853
4501a367a887
(direct_output_forward_char): Reenable check against
Richard M. Stallman <rms@gnu.org>
parents:
18774
diff
changeset
|
1124 /* This check is not redundant. */ |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1125 if (hpos >= WINDOW_LEFT_MARGIN (w) + window_internal_width (w) - 1) |
5223
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
1126 return 0; |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1127 |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1128 /* Give up if the buffer's direction is reversed (i.e. right-to-left). */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1129 if (!NILP (XBUFFER(w->buffer)->direction_reversed)) |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1130 return 0; |
5223
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
1131 |
543 | 1132 /* Avoid losing if cursor is in invisible text off left margin |
1133 or about to go off either side of window. */ | |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1134 if ((FRAME_CURSOR_X (frame) == WINDOW_LEFT_MARGIN (w) |
543 | 1135 && (XINT (w->hscroll) || n < 0)) |
1136 || (n > 0 | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1137 && (FRAME_CURSOR_X (frame) + 1 |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1138 >= XFASTINT (w->left) + window_internal_width (w) - 1)) |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1139 /* BUG FIX: Added "XFASTINT (w->left)". Without this, |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1140 direct_output_forward_char() always fails on "the right" |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1141 window. */ |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1142 || cursor_in_echo_area) |
314 | 1143 return 0; |
11096
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
1144 |
2794
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
1145 /* Can't use direct output if highlighting a region. */ |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
1146 if (!NILP (Vtransient_mark_mode) && !NILP (current_buffer->mark_active)) |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
1147 return 0; |
9163e4e4752c
(direct_output_forward_char): Just give up
Richard M. Stallman <rms@gnu.org>
parents:
2778
diff
changeset
|
1148 |
11096
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
1149 /* Can't use direct output at an overlay boundary; it might have |
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
1150 before-string or after-string properties. */ |
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
1151 if (overlay_touches_p (PT) || overlay_touches_p (PT - n)) |
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
1152 return 0; |
cac0367b1794
(direct_output_forward_char): Don't use direct output at an overlay boundary.
Karl Heuer <kwzh@gnu.org>
parents:
10770
diff
changeset
|
1153 |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1154 #ifdef USE_TEXT_PROPERTIES |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1155 /* Don't use direct output next to an invisible character |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1156 since we might need to do something special. */ |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1157 |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1158 XSETFASTINT (position, PT); |
4551
1abd3007cbb6
(direct_output_forward_char): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
4384
diff
changeset
|
1159 if (XFASTINT (position) < ZV |
6069
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
1160 && ! NILP (Fget_char_property (position, |
4551
1abd3007cbb6
(direct_output_forward_char): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
4384
diff
changeset
|
1161 Qinvisible, |
6069
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
1162 selected_window))) |
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
1163 return 0; |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1164 |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1165 XSETFASTINT (position, PT - 1); |
4551
1abd3007cbb6
(direct_output_forward_char): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
4384
diff
changeset
|
1166 if (XFASTINT (position) >= BEGV |
6069
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
1167 && ! NILP (Fget_char_property (position, |
4551
1abd3007cbb6
(direct_output_forward_char): Fix previous change:
Richard M. Stallman <rms@gnu.org>
parents:
4384
diff
changeset
|
1168 Qinvisible, |
6069
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
1169 selected_window))) |
07045ca8ff19
(direct_output_forward_char): Use Fget_char_property to test for invisibility.
Karl Heuer <kwzh@gnu.org>
parents:
6068
diff
changeset
|
1170 return 0; |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1171 #endif |
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1172 |
764 | 1173 FRAME_CURSOR_X (frame) += n; |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
1174 XSETFASTINT (w->last_point_x, FRAME_CURSOR_X (frame)); |
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15896
diff
changeset
|
1175 XSETFASTINT (w->last_point, PT); |
764 | 1176 cursor_to (FRAME_CURSOR_Y (frame), FRAME_CURSOR_X (frame)); |
314 | 1177 fflush (stdout); |
4384
98605d0ea3cf
(direct_output_for_insert): Fail if character
Richard M. Stallman <rms@gnu.org>
parents:
4290
diff
changeset
|
1178 |
314 | 1179 return 1; |
1180 } | |
1181 | |
1182 static void update_line (); | |
1183 | |
764 | 1184 /* Update frame F based on the data in FRAME_DESIRED_GLYPHS. |
314 | 1185 Value is nonzero if redisplay stopped due to pending input. |
1186 FORCE nonzero means do not stop for pending input. */ | |
1187 | |
1188 int | |
764 | 1189 update_frame (f, force, inhibit_hairy_id) |
1190 FRAME_PTR f; | |
314 | 1191 int force; |
1192 int inhibit_hairy_id; | |
1193 { | |
7179
cb958b7d5fe1
(update_frame): Move assignments to current_frame and desired_frame.
Richard M. Stallman <rms@gnu.org>
parents:
6857
diff
changeset
|
1194 register struct frame_glyphs *current_frame; |
7188
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
1195 register struct frame_glyphs *desired_frame = 0; |
314 | 1196 register int i; |
1197 int pause; | |
1198 int preempt_count = baud_rate / 2400 + 1; | |
1199 extern input_pending; | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1200 #ifdef HAVE_WINDOW_SYSTEM |
314 | 1201 register int downto, leftmost; |
1202 #endif | |
1203 | |
10122
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
1204 if (baud_rate != FRAME_COST_BAUD_RATE (f)) |
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
1205 calculate_costs (f); |
3de6776ae141
(update_frame): Call calculate_costs if baud_rate changed.
Richard M. Stallman <rms@gnu.org>
parents:
9963
diff
changeset
|
1206 |
3357
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
1207 if (preempt_count <= 0) |
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
1208 preempt_count = 1; |
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
1209 |
764 | 1210 if (FRAME_HEIGHT (f) == 0) abort (); /* Some bug zeros some core */ |
314 | 1211 |
1212 detect_input_pending (); | |
1213 if (input_pending && !force) | |
1214 { | |
1215 pause = 1; | |
1216 goto do_pause; | |
1217 } | |
1218 | |
764 | 1219 update_begin (f); |
314 | 1220 |
1221 if (!line_ins_del_ok) | |
1222 inhibit_hairy_id = 1; | |
1223 | |
7188
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
1224 /* These are separate to avoid a possible bug in the AIX C compiler. */ |
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
1225 current_frame = FRAME_CURRENT_GLYPHS (f); |
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
1226 desired_frame = FRAME_DESIRED_GLYPHS (f); |
7da4ad9a2a8f
(update_frame): Move those assignments even farther down.
Richard M. Stallman <rms@gnu.org>
parents:
7179
diff
changeset
|
1227 |
493 | 1228 /* See if any of the desired lines are enabled; don't compute for |
1229 i/d line if just want cursor motion. */ | |
764 | 1230 for (i = 0; i < FRAME_HEIGHT (f); i++) |
1231 if (desired_frame->enable[i]) | |
314 | 1232 break; |
1233 | |
1234 /* Try doing i/d line, if not yet inhibited. */ | |
764 | 1235 if (!inhibit_hairy_id && i < FRAME_HEIGHT (f)) |
1236 force |= scrolling (f); | |
314 | 1237 |
1238 /* Update the individual lines as needed. Do bottom line first. */ | |
1239 | |
764 | 1240 if (desired_frame->enable[FRAME_HEIGHT (f) - 1]) |
1241 update_line (f, FRAME_HEIGHT (f) - 1); | |
314 | 1242 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1243 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1244 if (FRAME_WINDOW_P (f)) |
314 | 1245 { |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1246 leftmost = downto = FRAME_INTERNAL_BORDER_WIDTH (f); |
764 | 1247 if (desired_frame->enable[0]) |
314 | 1248 { |
764 | 1249 current_frame->top_left_x[FRAME_HEIGHT (f) - 1] = leftmost; |
1250 current_frame->top_left_y[FRAME_HEIGHT (f) - 1] | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1251 = PIXEL_HEIGHT (f) - FRAME_INTERNAL_BORDER_WIDTH (f) |
1407
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
1252 - current_frame->pix_height[FRAME_HEIGHT (f) - 1]; |
764 | 1253 current_frame->top_left_x[0] = leftmost; |
1254 current_frame->top_left_y[0] = downto; | |
314 | 1255 } |
1256 } | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1257 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 1258 |
1259 /* Now update the rest of the lines. */ | |
764 | 1260 for (i = 0; i < FRAME_HEIGHT (f) - 1 && (force || !input_pending); i++) |
314 | 1261 { |
764 | 1262 if (desired_frame->enable[i]) |
314 | 1263 { |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
1264 if (FRAME_TERMCAP_P (f)) |
314 | 1265 { |
1266 /* Flush out every so many lines. | |
1267 Also flush out if likely to have more than 1k buffered | |
1268 otherwise. I'm told that some telnet connections get | |
1269 really screwed by more than 1k output at once. */ | |
1270 int outq = PENDING_OUTPUT_COUNT (stdout); | |
1271 if (outq > 900 | |
1272 || (outq > 20 && ((i - 1) % preempt_count == 0))) | |
1273 { | |
1274 fflush (stdout); | |
1275 if (preempt_count == 1) | |
1276 { | |
554 | 1277 #ifdef EMACS_OUTQSIZE |
1278 if (EMACS_OUTQSIZE (0, &outq) < 0) | |
314 | 1279 /* Probably not a tty. Ignore the error and reset |
1280 * the outq count. */ | |
1281 outq = PENDING_OUTPUT_COUNT (stdout); | |
1282 #endif | |
1283 outq *= 10; | |
7530
57c2345a9002
(update_frame): Fix test of outq and baud_rate some more.
Richard M. Stallman <rms@gnu.org>
parents:
7529
diff
changeset
|
1284 if (baud_rate <= outq && baud_rate > 0) |
3357
d9523a958b3c
(update_frame): Make preempt_count positive.
Richard M. Stallman <rms@gnu.org>
parents:
3317
diff
changeset
|
1285 sleep (outq / baud_rate); |
314 | 1286 } |
1287 } | |
1288 } | |
1289 | |
16822
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
1290 if ((i - 1) % preempt_count == 0) |
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
1291 detect_input_pending (); |
483e137d5384
(update_frame): Call detect_input_pending
Richard M. Stallman <rms@gnu.org>
parents:
16589
diff
changeset
|
1292 |
764 | 1293 update_line (f, i); |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1294 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1295 if (FRAME_WINDOW_P (f)) |
314 | 1296 { |
764 | 1297 current_frame->top_left_y[i] = downto; |
1298 current_frame->top_left_x[i] = leftmost; | |
314 | 1299 } |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1300 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 1301 } |
1302 | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1303 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1304 if (FRAME_WINDOW_P (f)) |
1407
0f214040f708
* dispnew.c (scroll_frame_lines): All references to frame elements
Joseph Arceneaux <jla@gnu.org>
parents:
1192
diff
changeset
|
1305 downto += current_frame->pix_height[i]; |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1306 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 1307 } |
764 | 1308 pause = (i < FRAME_HEIGHT (f) - 1) ? i : 0; |
314 | 1309 |
1310 /* Now just clean up termcap drivers and set cursor, etc. */ | |
1311 if (!pause) | |
1312 { | |
12409
6e374b28ecc3
(update_frame): Pretend cursor is in echo area
Richard M. Stallman <rms@gnu.org>
parents:
12193
diff
changeset
|
1313 if ((cursor_in_echo_area |
12627
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1314 /* If we are showing a message instead of the minibuffer, |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1315 show the cursor for the message instead of for the |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1316 (now hidden) minibuffer contents. */ |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1317 || (EQ (minibuf_window, selected_window) |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1318 && EQ (minibuf_window, echo_area_window) |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1319 && echo_area_glyphs != 0)) |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1320 /* These cases apply only to the frame that contains |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1321 the active minibuffer window. */ |
c7bc7a24b1ff
(update_frame): Check that the echo area is in the frame being displayed.
Richard M. Stallman <rms@gnu.org>
parents:
12532
diff
changeset
|
1322 && FRAME_HAS_MINIBUF_P (f) |
14459
c1d25453a95f
(update_frame): Compare FRAME_MINIBUF_WINDOW(f)
Richard M. Stallman <rms@gnu.org>
parents:
14286
diff
changeset
|
1323 && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window)) |
708 | 1324 { |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1325 int top = XINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1326 int row, col; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1327 |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1328 if (cursor_in_echo_area < 0) |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1329 { |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1330 row = top; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1331 col = 0; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1332 } |
708 | 1333 else |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1334 { |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1335 /* If the minibuffer is several lines high, find the last |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1336 line that has any text on it. */ |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1337 row = FRAME_HEIGHT (f); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1338 do |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1339 { |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1340 row--; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1341 if (current_frame->enable[row]) |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1342 col = current_frame->used[row]; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1343 else |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1344 col = 0; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1345 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1346 while (row > top && col == 0); |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1347 |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
1348 if (col >= FRAME_WINDOW_WIDTH (f)) |
1042
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1349 { |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1350 col = 0; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1351 if (row < FRAME_HEIGHT (f) - 1) |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1352 row++; |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1353 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1354 } |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1355 |
41b77a76b885
* dispnew.c: Incude "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1003
diff
changeset
|
1356 cursor_to (row, col); |
708 | 1357 } |
314 | 1358 else |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1359 cursor_to (FRAME_CURSOR_Y (f), |
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1360 max (min (FRAME_CURSOR_X (f), |
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1361 FRAME_WINDOW_WIDTH (f) - 1), 0)); |
314 | 1362 } |
1363 | |
764 | 1364 update_end (f); |
314 | 1365 |
1366 if (termscript) | |
1367 fflush (termscript); | |
1368 fflush (stdout); | |
1369 | |
1370 /* Here if output is preempted because input is detected. */ | |
1371 do_pause: | |
1372 | |
764 | 1373 if (FRAME_HEIGHT (f) == 0) abort (); /* Some bug zeros some core */ |
314 | 1374 display_completed = !pause; |
1375 | |
7247
bead6db0bbf2
(update_frame): Fix previous change: unconditionally bzero at the end.
Richard M. Stallman <rms@gnu.org>
parents:
7188
diff
changeset
|
1376 bzero (FRAME_DESIRED_GLYPHS (f)->enable, FRAME_HEIGHT (f)); |
314 | 1377 return pause; |
1378 } | |
1379 | |
1380 /* Called when about to quit, to check for doing so | |
1381 at an improper time. */ | |
1382 | |
1383 void | |
1384 quit_error_check () | |
1385 { | |
13105
a9efbc138c23
(get_display_line): Don't abort if there's text
Richard M. Stallman <rms@gnu.org>
parents:
12917
diff
changeset
|
1386 #if 0 |
764 | 1387 if (FRAME_DESIRED_GLYPHS (selected_frame) == 0) |
314 | 1388 return; |
764 | 1389 if (FRAME_DESIRED_GLYPHS (selected_frame)->enable[0]) |
314 | 1390 abort (); |
764 | 1391 if (FRAME_DESIRED_GLYPHS (selected_frame)->enable[FRAME_HEIGHT (selected_frame) - 1]) |
314 | 1392 abort (); |
13105
a9efbc138c23
(get_display_line): Don't abort if there's text
Richard M. Stallman <rms@gnu.org>
parents:
12917
diff
changeset
|
1393 #endif |
314 | 1394 } |
1395 | |
1396 /* Decide what insert/delete line to do, and do it */ | |
1397 | |
1398 extern void scrolling_1 (); | |
1399 | |
764 | 1400 scrolling (frame) |
1401 FRAME_PTR frame; | |
314 | 1402 { |
1403 int unchanged_at_top, unchanged_at_bottom; | |
1404 int window_size; | |
1405 int changed_lines; | |
764 | 1406 int *old_hash = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); |
1407 int *new_hash = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); | |
1408 int *draw_cost = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); | |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
1409 int *old_draw_cost = (int *) alloca (FRAME_HEIGHT (frame) * sizeof (int)); |
314 | 1410 register int i; |
764 | 1411 int free_at_end_vpos = FRAME_HEIGHT (frame); |
1412 register struct frame_glyphs *current_frame = FRAME_CURRENT_GLYPHS (frame); | |
1413 register struct frame_glyphs *desired_frame = FRAME_DESIRED_GLYPHS (frame); | |
314 | 1414 |
1415 /* Compute hash codes of all the lines. | |
1416 Also calculate number of changed lines, | |
1417 number of unchanged lines at the beginning, | |
1418 and number of unchanged lines at the end. */ | |
1419 | |
1420 changed_lines = 0; | |
1421 unchanged_at_top = 0; | |
764 | 1422 unchanged_at_bottom = FRAME_HEIGHT (frame); |
1423 for (i = 0; i < FRAME_HEIGHT (frame); i++) | |
314 | 1424 { |
1425 /* Give up on this scrolling if some old lines are not enabled. */ | |
764 | 1426 if (!current_frame->enable[i]) |
314 | 1427 return 0; |
764 | 1428 old_hash[i] = line_hash_code (current_frame, i); |
1429 if (! desired_frame->enable[i]) | |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1430 { |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1431 /* This line cannot be redrawn, so don't let scrolling mess it. */ |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1432 new_hash[i] = old_hash[i]; |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1433 #define INFINITY 1000000 /* Taken from scroll.c */ |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1434 draw_cost[i] = INFINITY; |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1435 } |
314 | 1436 else |
18015
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1437 { |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1438 new_hash[i] = line_hash_code (desired_frame, i); |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1439 draw_cost[i] = line_draw_cost (desired_frame, i); |
934a44a3b34f
(scrolling): If a line is not enabled,
Richard M. Stallman <rms@gnu.org>
parents:
17961
diff
changeset
|
1440 } |
314 | 1441 |
1442 if (old_hash[i] != new_hash[i]) | |
1443 { | |
1444 changed_lines++; | |
764 | 1445 unchanged_at_bottom = FRAME_HEIGHT (frame) - i - 1; |
314 | 1446 } |
1447 else if (i == unchanged_at_top) | |
1448 unchanged_at_top++; | |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
1449 old_draw_cost[i] = line_draw_cost (current_frame, i); |
314 | 1450 } |
1451 | |
1452 /* If changed lines are few, don't allow preemption, don't scroll. */ | |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
1453 if (!scroll_region_ok && changed_lines < baud_rate / 2400 |
764 | 1454 || unchanged_at_bottom == FRAME_HEIGHT (frame)) |
314 | 1455 return 1; |
1456 | |
764 | 1457 window_size = (FRAME_HEIGHT (frame) - unchanged_at_top |
314 | 1458 - unchanged_at_bottom); |
1459 | |
1460 if (scroll_region_ok) | |
1461 free_at_end_vpos -= unchanged_at_bottom; | |
764 | 1462 else if (memory_below_frame) |
314 | 1463 free_at_end_vpos = -1; |
1464 | |
1465 /* If large window, fast terminal and few lines in common between | |
764 | 1466 current frame and desired frame, don't bother with i/d calc. */ |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
1467 if (!scroll_region_ok && window_size >= 18 && baud_rate > 2400 |
314 | 1468 && (window_size >= |
1469 10 * scrolling_max_lines_saved (unchanged_at_top, | |
764 | 1470 FRAME_HEIGHT (frame) - unchanged_at_bottom, |
314 | 1471 old_hash, new_hash, draw_cost))) |
1472 return 0; | |
1473 | |
764 | 1474 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom, |
314 | 1475 draw_cost + unchanged_at_top - 1, |
10259
48e4dfc6bb43
(scrolling): Fewer restrictions if scroll_region_ok is
Richard M. Stallman <rms@gnu.org>
parents:
10122
diff
changeset
|
1476 old_draw_cost + unchanged_at_top - 1, |
314 | 1477 old_hash + unchanged_at_top - 1, |
1478 new_hash + unchanged_at_top - 1, | |
1479 free_at_end_vpos - unchanged_at_top); | |
1480 | |
1481 return 0; | |
1482 } | |
1483 | |
1484 /* Return the offset in its buffer of the character at location col, line | |
1485 in the given window. */ | |
1486 int | |
1487 buffer_posn_from_coords (window, col, line) | |
1488 struct window *window; | |
1489 int col, line; | |
1490 { | |
5885
b649c51e3f6b
(buffer_posn_from_coords): Take hscroll into account.
Karl Heuer <kwzh@gnu.org>
parents:
5619
diff
changeset
|
1491 int hscroll = XINT (window->hscroll); |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
1492 int window_left = WINDOW_LEFT_MARGIN (window); |
314 | 1493 |
1494 /* The actual width of the window is window->width less one for the | |
493 | 1495 DISP_CONTINUE_GLYPH, and less one if it's not the rightmost |
1496 window. */ | |
1777
4edfaa19c7a7
* window.c (window_internal_width): New function.
Jim Blandy <jimb@redhat.com>
parents:
1766
diff
changeset
|
1497 int window_width = window_internal_width (window) - 1; |
314 | 1498 |
493 | 1499 int startp = marker_position (window->start); |
314 | 1500 |
1501 /* Since compute_motion will only operate on the current buffer, | |
1502 we need to save the old one and restore it when we're done. */ | |
1503 struct buffer *old_current_buffer = current_buffer; | |
493 | 1504 struct position *posn; |
314 | 1505 |
1506 current_buffer = XBUFFER (window->buffer); | |
1507 | |
11858
343ec791e9be
(buffer_posn_from_coords): Don't let startp be before BEGV.
Karl Heuer <kwzh@gnu.org>
parents:
11851
diff
changeset
|
1508 /* We can't get a correct result in this case, |
343ec791e9be
(buffer_posn_from_coords): Don't let startp be before BEGV.
Karl Heuer <kwzh@gnu.org>
parents:
11851
diff
changeset
|
1509 but at least prevent compute_motion from crashing. */ |
343ec791e9be
(buffer_posn_from_coords): Don't let startp be before BEGV.
Karl Heuer <kwzh@gnu.org>
parents:
11851
diff
changeset
|
1510 if (startp < BEGV) |
343ec791e9be
(buffer_posn_from_coords): Don't let startp be before BEGV.
Karl Heuer <kwzh@gnu.org>
parents:
11851
diff
changeset
|
1511 startp = BEGV; |
343ec791e9be
(buffer_posn_from_coords): Don't let startp be before BEGV.
Karl Heuer <kwzh@gnu.org>
parents:
11851
diff
changeset
|
1512 |
764 | 1513 /* It would be nice if we could use FRAME_CURRENT_GLYPHS (XFRAME |
1514 (window->frame))->bufp to avoid scanning from the very top of | |
493 | 1515 the window, but it isn't maintained correctly, and I'm not even |
1516 sure I will keep it. */ | |
1517 posn = compute_motion (startp, 0, | |
11851
b90c2cdd9627
(buffer_posn_from_coords): New arg to compute_motion.
Karl Heuer <kwzh@gnu.org>
parents:
11795
diff
changeset
|
1518 ((window == XWINDOW (minibuf_window) && startp == BEG |
b90c2cdd9627
(buffer_posn_from_coords): New arg to compute_motion.
Karl Heuer <kwzh@gnu.org>
parents:
11795
diff
changeset
|
1519 ? minibuf_prompt_width : 0) |
b90c2cdd9627
(buffer_posn_from_coords): New arg to compute_motion.
Karl Heuer <kwzh@gnu.org>
parents:
11795
diff
changeset
|
1520 + (hscroll ? 1 - hscroll : 0)), |
b90c2cdd9627
(buffer_posn_from_coords): New arg to compute_motion.
Karl Heuer <kwzh@gnu.org>
parents:
11795
diff
changeset
|
1521 0, |
3317
55066d2375b6
(buffer_posn_from_coords): Since COL is already
Richard M. Stallman <rms@gnu.org>
parents:
3192
diff
changeset
|
1522 ZV, line, col, |
6692
43a79400a664
Add window argument on calls to compute_motion.
Karl Heuer <kwzh@gnu.org>
parents:
6682
diff
changeset
|
1523 window_width, hscroll, 0, window); |
314 | 1524 |
1525 current_buffer = old_current_buffer; | |
1526 | |
764 | 1527 /* compute_motion considers frame points past the end of a line |
493 | 1528 to be *after* the newline, i.e. at the start of the next line. |
1529 This is reasonable, but not really what we want. So if the | |
1530 result is on a line below LINE, back it up one character. */ | |
1531 if (posn->vpos > line) | |
1532 return posn->bufpos - 1; | |
1533 else | |
1534 return posn->bufpos; | |
314 | 1535 } |
1536 | |
1537 static int | |
1538 count_blanks (r) | |
1539 register GLYPH *r; | |
1540 { | |
1541 register GLYPH *p = r; | |
1495
f17665e7347e
(count_blanks): Leave argument r constant, and increment p.
Richard M. Stallman <rms@gnu.org>
parents:
1407
diff
changeset
|
1542 while (*p++ == SPACEGLYPH); |
f17665e7347e
(count_blanks): Leave argument r constant, and increment p.
Richard M. Stallman <rms@gnu.org>
parents:
1407
diff
changeset
|
1543 return p - r - 1; |
314 | 1544 } |
1545 | |
1546 static int | |
1547 count_match (str1, str2) | |
1548 GLYPH *str1, *str2; | |
1549 { | |
1550 register GLYPH *p1 = str1; | |
1551 register GLYPH *p2 = str2; | |
1552 while (*p1++ == *p2++); | |
1553 return p1 - str1 - 1; | |
1554 } | |
1555 | |
1556 /* Char insertion/deletion cost vector, from term.c */ | |
1557 extern int *char_ins_del_vector; | |
1558 | |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
1559 #define char_ins_del_cost(f) (&char_ins_del_vector[FRAME_WINDOW_WIDTH((f))]) |
314 | 1560 |
1561 static void | |
764 | 1562 update_line (frame, vpos) |
1563 register FRAME_PTR frame; | |
314 | 1564 int vpos; |
1565 { | |
1566 register GLYPH *obody, *nbody, *op1, *op2, *np1, *temp; | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1567 int *temp1; |
314 | 1568 int tem; |
1569 int osp, nsp, begmatch, endmatch, olen, nlen; | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1570 GLYPH save; |
764 | 1571 register struct frame_glyphs *current_frame |
1572 = FRAME_CURRENT_GLYPHS (frame); | |
1573 register struct frame_glyphs *desired_frame | |
1574 = FRAME_DESIRED_GLYPHS (frame); | |
314 | 1575 |
764 | 1576 if (desired_frame->highlight[vpos] |
1577 != (current_frame->enable[vpos] && current_frame->highlight[vpos])) | |
314 | 1578 { |
764 | 1579 change_line_highlight (desired_frame->highlight[vpos], vpos, |
1580 (current_frame->enable[vpos] ? | |
1581 current_frame->used[vpos] : 0)); | |
1582 current_frame->enable[vpos] = 0; | |
314 | 1583 } |
1584 else | |
764 | 1585 reassert_line_highlight (desired_frame->highlight[vpos], vpos); |
314 | 1586 |
764 | 1587 if (! current_frame->enable[vpos]) |
314 | 1588 { |
1589 olen = 0; | |
1590 } | |
1591 else | |
1592 { | |
764 | 1593 obody = current_frame->glyphs[vpos]; |
1594 olen = current_frame->used[vpos]; | |
1595 if (! current_frame->highlight[vpos]) | |
314 | 1596 { |
1597 if (!must_write_spaces) | |
13448
89f89cadc30d
(update_line): Avoid indexing into obody by -1.
Richard M. Stallman <rms@gnu.org>
parents:
13408
diff
changeset
|
1598 while (olen > 0 && obody[olen - 1] == SPACEGLYPH) |
314 | 1599 olen--; |
1600 } | |
1601 else | |
1602 { | |
1603 /* For an inverse-video line, remember we gave it | |
764 | 1604 spaces all the way to the frame edge |
314 | 1605 so that the reverse video extends all the way across. */ |
1606 | |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
1607 while (olen < FRAME_WINDOW_WIDTH (frame) - 1) |
314 | 1608 obody[olen++] = SPACEGLYPH; |
1609 } | |
1610 } | |
1611 | |
1612 /* One way or another, this will enable the line being updated. */ | |
764 | 1613 current_frame->enable[vpos] = 1; |
1614 current_frame->used[vpos] = desired_frame->used[vpos]; | |
1615 current_frame->highlight[vpos] = desired_frame->highlight[vpos]; | |
1616 current_frame->bufp[vpos] = desired_frame->bufp[vpos]; | |
314 | 1617 |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1618 #ifdef HAVE_WINDOW_SYSTEM |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1619 if (FRAME_WINDOW_P (frame)) |
314 | 1620 { |
764 | 1621 current_frame->pix_width[vpos] |
1622 = current_frame->used[vpos] | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1623 * FONT_WIDTH (FRAME_FONT (frame)); |
764 | 1624 current_frame->pix_height[vpos] |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1625 = FRAME_LINE_HEIGHT (frame); |
314 | 1626 } |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
1627 #endif /* HAVE_WINDOW_SYSTEM */ |
314 | 1628 |
764 | 1629 if (!desired_frame->enable[vpos]) |
314 | 1630 { |
1631 nlen = 0; | |
1632 goto just_erase; | |
1633 } | |
1634 | |
764 | 1635 nbody = desired_frame->glyphs[vpos]; |
1636 nlen = desired_frame->used[vpos]; | |
314 | 1637 |
1638 /* Pretend trailing spaces are not there at all, | |
1639 unless for one reason or another we must write all spaces. */ | |
764 | 1640 if (! desired_frame->highlight[vpos]) |
314 | 1641 { |
1642 if (!must_write_spaces) | |
1643 /* We know that the previous character byte contains 0. */ | |
1644 while (nbody[nlen - 1] == SPACEGLYPH) | |
1645 nlen--; | |
1646 } | |
1647 else | |
1648 { | |
1649 /* For an inverse-video line, give it extra trailing spaces | |
764 | 1650 all the way to the frame edge |
314 | 1651 so that the reverse video extends all the way across. */ |
1652 | |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
1653 while (nlen < FRAME_WINDOW_WIDTH (frame) - 1) |
314 | 1654 nbody[nlen++] = SPACEGLYPH; |
1655 } | |
1656 | |
1657 /* If there's no i/d char, quickly do the best we can without it. */ | |
1658 if (!char_ins_del_ok) | |
1659 { | |
1660 int i,j; | |
1661 | |
4276
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1662 #if 0 |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1663 if (FRAME_X_P (frame)) |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1664 { |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1665 /* Under X, erase everything we are going to rewrite, |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1666 and rewrite everything from the first char that's changed. |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1667 This is part of supporting fonts like Courier |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1668 whose chars can overlap outside the char width. */ |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1669 for (i = 0; i < nlen; i++) |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1670 if (i >= olen || nbody[i] != obody[i]) |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1671 break; |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1672 |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1673 cursor_to (vpos, i); |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1674 if (i != olen) |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1675 clear_end_of_line (olen); |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1676 write_glyphs (nbody + i, nlen - i); |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1677 } |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1678 else |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1679 {} |
2298d2aff61c
Commented-out code added.
Richard M. Stallman <rms@gnu.org>
parents:
4134
diff
changeset
|
1680 #endif /* 0 */ |
314 | 1681 for (i = 0; i < nlen; i++) |
1682 { | |
1683 if (i >= olen || nbody[i] != obody[i]) /* A non-matching char. */ | |
1684 { | |
1685 cursor_to (vpos, i); | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1686 for (j = 1; |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1687 (i + j < nlen |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1688 && (i + j >= olen || nbody[i + j] != obody[i + j] |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1689 || (nbody[i + j] & GLYPH_MASK_PADDING))); |
314 | 1690 j++); |
1691 | |
1692 /* Output this run of non-matching chars. */ | |
1693 write_glyphs (nbody + i, j); | |
1694 i += j - 1; | |
1695 | |
1696 /* Now find the next non-match. */ | |
1697 } | |
1698 } | |
1699 | |
1700 /* Clear the rest of the line, or the non-clear part of it. */ | |
1701 if (olen > nlen) | |
1702 { | |
1703 cursor_to (vpos, nlen); | |
1704 clear_end_of_line (olen); | |
1705 } | |
1706 | |
764 | 1707 /* Exchange contents between current_frame and new_frame. */ |
1708 temp = desired_frame->glyphs[vpos]; | |
1709 desired_frame->glyphs[vpos] = current_frame->glyphs[vpos]; | |
1710 current_frame->glyphs[vpos] = temp; | |
314 | 1711 |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1712 /* Exchange charstarts between current_frame and new_frame. */ |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1713 temp1 = desired_frame->charstarts[vpos]; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1714 desired_frame->charstarts[vpos] = current_frame->charstarts[vpos]; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1715 current_frame->charstarts[vpos] = temp1; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1716 |
314 | 1717 return; |
1718 } | |
1719 | |
1720 if (!olen) | |
1721 { | |
764 | 1722 nsp = (must_write_spaces || desired_frame->highlight[vpos]) |
314 | 1723 ? 0 : count_blanks (nbody); |
1724 if (nlen > nsp) | |
1725 { | |
1726 cursor_to (vpos, nsp); | |
1727 write_glyphs (nbody + nsp, nlen - nsp); | |
1728 } | |
1729 | |
764 | 1730 /* Exchange contents between current_frame and new_frame. */ |
1731 temp = desired_frame->glyphs[vpos]; | |
1732 desired_frame->glyphs[vpos] = current_frame->glyphs[vpos]; | |
1733 current_frame->glyphs[vpos] = temp; | |
314 | 1734 |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1735 /* Exchange charstarts between current_frame and new_frame. */ |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1736 temp1 = desired_frame->charstarts[vpos]; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1737 desired_frame->charstarts[vpos] = current_frame->charstarts[vpos]; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1738 current_frame->charstarts[vpos] = temp1; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1739 |
314 | 1740 return; |
1741 } | |
1742 | |
1743 obody[olen] = 1; | |
1744 save = nbody[nlen]; | |
1745 nbody[nlen] = 0; | |
1746 | |
1747 /* Compute number of leading blanks in old and new contents. */ | |
1748 osp = count_blanks (obody); | |
764 | 1749 if (!desired_frame->highlight[vpos]) |
314 | 1750 nsp = count_blanks (nbody); |
1751 else | |
1752 nsp = 0; | |
1753 | |
1754 /* Compute number of matching chars starting with first nonblank. */ | |
1755 begmatch = count_match (obody + osp, nbody + nsp); | |
1756 | |
1757 /* Spaces in new match implicit space past the end of old. */ | |
1758 /* A bug causing this to be a no-op was fixed in 18.29. */ | |
1759 if (!must_write_spaces && osp + begmatch == olen) | |
1760 { | |
1761 np1 = nbody + nsp; | |
1762 while (np1[begmatch] == SPACEGLYPH) | |
1763 begmatch++; | |
1764 } | |
1765 | |
1766 /* Avoid doing insert/delete char | |
1767 just cause number of leading spaces differs | |
1768 when the following text does not match. */ | |
1769 if (begmatch == 0 && osp != nsp) | |
1770 osp = nsp = min (osp, nsp); | |
1771 | |
1772 /* Find matching characters at end of line */ | |
1773 op1 = obody + olen; | |
1774 np1 = nbody + nlen; | |
1775 op2 = op1 + begmatch - min (olen - osp, nlen - nsp); | |
1776 while (op1 > op2 && op1[-1] == np1[-1]) | |
1777 { | |
1778 op1--; | |
1779 np1--; | |
1780 } | |
1781 endmatch = obody + olen - op1; | |
1782 | |
1783 /* Put correct value back in nbody[nlen]. | |
1784 This is important because direct_output_for_insert | |
1785 can write into the line at a later point. | |
1786 If this screws up the zero at the end of the line, re-establish it. */ | |
1787 nbody[nlen] = save; | |
1788 obody[olen] = 0; | |
1789 | |
1790 /* tem gets the distance to insert or delete. | |
1791 endmatch is how many characters we save by doing so. | |
1792 Is it worth it? */ | |
1793 | |
1794 tem = (nlen - nsp) - (olen - osp); | |
1795 if (endmatch && tem | |
764 | 1796 && (!char_ins_del_ok || endmatch <= char_ins_del_cost (frame)[tem])) |
314 | 1797 endmatch = 0; |
1798 | |
1799 /* nsp - osp is the distance to insert or delete. | |
1800 If that is nonzero, begmatch is known to be nonzero also. | |
1801 begmatch + endmatch is how much we save by doing the ins/del. | |
1802 Is it worth it? */ | |
1803 | |
1804 if (nsp != osp | |
1805 && (!char_ins_del_ok | |
764 | 1806 || begmatch + endmatch <= char_ins_del_cost (frame)[nsp - osp])) |
314 | 1807 { |
1808 begmatch = 0; | |
1809 endmatch = 0; | |
1810 osp = nsp = min (osp, nsp); | |
1811 } | |
1812 | |
1813 /* Now go through the line, inserting, writing and | |
1814 deleting as appropriate. */ | |
1815 | |
1816 if (osp > nsp) | |
1817 { | |
1818 cursor_to (vpos, nsp); | |
1819 delete_glyphs (osp - nsp); | |
1820 } | |
1821 else if (nsp > osp) | |
1822 { | |
1823 /* If going to delete chars later in line | |
1824 and insert earlier in the line, | |
1825 must delete first to avoid losing data in the insert */ | |
1826 if (endmatch && nlen < olen + nsp - osp) | |
1827 { | |
1828 cursor_to (vpos, nlen - endmatch + osp - nsp); | |
1829 delete_glyphs (olen + nsp - osp - nlen); | |
1830 olen = nlen - (nsp - osp); | |
1831 } | |
1832 cursor_to (vpos, osp); | |
1833 insert_glyphs ((char *)0, nsp - osp); | |
1834 } | |
1835 olen += nsp - osp; | |
1836 | |
1837 tem = nsp + begmatch + endmatch; | |
1838 if (nlen != tem || olen != tem) | |
1839 { | |
1840 cursor_to (vpos, nsp + begmatch); | |
1841 if (!endmatch || nlen == olen) | |
1842 { | |
1843 /* If new text being written reaches right margin, | |
1844 there is no need to do clear-to-eol at the end. | |
1845 (and it would not be safe, since cursor is not | |
1846 going to be "at the margin" after the text is done) */ | |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
1847 if (nlen == FRAME_WINDOW_WIDTH (frame)) |
314 | 1848 olen = 0; |
1849 write_glyphs (nbody + nsp + begmatch, nlen - tem); | |
1850 | |
1851 #ifdef obsolete | |
1852 | |
1853 /* the following code loses disastrously if tem == nlen. | |
1854 Rather than trying to fix that case, I am trying the simpler | |
1855 solution found above. */ | |
1856 | |
1857 /* If the text reaches to the right margin, | |
1858 it will lose one way or another (depending on AutoWrap) | |
1859 to clear to end of line after outputting all the text. | |
1860 So pause with one character to go and clear the line then. */ | |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
1861 if (nlen == FRAME_WINDOW_WIDTH (frame) && fast_clear_end_of_line && olen > nlen) |
314 | 1862 { |
1863 /* endmatch must be zero, and tem must equal nsp + begmatch */ | |
1864 write_glyphs (nbody + tem, nlen - tem - 1); | |
1865 clear_end_of_line (olen); | |
1866 olen = 0; /* Don't let it be cleared again later */ | |
1867 write_glyphs (nbody + nlen - 1, 1); | |
1868 } | |
1869 else | |
1870 write_glyphs (nbody + nsp + begmatch, nlen - tem); | |
1871 #endif /* OBSOLETE */ | |
1872 | |
1873 } | |
1874 else if (nlen > olen) | |
1875 { | |
17015
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1876 /* Here, we used to have the following simple code: |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1877 ---------------------------------------- |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1878 write_glyphs (nbody + nsp + begmatch, olen - tem); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1879 insert_glyphs (nbody + nsp + begmatch + olen - tem, nlen - olen); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1880 ---------------------------------------- |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1881 but it doesn't work if nbody[nsp + begmatch + olen - tem] |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1882 is a padding glyph. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1883 int out = olen - tem; /* Columns to be overwritten originally. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1884 int del; |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1885 |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1886 /* Calculate columns we can actually overwrite. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1887 while (nbody[nsp + begmatch + out] & GLYPH_MASK_PADDING) out--; |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1888 write_glyphs (nbody + nsp + begmatch, out); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1889 /* If we left columns to be overwritten. we must delete them. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1890 del = olen - tem - out; |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1891 if (del > 0) delete_glyphs (del); |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1892 /* At last, we insert columns not yet written out. */ |
fe0b3661b584
(direct_output_forward_char): #if-0-out redundant
Karl Heuer <kwzh@gnu.org>
parents:
16896
diff
changeset
|
1893 insert_glyphs (nbody + nsp + begmatch + out, nlen - olen + del); |
314 | 1894 olen = nlen; |
1895 } | |
1896 else if (olen > nlen) | |
1897 { | |
1898 write_glyphs (nbody + nsp + begmatch, nlen - tem); | |
1899 delete_glyphs (olen - nlen); | |
1900 olen = nlen; | |
1901 } | |
1902 } | |
1903 | |
1904 just_erase: | |
1905 /* If any unerased characters remain after the new line, erase them. */ | |
1906 if (olen > nlen) | |
1907 { | |
1908 cursor_to (vpos, nlen); | |
1909 clear_end_of_line (olen); | |
1910 } | |
1911 | |
764 | 1912 /* Exchange contents between current_frame and new_frame. */ |
1913 temp = desired_frame->glyphs[vpos]; | |
1914 desired_frame->glyphs[vpos] = current_frame->glyphs[vpos]; | |
1915 current_frame->glyphs[vpos] = temp; | |
6617
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1916 |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1917 /* Exchange charstarts between current_frame and new_frame. */ |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1918 temp1 = desired_frame->charstarts[vpos]; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1919 desired_frame->charstarts[vpos] = current_frame->charstarts[vpos]; |
6309d97ee4bc
(scroll_frame_lines): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
6414
diff
changeset
|
1920 current_frame->charstarts[vpos] = temp1; |
314 | 1921 } |
1922 | |
12193 | 1923 /* A vector of size >= 2 * NFRAMES + 3 * NBUFFERS + 1, containing the |
1924 session's frames, frame names, buffers, buffer-read-only flags, and | |
1925 buffer-modified-flags, and a trailing sentinel (so we don't need to | |
1926 add length checks). */ | |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1927 static Lisp_Object frame_and_buffer_state; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1928 |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1929 DEFUN ("frame-or-buffer-changed-p", Fframe_or_buffer_changed_p, |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1930 Sframe_or_buffer_changed_p, 0, 0, 0, |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1931 "Return non-nil if the frame and buffer state appears to have changed.\n\ |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1932 The state variable is an internal vector containing all frames and buffers,\n\ |
11411
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1933 aside from buffers whose names start with space,\n\ |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1934 along with the buffers' read-only and modified flags, which allows a fast\n\ |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1935 check to see whether the menu bars might need to be recomputed.\n\ |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1936 If this function returns non-nil, it updates the internal vector to reflect\n\ |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1937 the current state.\n") |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1938 () |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1939 { |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1940 Lisp_Object tail, frame, buf; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1941 Lisp_Object *vecp; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1942 int n; |
11919
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1943 |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1944 vecp = XVECTOR (frame_and_buffer_state)->contents; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1945 FOR_EACH_FRAME (tail, frame) |
11919
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1946 { |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1947 if (!EQ (*vecp++, frame)) |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1948 goto changed; |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1949 if (!EQ (*vecp++, XFRAME (frame)->name)) |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1950 goto changed; |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1951 } |
9650
4295137050dd
(Fframe_or_buffer_changed_p):
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1952 /* Check that the buffer info matches. |
4295137050dd
(Fframe_or_buffer_changed_p):
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1953 No need to test for the end of the vector |
4295137050dd
(Fframe_or_buffer_changed_p):
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1954 because the last element of the vector is lambda |
4295137050dd
(Fframe_or_buffer_changed_p):
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1955 and that will always cause a mismatch. */ |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1956 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1957 { |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1958 buf = XCONS (XCONS (tail)->car)->cdr; |
11411
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1959 /* Ignore buffers that aren't included in buffer lists. */ |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1960 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ') |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1961 continue; |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1962 if (!EQ (*vecp++, buf)) |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1963 goto changed; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1964 if (!EQ (*vecp++, XBUFFER (buf)->read_only)) |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1965 goto changed; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1966 if (!EQ (*vecp++, Fbuffer_modified_p (buf))) |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1967 goto changed; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1968 } |
9650
4295137050dd
(Fframe_or_buffer_changed_p):
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1969 /* Detect deletion of a buffer at the end of the list. */ |
17360
3dd1b4cc865b
(Fframe_or_buffer_changed_p): Use EQ, not ==.
Karl Heuer <kwzh@gnu.org>
parents:
17282
diff
changeset
|
1970 if (EQ (*vecp, Qlambda)) |
9650
4295137050dd
(Fframe_or_buffer_changed_p):
Richard M. Stallman <rms@gnu.org>
parents:
9572
diff
changeset
|
1971 return Qnil; |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1972 changed: |
9963 | 1973 /* Start with 1 so there is room for at least one lambda at the end. */ |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1974 n = 1; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1975 FOR_EACH_FRAME (tail, frame) |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
1976 n += 2; |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1977 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1978 n += 3; |
7814
e1e536773850
(Fframe_or_buffer_changed_p): Reuse the state vector.
Karl Heuer <kwzh@gnu.org>
parents:
7810
diff
changeset
|
1979 /* Reallocate the vector if it's grown, or if it's shrunk a lot. */ |
e1e536773850
(Fframe_or_buffer_changed_p): Reuse the state vector.
Karl Heuer <kwzh@gnu.org>
parents:
7810
diff
changeset
|
1980 if (n > XVECTOR (frame_and_buffer_state)->size |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
1981 || n + 20 < XVECTOR (frame_and_buffer_state)->size / 2) |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
1982 /* Add 20 extra so we grow it less often. */ |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
1983 frame_and_buffer_state = Fmake_vector (make_number (n + 20), Qlambda); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1984 vecp = XVECTOR (frame_and_buffer_state)->contents; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1985 FOR_EACH_FRAME (tail, frame) |
11919
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1986 { |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1987 *vecp++ = frame; |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1988 *vecp++ = XFRAME (frame)->name; |
31cb053405f2
(Fframe_or_buffer_changed_p): Record frame names
Karl Heuer <kwzh@gnu.org>
parents:
11914
diff
changeset
|
1989 } |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1990 for (tail = Vbuffer_alist; CONSP (tail); tail = XCONS (tail)->cdr) |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1991 { |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1992 buf = XCONS (XCONS (tail)->car)->cdr; |
11411
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1993 /* Ignore buffers that aren't included in buffer lists. */ |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1994 if (XSTRING (XBUFFER (buf)->name)->data[0] == ' ') |
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
1995 continue; |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1996 *vecp++ = buf; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1997 *vecp++ = XBUFFER (buf)->read_only; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1998 *vecp++ = Fbuffer_modified_p (buf); |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
1999 } |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2000 /* Fill up the vector with lambdas (always at least one). */ |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2001 *vecp++ = Qlambda; |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2002 while (vecp - XVECTOR (frame_and_buffer_state)->contents |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2003 < XVECTOR (frame_and_buffer_state)->size) |
7814
e1e536773850
(Fframe_or_buffer_changed_p): Reuse the state vector.
Karl Heuer <kwzh@gnu.org>
parents:
7810
diff
changeset
|
2004 *vecp++ = Qlambda; |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2005 /* Make sure we didn't overflow the vector. */ |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2006 if (vecp - XVECTOR (frame_and_buffer_state)->contents |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2007 > XVECTOR (frame_and_buffer_state)->size) |
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2008 abort (); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
2009 return Qt; |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
2010 } |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
2011 |
314 | 2012 DEFUN ("open-termscript", Fopen_termscript, Sopen_termscript, |
2013 1, 1, "FOpen termscript file: ", | |
2014 "Start writing all terminal output to FILE as well as the terminal.\n\ | |
2015 FILE = nil means just close any termscript file currently open.") | |
2016 (file) | |
2017 Lisp_Object file; | |
2018 { | |
2019 if (termscript != 0) fclose (termscript); | |
2020 termscript = 0; | |
2021 | |
493 | 2022 if (! NILP (file)) |
314 | 2023 { |
2024 file = Fexpand_file_name (file, Qnil); | |
2025 termscript = fopen (XSTRING (file)->data, "w"); | |
2026 if (termscript == 0) | |
2027 report_file_error ("Opening termscript", Fcons (file, Qnil)); | |
2028 } | |
2029 return Qnil; | |
2030 } | |
2031 | |
2032 | |
2033 #ifdef SIGWINCH | |
493 | 2034 SIGTYPE |
10745
a553a08f5785
(window_change_signal): Add ignored argument.
Richard M. Stallman <rms@gnu.org>
parents:
10259
diff
changeset
|
2035 window_change_signal (signalnum) /* If we don't have an argument, */ |
a553a08f5785
(window_change_signal): Add ignored argument.
Richard M. Stallman <rms@gnu.org>
parents:
10259
diff
changeset
|
2036 int signalnum; /* some compilers complain in signal calls. */ |
314 | 2037 { |
2038 int width, height; | |
2039 extern int errno; | |
2040 int old_errno = errno; | |
2041 | |
764 | 2042 get_frame_size (&width, &height); |
314 | 2043 |
764 | 2044 /* The frame size change obviously applies to a termcap-controlled |
2045 frame. Find such a frame in the list, and assume it's the only | |
314 | 2046 one (since the redisplay code always writes to stdout, not a |
764 | 2047 FILE * specified in the frame structure). Record the new size, |
314 | 2048 but don't reallocate the data structures now. Let that be done |
2049 later outside of the signal handler. */ | |
2050 | |
2051 { | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2052 Lisp_Object tail, frame; |
314 | 2053 |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2054 FOR_EACH_FRAME (tail, frame) |
314 | 2055 { |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2056 if (FRAME_TERMCAP_P (XFRAME (frame))) |
314 | 2057 { |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2058 change_frame_size (XFRAME (frame), height, width, 0, 1); |
314 | 2059 break; |
2060 } | |
2061 } | |
2062 } | |
2063 | |
2064 signal (SIGWINCH, window_change_signal); | |
2065 errno = old_errno; | |
2066 } | |
2067 #endif /* SIGWINCH */ | |
2068 | |
2069 | |
764 | 2070 /* Do any change in frame size that was requested by a signal. */ |
314 | 2071 |
2072 do_pending_window_change () | |
2073 { | |
2074 /* If window_change_signal should have run before, run it now. */ | |
2075 while (delayed_size_change) | |
2076 { | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2077 Lisp_Object tail, frame; |
314 | 2078 |
2079 delayed_size_change = 0; | |
2080 | |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2081 FOR_EACH_FRAME (tail, frame) |
314 | 2082 { |
2252
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2083 FRAME_PTR f = XFRAME (frame); |
9793d8654e23
* frame.h (FOR_EACH_FRAME): Change the definition so that
Jim Blandy <jimb@redhat.com>
parents:
2198
diff
changeset
|
2084 |
764 | 2085 int height = FRAME_NEW_HEIGHT (f); |
2086 int width = FRAME_NEW_WIDTH (f); | |
314 | 2087 |
3449
ad455da9b789
(do_pending_window_change): No need to clear
Richard M. Stallman <rms@gnu.org>
parents:
3357
diff
changeset
|
2088 if (height != 0 || width != 0) |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2089 change_frame_size (f, height, width, 0, 0); |
314 | 2090 } |
2091 } | |
2092 } | |
2093 | |
2094 | |
764 | 2095 /* Change the frame height and/or width. Values may be given as zero to |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2096 indicate no change is to take place. |
314 | 2097 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2098 If DELAY is non-zero, then assume we're being called from a signal |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2099 handler, and queue the change for later - perhaps the next |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2100 redisplay. Since this tries to resize windows, we can't call it |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2101 from a signal handler. */ |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2102 |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2103 change_frame_size (f, newheight, newwidth, pretend, delay) |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2104 register FRAME_PTR f; |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2105 int newheight, newwidth, pretend; |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2106 { |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2107 Lisp_Object tail, frame; |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2108 |
15395
b584c2db055f
(change_frame_size, remake_frame_glyphs): Use FRAME_WINDOW_P.
Richard M. Stallman <rms@gnu.org>
parents:
15394
diff
changeset
|
2109 if (! FRAME_WINDOW_P (f)) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2110 { |
15394
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
2111 /* When using termcap, or on MS-DOS, all frames use |
8d01f71c4797
(Fredraw_frame, remake_frame_glyphs)
Richard M. Stallman <rms@gnu.org>
parents:
15282
diff
changeset
|
2112 the same screen, so a change in size affects all frames. */ |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2113 FOR_EACH_FRAME (tail, frame) |
15395
b584c2db055f
(change_frame_size, remake_frame_glyphs): Use FRAME_WINDOW_P.
Richard M. Stallman <rms@gnu.org>
parents:
15394
diff
changeset
|
2114 if (! FRAME_WINDOW_P (XFRAME (frame))) |
10770
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2115 change_frame_size_1 (XFRAME (frame), newheight, newwidth, |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2116 pretend, delay); |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2117 } |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2118 else |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2119 change_frame_size_1 (f, newheight, newwidth, pretend, delay); |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2120 } |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2121 |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2122 static void |
79745e047484
(change_frame_size_1): New subroutine.
Richard M. Stallman <rms@gnu.org>
parents:
10745
diff
changeset
|
2123 change_frame_size_1 (frame, newheight, newwidth, pretend, delay) |
764 | 2124 register FRAME_PTR frame; |
11914
b1a014bdd22c
(change_frame_size_1): Declare arg DELAY.
Karl Heuer <kwzh@gnu.org>
parents:
11858
diff
changeset
|
2125 int newheight, newwidth, pretend, delay; |
314 | 2126 { |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2127 int new_frame_window_width; |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2128 unsigned int total_glyphs; |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2129 |
314 | 2130 /* If we can't deal with the change now, queue it for later. */ |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2131 if (delay) |
314 | 2132 { |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2133 FRAME_NEW_HEIGHT (frame) = newheight; |
764 | 2134 FRAME_NEW_WIDTH (frame) = newwidth; |
314 | 2135 delayed_size_change = 1; |
2136 return; | |
2137 } | |
2138 | |
764 | 2139 /* This size-change overrides any pending one for this frame. */ |
2140 FRAME_NEW_HEIGHT (frame) = 0; | |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2141 FRAME_NEW_WIDTH (frame) = 0; |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2142 |
3449
ad455da9b789
(do_pending_window_change): No need to clear
Richard M. Stallman <rms@gnu.org>
parents:
3357
diff
changeset
|
2143 /* If an argument is zero, set it to the current value. */ |
15896
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
2144 if (newheight == 0) |
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
2145 newheight = FRAME_HEIGHT (frame); |
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
2146 if (newwidth == 0) |
3a3c30116313
(change_frame_size_1): Clean up conditional.
Erik Naggum <erik@naggum.no>
parents:
15687
diff
changeset
|
2147 newwidth = FRAME_WIDTH (frame); |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2148 new_frame_window_width = FRAME_WINDOW_WIDTH_ARG (frame, newwidth); |
314 | 2149 |
16881
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2150 total_glyphs = newheight * (newwidth + 2) * sizeof (GLYPH); |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2151 |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2152 /* If these sizes are so big they cause overflow, |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2153 just ignore the change. It's not clear what better we could do. */ |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2154 if (total_glyphs / sizeof (GLYPH) / newheight != newwidth + 2) |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2155 return; |
245ba9f2781a
(change_frame_size_1): Reject new sizes if they cause overflow.
Richard M. Stallman <rms@gnu.org>
parents:
16822
diff
changeset
|
2156 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2157 /* Round up to the smallest acceptable size. */ |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2158 check_frame_size (frame, &newheight, &newwidth); |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2159 |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2160 /* If we're not changing the frame size, quit now. */ |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2161 if (newheight == FRAME_HEIGHT (frame) |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2162 && new_frame_window_width == FRAME_WINDOW_WIDTH (frame)) |
314 | 2163 return; |
2164 | |
15078 | 2165 BLOCK_INPUT; |
2166 | |
14286
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2167 #ifdef MSDOS |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2168 /* We only can set screen dimensions to certain values supported |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2169 by our video hardware. Try to find the smallest size greater |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2170 or equal to the requested dimensions. */ |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2171 dos_set_window_size (&newheight, &newwidth); |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2172 #endif |
5d42664b4e74
(change_frame_size_1) [MSDOS]: Support frame size
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
2173 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2174 if (newheight != FRAME_HEIGHT (frame)) |
314 | 2175 { |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2176 if (FRAME_HAS_MINIBUF_P (frame) |
764 | 2177 && ! FRAME_MINIBUF_ONLY_P (frame)) |
314 | 2178 { |
764 | 2179 /* Frame has both root and minibuffer. */ |
2180 set_window_height (FRAME_ROOT_WINDOW (frame), | |
2132
0f4b18efebf5
(change_frame_size): Handle FRAME_MENU_BAR_LINES.
Richard M. Stallman <rms@gnu.org>
parents:
1915
diff
changeset
|
2181 newheight - 1 - FRAME_MENU_BAR_LINES (frame), 0); |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
2182 XSETFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (frame))->top, |
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
2183 newheight - 1); |
764 | 2184 set_window_height (FRAME_MINIBUF_WINDOW (frame), 1, 0); |
314 | 2185 } |
2186 else | |
764 | 2187 /* Frame has just one top-level window. */ |
2132
0f4b18efebf5
(change_frame_size): Handle FRAME_MENU_BAR_LINES.
Richard M. Stallman <rms@gnu.org>
parents:
1915
diff
changeset
|
2188 set_window_height (FRAME_ROOT_WINDOW (frame), |
0f4b18efebf5
(change_frame_size): Handle FRAME_MENU_BAR_LINES.
Richard M. Stallman <rms@gnu.org>
parents:
1915
diff
changeset
|
2189 newheight - FRAME_MENU_BAR_LINES (frame), 0); |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2190 |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2191 if (FRAME_TERMCAP_P (frame) && !pretend) |
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2192 FrameRows = newheight; |
314 | 2193 |
2194 #if 0 | |
764 | 2195 if (frame->output_method == output_termcap) |
314 | 2196 { |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2197 frame_height = newheight; |
314 | 2198 if (!pretend) |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2199 FrameRows = newheight; |
314 | 2200 } |
2201 #endif | |
2202 } | |
2203 | |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2204 if (new_frame_window_width != FRAME_WINDOW_WIDTH (frame)) |
314 | 2205 { |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2206 set_window_width (FRAME_ROOT_WINDOW (frame), new_frame_window_width, 0); |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2207 if (FRAME_HAS_MINIBUF_P (frame)) |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2208 set_window_width (FRAME_MINIBUF_WINDOW (frame), new_frame_window_width, 0); |
314 | 2209 |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2210 if (FRAME_TERMCAP_P (frame) && !pretend) |
764 | 2211 FrameCols = newwidth; |
314 | 2212 #if 0 |
764 | 2213 if (frame->output_method == output_termcap) |
314 | 2214 { |
764 | 2215 frame_width = newwidth; |
314 | 2216 if (!pretend) |
764 | 2217 FrameCols = newwidth; |
314 | 2218 } |
2219 #endif | |
2220 } | |
2221 | |
960
17986889d3b6
* dispnew.c (Fredraw_frame): Call clear_frame_records before
Jim Blandy <jimb@redhat.com>
parents:
764
diff
changeset
|
2222 FRAME_HEIGHT (frame) = newheight; |
16256
1ce0cb94fa68
(preserve_other_columns, preserve_my_columns): Use new
Richard M. Stallman <rms@gnu.org>
parents:
16195
diff
changeset
|
2223 SET_FRAME_WIDTH (frame, newwidth); |
7648
2e85e48d42da
(change_frame_size): Keep cursor coords in range.
Richard M. Stallman <rms@gnu.org>
parents:
7558
diff
changeset
|
2224 |
16267
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
2225 if (FRAME_CURSOR_X (frame) >= FRAME_WINDOW_WIDTH (frame)) |
05ca2cb9fe0f
(make_frame_glyphs, update_line, update_frame)
Richard M. Stallman <rms@gnu.org>
parents:
16256
diff
changeset
|
2226 FRAME_CURSOR_X (frame) = FRAME_WINDOW_WIDTH (frame) - 1; |
7648
2e85e48d42da
(change_frame_size): Keep cursor coords in range.
Richard M. Stallman <rms@gnu.org>
parents:
7558
diff
changeset
|
2227 if (FRAME_CURSOR_Y (frame) >= FRAME_HEIGHT (frame)) |
2e85e48d42da
(change_frame_size): Keep cursor coords in range.
Richard M. Stallman <rms@gnu.org>
parents:
7558
diff
changeset
|
2228 FRAME_CURSOR_Y (frame) = FRAME_HEIGHT (frame) - 1; |
2e85e48d42da
(change_frame_size): Keep cursor coords in range.
Richard M. Stallman <rms@gnu.org>
parents:
7558
diff
changeset
|
2229 |
764 | 2230 remake_frame_glyphs (frame); |
2231 calculate_costs (frame); | |
15065 | 2232 |
2233 UNBLOCK_INPUT; | |
17282
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
2234 |
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
2235 /* This isn't quite a no-op: it runs window-configuration-change-hook. */ |
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
2236 Fset_window_buffer (FRAME_SELECTED_WINDOW (frame), |
5023bea28298
(change_frame_size_1): Call Fset_window_buffer,
Richard M. Stallman <rms@gnu.org>
parents:
17015
diff
changeset
|
2237 XWINDOW (FRAME_SELECTED_WINDOW (frame))->buffer); |
314 | 2238 } |
2239 | |
2240 DEFUN ("send-string-to-terminal", Fsend_string_to_terminal, | |
2241 Ssend_string_to_terminal, 1, 1, 0, | |
2242 "Send STRING to the terminal without alteration.\n\ | |
2243 Control characters in STRING will have terminal-dependent effects.") | |
14068
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
2244 (string) |
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
2245 Lisp_Object string; |
314 | 2246 { |
14068
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
2247 CHECK_STRING (string, 0); |
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
2248 fwrite (XSTRING (string)->data, 1, XSTRING (string)->size, stdout); |
314 | 2249 fflush (stdout); |
2250 if (termscript) | |
2251 { | |
14068
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
2252 fwrite (XSTRING (string)->data, 1, XSTRING (string)->size, termscript); |
314 | 2253 fflush (termscript); |
2254 } | |
2255 return Qnil; | |
2256 } | |
2257 | |
2258 DEFUN ("ding", Fding, Sding, 0, 1, 0, | |
2259 "Beep, or flash the screen.\n\ | |
2260 Also, unless an argument is given,\n\ | |
2261 terminate any keyboard macro currently executing.") | |
2262 (arg) | |
2263 Lisp_Object arg; | |
2264 { | |
493 | 2265 if (!NILP (arg)) |
314 | 2266 { |
649
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
2267 if (noninteractive) |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
2268 putchar (07); |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
2269 else |
61deba7b73b6
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
587
diff
changeset
|
2270 ring_bell (); |
314 | 2271 fflush (stdout); |
2272 } | |
2273 else | |
2274 bitch_at_user (); | |
2275 | |
2276 return Qnil; | |
2277 } | |
2278 | |
2279 bitch_at_user () | |
2280 { | |
2281 if (noninteractive) | |
2282 putchar (07); | |
2283 else if (!INTERACTIVE) /* Stop executing a keyboard macro. */ | |
2284 error ("Keyboard macro terminated by a command ringing the bell"); | |
2285 else | |
2286 ring_bell (); | |
2287 fflush (stdout); | |
2288 } | |
2289 | |
2290 DEFUN ("sleep-for", Fsleep_for, Ssleep_for, 1, 2, 0, | |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2291 "Pause, without updating display, for SECONDS seconds.\n\ |
2648 | 2292 SECONDS may be a floating-point value, meaning that you can wait for a\n\ |
2293 fraction of a second. Optional second arg MILLISECONDS specifies an\n\ | |
2294 additional wait period, in milliseconds; this may be useful if your\n\ | |
2295 Emacs was built without floating point support.\n\ | |
2296 \(Not all operating systems support waiting for a fraction of a second.)") | |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2297 (seconds, milliseconds) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2298 Lisp_Object seconds, milliseconds; |
314 | 2299 { |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2300 int sec, usec; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2301 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2302 if (NILP (milliseconds)) |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
2303 XSETINT (milliseconds, 0); |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2304 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2305 CHECK_NUMBER (milliseconds, 1); |
2648 | 2306 usec = XINT (milliseconds) * 1000; |
2307 | |
2308 #ifdef LISP_FLOAT_TYPE | |
2309 { | |
2310 double duration = extract_float (seconds); | |
2311 sec = (int) duration; | |
2312 usec += (duration - sec) * 1000000; | |
2313 } | |
2314 #else | |
2315 CHECK_NUMBER (seconds, 0); | |
2316 sec = XINT (seconds); | |
2317 #endif | |
314 | 2318 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2319 #ifndef EMACS_HAS_USECS |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2320 if (sec == 0 && usec != 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2321 error ("millisecond `sleep-for' not supported on %s", SYSTEM_TYPE); |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2322 #endif |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2323 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2324 /* Assure that 0 <= usec < 1000000. */ |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2325 if (usec < 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2326 { |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2327 /* We can't rely on the rounding being correct if user is negative. */ |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2328 if (-1000000 < usec) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2329 sec--, usec += 1000000; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2330 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2331 sec -= -usec / 1000000, usec = 1000000 - (-usec % 1000000); |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2332 } |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2333 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2334 sec += usec / 1000000, usec %= 1000000; |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2335 |
14646
68fe10d1abd0
(Fsleep_for): Accept sub-second intervals.
Erik Naggum <erik@naggum.no>
parents:
14459
diff
changeset
|
2336 if (sec < 0 || (sec == 0 && usec == 0)) |
314 | 2337 return Qnil; |
2338 | |
650 | 2339 { |
2340 Lisp_Object zero; | |
2341 | |
9303
3115ae493c30
(direct_output_for_insert, direct_output_forward_char, change_frame_size,
Karl Heuer <kwzh@gnu.org>
parents:
9264
diff
changeset
|
2342 XSETFASTINT (zero, 0); |
650 | 2343 wait_reading_process_input (sec, usec, zero, 0); |
2344 } | |
587 | 2345 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2346 /* We should always have wait_reading_process_input; we have a dummy |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2347 implementation for systems which don't support subprocesses. */ |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2348 #if 0 |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2349 /* No wait_reading_process_input */ |
314 | 2350 immediate_quit = 1; |
2351 QUIT; | |
2352 | |
2353 #ifdef VMS | |
2354 sys_sleep (sec); | |
2355 #else /* not VMS */ | |
2356 /* The reason this is done this way | |
2357 (rather than defined (H_S) && defined (H_T)) | |
2358 is because the VMS preprocessor doesn't grok `defined' */ | |
2359 #ifdef HAVE_SELECT | |
554 | 2360 EMACS_GET_TIME (end_time); |
2361 EMACS_SET_SECS_USECS (timeout, sec, usec); | |
587 | 2362 EMACS_ADD_TIME (end_time, end_time, timeout); |
554 | 2363 |
314 | 2364 while (1) |
2365 { | |
554 | 2366 EMACS_GET_TIME (timeout); |
2367 EMACS_SUB_TIME (timeout, end_time, timeout); | |
2368 if (EMACS_TIME_NEG_P (timeout) | |
2369 || !select (1, 0, 0, 0, &timeout)) | |
314 | 2370 break; |
2371 } | |
2372 #else /* not HAVE_SELECT */ | |
2373 sleep (sec); | |
2374 #endif /* HAVE_SELECT */ | |
2375 #endif /* not VMS */ | |
2376 | |
2377 immediate_quit = 0; | |
2378 #endif /* no subprocesses */ | |
2379 | |
2380 return Qnil; | |
2381 } | |
2382 | |
650 | 2383 /* This is just like wait_reading_process_input, except that |
2384 it does the redisplay. | |
2385 | |
5223
db2e7e6a488e
(Fsit_for): Call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
5218
diff
changeset
|
2386 It's also much like Fsit_for, except that it can be used for |
11411
91bcce2fd486
(Fframe_or_buffer_changed_p): Ignore buffers whose names start with space.
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
2387 waiting for input as well. */ |
650 | 2388 |
2389 Lisp_Object | |
17961
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
2390 sit_for (sec, usec, reading, display, initial_display) |
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
2391 int sec, usec, reading, display, initial_display; |
314 | 2392 { |
650 | 2393 Lisp_Object read_kbd; |
314 | 2394 |
14964
9938201005a3
(sit_for): Call swallow_events.
Richard M. Stallman <rms@gnu.org>
parents:
14903
diff
changeset
|
2395 swallow_events (display); |
9938201005a3
(sit_for): Call swallow_events.
Richard M. Stallman <rms@gnu.org>
parents:
14903
diff
changeset
|
2396 |
14757
99125e1e8bac
(sit_for): Pass DISPLAY to detect_input_pending_run_timers.
Richard M. Stallman <rms@gnu.org>
parents:
14646
diff
changeset
|
2397 if (detect_input_pending_run_timers (display)) |
314 | 2398 return Qnil; |
650 | 2399 |
17961
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
2400 if (initial_display) |
314 | 2401 redisplay_preserve_echo_area (); |
2402 | |
673 | 2403 if (sec == 0 && usec == 0) |
2404 return Qt; | |
2405 | |
314 | 2406 #ifdef SIGIO |
1915
98ecf99d7b1a
* dispnew.c (sit_for): Pass the correct number of arguments to
Jim Blandy <jimb@redhat.com>
parents:
1872
diff
changeset
|
2407 gobble_input (0); |
650 | 2408 #endif |
2409 | |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
2410 XSETINT (read_kbd, reading ? -1 : 1); |
650 | 2411 wait_reading_process_input (sec, usec, read_kbd, display); |
2412 | |
314 | 2413 return detect_input_pending () ? Qnil : Qt; |
2414 } | |
2415 | |
650 | 2416 DEFUN ("sit-for", Fsit_for, Ssit_for, 1, 3, 0, |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2417 "Perform redisplay, then wait for SECONDS seconds or until input is available.\n\ |
2648 | 2418 SECONDS may be a floating-point value, meaning that you can wait for a\n\ |
2419 fraction of a second. Optional second arg MILLISECONDS specifies an\n\ | |
2420 additional wait period, in milliseconds; this may be useful if your\n\ | |
2421 Emacs was built without floating point support.\n\ | |
2422 \(Not all operating systems support waiting for a fraction of a second.)\n\ | |
14068
a3c83dde295e
(Fsend_string_to_terminal, Fsit_for): Harmonize arguments with
Erik Naggum <erik@naggum.no>
parents:
13526
diff
changeset
|
2423 Optional third arg NODISP non-nil means don't redisplay, just wait for input.\n\ |
650 | 2424 Redisplay is preempted as always if input arrives, and does not happen\n\ |
2425 if input is available before it starts.\n\ | |
2426 Value is t if waited the full time with no input arriving.") | |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2427 (seconds, milliseconds, nodisp) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2428 Lisp_Object seconds, milliseconds, nodisp; |
650 | 2429 { |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2430 int sec, usec; |
650 | 2431 |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2432 if (NILP (milliseconds)) |
9264
9338a124ea84
(redraw_frame, Fsleep_for, sit_for, Fsit_for): Use new accessor macros instead
Karl Heuer <kwzh@gnu.org>
parents:
8903
diff
changeset
|
2433 XSETINT (milliseconds, 0); |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2434 else |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2435 CHECK_NUMBER (milliseconds, 1); |
2648 | 2436 usec = XINT (milliseconds) * 1000; |
2437 | |
2438 #ifdef LISP_FLOAT_TYPE | |
2439 { | |
2440 double duration = extract_float (seconds); | |
2441 sec = (int) duration; | |
2442 usec += (duration - sec) * 1000000; | |
2443 } | |
2444 #else | |
2445 CHECK_NUMBER (seconds, 0); | |
2446 sec = XINT (seconds); | |
2447 #endif | |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2448 |
650 | 2449 #ifndef EMACS_HAS_USECS |
2291
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2450 if (usec != 0 && sec == 0) |
bee5c1693cac
* dispnew.c (Fsleep_for): Make this take two arguments SECONDS and
Jim Blandy <jimb@redhat.com>
parents:
2288
diff
changeset
|
2451 error ("millisecond `sit-for' not supported on %s", SYSTEM_TYPE); |
650 | 2452 #endif |
2453 | |
17961
86ae1679df19
(sit_for): New arg initial_display.
Richard M. Stallman <rms@gnu.org>
parents:
17895
diff
changeset
|
2454 return sit_for (sec, usec, 0, NILP (nodisp), NILP (nodisp)); |
650 | 2455 } |
314 | 2456 |
2457 char *terminal_type; | |
2458 | |
2459 /* Initialization done when Emacs fork is started, before doing stty. */ | |
2460 /* Determine terminal type and set terminal_driver */ | |
2461 /* Then invoke its decoding routine to set up variables | |
2462 in the terminal package */ | |
2463 | |
2464 init_display () | |
2465 { | |
2466 #ifdef HAVE_X_WINDOWS | |
2467 extern int display_arg; | |
2468 #endif | |
2469 | |
2470 meta_key = 0; | |
2471 inverse_video = 0; | |
2472 cursor_in_echo_area = 0; | |
2473 terminal_type = (char *) 0; | |
2474 | |
2339
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2475 /* Now is the time to initialize this; it's used by init_sys_modes |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2476 during startup. */ |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2477 Vwindow_system = Qnil; |
314 | 2478 |
2339
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2479 /* If the user wants to use a window system, we shouldn't bother |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2480 initializing the terminal. This is especially important when the |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2481 terminal is so dumb that emacs gives up before and doesn't bother |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2482 using the window system. |
a302de11debf
* dispnew.c (init_display): Initialize Vwindow_system.
Jim Blandy <jimb@redhat.com>
parents:
2292
diff
changeset
|
2483 |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2484 If the DISPLAY environment variable is set and nonempty, |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2485 try to use X, and die with an error message if that doesn't work. */ |
314 | 2486 |
2487 #ifdef HAVE_X_WINDOWS | |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
2488 if (! display_arg) |
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
2489 { |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2490 char *display; |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
2491 #ifdef VMS |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2492 display = getenv ("DECW$DISPLAY"); |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
2493 #else |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2494 display = getenv ("DISPLAY"); |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
2495 #endif |
14125
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2496 |
2f222e8b06f5
(init_display): Treat null string DISPLAY var like not set.
Karl Heuer <kwzh@gnu.org>
parents:
14068
diff
changeset
|
2497 display_arg = (display != 0 && *display != 0); |
2364 | 2498 } |
2359
90a5f91329f3
* dispnew.c (init_display): Get display name from environment
Jim Blandy <jimb@redhat.com>
parents:
2339
diff
changeset
|
2499 |
18774
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
2500 if (!inhibit_window_system && display_arg |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
2501 #ifndef CANNOT_DUMP |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
2502 && initialized |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
2503 #endif |
95b4ac950a5d
(init_display): Go ahead and prepare for
Richard M. Stallman <rms@gnu.org>
parents:
18015
diff
changeset
|
2504 ) |
314 | 2505 { |
2506 Vwindow_system = intern ("x"); | |
2507 #ifdef HAVE_X11 | |
2508 Vwindow_system_version = make_number (11); | |
2509 #else | |
2510 Vwindow_system_version = make_number (10); | |
2511 #endif | |
15273
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
2512 #if defined (LINUX) && defined (HAVE_LIBNCURSES) |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
2513 /* In some versions of ncurses, |
15282 | 2514 tputs crashes if we have not called tgetent. |
15273
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
2515 So call tgetent. */ |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
2516 { char b[2044]; tgetent (b, "xterm");} |
db889dd732a1
(init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
Karl Heuer <kwzh@gnu.org>
parents:
15078
diff
changeset
|
2517 #endif |
314 | 2518 return; |
2519 } | |
2520 #endif /* HAVE_X_WINDOWS */ | |
2521 | |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2522 #ifdef HAVE_NTGUI |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2523 if (!inhibit_window_system) |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2524 { |
16589
ec300a10e407
(init_display) [HAVE_NTGUI]: Use w32 for window-system.
Geoff Voelker <voelker@cs.washington.edu>
parents:
16412
diff
changeset
|
2525 Vwindow_system = intern ("w32"); |
13408
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2526 Vwindow_system_version = make_number (1); |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2527 return; |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2528 } |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2529 #endif /* HAVE_NTGUI */ |
7e92386e1cf7
[HAVE_NTGUI]: Include w32term.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13220
diff
changeset
|
2530 |
314 | 2531 /* If no window system has been specified, try to use the terminal. */ |
2532 if (! isatty (0)) | |
2533 { | |
16896
b2c51d6de440
(init_display): Use `fatal'.
Richard M. Stallman <rms@gnu.org>
parents:
16891
diff
changeset
|
2534 fatal ("standard input is not a tty"); |
314 | 2535 exit (1); |
2536 } | |
2537 | |
2538 /* Look at the TERM variable */ | |
2539 terminal_type = (char *) getenv ("TERM"); | |
2540 if (!terminal_type) | |
2541 { | |
2542 #ifdef VMS | |
2543 fprintf (stderr, "Please specify your terminal type.\n\ | |
2544 For types defined in VMS, use set term /device=TYPE.\n\ | |
2545 For types not defined in VMS, use define emacs_term \"TYPE\".\n\ | |
2546 \(The quotation marks are necessary since terminal types are lower case.)\n"); | |
2547 #else | |
2548 fprintf (stderr, "Please set the environment variable TERM; see tset(1).\n"); | |
2549 #endif | |
2550 exit (1); | |
2551 } | |
2552 | |
2553 #ifdef VMS | |
2554 /* VMS DCL tends to upcase things, so downcase term type. | |
2555 Hardly any uppercase letters in terminal types; should be none. */ | |
2556 { | |
2557 char *new = (char *) xmalloc (strlen (terminal_type) + 1); | |
2558 char *p; | |
2559 | |
2560 strcpy (new, terminal_type); | |
2561 | |
2562 for (p = new; *p; p++) | |
2563 if (isupper (*p)) | |
2564 *p = tolower (*p); | |
2565 | |
2566 terminal_type = new; | |
2567 } | |
2568 #endif | |
2569 | |
2570 term_init (terminal_type); | |
2571 | |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2572 { |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2573 int width = FRAME_WINDOW_WIDTH (selected_frame); |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2574 int height = FRAME_HEIGHT (selected_frame); |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2575 |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2576 unsigned int total_glyphs = height * (width + 2) * sizeof (GLYPH); |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2577 |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2578 /* If these sizes are so big they cause overflow, |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2579 just ignore the change. It's not clear what better we could do. */ |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2580 if (total_glyphs / sizeof (GLYPH) / height != width + 2) |
16896
b2c51d6de440
(init_display): Use `fatal'.
Richard M. Stallman <rms@gnu.org>
parents:
16891
diff
changeset
|
2581 fatal ("screen size %dx%d too big", width, height); |
16891
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2582 } |
989845750a4d
(init_display): Check for overflow in screen size.
Richard M. Stallman <rms@gnu.org>
parents:
16881
diff
changeset
|
2583 |
764 | 2584 remake_frame_glyphs (selected_frame); |
2585 calculate_costs (selected_frame); | |
314 | 2586 |
2587 /* X and Y coordinates of the cursor between updates. */ | |
764 | 2588 FRAME_CURSOR_X (selected_frame) = 0; |
2589 FRAME_CURSOR_Y (selected_frame) = 0; | |
314 | 2590 |
2591 #ifdef SIGWINCH | |
2592 #ifndef CANNOT_DUMP | |
2593 if (initialized) | |
2594 #endif /* CANNOT_DUMP */ | |
2595 signal (SIGWINCH, window_change_signal); | |
2596 #endif /* SIGWINCH */ | |
2597 } | |
2598 | |
2599 syms_of_display () | |
2600 { | |
764 | 2601 defsubr (&Sredraw_frame); |
314 | 2602 defsubr (&Sredraw_display); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
2603 defsubr (&Sframe_or_buffer_changed_p); |
314 | 2604 defsubr (&Sopen_termscript); |
2605 defsubr (&Sding); | |
2606 defsubr (&Ssit_for); | |
2607 defsubr (&Ssleep_for); | |
2608 defsubr (&Ssend_string_to_terminal); | |
2609 | |
12186
6811992e871c
(Fframe_or_buffer_changed_p): Calculate vector size right.
Karl Heuer <kwzh@gnu.org>
parents:
11919
diff
changeset
|
2610 frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda); |
7810
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
2611 staticpro (&frame_and_buffer_state); |
15c0bf73737e
(Fframe_or_buffer_changed_p): New function.
Karl Heuer <kwzh@gnu.org>
parents:
7808
diff
changeset
|
2612 |
13220
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
2613 Qdisplay_table = intern ("display-table"); |
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
2614 staticpro (&Qdisplay_table); |
2e9014617492
(Qdisplay_table): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
13105
diff
changeset
|
2615 |
314 | 2616 DEFVAR_INT ("baud-rate", &baud_rate, |
7926
b87f2c705501
(syms_of_display): Make baud-rate a user var.
Richard M. Stallman <rms@gnu.org>
parents:
7900
diff
changeset
|
2617 "*The output baud rate of the terminal.\n\ |
314 | 2618 On most systems, changing this value will affect the amount of padding\n\ |
2619 and the other strategic decisions made during redisplay."); | |
2620 DEFVAR_BOOL ("inverse-video", &inverse_video, | |
764 | 2621 "*Non-nil means invert the entire frame display.\n\ |
314 | 2622 This means everything is in inverse video which otherwise would not be."); |
2623 DEFVAR_BOOL ("visible-bell", &visible_bell, | |
764 | 2624 "*Non-nil means try to flash the frame to represent a bell."); |
314 | 2625 DEFVAR_BOOL ("no-redraw-on-reenter", &no_redraw_on_reenter, |
764 | 2626 "*Non-nil means no need to redraw entire frame after suspending.\n\ |
314 | 2627 A non-nil value is useful if the terminal can automatically preserve\n\ |
764 | 2628 Emacs's frame display when you reenter Emacs.\n\ |
314 | 2629 It is up to you to set this variable if your terminal can do that."); |
2630 DEFVAR_LISP ("window-system", &Vwindow_system, | |
2631 "A symbol naming the window-system under which Emacs is running\n\ | |
2632 \(such as `x'), or nil if emacs is running on an ordinary terminal."); | |
2633 DEFVAR_LISP ("window-system-version", &Vwindow_system_version, | |
2634 "The version number of the window system in use.\n\ | |
2635 For X windows, this is 10 or 11."); | |
2636 DEFVAR_BOOL ("cursor-in-echo-area", &cursor_in_echo_area, | |
2637 "Non-nil means put cursor in minibuffer, at end of any message there."); | |
2638 DEFVAR_LISP ("glyph-table", &Vglyph_table, | |
764 | 2639 "Table defining how to output a glyph code to the frame.\n\ |
314 | 2640 If not nil, this is a vector indexed by glyph code to define the glyph.\n\ |
2641 Each element can be:\n\ | |
2642 integer: a glyph code which this glyph is an alias for.\n\ | |
2643 string: output this glyph using that string (not impl. in X windows).\n\ | |
2644 nil: this glyph mod 256 is char code to output,\n\ | |
6857 | 2645 and this glyph / 256 is face code for X windows (see `face-id')."); |
314 | 2646 Vglyph_table = Qnil; |
2647 | |
2648 DEFVAR_LISP ("standard-display-table", &Vstandard_display_table, | |
2649 "Display table to use for buffers that specify none.\n\ | |
2650 See `buffer-display-table' for more information."); | |
2651 Vstandard_display_table = Qnil; | |
2652 | |
2653 /* Initialize `window-system', unless init_display already decided it. */ | |
2654 #ifdef CANNOT_DUMP | |
2655 if (noninteractive) | |
2656 #endif | |
2657 { | |
2658 Vwindow_system = Qnil; | |
2659 Vwindow_system_version = Qnil; | |
2660 } | |
2661 } |