xref: /plan9/sys/src/cmd/clock.c (revision 72061b92c86a7d2b16e3ab31edd3846f53c84345)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier #include <event.h>
57dd7cddfSDavid du Colombier 
67dd7cddfSDavid du Colombier Image *hrhand, *minhand;
77dd7cddfSDavid du Colombier Image *dots, *back;
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier Point
circlept(Point c,int r,int degrees)107dd7cddfSDavid du Colombier circlept(Point c, int r, int degrees)
117dd7cddfSDavid du Colombier {
127dd7cddfSDavid du Colombier 	double rad;
137dd7cddfSDavid du Colombier 	rad = (double) degrees * PI/180.0;
147dd7cddfSDavid du Colombier 	c.x += cos(rad)*r;
157dd7cddfSDavid du Colombier 	c.y -= sin(rad)*r;
167dd7cddfSDavid du Colombier 	return c;
177dd7cddfSDavid du Colombier }
187dd7cddfSDavid du Colombier 
197dd7cddfSDavid du Colombier void
redraw(Image * screen)207dd7cddfSDavid du Colombier redraw(Image *screen)
217dd7cddfSDavid du Colombier {
227dd7cddfSDavid du Colombier 	static int tm, ntm;
237dd7cddfSDavid du Colombier 	static Rectangle r;
247dd7cddfSDavid du Colombier 	static Point c;
257dd7cddfSDavid du Colombier 	static int rad;
267dd7cddfSDavid du Colombier 	static Image *im;
277dd7cddfSDavid du Colombier 	int i;
287dd7cddfSDavid du Colombier 	int anghr, angmin;
297dd7cddfSDavid du Colombier 	static Tm tms;
307dd7cddfSDavid du Colombier 	static Tm ntms;
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	ntm = time(0);
337dd7cddfSDavid du Colombier 	if(ntm == tm && eqrect(screen->r, r))
347dd7cddfSDavid du Colombier 		return;
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier 	ntms = *localtime(ntm);
3794c096e2SDavid du Colombier 	anghr = 90-(ntms.hour*5 + ntms.min/12)*6;
387dd7cddfSDavid du Colombier 	angmin = 90-ntms.min*6;
397dd7cddfSDavid du Colombier 	tm = ntm;
407dd7cddfSDavid du Colombier 	tms = ntms;
417dd7cddfSDavid du Colombier 	r = screen->r;
427dd7cddfSDavid du Colombier 	c = divpt(addpt(r.min, r.max), 2);
437dd7cddfSDavid du Colombier 	rad = Dx(r) < Dy(r) ? Dx(r) : Dy(r);
447dd7cddfSDavid du Colombier 	rad /= 2;
457dd7cddfSDavid du Colombier 	rad -= 8;
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 	draw(screen, screen->r, back, nil, ZP);
48223a736eSDavid du Colombier 	for(i=0; i<12; i++)
49223a736eSDavid du Colombier 		fillellipse(screen, circlept(c, rad, i*(360/12)), 2, 2, dots, ZP);
50223a736eSDavid du Colombier 
517dd7cddfSDavid du Colombier 	line(screen, c, circlept(c, (rad*3)/4, angmin), 0, 0, 1, minhand, ZP);
527dd7cddfSDavid du Colombier 	line(screen, c, circlept(c, rad/2, anghr), 0, 0, 1, hrhand, ZP);
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier 	flushimage(display, 1);
557dd7cddfSDavid du Colombier }
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier void
eresized(int new)587dd7cddfSDavid du Colombier eresized(int new)
597dd7cddfSDavid du Colombier {
609a747e4fSDavid du Colombier 	if(new && getwindow(display, Refnone) < 0)
617dd7cddfSDavid du Colombier 		fprint(2,"can't reattach to window");
627dd7cddfSDavid du Colombier 	redraw(screen);
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier 
657dd7cddfSDavid du Colombier void
main(int,char **)66223a736eSDavid du Colombier main(int, char**)
677dd7cddfSDavid du Colombier {
687dd7cddfSDavid du Colombier 	Event e;
697dd7cddfSDavid du Colombier 	Mouse m;
707dd7cddfSDavid du Colombier 	Menu menu;
717dd7cddfSDavid du Colombier 	char *mstr[] = {"exit", 0};
727dd7cddfSDavid du Colombier 	int key, timer;
737dd7cddfSDavid du Colombier 	int t;
747dd7cddfSDavid du Colombier 
75*72061b92SDavid du Colombier 	if (initdraw(0, 0, "clock") < 0)
76*72061b92SDavid du Colombier 		sysfatal("initdraw failed");
777dd7cddfSDavid du Colombier 	back = allocimagemix(display, DPalebluegreen, DWhite);
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier 	hrhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkblue);
807dd7cddfSDavid du Colombier 	minhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DPaleblue);
817dd7cddfSDavid du Colombier 	dots = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DBlue);
827dd7cddfSDavid du Colombier 	redraw(screen);
837dd7cddfSDavid du Colombier 
847dd7cddfSDavid du Colombier 	einit(Emouse);
857dd7cddfSDavid du Colombier 	t = (30*1000);
867dd7cddfSDavid du Colombier 	timer = etimer(0, t);
877dd7cddfSDavid du Colombier 
887dd7cddfSDavid du Colombier 	menu.item = mstr;
897dd7cddfSDavid du Colombier 	menu.lasthit = 0;
907dd7cddfSDavid du Colombier 	for(;;) {
917dd7cddfSDavid du Colombier 		key = event(&e);
927dd7cddfSDavid du Colombier 		if(key == Emouse) {
937dd7cddfSDavid du Colombier 			m = e.mouse;
947dd7cddfSDavid du Colombier 			if(m.buttons & 4) {
957dd7cddfSDavid du Colombier 				if(emenuhit(3, &m, &menu) == 0)
967dd7cddfSDavid du Colombier 					exits(0);
977dd7cddfSDavid du Colombier 			}
987dd7cddfSDavid du Colombier 		} else if(key == timer) {
997dd7cddfSDavid du Colombier 			redraw(screen);
1007dd7cddfSDavid du Colombier 		}
1017dd7cddfSDavid du Colombier 	}
1027dd7cddfSDavid du Colombier }
103