xref: /plan9/sys/src/cmd/clock.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier #include <event.h>
5*7dd7cddfSDavid du Colombier 
6*7dd7cddfSDavid du Colombier Image *hrhand, *minhand;
7*7dd7cddfSDavid du Colombier Image *dots, *back;
8*7dd7cddfSDavid du Colombier 
9*7dd7cddfSDavid du Colombier Point
10*7dd7cddfSDavid du Colombier circlept(Point c, int r, int degrees)
11*7dd7cddfSDavid du Colombier {
12*7dd7cddfSDavid du Colombier 	double rad;
13*7dd7cddfSDavid du Colombier 	rad = (double) degrees * PI/180.0;
14*7dd7cddfSDavid du Colombier 	c.x += cos(rad)*r;
15*7dd7cddfSDavid du Colombier 	c.y -= sin(rad)*r;
16*7dd7cddfSDavid du Colombier 	return c;
17*7dd7cddfSDavid du Colombier }
18*7dd7cddfSDavid du Colombier 
19*7dd7cddfSDavid du Colombier void
20*7dd7cddfSDavid du Colombier redraw(Image *screen)
21*7dd7cddfSDavid du Colombier {
22*7dd7cddfSDavid du Colombier 	static int tm, ntm;
23*7dd7cddfSDavid du Colombier 	static Rectangle r;
24*7dd7cddfSDavid du Colombier 	static Point c;
25*7dd7cddfSDavid du Colombier 	static int rad;
26*7dd7cddfSDavid du Colombier 	static Image *im;
27*7dd7cddfSDavid du Colombier 	int i;
28*7dd7cddfSDavid du Colombier 	int anghr, angmin;
29*7dd7cddfSDavid du Colombier 	int oanghr, oangmin;
30*7dd7cddfSDavid du Colombier 	static Tm tms;
31*7dd7cddfSDavid du Colombier 	static Tm ntms;
32*7dd7cddfSDavid du Colombier 
33*7dd7cddfSDavid du Colombier 	ntm = time(0);
34*7dd7cddfSDavid du Colombier 	if(ntm == tm && eqrect(screen->r, r))
35*7dd7cddfSDavid du Colombier 		return;
36*7dd7cddfSDavid du Colombier 
37*7dd7cddfSDavid du Colombier 	ntms = *localtime(ntm);
38*7dd7cddfSDavid du Colombier 	anghr = 90-(ntms.hour*5 + ntms.min/10)*6;
39*7dd7cddfSDavid du Colombier 	oanghr = 90-(tms.hour*5 + tms.min/10)*6;
40*7dd7cddfSDavid du Colombier 	angmin = 90-ntms.min*6;
41*7dd7cddfSDavid du Colombier 	oangmin = 90-tms.min*6;
42*7dd7cddfSDavid du Colombier 	tm = ntm;
43*7dd7cddfSDavid du Colombier 	tms = ntms;
44*7dd7cddfSDavid du Colombier 	if(!eqrect(screen->r, r)) {
45*7dd7cddfSDavid du Colombier 		r = screen->r;
46*7dd7cddfSDavid du Colombier 		c = divpt(addpt(r.min, r.max), 2);
47*7dd7cddfSDavid du Colombier 		rad = Dx(r) < Dy(r) ? Dx(r) : Dy(r);
48*7dd7cddfSDavid du Colombier 		rad /= 2;
49*7dd7cddfSDavid du Colombier 		rad -= 8;
50*7dd7cddfSDavid du Colombier 
51*7dd7cddfSDavid du Colombier 		draw(screen, screen->r, back, nil, ZP);
52*7dd7cddfSDavid du Colombier 		for(i=0; i<12; i++) {
53*7dd7cddfSDavid du Colombier 			fillellipse(screen, circlept(c, rad, i*(360/12)),
54*7dd7cddfSDavid du Colombier 				2, 2, dots, ZP);
55*7dd7cddfSDavid du Colombier 		}
56*7dd7cddfSDavid du Colombier 	}else{
57*7dd7cddfSDavid du Colombier 		if(oanghr != anghr)
58*7dd7cddfSDavid du Colombier 			line(screen, c, circlept(c, rad/2, oanghr), 0, 0, 1, back, ZP);
59*7dd7cddfSDavid du Colombier 		line(screen, c, circlept(c, (rad*3)/4, oangmin), 0, 0, 1, back, ZP);
60*7dd7cddfSDavid du Colombier 	}
61*7dd7cddfSDavid du Colombier 	line(screen, c, circlept(c, (rad*3)/4, angmin), 0, 0, 1, minhand, ZP);
62*7dd7cddfSDavid du Colombier 	line(screen, c, circlept(c, rad/2, anghr), 0, 0, 1, hrhand, ZP);
63*7dd7cddfSDavid du Colombier 
64*7dd7cddfSDavid du Colombier 	flushimage(display, 1);
65*7dd7cddfSDavid du Colombier }
66*7dd7cddfSDavid du Colombier 
67*7dd7cddfSDavid du Colombier void
68*7dd7cddfSDavid du Colombier eresized(int new)
69*7dd7cddfSDavid du Colombier {
70*7dd7cddfSDavid du Colombier 	if(new && getwindow(display, Refmesg) < 0)
71*7dd7cddfSDavid du Colombier 		fprint(2,"can't reattach to window");
72*7dd7cddfSDavid du Colombier 	redraw(screen);
73*7dd7cddfSDavid du Colombier }
74*7dd7cddfSDavid du Colombier 
75*7dd7cddfSDavid du Colombier void
76*7dd7cddfSDavid du Colombier main(int argc, char **argv)
77*7dd7cddfSDavid du Colombier {
78*7dd7cddfSDavid du Colombier 	Event e;
79*7dd7cddfSDavid du Colombier 	Mouse m;
80*7dd7cddfSDavid du Colombier 	Menu menu;
81*7dd7cddfSDavid du Colombier 	char *mstr[] = {"exit", 0};
82*7dd7cddfSDavid du Colombier 	int key, timer;
83*7dd7cddfSDavid du Colombier 	int t;
84*7dd7cddfSDavid du Colombier 
85*7dd7cddfSDavid du Colombier 	initdraw(0,0,"clock");
86*7dd7cddfSDavid du Colombier 	back = allocimagemix(display, DPalebluegreen, DWhite);
87*7dd7cddfSDavid du Colombier 
88*7dd7cddfSDavid du Colombier 	hrhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkblue);
89*7dd7cddfSDavid du Colombier 	minhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DPaleblue);
90*7dd7cddfSDavid du Colombier 	dots = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DBlue);
91*7dd7cddfSDavid du Colombier 	redraw(screen);
92*7dd7cddfSDavid du Colombier 
93*7dd7cddfSDavid du Colombier 	einit(Emouse);
94*7dd7cddfSDavid du Colombier 	t = (30*1000);
95*7dd7cddfSDavid du Colombier 	timer = etimer(0, t);
96*7dd7cddfSDavid du Colombier 
97*7dd7cddfSDavid du Colombier 	menu.item = mstr;
98*7dd7cddfSDavid du Colombier 	menu.lasthit = 0;
99*7dd7cddfSDavid du Colombier 	for(;;) {
100*7dd7cddfSDavid du Colombier 		key = event(&e);
101*7dd7cddfSDavid du Colombier 		if(key == Emouse) {
102*7dd7cddfSDavid du Colombier 			m = e.mouse;
103*7dd7cddfSDavid du Colombier 			if(m.buttons & 4) {
104*7dd7cddfSDavid du Colombier 				if(emenuhit(3, &m, &menu) == 0)
105*7dd7cddfSDavid du Colombier 					exits(0);
106*7dd7cddfSDavid du Colombier 			}
107*7dd7cddfSDavid du Colombier 		} else if(key == timer) {
108*7dd7cddfSDavid du Colombier 			redraw(screen);
109*7dd7cddfSDavid du Colombier 		}
110*7dd7cddfSDavid du Colombier 	}
111*7dd7cddfSDavid du Colombier }
112