94 lines · 1.7 KB · C
RawDownload
#include "a.h" voiddirviewsetrect(Dirview *d, Rectangle r){	Rectangle lr, rr; 	d->r = r;	freeimage(d->b);	d->b = nil;	lr = r;	lr.max.x = r.min.x + Dx(r)/2;	rr = r;	rr.min.x = lr.max.x;	dirpanelsetrect(d->leftp, lr);	dirpanelsetrect(d->rightp, rr);} voiddirviewredraw(Dirview *d){	Rectangle r, lr, rr;		r = Rect(0, 0, Dx(d->r), Dy(d->r));	lr = r;	lr.max.x = r.min.x + Dx(r)/2;	d->leftr = lr;	rr = r;	rr.min.x = lr.max.x + 1;	d->rightr = rr;	if(d->b == nil)		d->b = allocimage(display, r, screen->chan, 0, DNofill);	dirpanelredraw(d->leftp);	dirpanelredraw(d->rightp);	draw(d->b, r, cols[Cbg], nil, ZP);	draw(d->b, lr, d->leftp->b, nil, ZP);	draw(d->b, rr, d->rightp->b, nil, ZP);} voidswitchfocus(Dirview *v){	v->leftp->focused = !v->leftp->focused;	v->rightp->focused = !v->rightp->focused;	dirviewredraw(v);	sendul(v->c, 1);} voiddirviewemouse(Dirview *v, Mouse m){	if(!m.buttons)		return;	if((ptinrect(m.xy, v->leftp->r) && !v->leftp->focused) 	|| (ptinrect(m.xy, v->rightp->r) && !v->rightp->focused))		switchfocus(v);	if(ptinrect(m.xy, v->leftp->r) && v->leftp->focused)		dirpanelemouse(v->leftp, m);	else if(ptinrect(m.xy, v->rightp->r) && v->rightp->focused)		dirpanelemouse(v->rightp, m);} Dirview*mkdirview(char *lpath, char *rpath){	Dirview *dv;	Dirmodel *m;		dv = emalloc(sizeof *dv);	dv->c = chancreate(sizeof(ulong), 1);	dv->b = nil;	m = mkdirmodel(lpath);	dv->leftp = mkdirpanel(m);	dv->leftp->focused = 1;	m = mkdirmodel(rpath);	dv->rightp = mkdirpanel(m);	return dv;} Dirpanel*dirviewcurrentpanel(Dirview *v){	if(v->leftp->focused)		return v->leftp;	return v->rightp;} Dirpanel*dirviewotherpanel(Dirview *v){	if(v->leftp->focused)		return v->rightp;	return v->leftp;}