henesyinit from p9fce6d0435 years agoHistory
153 lines · 2.9 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <libg.h> void	face(Bitmap *, Rectangle, int, int);Point	limb(Point, int, int); voidignore(void *a, char *msg){	USED(a, msg);	noted(NCONT);} voidmain(void){	int ha, ma, f, n;	Rectangle r;	char buf[128];	Bitmap *d;	Tm *tv; 	binit(0, 0, "clock");	clipr(&screen, screen.r); 	r = screen.r; 	tv = localtime(time(0));	if(tv->hour > 12)		tv->hour -= 12; 	ha = 90 - ((360/12) * tv->hour) - ((360 * tv->min)/(60*12));	ma = 90 - ((360/60) * tv->min);	d = balloc(r, 0);	face(d, r, ha, ma);	bitblt(&screen, r.min, d, r, S);	bfree(d); 	notify(ignore); 	f = open("/dev/mouse", OREAD);	if(f < 0){		fprint(2, "can't open /dev/mouse: %r\n");		exits(0);	}	alarm(1000*60);	for(;;) {		n = read(f, buf, sizeof(buf));		alarm(1000*60);		if(n < 0) {			errstr(buf);			if(strcmp(buf, "interrupted") != 0)			if(strcmp(buf, "no error") != 0)				exits(buf);			buf[0] = 'm';			buf[1] = 0x80;		}		if(buf[0] != 'm' || (buf[1]&0x80) == 0)			continue; 		r = bscreenrect(0);		screen.r = r;		clipr(&screen, screen.r);		d = balloc(r, 0);		tv = localtime(time(0));		if(tv->hour > 12)			tv->hour -= 12; 		ha = 90 - ((360/12) * tv->hour) - ((360 * tv->min)/(60*12));		ma = 90 - ((360/60) * tv->min);		face(d, r, ha, ma);		bitblt(&screen, r.min, d, r, S);		bfree(d);	}} voidface(Bitmap *d, Rectangle r, int ha, int ma){	int xwidth, ywidth, radius, i;	int sx, sy, siz;	Point mid, p, top, up, dn;	Bitmap *b;	double inc; 	bitblt(d, r.min, d, r, F); 	xwidth = r.max.x - r.min.x;	ywidth = r.max.y - r.min.y; 	mid.x = xwidth/2 + r.min.x;	mid.y = ywidth/2 + r.min.y;		radius = xwidth < ywidth ? xwidth : ywidth;	radius = (radius/2) - 4; 	b = balloc(r, 0);	circle(b, mid, radius, 1, F);	bitblt(b, add(r.min, Pt(0, 1)), b, r, DorS);	bitblt(b, add(r.min, Pt(1, 0)), b, r, DorS);	if(radius > 100) {		bitblt(b, add(r.min, Pt(0, -1)), b, r, DorS);		bitblt(b, add(r.min, Pt(-1, 0)), b, r, DorS);	}	bitblt(d, r.min, b, r, notS);	bfree(b); 	radius = (radius*18)/20;	inc = -3.14159/2;	for(i = 0; i < 12; i++) {		sx = (int)(sin(inc) * (double)radius);		sy = (int)(cos(inc) * (double)radius);		p = add(mid, Pt(sx, sy));		siz = 1;		if(sx == 0 || sy == 0)			siz += 1;		disc(d, p, siz, 1, notS);		inc += 3.141592/6;	} 	radius = (radius*18)/20;	top = limb(mid, ma, radius);	up = limb(mid, ma-3, radius/2);	dn = limb(mid, ma+3, radius/2);	segment(d, mid, up, 1, notS);	segment(d, mid, dn, 1, notS);	segment(d, top, up, 1, notS);	segment(d, top, dn, 1, notS); 	radius = (radius*2)/3;	top = limb(mid, ha, radius);	up = limb(mid, ha-6, radius/2);	dn = limb(mid, ha+6, radius/2);	segment(d, mid, up, 1, notS);	segment(d, mid, dn, 1, notS);	segment(d, top, up, 1, notS);	segment(d, top, dn, 1, notS); 	bflush();} Pointlimb(Point mid, int xa, int len){	int sx, sy;	double angle; 	angle = (3.14159*(double)xa)/180;;	sx = (int)(cos(angle) * (double)len);	sy = -(int)(sin(angle) * (double)len);	return add(mid, Pt(sx, sy));}