commit ac6456a0cc67ca33c7b9c64cf7a4598961de8911 from: Russ Cox date: Mon Jan 13 21:53:30 2020 UTC clock: import from plan 9 Fixes #250. commit - be263a722e8957d99f2a51bb11106103bf878b44 commit + ac6456a0cc67ca33c7b9c64cf7a4598961de8911 blob - 1ce96f384d4dab965db8b5d8bbaf2acd140fef7a blob + 10db8dfe8d7a894ba51ae9b8da645e97dbb0558c --- man/man1/date.1 +++ man/man1/date.1 @@ -1,6 +1,6 @@ .TH DATE 1 .SH NAME -date \- date and time +date, clock \- date and time .SH SYNOPSIS .B date [ @@ -8,8 +8,8 @@ date \- date and time ] [ .I seconds ] -.\" .br -.\" .B clock +.br +.B clock .SH DESCRIPTION Print the date, in the format .PP @@ -34,6 +34,9 @@ If the optional argument .I seconds is present, it is used as the time to convert rather than the real time. +.PP +.I Clock +draws a simple analog clock in its window. .\" .SH FILES .\" .TF /adm/timezone/local .\" .TP @@ -54,5 +57,5 @@ the real time. .\" draws a simple analog clock in its window. .SH SOURCE .B \*9/src/cmd/date.c -.\" .br -.\" .B \*9/src/cmd/draw/clock.c +.br +.B \*9/src/cmd/draw/clock.c blob - /dev/null blob + b804e1f4e95739d5c3078efa20e11b8c5ae9b968 (mode 644) --- /dev/null +++ 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); + } + } +}