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