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