From ac6456a0cc67ca33c7b9c64cf7a4598961de8911 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 13 Jan 2020 16:53:30 -0500 Subject: clock: import from plan 9 Fixes #250. --- src/cmd/draw/clock.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/cmd/draw/clock.c (limited to 'src') diff --git a/src/cmd/draw/clock.c b/src/cmd/draw/clock.c new file mode 100644 index 00000000..b804e1f4 --- /dev/null +++ b/src/cmd/draw/clock.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +Image *hrhand, *minhand; +Image *dots, *back; + +Point +circlept(Point c, int r, int degrees) +{ + double rad; + rad = (double) degrees * PI/180.0; + c.x += cos(rad)*r; + c.y -= sin(rad)*r; + return c; +} + +void +redraw(Image *screen) +{ + static int tm, ntm; + static Rectangle r; + static Point c; + static int rad; + int i; + int anghr, angmin; + static Tm tms; + static Tm ntms; + + ntm = time(0); + if(ntm == tm && eqrect(screen->r, r)) + return; + + ntms = *localtime(ntm); + anghr = 90-(ntms.hour*5 + ntms.min/12)*6; + angmin = 90-ntms.min*6; + tm = ntm; + tms = ntms; + r = screen->r; + c = divpt(addpt(r.min, r.max), 2); + rad = Dx(r) < Dy(r) ? Dx(r) : Dy(r); + rad /= 2; + rad -= 8; + + draw(screen, screen->r, back, nil, ZP); + for(i=0; i<12; i++) + fillellipse(screen, circlept(c, rad, i*(360/12)), 2, 2, dots, ZP); + + line(screen, c, circlept(c, (rad*3)/4, angmin), 0, 0, 1, minhand, ZP); + line(screen, c, circlept(c, rad/2, anghr), 0, 0, 1, hrhand, ZP); + + flushimage(display, 1); +} + +void +eresized(int new) +{ + if(new && getwindow(display, Refnone) < 0) + fprint(2,"can't reattach to window"); + redraw(screen); +} + +void +main(int argc, char **argv) +{ + Event e; + Mouse m; + Menu menu; + char *mstr[] = {"exit", 0}; + int key, timer; + int t; + + USED(argc); + USED(argv); + + if (initdraw(0, 0, "clock") < 0) + sysfatal("initdraw failed"); + back = allocimagemix(display, DPalebluegreen, DWhite); + + hrhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DDarkblue); + minhand = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DPaleblue); + dots = allocimage(display, Rect(0,0,1,1), CMAP8, 1, DBlue); + redraw(screen); + + einit(Emouse); + t = (30*1000); + timer = etimer(0, t); + + menu.item = mstr; + menu.lasthit = 0; + for(;;) { + key = event(&e); + if(key == Emouse) { + m = e.mouse; + if(m.buttons & 4) { + if(emenuhit(3, &m, &menu) == 0) + exits(0); + } + } else if(key == timer) { + redraw(screen); + } + } +} -- cgit v1.2.3