xref: /plan9/sys/src/cmd/abaco/wind.c (revision 7ab27030036b6c877a6f81728daeda263d1ca3cf)
1*7ab27030SDavid du Colombier #include <u.h>
2*7ab27030SDavid du Colombier #include <libc.h>
3*7ab27030SDavid du Colombier #include <draw.h>
4*7ab27030SDavid du Colombier #include <memdraw.h>
5*7ab27030SDavid du Colombier #include <thread.h>
6*7ab27030SDavid du Colombier #include <cursor.h>
7*7ab27030SDavid du Colombier #include <mouse.h>
8*7ab27030SDavid du Colombier #include <keyboard.h>
9*7ab27030SDavid du Colombier #include <frame.h>
10*7ab27030SDavid du Colombier #include <plumb.h>
11*7ab27030SDavid du Colombier #include <html.h>
12*7ab27030SDavid du Colombier #include "dat.h"
13*7ab27030SDavid du Colombier #include "fns.h"
14*7ab27030SDavid du Colombier 
15*7ab27030SDavid du Colombier void
wininit(Window * w,Window *,Rectangle r)16*7ab27030SDavid du Colombier wininit(Window *w, Window *, Rectangle r)
17*7ab27030SDavid du Colombier {
18*7ab27030SDavid du Colombier 	Rectangle r1, br;
19*7ab27030SDavid du Colombier 
20*7ab27030SDavid du Colombier 	incref(w);
21*7ab27030SDavid du Colombier 	w->r = r;
22*7ab27030SDavid du Colombier 	w->tag.w = w;
23*7ab27030SDavid du Colombier 	w->url.w = w;
24*7ab27030SDavid du Colombier 	w->page.w = w;
25*7ab27030SDavid du Colombier 	w->status.w = w;
26*7ab27030SDavid du Colombier 	r1 = r;
27*7ab27030SDavid du Colombier 	r1.max.y = r1.min.y + font->height;
28*7ab27030SDavid du Colombier 	textinit(&w->tag, screen, r1, font, tagcols);
29*7ab27030SDavid du Colombier 	w->tag.what = Tag;
30*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y++;
31*7ab27030SDavid du Colombier 	draw(screen, r1, tagcols[BORD], nil, ZP);
32*7ab27030SDavid du Colombier 	br.min = w->tag.scrollr.min;
33*7ab27030SDavid du Colombier 	br.max.x = br.min.x + Dx(button->r);
34*7ab27030SDavid du Colombier 	br.max.y  = br.min.y + Dy(button->r);
35*7ab27030SDavid du Colombier 	draw(screen, br, button, nil, button->r.min);
36*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y;
37*7ab27030SDavid du Colombier 	r1.max.y += font->height;
38*7ab27030SDavid du Colombier 	textinit(&w->url, screen, r1, font, tagcols);
39*7ab27030SDavid du Colombier 	w->url.
40*7ab27030SDavid du Colombier 	w->url.what = Urltag;
41*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y++;
42*7ab27030SDavid du Colombier 	draw(screen, r1, tagcols[BORD], nil, ZP);
43*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y;
44*7ab27030SDavid du Colombier 	r1.max.y = r.max.y - font->height - 1;
45*7ab27030SDavid du Colombier 	w->page.all = r1;
46*7ab27030SDavid du Colombier 	w->page.b = screen;
47*7ab27030SDavid du Colombier 	draw(screen, r1, display->white, nil, ZP);
48*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y++;
49*7ab27030SDavid du Colombier 	draw(screen, r1, tagcols[BORD], nil, ZP);
50*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y;
51*7ab27030SDavid du Colombier 	r1.max.y += font->height;
52*7ab27030SDavid du Colombier 	textinit(&w->status, screen, r1, font, tagcols);
53*7ab27030SDavid du Colombier 	w->status.what = Statustag;
54*7ab27030SDavid du Colombier }
55*7ab27030SDavid du Colombier 
56*7ab27030SDavid du Colombier int
winresize(Window * w,Rectangle r,int safe)57*7ab27030SDavid du Colombier winresize(Window *w, Rectangle r, int safe)
58*7ab27030SDavid du Colombier {
59*7ab27030SDavid du Colombier 	Rectangle r1, br;
60*7ab27030SDavid du Colombier 
61*7ab27030SDavid du Colombier 	w->r = r;
62*7ab27030SDavid du Colombier 	r1 = r;
63*7ab27030SDavid du Colombier 	r1.max.y = r1.min.y + font->height;
64*7ab27030SDavid du Colombier 	if(!safe || !eqrect(w->tag.r, r1)){
65*7ab27030SDavid du Colombier 		textresize(&w->tag, screen, r1);
66*7ab27030SDavid du Colombier 		br.min = w->tag.scrollr.min;
67*7ab27030SDavid du Colombier 		br.max.x = r1.min.x + Dx(button->r);
68*7ab27030SDavid du Colombier 		br.max.y  = r1.min.y + Dy(button->r);
69*7ab27030SDavid du Colombier 		draw(screen, br, button, nil, button->r.min);
70*7ab27030SDavid du Colombier 		r1.min.y = r1.max.y++;
71*7ab27030SDavid du Colombier 		draw(screen, r1, tagcols[BORD], nil, ZP);
72*7ab27030SDavid du Colombier 		r1.min.y = r1.max.y;
73*7ab27030SDavid du Colombier 		r1.max.y += font->height;
74*7ab27030SDavid du Colombier 		textresize(&w->url, screen, r1);
75*7ab27030SDavid du Colombier 		r1.min.y = r1.max.y++;
76*7ab27030SDavid du Colombier 		draw(screen, r1, tagcols[BORD], nil, ZP);
77*7ab27030SDavid du Colombier 	}
78*7ab27030SDavid du Colombier 	r1.min.y = r1.max.y;
79*7ab27030SDavid du Colombier 	r1.max.y = r.max.y - font->height - 1;
80*7ab27030SDavid du Colombier 	w->page.b = screen;
81*7ab27030SDavid du Colombier 	if(!safe || !eqrect(w->page.all, r1)){
82*7ab27030SDavid du Colombier 		if(Dy(r1) <= 0){
83*7ab27030SDavid du Colombier 			w->page.all = ZR;
84*7ab27030SDavid du Colombier 			pagerender(&w->page);
85*7ab27030SDavid du Colombier 			w->r = r;
86*7ab27030SDavid du Colombier 			w->r.max.y = r1.min.y;
87*7ab27030SDavid du Colombier 			return w->r.max.y;
88*7ab27030SDavid du Colombier 		}
89*7ab27030SDavid du Colombier 		draw(screen, r1, display->white, nil, ZP);
90*7ab27030SDavid du Colombier 		w->page.all = r1;
91*7ab27030SDavid du Colombier 		pagerender(&w->page);
92*7ab27030SDavid du Colombier 		r1.min.y = r1.max.y++;
93*7ab27030SDavid du Colombier 		draw(screen, r1, tagcols[BORD], nil, ZP);
94*7ab27030SDavid du Colombier 		r1.min.y = r1.max.y;
95*7ab27030SDavid du Colombier 		r1.max.y = r.max.y;
96*7ab27030SDavid du Colombier 		textresize(&w->status, screen, r1);
97*7ab27030SDavid du Colombier 	}
98*7ab27030SDavid du Colombier 	return w->r.max.y;
99*7ab27030SDavid du Colombier }
100*7ab27030SDavid du Colombier 
101*7ab27030SDavid du Colombier void
winclose1(Window * w)102*7ab27030SDavid du Colombier winclose1(Window *w)
103*7ab27030SDavid du Colombier {
104*7ab27030SDavid du Colombier 	int i;
105*7ab27030SDavid du Colombier 
106*7ab27030SDavid du Colombier 	if(decref(w) == 0){
107*7ab27030SDavid du Colombier 		textclose(&w->tag);
108*7ab27030SDavid du Colombier 		textclose(&w->url);
109*7ab27030SDavid du Colombier 		textclose(&w->status);
110*7ab27030SDavid du Colombier 		if(w->history.url){
111*7ab27030SDavid du Colombier 			for(i=0; i<w->history.nurl; i++)
112*7ab27030SDavid du Colombier 				urlfree(w->history.url[i]);
113*7ab27030SDavid du Colombier 			free(w->history.url);
114*7ab27030SDavid du Colombier 		}
115*7ab27030SDavid du Colombier 		free(w);
116*7ab27030SDavid du Colombier 	}
117*7ab27030SDavid du Colombier }
118*7ab27030SDavid du Colombier 
119*7ab27030SDavid du Colombier void
winclose(Window * w)120*7ab27030SDavid du Colombier winclose(Window *w)
121*7ab27030SDavid du Colombier {
122*7ab27030SDavid du Colombier 	pageclose(&w->page);
123*7ab27030SDavid du Colombier 	winclose1(w);
124*7ab27030SDavid du Colombier }
125*7ab27030SDavid du Colombier 
126*7ab27030SDavid du Colombier void
winlock(Window * w,int owner)127*7ab27030SDavid du Colombier winlock(Window *w, int owner)
128*7ab27030SDavid du Colombier {
129*7ab27030SDavid du Colombier 	incref(w);
130*7ab27030SDavid du Colombier 	qlock(w);
131*7ab27030SDavid du Colombier 	w->owner = owner;
132*7ab27030SDavid du Colombier }
133*7ab27030SDavid du Colombier 
134*7ab27030SDavid du Colombier void
winunlock(Window * w)135*7ab27030SDavid du Colombier winunlock(Window *w)
136*7ab27030SDavid du Colombier {
137*7ab27030SDavid du Colombier 	w->owner = 0;
138*7ab27030SDavid du Colombier 	qunlock(w);
139*7ab27030SDavid du Colombier 	winclose1(w);
140*7ab27030SDavid du Colombier }
141*7ab27030SDavid du Colombier 
142*7ab27030SDavid du Colombier void
winsettag1(Window * w)143*7ab27030SDavid du Colombier winsettag1(Window *w)
144*7ab27030SDavid du Colombier {
145*7ab27030SDavid du Colombier 	int i, j, k, n, bar;
146*7ab27030SDavid du Colombier 	Rune *new, *r;
147*7ab27030SDavid du Colombier 	Image *b;
148*7ab27030SDavid du Colombier 	uint q0, q1;
149*7ab27030SDavid du Colombier 	Rectangle br;
150*7ab27030SDavid du Colombier 	Runestr old;
151*7ab27030SDavid du Colombier 
152*7ab27030SDavid du Colombier 	memset(&old, 0, sizeof(Runestr));
153*7ab27030SDavid du Colombier 	copyrunestr(&old, &w->tag.rs);
154*7ab27030SDavid du Colombier 	for(i=0; i<w->tag.rs.nr; i++)
155*7ab27030SDavid du Colombier 		if(old.r[i]==' ' || old.r[i]=='\t')
156*7ab27030SDavid du Colombier 			break;
157*7ab27030SDavid du Colombier 
158*7ab27030SDavid du Colombier 	if(runestreq(old, w->page.title) == FALSE){
159*7ab27030SDavid du Colombier 		textdelete(&w->tag, 0, i);
160*7ab27030SDavid du Colombier 		textinsert(&w->tag, 0, w->page.title.r, w->page.title.nr);
161*7ab27030SDavid du Colombier 		closerunestr(&old);
162*7ab27030SDavid du Colombier 		copyrunestr(&old, &w->tag.rs);
163*7ab27030SDavid du Colombier 	}
164*7ab27030SDavid du Colombier 	new = runemalloc(w->page.title.nr+100);
165*7ab27030SDavid du Colombier 	i = 0;
166*7ab27030SDavid du Colombier 	runemove(new+i, L" Del Snarf", 10);
167*7ab27030SDavid du Colombier 	i += 10;
168*7ab27030SDavid du Colombier 	if(w->history.nurl){
169*7ab27030SDavid du Colombier 		if(w->history.cid > 0){
170*7ab27030SDavid du Colombier 			runemove(new+i, L" Back", 5);
171*7ab27030SDavid du Colombier 			i += 5;
172*7ab27030SDavid du Colombier 		}
173*7ab27030SDavid du Colombier 		if(w->history.cid < w->history.nurl-1){
174*7ab27030SDavid du Colombier 			runemove(new+i, L" Next", 5);
175*7ab27030SDavid du Colombier 			i += 5;
176*7ab27030SDavid du Colombier 		}
177*7ab27030SDavid du Colombier 		if(w->page.loading){
178*7ab27030SDavid du Colombier 			runemove(new+i, L" Stop", 5);
179*7ab27030SDavid du Colombier 			i += 5;
180*7ab27030SDavid du Colombier 		}
181*7ab27030SDavid du Colombier 	}
182*7ab27030SDavid du Colombier 	runemove(new+i, L" Get", 4);
183*7ab27030SDavid du Colombier 	i += 4;
184*7ab27030SDavid du Colombier 	runemove(new+i, L" | ", 3);
185*7ab27030SDavid du Colombier 	i += 3;
186*7ab27030SDavid du Colombier 	runemove(new+i, w->page.title.r, w->page.title.nr);
187*7ab27030SDavid du Colombier 	i += w->page.title.nr;
188*7ab27030SDavid du Colombier /*
189*7ab27030SDavid du Colombier 	r = runestrchr(old.r, '|');
190*7ab27030SDavid du Colombier 	r = nil;
191*7ab27030SDavid du Colombier 	if(r)
192*7ab27030SDavid du Colombier 		k = r-old.r+1;
193*7ab27030SDavid du Colombier 	else{
194*7ab27030SDavid du Colombier 		k = w->tag.rs.nr;
195*7ab27030SDavid du Colombier 		if(w->page.url){
196*7ab27030SDavid du Colombier 			runemove(new+i, L" Look ", 6);
197*7ab27030SDavid du Colombier 			i += 6;
198*7ab27030SDavid du Colombier 		}
199*7ab27030SDavid du Colombier 	}
200*7ab27030SDavid du Colombier */
201*7ab27030SDavid du Colombier 	k = w->tag.rs.nr;
202*7ab27030SDavid du Colombier 	if(runeeq(new, i, old.r, k) == FALSE){
203*7ab27030SDavid du Colombier 		n = k;
204*7ab27030SDavid du Colombier 		if(n > i)
205*7ab27030SDavid du Colombier 			n = i;
206*7ab27030SDavid du Colombier 		for(j=0; j<n; j++)
207*7ab27030SDavid du Colombier 			if(old.r[j] != new[j])
208*7ab27030SDavid du Colombier 				break;
209*7ab27030SDavid du Colombier 		q0 = w->tag.q0;
210*7ab27030SDavid du Colombier 		q1 = w->tag.q1;
211*7ab27030SDavid du Colombier 		textdelete(&w->tag, j, k);
212*7ab27030SDavid du Colombier 		textinsert(&w->tag, j, new+j, i-j);
213*7ab27030SDavid du Colombier 		/* try to preserve user selection */
214*7ab27030SDavid du Colombier 		r = runestrchr(old.r, '|');
215*7ab27030SDavid du Colombier 		if(r){
216*7ab27030SDavid du Colombier 			bar = r-old.r;
217*7ab27030SDavid du Colombier 			if(q0 > bar){
218*7ab27030SDavid du Colombier 				bar = (runestrchr(new, '|')-new)-bar;
219*7ab27030SDavid du Colombier 				w->tag.q0 = q0+bar;
220*7ab27030SDavid du Colombier 				w->tag.q1 = q1+bar;
221*7ab27030SDavid du Colombier 			}
222*7ab27030SDavid du Colombier 		}
223*7ab27030SDavid du Colombier 	}
224*7ab27030SDavid du Colombier 	closerunestr(&old);
225*7ab27030SDavid du Colombier 	free(new);
226*7ab27030SDavid du Colombier 	n = w->tag.rs.nr;
227*7ab27030SDavid du Colombier 	if(w->tag.q0 > n)
228*7ab27030SDavid du Colombier 		w->tag.q0 = n;
229*7ab27030SDavid du Colombier 	if(w->tag.q1 > n)
230*7ab27030SDavid du Colombier 		w->tag.q1 = n;
231*7ab27030SDavid du Colombier 	textsetselect(&w->tag, w->tag.q0, w->tag.q1);
232*7ab27030SDavid du Colombier 	b = button;
233*7ab27030SDavid du Colombier 	br.min = w->tag.scrollr.min;
234*7ab27030SDavid du Colombier 	br.max.x = br.min.x + Dx(b->r);
235*7ab27030SDavid du Colombier 	br.max.y = br.min.y + Dy(b->r);
236*7ab27030SDavid du Colombier 	draw(screen, br, b, nil, b->r.min);
237*7ab27030SDavid du Colombier }
238*7ab27030SDavid du Colombier 
239*7ab27030SDavid du Colombier 
240*7ab27030SDavid du Colombier void
winsettag(Window * w)241*7ab27030SDavid du Colombier winsettag(Window *w)
242*7ab27030SDavid du Colombier {
243*7ab27030SDavid du Colombier 	if(w->col && w->col->safe)
244*7ab27030SDavid du Colombier 		winsettag1(w);
245*7ab27030SDavid du Colombier }
246*7ab27030SDavid du Colombier 
247*7ab27030SDavid du Colombier void
winseturl(Window * w)248*7ab27030SDavid du Colombier winseturl(Window *w)
249*7ab27030SDavid du Colombier {
250*7ab27030SDavid du Colombier 	if(w->page.url && runestreq(w->url.rs, w->page.url->act)==FALSE)
251*7ab27030SDavid du Colombier 		textset(&w->url, w->page.url->act.r, w->page.url->act.nr);
252*7ab27030SDavid du Colombier }
253*7ab27030SDavid du Colombier 
254*7ab27030SDavid du Colombier void
winsetstatus(Window * w,Rune * r)255*7ab27030SDavid du Colombier winsetstatus(Window *w, Rune *r)
256*7ab27030SDavid du Colombier {
257*7ab27030SDavid du Colombier 	if(w->col && w->col->safe)
258*7ab27030SDavid du Colombier 		textset(&w->status, r, runestrlen(r));
259*7ab27030SDavid du Colombier }
260*7ab27030SDavid du Colombier 
261*7ab27030SDavid du Colombier void
winaddhist(Window * w,Url * u)262*7ab27030SDavid du Colombier winaddhist(Window *w, Url *u)
263*7ab27030SDavid du Colombier {
264*7ab27030SDavid du Colombier 	Url **url;
265*7ab27030SDavid du Colombier 	int cid, n, i;
266*7ab27030SDavid du Colombier 
267*7ab27030SDavid du Colombier 	url = w->history.url;
268*7ab27030SDavid du Colombier 	n = w->history.nurl;
269*7ab27030SDavid du Colombier 	cid = w->history.cid;
270*7ab27030SDavid du Colombier 	if(cid < n-1){
271*7ab27030SDavid du Colombier 		for(i=cid+1; i<n; i++)
272*7ab27030SDavid du Colombier 			urlfree(url[i]);
273*7ab27030SDavid du Colombier 		n = cid+1;
274*7ab27030SDavid du Colombier 	}
275*7ab27030SDavid du Colombier 	w->history.url = erealloc(w->history.url, ++n*sizeof(Url *));
276*7ab27030SDavid du Colombier 	w->history.url[n-1] = u;
277*7ab27030SDavid du Colombier 	w->history.cid = u->id = n-1;
278*7ab27030SDavid du Colombier 	w->history.nurl = n;
279*7ab27030SDavid du Colombier 	incref(u);
280*7ab27030SDavid du Colombier }
281*7ab27030SDavid du Colombier 
282*7ab27030SDavid du Colombier void
wingohist(Window * w,int isnext)283*7ab27030SDavid du Colombier wingohist(Window *w, int isnext)
284*7ab27030SDavid du Colombier {
285*7ab27030SDavid du Colombier 	Page *p;
286*7ab27030SDavid du Colombier 	int n, id;
287*7ab27030SDavid du Colombier 
288*7ab27030SDavid du Colombier 	n = w->history.nurl;
289*7ab27030SDavid du Colombier 	p = &w->page;
290*7ab27030SDavid du Colombier 	if(!p->url)
291*7ab27030SDavid du Colombier 		return;
292*7ab27030SDavid du Colombier 
293*7ab27030SDavid du Colombier 	id = p->url->id;
294*7ab27030SDavid du Colombier 
295*7ab27030SDavid du Colombier 	if(isnext)
296*7ab27030SDavid du Colombier 		id++;
297*7ab27030SDavid du Colombier 	else
298*7ab27030SDavid du Colombier 		id--;
299*7ab27030SDavid du Colombier 
300*7ab27030SDavid du Colombier 	if(n==0 || id<0 || id==n)
301*7ab27030SDavid du Colombier 		return;
302*7ab27030SDavid du Colombier 
303*7ab27030SDavid du Colombier 	incref(w->history.url[id]);
304*7ab27030SDavid du Colombier 	pageload(p, w->history.url[id], FALSE);
305*7ab27030SDavid du Colombier 	w->history.cid = id;
306*7ab27030SDavid du Colombier }
307*7ab27030SDavid du Colombier 
308*7ab27030SDavid du Colombier Text *
wintext(Window * w,Point xy)309*7ab27030SDavid du Colombier wintext(Window *w, Point xy)
310*7ab27030SDavid du Colombier {
311*7ab27030SDavid du Colombier 	w->inpage = FALSE;
312*7ab27030SDavid du Colombier 	if(ptinrect(xy, w->tag.all))
313*7ab27030SDavid du Colombier 		return &w->tag;
314*7ab27030SDavid du Colombier 	if(ptinrect(xy, w->url.all))
315*7ab27030SDavid du Colombier 		return &w->url;
316*7ab27030SDavid du Colombier 	if(ptinrect(xy, w->status.all))
317*7ab27030SDavid du Colombier 		return &w->status;
318*7ab27030SDavid du Colombier 	if(ptinrect(xy, w->page.all))
319*7ab27030SDavid du Colombier 		w->inpage = TRUE;
320*7ab27030SDavid du Colombier 
321*7ab27030SDavid du Colombier 	return nil;
322*7ab27030SDavid du Colombier }
323*7ab27030SDavid du Colombier 
324*7ab27030SDavid du Colombier Text *
wintype(Window * w,Point xy,Rune r)325*7ab27030SDavid du Colombier wintype(Window *w, Point xy, Rune r)
326*7ab27030SDavid du Colombier {
327*7ab27030SDavid du Colombier 	Text *t;
328*7ab27030SDavid du Colombier 
329*7ab27030SDavid du Colombier 	t = wintext(w, xy);
330*7ab27030SDavid du Colombier 	if(t && !ptinrect(xy, t->scrollr))
331*7ab27030SDavid du Colombier 		return t;
332*7ab27030SDavid du Colombier 	if(w->inpage)
333*7ab27030SDavid du Colombier 		pagetype(&w->page, r, xy);
334*7ab27030SDavid du Colombier 
335*7ab27030SDavid du Colombier 	return nil;
336*7ab27030SDavid du Colombier }
337*7ab27030SDavid du Colombier 
338*7ab27030SDavid du Colombier Text *
winmouse(Window * w,Point xy,int but)339*7ab27030SDavid du Colombier winmouse(Window *w, Point xy, int but)
340*7ab27030SDavid du Colombier {
341*7ab27030SDavid du Colombier 	Text *t;
342*7ab27030SDavid du Colombier 
343*7ab27030SDavid du Colombier 	t = wintext(w, xy);
344*7ab27030SDavid du Colombier 	if(t)
345*7ab27030SDavid du Colombier 		return t;
346*7ab27030SDavid du Colombier 	if(w->inpage)
347*7ab27030SDavid du Colombier 		pagemouse(&w->page, xy, but);
348*7ab27030SDavid du Colombier 
349*7ab27030SDavid du Colombier 	return nil;
350*7ab27030SDavid du Colombier }
351*7ab27030SDavid du Colombier 
352*7ab27030SDavid du Colombier void
winmousebut(Window * w)353*7ab27030SDavid du Colombier winmousebut(Window *w)
354*7ab27030SDavid du Colombier {
355*7ab27030SDavid du Colombier 	moveto(mousectl, divpt(addpt(w->tag.scrollr.min, w->tag.scrollr.max), 2));
356*7ab27030SDavid du Colombier }
357*7ab27030SDavid du Colombier 
358*7ab27030SDavid du Colombier int
winclean(Window *,int)359*7ab27030SDavid du Colombier winclean(Window *, int)
360*7ab27030SDavid du Colombier {
361*7ab27030SDavid du Colombier 	return TRUE;
362*7ab27030SDavid du Colombier }
363*7ab27030SDavid du Colombier 
364*7ab27030SDavid du Colombier void
windebug(Window * w)365*7ab27030SDavid du Colombier windebug(Window *w)
366*7ab27030SDavid du Colombier {
367*7ab27030SDavid du Colombier 	Page *p;
368*7ab27030SDavid du Colombier 	int i;
369*7ab27030SDavid du Colombier 
370*7ab27030SDavid du Colombier 	p = &w->page;
371*7ab27030SDavid du Colombier 	fprint(2, "title:\t%S\n", p->title.r);
372*7ab27030SDavid du Colombier 	fprint(2, "url:\t%.*S\n",w->url.rs.nr, w->url.rs.r);
373*7ab27030SDavid du Colombier 	fprint(2, "aborting:\t%s\n", istrue(p->aborting));
374*7ab27030SDavid du Colombier 	fprint(2, "changed:\t%s\n", istrue(p->changed));
375*7ab27030SDavid du Colombier 	fprint(2, "loading:\t%s\n", istrue(p->loading));
376*7ab27030SDavid du Colombier 	fprint(2, "status:\t%S\n", p->status);
377*7ab27030SDavid du Colombier 	fprint(2, "HISTORY:\n");
378*7ab27030SDavid du Colombier 	for(i=0; i<w->history.nurl; i++)
379*7ab27030SDavid du Colombier 		fprint(2, "url[%d]: %S\n", i, w->history.url[i]->act.r);
380*7ab27030SDavid du Colombier 
381*7ab27030SDavid du Colombier 	if(p->kidinfo)
382*7ab27030SDavid du Colombier 		fprint(2, "name: %S\n", p->kidinfo->name);
383*7ab27030SDavid du Colombier }
384