Mercurial > emacs
annotate src/scroll.c @ 107777:13c077500eb3
2010-04-04 John Wiegley <jwiegley@gmail.com>
* ido.el (ido-use-virtual-buffers): New variable to indicate
whether "virtual buffer" support is enabled for IDO. Essentially
it works as follows: Say you are visiting a file and the buffer
gets cleaned up by mignight.el. Later, you want to switch to that
buffer, but find it's no longer open. With virtual buffers
enabled, the buffer name stays in the buffer list (using the
ido-virtual face, and always at the end), and if you select it, it
opens the file back up again. This allows you to think less about
whether recently opened files are still open or not. Most of the
time you can quit Emacs, restart, and then switch to a file buffer
that was previously open as if it still were. NOTE: This feature
has been present in iswitchb for several years now, and I'm
porting the same logic to IDO.
(ido-virtual): Face used to indicate virtual buffers in the list.
(ido-buffer-internal): If a buffer is chosen, and no such buffer
exists, but a virtual buffer of that name does (which would be why
it was in the list), recreate the buffer by reopening the file.
(ido-make-buffer-list): If virtual buffers are being used, call
`ido-add-virtual-buffers-to-list' before the make list hook.
(ido-virtual-buffers): New variable which contains a copy of the
current contents of the `recentf-list', albeit pared down for the
sake of speed, and with proper faces applied.
(ido-add-virtual-buffers-to-list): Using the `recentf-list',
create a list of "virtual buffers" to present to the user in
addition to the currently open set. Note that this logic could
get rather slow if that list is too large. With the default
`recentf-max-saved-items' of 200, there is little speed penalty.
author | jwiegley@gmail.com |
---|---|
date | Sun, 04 Apr 2010 02:55:19 -0400 |
parents | 1d1d5d9bd884 |
children | 2bc9a0c04c87 376148b31b5e |
rev | line source |
---|---|
154 | 1 /* Calculate what line insertion or deletion to do, and do it, |
75227
e90d04cd455a
Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents:
68651
diff
changeset
|
2 Copyright (C) 1985, 1986, 1990, 1993, 1994, 2001, 2002, 2003, 2004, |
106815 | 3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
154 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
7 GNU Emacs is free software: you can redistribute it and/or modify |
154 | 8 it under the terms of the GNU General Public License as published by |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
9 the Free Software Foundation, either version 3 of the License, or |
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
10 (at your option) any later version. |
154 | 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 | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
87649
diff
changeset
|
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
154 | 19 |
20 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
3356
diff
changeset
|
21 #include <config.h> |
25004 | 22 #include <stdio.h> |
23 #include <string.h> | |
105669
68dd71358159
* alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
100951
diff
changeset
|
24 #include <setjmp.h> |
53229
33c3c7c16e13
lib-src/emacsclient.c: Implemented --here option (open a new Emacs tty). Needs more work.
Karoly Lorentey <lorentey@elte.hu>
parents:
53226
diff
changeset
|
25 #include "lisp.h" |
154 | 26 #include "termchar.h" |
27 #include "dispextern.h" | |
31102
6a0caa788013
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
28407
diff
changeset
|
28 #include "keyboard.h" |
766 | 29 #include "frame.h" |
25004 | 30 #include "window.h" |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
53229
diff
changeset
|
31 #include "termhooks.h" |
154 | 32 |
33 /* All costs measured in characters. | |
766 | 34 So no cost can exceed the area of a frame, measured in characters. |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
35 Let's hope this is never more than 1000000 characters. */ |
154 | 36 |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
37 #define INFINITY 1000000 |
154 | 38 |
39 struct matrix_elt | |
40 { | |
41 /* Cost of outputting through this line | |
42 if no insert/delete is done just above it. */ | |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
43 int writecost; |
154 | 44 /* Cost of outputting through this line |
45 if an insert is done just above it. */ | |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
46 int insertcost; |
154 | 47 /* Cost of outputting through this line |
48 if a delete is done just above it. */ | |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
49 int deletecost; |
154 | 50 /* Number of inserts so far in this run of inserts, |
51 for the cost in insertcost. */ | |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
52 unsigned char insertcount; |
154 | 53 /* Number of deletes so far in this run of deletes, |
54 for the cost in deletecost. */ | |
6773
ed16e189b9a5
(struct matrix_elt): Use int, not short.
Richard M. Stallman <rms@gnu.org>
parents:
6647
diff
changeset
|
55 unsigned char deletecount; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
56 /* Number of writes so far since the last insert |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
57 or delete for the cost in writecost. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
58 unsigned char writecount; |
154 | 59 }; |
60 | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
61 static void do_direct_scrolling P_ ((struct frame *, |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
62 struct glyph_matrix *, |
25004 | 63 struct matrix_elt *, |
64 int, int)); | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
65 static void do_scrolling P_ ((struct frame *, |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
66 struct glyph_matrix *, |
25004 | 67 struct matrix_elt *, |
68 int, int)); | |
69 | |
154 | 70 |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
71 /* Determine, in matrix[i,j], the cost of updating the first j old |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
72 lines into the first i new lines using the general scrolling method. |
154 | 73 This involves using insert or delete somewhere if i != j. |
74 For each matrix elements, three kinds of costs are recorded: | |
75 the smallest cost that ends with an insert, the smallest | |
76 cost that ends with a delete, and the smallest cost that | |
77 ends with neither one. These are kept separate because | |
78 on some terminals the cost of doing an insert varies | |
79 depending on whether one was just done, etc. */ | |
80 | |
81 /* draw_cost[VPOS] is the cost of outputting new line at VPOS. | |
82 old_hash[VPOS] is the hash code of the old line at VPOS. | |
83 new_hash[VPOS] is the hash code of the new line at VPOS. | |
766 | 84 Note that these are not true frame vpos's, but relative |
154 | 85 to the place at which the first mismatch between old and |
86 new contents appears. */ | |
87 | |
88 static void | |
766 | 89 calculate_scrolling (frame, matrix, window_size, lines_below, |
154 | 90 draw_cost, old_hash, new_hash, |
91 free_at_end) | |
766 | 92 FRAME_PTR frame; |
154 | 93 /* matrix is of size window_size + 1 on each side. */ |
94 struct matrix_elt *matrix; | |
48323
3aa5ba8c3ef4
(calculate_scrolling, calculate_direct_scrolling):
Dave Love <fx@gnu.org>
parents:
39682
diff
changeset
|
95 int window_size, lines_below; |
154 | 96 int *draw_cost; |
97 int *old_hash; | |
98 int *new_hash; | |
99 int free_at_end; | |
100 { | |
101 register int i, j; | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
102 int frame_lines = FRAME_LINES (frame); |
154 | 103 register struct matrix_elt *p, *p1; |
104 register int cost, cost1; | |
105 | |
53225
4250e7e26247
Add a level of indirection to terminal characteristics.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
106 int lines_moved = window_size |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
53229
diff
changeset
|
107 + (FRAME_SCROLL_REGION_OK (frame) ? 0 : lines_below); |
154 | 108 /* first_insert_cost[I] is the cost of doing the first insert-line |
25004 | 109 at the i'th line of the lines we are considering, |
154 | 110 where I is origin 1 (as it is below). */ |
111 int *first_insert_cost | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
112 = &FRAME_INSERT_COST (frame)[frame_lines - 1 - lines_moved]; |
154 | 113 int *first_delete_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
114 = &FRAME_DELETE_COST (frame)[frame_lines - 1 - lines_moved]; |
154 | 115 int *next_insert_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
116 = &FRAME_INSERTN_COST (frame)[frame_lines - 1 - lines_moved]; |
154 | 117 int *next_delete_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
118 = &FRAME_DELETEN_COST (frame)[frame_lines - 1 - lines_moved]; |
154 | 119 |
120 /* Discourage long scrolls on fast lines. | |
766 | 121 Don't scroll nearly a full frame height unless it saves |
154 | 122 at least 1/4 second. */ |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
123 int extra_cost = baud_rate / (10 * 4 * FRAME_LINES (frame)); |
154 | 124 |
3356
09759a9653c5
(calculate_scrolling): Defend against negative baud_rate.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
125 if (baud_rate <= 0) |
09759a9653c5
(calculate_scrolling): Defend against negative baud_rate.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
126 extra_cost = 1; |
09759a9653c5
(calculate_scrolling): Defend against negative baud_rate.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
127 |
154 | 128 /* initialize the top left corner of the matrix */ |
129 matrix->writecost = 0; | |
130 matrix->insertcost = INFINITY; | |
131 matrix->deletecost = INFINITY; | |
132 matrix->insertcount = 0; | |
133 matrix->deletecount = 0; | |
134 | |
135 /* initialize the left edge of the matrix */ | |
136 cost = first_insert_cost[1] - next_insert_cost[1]; | |
137 for (i = 1; i <= window_size; i++) | |
138 { | |
139 p = matrix + i * (window_size + 1); | |
140 cost += draw_cost[i] + next_insert_cost[i] + extra_cost; | |
141 p->insertcost = cost; | |
142 p->writecost = INFINITY; | |
143 p->deletecost = INFINITY; | |
144 p->insertcount = i; | |
145 p->deletecount = 0; | |
146 } | |
147 | |
148 /* initialize the top edge of the matrix */ | |
149 cost = first_delete_cost[1] - next_delete_cost[1]; | |
150 for (j = 1; j <= window_size; j++) | |
151 { | |
152 cost += next_delete_cost[j]; | |
153 matrix[j].deletecost = cost; | |
154 matrix[j].writecost = INFINITY; | |
155 matrix[j].insertcost = INFINITY; | |
156 matrix[j].deletecount = j; | |
157 matrix[j].insertcount = 0; | |
158 } | |
159 | |
766 | 160 /* `i' represents the vpos among new frame contents. |
161 `j' represents the vpos among the old frame contents. */ | |
154 | 162 p = matrix + window_size + 2; /* matrix [1, 1] */ |
163 for (i = 1; i <= window_size; i++, p++) | |
164 for (j = 1; j <= window_size; j++, p++) | |
165 { | |
166 /* p contains the address of matrix [i, j] */ | |
167 | |
168 /* First calculate the cost assuming we do | |
169 not insert or delete above this line. | |
170 That is, if we update through line i-1 | |
171 based on old lines through j-1, | |
172 and then just change old line j to new line i. */ | |
173 p1 = p - window_size - 2; /* matrix [i-1, j-1] */ | |
174 cost = p1->writecost; | |
175 if (cost > p1->insertcost) | |
176 cost = p1->insertcost; | |
177 if (cost > p1->deletecost) | |
178 cost = p1->deletecost; | |
179 if (old_hash[j] != new_hash[i]) | |
180 cost += draw_cost[i]; | |
181 p->writecost = cost; | |
182 | |
183 /* Calculate the cost if we do an insert-line | |
184 before outputting this line. | |
185 That is, we update through line i-1 | |
186 based on old lines through j, | |
187 do an insert-line on line i, | |
188 and then output line i from scratch, | |
189 leaving old lines starting from j for reuse below. */ | |
190 p1 = p - window_size - 1; /* matrix [i-1, j] */ | |
191 /* No need to think about doing a delete followed | |
192 immediately by an insert. It cannot be as good | |
193 as not doing either of them. */ | |
194 if (free_at_end == i) | |
195 { | |
196 cost = p1->writecost; | |
197 cost1 = p1->insertcost; | |
198 } | |
199 else | |
200 { | |
201 cost = p1->writecost + first_insert_cost[i]; | |
6888
a39caeb88721
(calculate_scrolling): Add explicit casts, to avoid compiler warnings.
Karl Heuer <kwzh@gnu.org>
parents:
6773
diff
changeset
|
202 if ((int) p1->insertcount > i) |
154 | 203 abort (); |
204 cost1 = p1->insertcost + next_insert_cost[i - p1->insertcount]; | |
205 } | |
206 p->insertcost = min (cost, cost1) + draw_cost[i] + extra_cost; | |
207 p->insertcount = (cost < cost1) ? 1 : p1->insertcount + 1; | |
6888
a39caeb88721
(calculate_scrolling): Add explicit casts, to avoid compiler warnings.
Karl Heuer <kwzh@gnu.org>
parents:
6773
diff
changeset
|
208 if ((int) p->insertcount > i) |
154 | 209 abort (); |
210 | |
211 /* Calculate the cost if we do a delete line after | |
212 outputting this line. | |
213 That is, we update through line i | |
214 based on old lines through j-1, | |
215 and throw away old line j. */ | |
216 p1 = p - 1; /* matrix [i, j-1] */ | |
217 /* No need to think about doing an insert followed | |
218 immediately by a delete. */ | |
219 if (free_at_end == i) | |
220 { | |
221 cost = p1->writecost; | |
222 cost1 = p1->deletecost; | |
223 } | |
224 else | |
225 { | |
226 cost = p1->writecost + first_delete_cost[i]; | |
227 cost1 = p1->deletecost + next_delete_cost[i]; | |
228 } | |
229 p->deletecost = min (cost, cost1); | |
230 p->deletecount = (cost < cost1) ? 1 : p1->deletecount + 1; | |
231 } | |
232 } | |
25004 | 233 |
234 | |
154 | 235 |
25004 | 236 /* Perform insert-lines and delete-lines operations on CURRENT_MATRIX |
237 according to the costs in MATRIX, using the general scrolling | |
238 method that is used if the terminal does not support the setting of | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
239 scroll windows (scroll_region_ok == 0). |
6647
e6611521fb67
(do_scrolling): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
240 |
e6611521fb67
(do_scrolling): Handle charstarts like glyphs.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
241 WINDOW_SIZE is the number of lines being considered for scrolling |
25004 | 242 and UNCHANGED_AT_TOP is the vpos of the first line being |
243 considered. These two arguments can specify any contiguous range | |
244 of lines. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
245 |
154 | 246 static void |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
247 do_scrolling (frame, current_matrix, matrix, window_size, unchanged_at_top) |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
248 struct frame *frame; |
25004 | 249 struct glyph_matrix *current_matrix; |
154 | 250 struct matrix_elt *matrix; |
251 int window_size; | |
252 int unchanged_at_top; | |
253 { | |
25004 | 254 struct matrix_elt *p; |
255 int i, j, k; | |
256 | |
257 /* Set to 1 if we have set a terminal window with | |
258 set_terminal_window. */ | |
259 int terminal_window_p = 0; | |
154 | 260 |
25004 | 261 /* A queue for line insertions to be done. */ |
262 struct queue { int count, pos; }; | |
263 struct queue *queue_start | |
264 = (struct queue *) alloca (current_matrix->nrows * sizeof (struct queue)); | |
265 struct queue *queue = queue_start; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
266 |
25004 | 267 char *retained_p = (char *) alloca (window_size * sizeof (char)); |
268 int *copy_from = (int *) alloca (window_size * sizeof (int)); | |
154 | 269 |
25004 | 270 /* Zero means line is empty. */ |
271 bzero (retained_p, window_size * sizeof (char)); | |
272 for (k = 0; k < window_size; ++k) | |
273 copy_from[k] = -1; | |
154 | 274 |
28407
f15029804aba
* scroll.c (CHECK_BOUNDS): Renamed from CHECK.
Ken Raeburn <raeburn@raeburn.org>
parents:
25004
diff
changeset
|
275 #define CHECK_BOUNDS \ |
25004 | 276 do \ |
277 { \ | |
278 int k; \ | |
279 for (k = 0; k < window_size; ++k) \ | |
280 xassert (copy_from[k] == -1 \ | |
281 || (copy_from[k] >= 0 && copy_from[k] < window_size)); \ | |
282 } \ | |
283 while (0); | |
154 | 284 |
25004 | 285 /* When j is advanced, this corresponds to deleted lines. |
286 When i is advanced, this corresponds to inserted lines. */ | |
154 | 287 i = j = window_size; |
288 while (i > 0 || j > 0) | |
289 { | |
290 p = matrix + i * (window_size + 1) + j; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
291 |
25004 | 292 if (p->insertcost < p->writecost && p->insertcost < p->deletecost) |
154 | 293 { |
25004 | 294 /* Insert should be done at vpos i-1, plus maybe some before. |
295 Queue the screen operation to be performed. */ | |
296 queue->count = p->insertcount; | |
297 queue->pos = i + unchanged_at_top - p->insertcount; | |
298 ++queue; | |
299 | |
300 /* By incrementing I, we leave room in the result rows | |
301 for the empty rows opened up. */ | |
154 | 302 i -= p->insertcount; |
303 } | |
304 else if (p->deletecost < p->writecost) | |
305 { | |
25004 | 306 /* Old line at vpos j-1, and maybe some before it, should be |
307 deleted. By decrementing J, we skip some lines in the | |
308 temp_rows which is equivalent to omitting these lines in | |
309 the result rows, thus deleting them. */ | |
154 | 310 j -= p->deletecount; |
25004 | 311 |
312 /* Set the terminal window, if not done already. */ | |
313 if (! terminal_window_p) | |
154 | 314 { |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
315 set_terminal_window (frame, window_size + unchanged_at_top); |
25004 | 316 terminal_window_p = 1; |
154 | 317 } |
25004 | 318 |
319 /* Delete lines on the terminal. */ | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
320 ins_del_lines (frame, j + unchanged_at_top, - p->deletecount); |
154 | 321 } |
322 else | |
323 { | |
25004 | 324 /* Best thing done here is no insert or delete, i.e. a write. */ |
325 --i, --j; | |
326 xassert (i >= 0 && i < window_size); | |
327 xassert (j >= 0 && j < window_size); | |
328 copy_from[i] = j; | |
329 retained_p[j] = 1; | |
154 | 330 |
25004 | 331 #if GLYPH_DEBUG |
28407
f15029804aba
* scroll.c (CHECK_BOUNDS): Renamed from CHECK.
Ken Raeburn <raeburn@raeburn.org>
parents:
25004
diff
changeset
|
332 CHECK_BOUNDS; |
25004 | 333 #endif |
154 | 334 } |
335 } | |
336 | |
25004 | 337 /* Now do all insertions queued above. */ |
338 if (queue > queue_start) | |
154 | 339 { |
25004 | 340 int next = -1; |
341 | |
342 /* Set the terminal window if not yet done. */ | |
343 if (!terminal_window_p) | |
344 { | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
345 set_terminal_window (frame, window_size + unchanged_at_top); |
25004 | 346 terminal_window_p = 1; |
347 } | |
348 | |
349 do | |
350 { | |
351 --queue; | |
352 | |
353 /* Do the deletion on the terminal. */ | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
354 ins_del_lines (frame, queue->pos, queue->count); |
25004 | 355 |
356 /* All lines in the range deleted become empty in the glyph | |
357 matrix. Assign to them glyph rows that are not retained. | |
358 K is the starting position of the deleted range relative | |
359 to the window we are working in. */ | |
360 k = queue->pos - unchanged_at_top; | |
361 for (j = 0; j < queue->count; ++j) | |
362 { | |
363 /* Find the next row not retained. */ | |
364 while (retained_p[++next]) | |
365 ; | |
366 | |
367 /* Record that this row is to be used for the empty | |
368 glyph row j. */ | |
369 copy_from[k + j] = next; | |
370 } | |
371 } | |
372 while (queue > queue_start); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
373 |
154 | 374 } |
375 | |
25004 | 376 for (k = 0; k < window_size; ++k) |
377 xassert (copy_from[k] >= 0 && copy_from[k] < window_size); | |
154 | 378 |
25004 | 379 /* Perform the row swizzling. */ |
380 mirrored_line_dance (current_matrix, unchanged_at_top, window_size, | |
381 copy_from, retained_p); | |
154 | 382 |
25004 | 383 /* Some sanity checks if GLYPH_DEBUG != 0. */ |
384 CHECK_MATRIX (current_matrix); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
385 |
25004 | 386 if (terminal_window_p) |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
387 set_terminal_window (frame, 0); |
154 | 388 } |
25004 | 389 |
154 | 390 |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
391 /* Determine, in matrix[i,j], the cost of updating the first j |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
392 old lines into the first i new lines using the direct |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
393 scrolling method. When the old line and the new line have |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
394 different hash codes, the calculated cost of updating old |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
395 line j into new line i includes the cost of outputting new |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
396 line i, and if i != j, the cost of outputting the old line j |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
397 is also included, as a penalty for moving the line and then |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
398 erasing it. In addition, the cost of updating a sequence of |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
399 lines with constant i - j includes the cost of scrolling the |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
400 old lines into their new positions, unless i == j. Scrolling |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
401 is achieved by setting the screen window to avoid affecting |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
402 other lines below, and inserting or deleting lines at the top |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
403 of the scrolled region. The cost of scrolling a sequence of |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
404 lines includes the fixed cost of specifying a scroll region, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
405 plus a variable cost which can depend upon the number of lines |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
406 involved and the distance by which they are scrolled, and an |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
407 extra cost to discourage long scrolls. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
408 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
409 As reflected in the matrix, an insert or delete does not |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
410 correspond directly to the insertion or deletion which is |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
411 used in scrolling lines. An insert means that the value of i |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
412 has increased without a corresponding increase in the value |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
413 of j. A delete means that the value of j has increased |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
414 without a corresponding increase in the value of i. A write |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
415 means that i and j are both increased by the same amount, and |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
416 that the old lines will be moved to their new positions. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
417 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
418 An insert following a delete is allowed only if i > j. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
419 A delete following an insert is allowed only if i < j. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
420 These restrictions ensure that the new lines in an insert |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
421 will always be blank as an effect of the neighboring writes. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
422 Thus the calculated cost of an insert is simply the cost of |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
423 outputting the new line contents. The direct cost of a |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
424 delete is zero. Inserts and deletes indirectly affect the |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
425 total cost through their influence on subsequent writes. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
426 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
427 /* The vectors draw_cost, old_hash, and new_hash have the same |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
428 meanings here as in calculate_scrolling, and old_draw_cost |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
429 is the equivalent of draw_cost for the old line contents */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
430 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
431 static void |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
432 calculate_direct_scrolling (frame, matrix, window_size, lines_below, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
433 draw_cost, old_draw_cost, old_hash, new_hash, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
434 free_at_end) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
435 FRAME_PTR frame; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
436 /* matrix is of size window_size + 1 on each side. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
437 struct matrix_elt *matrix; |
48323
3aa5ba8c3ef4
(calculate_scrolling, calculate_direct_scrolling):
Dave Love <fx@gnu.org>
parents:
39682
diff
changeset
|
438 int window_size, lines_below; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
439 int *draw_cost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
440 int *old_draw_cost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
441 int *old_hash; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
442 int *new_hash; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
443 int free_at_end; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
444 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
445 register int i, j; |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
446 int frame_lines = FRAME_LINES (frame); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
447 register struct matrix_elt *p, *p1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
448 register int cost, cost1, delta; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
449 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
450 /* first_insert_cost[-I] is the cost of doing the first insert-line |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
451 at a position I lines above the bottom line in the scroll window. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
452 int *first_insert_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
453 = &FRAME_INSERT_COST (frame)[frame_lines - 1]; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
454 int *first_delete_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
455 = &FRAME_DELETE_COST (frame)[frame_lines - 1]; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
456 int *next_insert_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
457 = &FRAME_INSERTN_COST (frame)[frame_lines - 1]; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
458 int *next_delete_cost |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
459 = &FRAME_DELETEN_COST (frame)[frame_lines - 1]; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
460 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
461 int scroll_overhead; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
462 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
463 /* Discourage long scrolls on fast lines. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
464 Don't scroll nearly a full frame height unless it saves |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
465 at least 1/4 second. */ |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
466 int extra_cost = baud_rate / (10 * 4 * FRAME_LINES (frame)); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
467 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
468 if (baud_rate <= 0) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
469 extra_cost = 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
470 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
471 /* Overhead of setting the scroll window, plus the extra cost |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
472 cost of scrolling by a distance of one. The extra cost is |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
473 added once for consistency with the cost vectors */ |
53225
4250e7e26247
Add a level of indirection to terminal characteristics.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
474 scroll_overhead |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
53229
diff
changeset
|
475 = FRAME_SCROLL_REGION_COST (frame) + extra_cost; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
476 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
477 /* initialize the top left corner of the matrix */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
478 matrix->writecost = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
479 matrix->insertcost = INFINITY; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
480 matrix->deletecost = INFINITY; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
481 matrix->writecount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
482 matrix->insertcount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
483 matrix->deletecount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
484 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
485 /* initialize the left edge of the matrix */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
486 cost = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
487 for (i = 1; i <= window_size; i++) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
488 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
489 p = matrix + i * (window_size + 1); |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
490 cost += draw_cost[i]; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
491 p->insertcost = cost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
492 p->writecost = INFINITY; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
493 p->deletecost = INFINITY; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
494 p->insertcount = i; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
495 p->writecount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
496 p->deletecount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
497 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
498 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
499 /* initialize the top edge of the matrix */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
500 for (j = 1; j <= window_size; j++) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
501 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
502 matrix[j].deletecost = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
503 matrix[j].writecost = INFINITY; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
504 matrix[j].insertcost = INFINITY; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
505 matrix[j].deletecount = j; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
506 matrix[j].writecount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
507 matrix[j].insertcount = 0; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
508 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
509 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
510 /* `i' represents the vpos among new frame contents. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
511 `j' represents the vpos among the old frame contents. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
512 p = matrix + window_size + 2; /* matrix [1, 1] */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
513 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
514 for (i = 1; i <= window_size; i++, p++) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
515 for (j = 1; j <= window_size; j++, p++) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
516 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
517 /* p contains the address of matrix [i, j] */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
518 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
519 /* First calculate the cost assuming we do |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
520 not insert or delete above this line. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
521 That is, if we update through line i-1 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
522 based on old lines through j-1, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
523 and then just change old line j to new line i. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
524 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
525 Depending on which choice gives the lower cost, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
526 this usually involves either scrolling a single line |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
527 or extending a sequence of scrolled lines, but |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
528 when i == j, no scrolling is required. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
529 p1 = p - window_size - 2; /* matrix [i-1, j-1] */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
530 cost = p1->insertcost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
531 if (cost > p1->deletecost) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
532 cost = p1->deletecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
533 cost1 = p1->writecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
534 if (i == j) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
535 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
536 if (cost > cost1) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
537 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
538 cost = cost1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
539 p->writecount = p1->writecount + 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
540 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
541 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
542 p->writecount = 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
543 if (old_hash[j] != new_hash[i]) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
544 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
545 cost += draw_cost[i]; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
546 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
547 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
548 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
549 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
550 if (i > j) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
551 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
552 delta = i - j; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
553 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
554 /* The cost added here for scrolling the first line by |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
555 a distance N includes the overhead of setting the |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
556 scroll window, the cost of inserting N lines at a |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
557 position N lines above the bottom line of the window, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
558 and an extra cost which is proportional to N. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
559 cost += scroll_overhead + first_insert_cost[-delta] + |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
560 (delta-1) * (next_insert_cost[-delta] + extra_cost); |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
561 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
562 /* In the most general case, the insertion overhead and |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
563 the multiply factor can grow linearly as the distance |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
564 from the bottom of the window increases. The incremental |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
565 cost of scrolling an additional line depends upon the |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
566 rate of change of these two parameters. Each of these |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
567 growth rates can be determined by a simple difference. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
568 To reduce the cumulative effects of rounding error, we |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
569 vary the position at which the difference is computed. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
570 cost1 += first_insert_cost[-j] - first_insert_cost[1-j] + |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
571 (delta-1) * (next_insert_cost[-j] - next_insert_cost[1-j]); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
572 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
573 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
574 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
575 delta = j - i; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
576 cost += scroll_overhead + first_delete_cost[-delta] + |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
577 (delta-1) * (next_delete_cost[-delta] + extra_cost); |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
578 cost1 += first_delete_cost[-i] - first_delete_cost[1-i] + |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
579 (delta-1) * ( next_delete_cost[-i] - next_delete_cost[1-i]); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
580 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
581 if (cost1 < cost) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
582 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
583 cost = cost1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
584 p->writecount = p1->writecount + 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
585 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
586 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
587 p->writecount = 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
588 if (old_hash[j] != new_hash[i]) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
589 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
590 cost += draw_cost[i] + old_draw_cost[j]; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
591 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
592 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
593 p->writecost = cost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
594 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
595 /* Calculate the cost if we do an insert-line |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
596 before outputting this line. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
597 That is, we update through line i-1 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
598 based on old lines through j, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
599 do an insert-line on line i, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
600 and then output line i from scratch, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
601 leaving old lines starting from j for reuse below. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
602 p1 = p - window_size - 1; /* matrix [i-1, j] */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
603 cost = p1->writecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
604 /* If i > j, an insert is allowed after a delete. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
605 if (i > j && p1->deletecost < cost) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
606 cost = p1->deletecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
607 if (p1->insertcost <= cost) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
608 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
609 cost = p1->insertcost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
610 p->insertcount = p1->insertcount + 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
611 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
612 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
613 p->insertcount = 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
614 cost += draw_cost[i]; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
615 p->insertcost = cost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
616 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
617 /* Calculate the cost if we do a delete line after |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
618 outputting this line. |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
619 That is, we update through line i |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
620 based on old lines through j-1, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
621 and throw away old line j. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
622 p1 = p - 1; /* matrix [i, j-1] */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
623 cost = p1->writecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
624 /* If i < j, a delete is allowed after an insert. */ |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
625 if (i < j && p1->insertcost < cost) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
626 cost = p1->insertcost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
627 cost1 = p1->deletecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
628 if (p1->deletecost <= cost) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
629 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
630 cost = p1->deletecost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
631 p->deletecount = p1->deletecount + 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
632 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
633 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
634 p->deletecount = 1; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
635 p->deletecost = cost; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
636 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
637 } |
25004 | 638 |
639 | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
640 |
25004 | 641 /* Perform insert-lines and delete-lines operations on CURRENT_MATRIX |
642 according to the costs in MATRIX, using the direct scrolling method | |
643 which is used when the terminal supports setting a scroll window | |
644 (scroll_region_ok). | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
645 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
646 WINDOW_SIZE is the number of lines being considered for scrolling |
25004 | 647 and UNCHANGED_AT_TOP is the vpos of the first line being |
648 considered. These two arguments can specify any contiguous range | |
649 of lines. | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
650 |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
651 In the direct scrolling method, a new scroll window is selected |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
652 before each insertion or deletion, so that groups of lines can be |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
653 scrolled directly to their final vertical positions. This method |
25004 | 654 is described in more detail in calculate_direct_scrolling, where |
655 the cost matrix for this approach is constructed. */ | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
656 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
657 static void |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
658 do_direct_scrolling (frame, current_matrix, cost_matrix, |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
659 window_size, unchanged_at_top) |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
660 struct frame *frame; |
25004 | 661 struct glyph_matrix *current_matrix; |
662 struct matrix_elt *cost_matrix; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
663 int window_size; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
664 int unchanged_at_top; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
665 { |
25004 | 666 struct matrix_elt *p; |
667 int i, j; | |
668 | |
669 /* A queue of deletions and insertions to be performed. */ | |
670 struct alt_queue { int count, pos, window; }; | |
671 struct alt_queue *queue_start = (struct alt_queue *) | |
672 alloca (window_size * sizeof *queue_start); | |
673 struct alt_queue *queue = queue_start; | |
674 | |
675 /* Set to 1 if a terminal window has been set with | |
676 set_terminal_window: */ | |
677 int terminal_window_p = 0; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
678 |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
679 /* A nonzero value of write_follows indicates that a write has been |
25004 | 680 selected, allowing either an insert or a delete to be selected |
681 next. When write_follows is zero, a delete cannot be selected | |
682 unless j < i, and an insert cannot be selected unless i < j. | |
683 This corresponds to a similar restriction (with the ordering | |
684 reversed) in calculate_direct_scrolling, which is intended to | |
685 ensure that lines marked as inserted will be blank. */ | |
686 int write_follows_p = 1; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
687 |
25004 | 688 /* For each row in the new matrix what row of the old matrix it is. */ |
689 int *copy_from = (int *) alloca (window_size * sizeof (int)); | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
690 |
25004 | 691 /* Non-zero for each row in the new matrix that is retained from the |
692 old matrix. Lines not retained are empty. */ | |
693 char *retained_p = (char *) alloca (window_size * sizeof (char)); | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
694 |
25004 | 695 bzero (retained_p, window_size * sizeof (char)); |
696 | |
697 /* Perform some sanity checks when GLYPH_DEBUG is on. */ | |
698 CHECK_MATRIX (current_matrix); | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
699 |
25004 | 700 /* We are working on the line range UNCHANGED_AT_TOP ... |
701 UNCHANGED_AT_TOP + WINDOW_SIZE (not including) in CURRENT_MATRIX. | |
702 We step through lines in this range from the end to the start. I | |
703 is an index into new lines, j an index into old lines. The cost | |
704 matrix determines what to do for ranges of indices. | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
705 |
25004 | 706 If i is decremented without also decrementing j, this corresponds |
707 to inserting empty lines in the result. If j is decremented | |
708 without also decrementing i, this corresponds to omitting these | |
709 lines in the new rows, i.e. rows are deleted. */ | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
710 i = j = window_size; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
711 |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
712 while (i > 0 || j > 0) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
713 { |
25004 | 714 p = cost_matrix + i * (window_size + 1) + j; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
715 |
25004 | 716 if (p->insertcost < p->writecost |
717 && p->insertcost < p->deletecost | |
718 && (write_follows_p || i < j)) | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
719 { |
25004 | 720 /* Insert is cheaper than deleting or writing lines. Leave |
721 a hole in the result display that will be filled with | |
722 empty lines when the queue is emptied. */ | |
723 queue->count = 0; | |
724 queue->window = i; | |
725 queue->pos = i - p->insertcount; | |
726 ++queue; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
727 |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
728 i -= p->insertcount; |
25004 | 729 write_follows_p = 0; |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
730 } |
25004 | 731 else if (p->deletecost < p->writecost |
732 && (write_follows_p || i > j)) | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
733 { |
25004 | 734 /* Deleting lines is cheaper. By decrementing J, omit |
735 deletecount lines from the original. */ | |
736 write_follows_p = 0; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
737 j -= p->deletecount; |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
738 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
739 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
740 { |
25004 | 741 /* One or more lines should be written. In the direct |
742 scrolling method we do this by scrolling the lines to the | |
743 place they belong. */ | |
744 int n_to_write = p->writecount; | |
745 write_follows_p = 1; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
746 xassert (n_to_write > 0); |
25004 | 747 |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
748 if (i > j) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
749 { |
25004 | 750 /* Immediately insert lines */ |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
751 set_terminal_window (frame, i + unchanged_at_top); |
25004 | 752 terminal_window_p = 1; |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
753 ins_del_lines (frame, j - n_to_write + unchanged_at_top, i - j); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
754 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
755 else if (i < j) |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
756 { |
25004 | 757 /* Queue the deletion of a group of lines */ |
758 queue->pos = i - n_to_write + unchanged_at_top; | |
759 queue->window = j + unchanged_at_top; | |
760 queue->count = i - j; | |
761 ++queue; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
762 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
763 |
25004 | 764 while (n_to_write > 0) |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
765 { |
25004 | 766 --i, --j, --n_to_write; |
767 copy_from[i] = j; | |
768 retained_p[j] = 1; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
769 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
770 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
771 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
772 |
25004 | 773 /* Do queued operations. */ |
774 if (queue > queue_start) | |
775 { | |
776 int next = -1; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
777 |
25004 | 778 do |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
779 { |
25004 | 780 --queue; |
781 if (queue->count) | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
782 { |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
783 set_terminal_window (frame, queue->window); |
25004 | 784 terminal_window_p = 1; |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
785 ins_del_lines (frame, queue->pos, queue->count); |
25004 | 786 } |
787 else | |
788 { | |
789 for (j = queue->window - 1; j >= queue->pos; --j) | |
790 { | |
791 while (retained_p[++next]) | |
792 ; | |
793 copy_from[j] = next; | |
794 } | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
795 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
796 } |
25004 | 797 while (queue > queue_start); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
798 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
799 |
25004 | 800 /* Now, for each row I in the range of rows we are working on, |
801 copy_from[i] gives the original line to copy to I, and | |
802 retained_p[copy_from[i]] is zero if line I in the new display is | |
803 empty. */ | |
804 mirrored_line_dance (current_matrix, unchanged_at_top, window_size, | |
805 copy_from, retained_p); | |
806 | |
807 if (terminal_window_p) | |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
808 set_terminal_window (frame, 0); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
809 } |
25004 | 810 |
811 | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
812 |
154 | 813 void |
766 | 814 scrolling_1 (frame, window_size, unchanged_at_top, unchanged_at_bottom, |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
815 draw_cost, old_draw_cost, old_hash, new_hash, free_at_end) |
766 | 816 FRAME_PTR frame; |
154 | 817 int window_size, unchanged_at_top, unchanged_at_bottom; |
818 int *draw_cost; | |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
819 int *old_draw_cost; |
154 | 820 int *old_hash; |
821 int *new_hash; | |
822 int free_at_end; | |
823 { | |
824 struct matrix_elt *matrix; | |
825 matrix = ((struct matrix_elt *) | |
826 alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix)); | |
827 | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
53229
diff
changeset
|
828 if (FRAME_SCROLL_REGION_OK (frame)) |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
829 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
830 calculate_direct_scrolling (frame, matrix, window_size, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
831 unchanged_at_bottom, |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
832 draw_cost, old_draw_cost, |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
833 old_hash, new_hash, free_at_end); |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
834 do_direct_scrolling (frame, frame->current_matrix, |
25004 | 835 matrix, window_size, unchanged_at_top); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
836 } |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
837 else |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
838 { |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
839 calculate_scrolling (frame, matrix, window_size, unchanged_at_bottom, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
840 draw_cost, old_hash, new_hash, |
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
841 free_at_end); |
83100
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
842 do_scrolling (frame, |
4970ad4995f5
Eliminated updating_frame.
Karoly Lorentey <lorentey@elte.hu>
parents:
83004
diff
changeset
|
843 frame->current_matrix, matrix, window_size, |
25004 | 844 unchanged_at_top); |
10262
4face60ac721
(scrolling_1): When scroll_region_ok is set, use a
Richard M. Stallman <rms@gnu.org>
parents:
10109
diff
changeset
|
845 } |
154 | 846 } |
25004 | 847 |
848 | |
154 | 849 |
25004 | 850 /* Return number of lines in common between current and desired frame |
851 contents described to us only as vectors of hash codes OLDHASH and | |
852 NEWHASH. Consider only vpos range START to END (not including | |
853 END). Ignore short lines on the assumption that avoiding redrawing | |
854 such a line will have little weight. */ | |
154 | 855 |
856 int | |
857 scrolling_max_lines_saved (start, end, oldhash, newhash, cost) | |
858 int start, end; | |
859 int *oldhash, *newhash, *cost; | |
860 { | |
861 struct { int hash; int count; } lines[01000]; | |
862 register int i, h; | |
863 register int matchcount = 0; | |
864 int avg_length = 0; | |
865 int threshold; | |
866 | |
867 /* Compute a threshold which is 1/4 of average length of these lines. */ | |
868 | |
869 for (i = start; i < end; i++) | |
870 avg_length += cost[i]; | |
871 | |
872 avg_length /= end - start; | |
873 threshold = avg_length / 4; | |
874 | |
875 bzero (lines, sizeof lines); | |
876 | |
25004 | 877 /* Put new lines' hash codes in hash table. Ignore lines shorter |
878 than the threshold. Thus, if the lines that are in common are | |
879 mainly the ones that are short, they won't count. */ | |
154 | 880 for (i = start; i < end; i++) |
881 { | |
882 if (cost[i] > threshold) | |
883 { | |
884 h = newhash[i] & 0777; | |
885 lines[h].hash = newhash[i]; | |
886 lines[h].count++; | |
887 } | |
888 } | |
889 | |
25004 | 890 /* Look up old line hash codes in the hash table. Count number of |
891 matches between old lines and new. */ | |
154 | 892 for (i = start; i < end; i++) |
893 { | |
894 h = oldhash[i] & 0777; | |
895 if (oldhash[i] == lines[h].hash) | |
896 { | |
897 matchcount++; | |
898 if (--lines[h].count == 0) | |
899 lines[h].hash = 0; | |
900 } | |
901 } | |
902 | |
903 return matchcount; | |
904 } | |
905 | |
25004 | 906 /* Return a measure of the cost of moving the lines starting with vpos |
907 FROM, up to but not including vpos TO, down by AMOUNT lines (AMOUNT | |
908 may be negative). These are the same arguments that might be given | |
909 to scroll_frame_lines to perform this scrolling. */ | |
154 | 910 |
21514 | 911 int |
766 | 912 scroll_cost (frame, from, to, amount) |
913 FRAME_PTR frame; | |
154 | 914 int from, to, amount; |
915 { | |
766 | 916 /* Compute how many lines, at bottom of frame, |
154 | 917 will not be involved in actual motion. */ |
918 int limit = to; | |
919 int offset; | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
920 int height = FRAME_LINES (frame); |
154 | 921 |
421 | 922 if (amount == 0) |
923 return 0; | |
924 | |
82990
2ecd1f669db9
Fixed X support, preliminary support for X-tty combo sessions.
Karoly Lorentey <lorentey@elte.hu>
parents:
53229
diff
changeset
|
925 if (! FRAME_SCROLL_REGION_OK (frame)) |
154 | 926 limit = height; |
421 | 927 else if (amount > 0) |
928 limit += amount; | |
154 | 929 |
930 if (amount < 0) | |
931 { | |
932 int temp = to; | |
933 to = from + amount; | |
934 from = temp + amount; | |
935 amount = - amount; | |
936 } | |
937 | |
938 offset = height - limit; | |
939 | |
940 return | |
766 | 941 (FRAME_INSERT_COST (frame)[offset + from] |
942 + (amount - 1) * FRAME_INSERTN_COST (frame)[offset + from] | |
10109
869e177ca872
(scroll_cost): FRAME_DELETE_COST and FRAME_DELETEN_COSTS were confused. Fixed.
Richard M. Stallman <rms@gnu.org>
parents:
9576
diff
changeset
|
943 + FRAME_DELETE_COST (frame)[offset + to] |
869e177ca872
(scroll_cost): FRAME_DELETE_COST and FRAME_DELETEN_COSTS were confused. Fixed.
Richard M. Stallman <rms@gnu.org>
parents:
9576
diff
changeset
|
944 + (amount - 1) * FRAME_DELETEN_COST (frame)[offset + to]); |
154 | 945 } |
946 | |
947 /* Calculate the line insertion/deletion | |
948 overhead and multiply factor values */ | |
949 | |
950 static void | |
766 | 951 line_ins_del (frame, ov1, pf1, ovn, pfn, ov, mf) |
952 FRAME_PTR frame; | |
154 | 953 int ov1, ovn; |
954 int pf1, pfn; | |
955 register int *ov, *mf; | |
956 { | |
957 register int i; | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
958 register int frame_lines = FRAME_LINES (frame); |
154 | 959 register int insert_overhead = ov1 * 10; |
960 register int next_insert_cost = ovn * 10; | |
961 | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
962 for (i = frame_lines-1; i >= 0; i--) |
154 | 963 { |
529 | 964 mf[i] = next_insert_cost / 10; |
154 | 965 next_insert_cost += pfn; |
529 | 966 ov[i] = (insert_overhead + next_insert_cost) / 10; |
154 | 967 insert_overhead += pf1; |
968 } | |
969 } | |
970 | |
971 static void | |
766 | 972 ins_del_costs (frame, |
154 | 973 one_line_string, multi_string, |
974 setup_string, cleanup_string, | |
975 costvec, ncostvec, coefficient) | |
766 | 976 FRAME_PTR frame; |
154 | 977 char *one_line_string, *multi_string; |
978 char *setup_string, *cleanup_string; | |
979 int *costvec, *ncostvec; | |
980 int coefficient; | |
981 { | |
982 if (multi_string) | |
766 | 983 line_ins_del (frame, |
154 | 984 string_cost (multi_string) * coefficient, |
985 per_line_cost (multi_string) * coefficient, | |
986 0, 0, costvec, ncostvec); | |
987 else if (one_line_string) | |
766 | 988 line_ins_del (frame, |
154 | 989 string_cost (setup_string) + string_cost (cleanup_string), 0, |
990 string_cost (one_line_string), | |
991 per_line_cost (one_line_string), | |
992 costvec, ncostvec); | |
993 else | |
766 | 994 line_ins_del (frame, |
154 | 995 9999, 0, 9999, 0, |
996 costvec, ncostvec); | |
997 } | |
998 | |
999 /* Calculate the insert and delete line costs. | |
1000 Note that this is done even when running with a window system | |
1001 because we want to know how long scrolling takes (and avoid it). | |
766 | 1002 This must be redone whenever the frame height changes. |
154 | 1003 |
1004 We keep the ID costs in a precomputed array based on the position | |
1005 at which the I or D is performed. Also, there are two kinds of ID | |
1006 costs: the "once-only" and the "repeated". This is to handle both | |
1007 those terminals that are able to insert N lines at a time (once- | |
1008 only) and those that must repeatedly insert one line. | |
1009 | |
1010 The cost to insert N lines at line L is | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1011 [tt.t_ILov + (frame_lines + 1 - L) * tt.t_ILpf] + |
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1012 N * [tt.t_ILnov + (frame_lines + 1 - L) * tt.t_ILnpf] |
154 | 1013 |
1014 ILov represents the basic insert line overhead. ILpf is the padding | |
1015 required to allow the terminal time to move a line: insertion at line | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1016 L changes (frame_lines + 1 - L) lines. |
154 | 1017 |
1018 The first bracketed expression above is the overhead; the second is | |
1019 the multiply factor. Both are dependent only on the position at | |
1020 which the insert is performed. We store the overhead in | |
766 | 1021 FRAME_INSERT_COST (frame) and the multiply factor in |
1022 FRAME_INSERTN_COST (frame). Note however that any insertion | |
154 | 1023 must include at least one multiply factor. Rather than compute this |
766 | 1024 as FRAME_INSERT_COST (frame)[line]+FRAME_INSERTN_COST (frame)[line], |
1025 we add FRAME_INSERTN_COST (frame) into FRAME_INSERT_COST (frame). | |
154 | 1026 This is reasonable because of the particular algorithm used in calcM. |
1027 | |
1028 Deletion is essentially the same as insertion. | |
1029 */ | |
1030 | |
21514 | 1031 void |
766 | 1032 do_line_insertion_deletion_costs (frame, |
154 | 1033 ins_line_string, multi_ins_string, |
1034 del_line_string, multi_del_string, | |
1035 setup_string, cleanup_string, coefficient) | |
766 | 1036 FRAME_PTR frame; |
154 | 1037 char *ins_line_string, *multi_ins_string; |
1038 char *del_line_string, *multi_del_string; | |
1039 char *setup_string, *cleanup_string; | |
1040 int coefficient; | |
1041 { | |
766 | 1042 if (FRAME_INSERT_COST (frame) != 0) |
154 | 1043 { |
766 | 1044 FRAME_INSERT_COST (frame) = |
1045 (int *) xrealloc (FRAME_INSERT_COST (frame), | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1046 FRAME_LINES (frame) * sizeof (int)); |
766 | 1047 FRAME_DELETEN_COST (frame) = |
1048 (int *) xrealloc (FRAME_DELETEN_COST (frame), | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1049 FRAME_LINES (frame) * sizeof (int)); |
766 | 1050 FRAME_INSERTN_COST (frame) = |
1051 (int *) xrealloc (FRAME_INSERTN_COST (frame), | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1052 FRAME_LINES (frame) * sizeof (int)); |
766 | 1053 FRAME_DELETE_COST (frame) = |
1054 (int *) xrealloc (FRAME_DELETE_COST (frame), | |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1055 FRAME_LINES (frame) * sizeof (int)); |
154 | 1056 } |
1057 else | |
1058 { | |
766 | 1059 FRAME_INSERT_COST (frame) = |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1060 (int *) xmalloc (FRAME_LINES (frame) * sizeof (int)); |
766 | 1061 FRAME_DELETEN_COST (frame) = |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1062 (int *) xmalloc (FRAME_LINES (frame) * sizeof (int)); |
766 | 1063 FRAME_INSERTN_COST (frame) = |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1064 (int *) xmalloc (FRAME_LINES (frame) * sizeof (int)); |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48323
diff
changeset
|
1065 FRAME_DELETE_COST (frame) = |
51212
332134065648
Make (some) trivial substitutions for renamed and
Kim F. Storm <storm@cua.dk>
parents:
49600
diff
changeset
|
1066 (int *) xmalloc (FRAME_LINES (frame) * sizeof (int)); |
154 | 1067 } |
1068 | |
766 | 1069 ins_del_costs (frame, |
154 | 1070 ins_line_string, multi_ins_string, |
1071 setup_string, cleanup_string, | |
766 | 1072 FRAME_INSERT_COST (frame), FRAME_INSERTN_COST (frame), |
154 | 1073 coefficient); |
766 | 1074 ins_del_costs (frame, |
154 | 1075 del_line_string, multi_del_string, |
1076 setup_string, cleanup_string, | |
9576
14cd96eda0e3
(do_line_insertion_deletion_costs): Fix argument order.
Karl Heuer <kwzh@gnu.org>
parents:
7307
diff
changeset
|
1077 FRAME_DELETE_COST (frame), FRAME_DELETEN_COST (frame), |
154 | 1078 coefficient); |
1079 } | |
52401 | 1080 |
1081 /* arch-tag: cdb7149c-48e7-4793-a948-2786c8e45485 | |
1082 (do not change this comment) */ |