henesyinit from p9f47575dc5 years agoHistory
259 lines · 5.0 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <libg.h>#include <frame.h>#include "dat.h"#include "fns.h" /* * when called, (button&mask) == mask */voidpick(Frame *f, Mouse *m, int mask){	ulong p0, p1, q;	Point mp, pt0, pt1, qt; 	mp = m->xy;     Again:	f->modified = 0;	frselectp(f, F&~D);	p0 = p1 = frcharofpt(f, mp);	pt0 = frptofchar(f, p0);	pt1 = frptofchar(f, p1);	frselectf(f, pt0, pt1, F&~D);	do{		if(f->modified)	/* special hack so 8.5 can select in parallel */			goto Again;		q = frcharofpt(f, m->xy);		if(p1 != q){			if(p0 == p1)				frselectf(f, pt0, pt1, F&~D);			qt = frptofchar(f, q);			if(p1 < q)				frselectf(f, pt1, qt, F&~D);			else				frselectf(f, qt, pt1, F&~D);			p1 = q;			pt1 = qt;			if(p0 == p1)				frselectf(f, pt0, pt1, F&~D);		}		f->modified = 0;		if(p0 < p1)			f->p0 = p0, f->p1 = p1;		else			f->p0 = p1, f->p1 = p0;		frgetmouse();	}while(m->buttons == mask);} /* * It is assumed in all these routines that * p0<=p1 and both were generated by ptofchar() */voidselectf1(Frame *f, Point p0, Point p1, Fcode c){	int n;	Point q0, q1; 	p0.x--;	p1.x--;	q0 = p0;	q1 = p1;	q0.y += f->font->height;	q1.y += f->font->height;	n = (p1.y-p0.y)/f->font->height;	if(f->b == 0)		berror("selectf b==0");	if(p0.y == f->r.max.y)		return;	if(n == 0){		if(p0.x == p1.x)			q1.x++;		bitblt(f->b, p0, f->b, Rpt(p0, q1), c);	}else{		bitblt(f->b, p0, f->b, Rect(p0.x, p0.y, f->r.max.x, q0.y), c);		if(n > 1)			bitblt(f->b, Pt(f->r.min.x, q0.y),				f->b, Rect(f->r.min.x, q0.y, f->r.max.x, p1.y), c);		bitblt(f->b, Pt(f->r.min.x, p1.y),				f->b, Rect(f->r.min.x, p1.y, q1.x, q1.y), c);	}} voidoutline(Frame *f, Point p0, Point p1){	int n;	Point q0, q1;	Rectangle r; 	p0.x--;	p1.x--;	q0 = p0;	q1 = p1;	q0.y += f->font->height;	q1.y += f->font->height;	n = (p1.y-p0.y)/f->font->height;	if(f->b == 0)		berror("outline b==0");	if(p0.y==f->r.max.y)		return;	if(n == 0){		if(p0.x == p1.x)			q1.x++;		r = inset(Rpt(p0, q1), 1);		bitblt(f->b, r.min, f->b, r, F&~D);	}else{		r = inset(Rect(p0.x, p0.y, f->r.max.x, q0.y), 1);		bitblt(f->b, r.min, f->b, r, F&~D);		if(n > 1){			/* erase extra above */			r.min.x = p0.x+1;			r.min.y = q0.y-1;			r.max.x = f->r.max.x-1;			r.max.y = q0.y+1;			bitblt(f->b, r.min, f->b, r, F&~D);			/* main part */			r = inset(Rect(f->r.min.x, q0.y, f->r.max.x, p1.y), 1);			bitblt(f->b, r.min, f->b, r, F&~D);			/* erase extra below */			r.min.x = f->r.min.x+1;			r.min.y = p1.y-1;			r.max.x = q1.x-1;			r.max.y = p1.y+1;			bitblt(f->b, r.min, f->b, r, F&~D);		}else{			r.min.x = p0.x+1;			r.min.y = p1.y-1;			r.max.x = q1.x-1;			r.max.y = p1.y+1;			bitblt(f->b, r.min, f->b, r, F&~D);		}		r = inset(Rect(f->r.min.x, p1.y, q1.x, q1.y), 1);		bitblt(f->b, r.min, f->b, r, F&~D);	}} voidfrselectf(Frame *f, Point p0, Point p1, Fcode c){	Text *t; 	t = (Text*)f;	if(c && t->outline){		if(c != (F&~D))			error("selectf");		outline(f, p0, p1);	}	selectf1(f, p0, p1, c);} voidfrselectp(Frame *f, Fcode c){	Point pt0, pt1; 	pt0 = frptofchar(f, f->p0);	pt1 = (f->p0==f->p1)? pt0 : frptofchar(f, f->p1);	frselectf(f, pt0, pt1, c);} voidsetoutline(Text *t, int g){	Point pt0, pt1; 	if(t->outline == g)		return;	pt0 = frptofchar(t, t->p0);	pt1 = (t->p0==t->p1)? pt0 : frptofchar(t, t->p1);	outline(t, pt0, pt1);	t->outline = g;} /* it is assumed p0<=p1 and both were generated by ptofchar() */voidunderf(Frame *f, Point p0, Point p1, Fcode c){	int n;	Point q0, q1; 	p0.x--;	p1.x--;	p0.y += f->font->height-1;	p1.y += f->font->height-1;	q0 = p0;	q1 = p1;	p0.y -= 2;	p1.y -= 2;	n = (p1.y-p0.y)/f->font->height;	if(f->b == 0)		berror("underf b==0");	if(p0.y == f->r.max.y)		return;	if(n == 0){		if(p0.x == p1.x)			q1.x++;		bitblt(f->b, p0, f->b, Rpt(p0, q1), c);	}else{		bitblt(f->b, p0, f->b, Rect(p0.x, p0.y, f->r.max.x, q0.y), c);		while(n-- > 1){			p0.y += f->font->height;			q0.y += f->font->height;			bitblt(f->b, Pt(f->r.min.x, p0.y),				f->b, Rect(f->r.min.x, p0.y, f->r.max.x, q0.y), c);		}		bitblt(f->b, Pt(f->r.min.x, p1.y),				f->b, Rect(f->r.min.x, p1.y, q1.x, q1.y), c);	}} /* * when called, (button&mask) == mask */voidpick2(Frame *f, Mouse *m, int mask, ulong *pp0, ulong *pp1){	ulong p0, p1, q;	Point mp, pt0, pt1, qt; 	mp = m->xy;     Again:	f->modified = 0;	p0 = p1 = frcharofpt(f, mp);	pt0 = frptofchar(f, p0);	pt1 = frptofchar(f, p1);	underf(f, pt0, pt1, F&~D);	do{		if(f->modified)	/* special hack so 8.5 can select in parallel */			goto Again;		q = frcharofpt(f, m->xy);		if(p1 != q){			if(p0 == p1)				underf(f, pt0, pt1, F&~D);			qt = frptofchar(f, q);			if(p1 < q)				underf(f, pt1, qt, F&~D);			else				underf(f, qt, pt1, F&~D);			p1 = q;			pt1 = qt;			if(p0 == p1)				underf(f, pt0, pt1, F&~D);		}		f->modified = 0;		if(p0 < p1)			*pp0 = p0, *pp1 = p1;		else			*pp0 = p1, *pp1 = p0;		frgetmouse();	}while(m->buttons == mask);	pt0 = frptofchar(f, *pp0);	pt1 = frptofchar(f, *pp1);	underf(f, pt0, pt1, F&~D);}