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 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 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); 377dd7cddfSDavid du Colombier anghr = 90-(ntms.hour*5 + ntms.min/10)*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 587dd7cddfSDavid du Colombier eresized(int new) 597dd7cddfSDavid du Colombier { 60*9a747e4fSDavid 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 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 757dd7cddfSDavid du Colombier initdraw(0,0,"clock"); 767dd7cddfSDavid du Colombier back = allocimagemix(display, DPalebluegreen, DWhite); 777dd7cddfSDavid du Colombier 787dd7cddfSDavid du Colombier hrhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkblue); 797dd7cddfSDavid du Colombier minhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DPaleblue); 807dd7cddfSDavid du Colombier dots = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DBlue); 817dd7cddfSDavid du Colombier redraw(screen); 827dd7cddfSDavid du Colombier 837dd7cddfSDavid du Colombier einit(Emouse); 847dd7cddfSDavid du Colombier t = (30*1000); 857dd7cddfSDavid du Colombier timer = etimer(0, t); 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier menu.item = mstr; 887dd7cddfSDavid du Colombier menu.lasthit = 0; 897dd7cddfSDavid du Colombier for(;;) { 907dd7cddfSDavid du Colombier key = event(&e); 917dd7cddfSDavid du Colombier if(key == Emouse) { 927dd7cddfSDavid du Colombier m = e.mouse; 937dd7cddfSDavid du Colombier if(m.buttons & 4) { 947dd7cddfSDavid du Colombier if(emenuhit(3, &m, &menu) == 0) 957dd7cddfSDavid du Colombier exits(0); 967dd7cddfSDavid du Colombier } 977dd7cddfSDavid du Colombier } else if(key == timer) { 987dd7cddfSDavid du Colombier redraw(screen); 997dd7cddfSDavid du Colombier } 1007dd7cddfSDavid du Colombier } 1017dd7cddfSDavid du Colombier } 102