xref: /original-bsd/usr.bin/window/wwdelete.c (revision e74403ba)
1 #ifndef lint
2 static	char *sccsid = "@(#)wwdelete.c	3.11 83/12/02";
3 #endif
4 
5 #include "ww.h"
6 
7 /*
8  * Pull w free from the cover list.
9  */
10 wwdelete(w)
11 register struct ww *w;
12 {
13 	register i;
14 
15 	for (i = w->ww_i.t; i < w->ww_i.b; i++) {
16 		register j;
17 		register char *smap = wwsmap[i];
18 		register struct ww_char *ns = wwns[i];
19 		register int nchanged = 0;
20 
21 		for (j = w->ww_i.l; j < w->ww_i.r; j++)
22 			if (smap[j] == w->ww_index) {
23 				smap[j] = WWX_NOBODY;
24 				ns[j].c_w = ' ';
25 				nchanged++;
26 			}
27 		if (nchanged > 4)
28 			wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
29 		else if (nchanged > 0)
30 			wwtouched[i] |= WWU_TOUCHED;
31 	}
32 
33 	{
34 		register struct ww *wp;
35 
36 		for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
37 			wp->ww_order--;
38 	}
39 
40 	if (w->ww_forw != &wwhead)
41 		wwdelete1(w->ww_forw,
42 			w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
43 
44 	w->ww_back->ww_forw = w->ww_forw;
45 	w->ww_forw->ww_back = w->ww_back;
46 	w->ww_forw = w->ww_back = 0;
47 }
48 
49 wwdelete1(w, t, b, l, r)
50 register struct ww *w;
51 {
52 	int i;
53 	int tt, bb, ll, rr;
54 	char hasglass;
55 
56 again:
57 	hasglass = 0;
58 	tt = MAX(t, w->ww_i.t);
59 	bb = MIN(b, w->ww_i.b);
60 	ll = MAX(l, w->ww_i.l);
61 	rr = MIN(r, w->ww_i.r);
62 	if (tt >= bb || ll >= rr) {
63 		if ((w = w->ww_forw) == &wwhead)
64 			return;
65 		goto again;
66 	}
67 	for (i = tt; i < bb; i++) {
68 		register j;
69 		register char *smap = wwsmap[i];
70 		register union ww_char *ns = wwns[i];
71 		register char *win = w->ww_win[i];
72 		register union ww_char *buf = w->ww_buf[i];
73 		int nvis = w->ww_nvis[i];
74 		int nchanged = 0;
75 
76 		for (j = ll; j < rr; j++) {
77 			if (smap[j] != WWX_NOBODY)
78 				continue;
79 			if (win[j] & WWM_GLS) {
80 				hasglass = 1;
81 				continue;
82 			}
83 			smap[j] = w->ww_index;
84 			ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
85 			nchanged++;
86 			if (win[j] == 0)
87 				nvis++;
88 		}
89 		if (nchanged > 4)
90 			wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
91 		else if (nchanged > 0)
92 			wwtouched[i] |= WWU_TOUCHED;
93 		w->ww_nvis[i] = nvis;
94 	}
95 	if ((w = w->ww_forw) == &wwhead)
96 		return;
97 	if (hasglass)
98 		goto again;
99 	if (tt > t)
100 		wwdelete1(w, t, tt, l, r);
101 	if (bb < b)
102 		wwdelete1(w, bb, b, l, r);
103 	if (ll > l)
104 		wwdelete1(w, tt, bb, l, ll);
105 	if (rr < r)
106 		wwdelete1(w, tt, bb, rr, r);
107 }
108