xref: /original-bsd/usr.bin/window/wwmove.c (revision 57feb3a1)
1 #ifndef lint
2 static	char *sccsid = "@(#)wwmove.c	3.3 83/09/16";
3 #endif
4 
5 #include "ww.h"
6 
7 /*
8  * Move a window.  Should be unattached.
9  */
10 wwmove(w, row, col)
11 register struct ww *w;
12 {
13 	register dr, dc;
14 	register i;
15 
16 	if (w->ww_forw != 0 || w->ww_back != 0)
17 		return;				/* sanity */
18 
19 	dr = row - w->ww_w.t;
20 	dc = col - w->ww_w.l;
21 
22 	w->ww_w.t += dr;
23 	w->ww_w.b += dr;
24 	w->ww_w.l += dc;
25 	w->ww_w.r += dc;
26 
27 	w->ww_b.t += dr;
28 	w->ww_b.b += dr;
29 	w->ww_b.l += dc;
30 	w->ww_b.r += dc;
31 
32 	w->ww_i.t = MAX(w->ww_w.t, 0);
33 	w->ww_i.b = MIN(w->ww_w.b, wwnrow);
34 	w->ww_i.nr = w->ww_i.b - w->ww_i.t;
35 	w->ww_i.l = MAX(w->ww_w.l, 0);
36 	w->ww_i.r = MIN(w->ww_w.r, wwncol);
37 	w->ww_i.nc = w->ww_i.r - w->ww_i.l;
38 
39 	w->ww_cur.r += dr;
40 	w->ww_cur.c += dc;
41 
42 	w->ww_win -= dr;
43 	for (i = w->ww_w.t; i < w->ww_w.b; i++)
44 		w->ww_win[i] -= dc;
45 	w->ww_cov -= dr;
46 	for (i = w->ww_w.t; i < w->ww_w.b; i++)
47 		w->ww_cov[i] -= dc;
48 	if (w->ww_fmap != 0) {
49 		w->ww_fmap -= dr;
50 		for (i = w->ww_w.t; i < w->ww_w.b; i++)
51 			w->ww_fmap[i] -= dc;
52 	}
53 	w->ww_nvis -= dr;
54 	for (i = w->ww_i.t; i < w->ww_i.b; i++) {
55 		register j = w->ww_i.l;
56 		register char *win = &w->ww_win[i][j];
57 		int nvis = 0;
58 
59 		for (; j < w->ww_i.r; j++)
60 			if (*win++ == 0)
61 				nvis++;
62 		w->ww_nvis[i] = nvis;
63 	}
64 	w->ww_buf -= dr;
65 	for (i = w->ww_b.t; i < w->ww_b.b; i++)
66 		w->ww_buf[i] -= dc;
67 }
68