clock: import from plan 9

Fixes #250.
This commit is contained in:
Russ Cox 2020-01-13 16:53:30 -05:00
parent be263a722e
commit ac6456a0cc
2 changed files with 112 additions and 5 deletions

View file

@ -1,6 +1,6 @@
.TH DATE 1 .TH DATE 1
.SH NAME .SH NAME
date \- date and time date, clock \- date and time
.SH SYNOPSIS .SH SYNOPSIS
.B date .B date
[ [
@ -8,8 +8,8 @@ date \- date and time
] [ ] [
.I seconds .I seconds
] ]
.\" .br .br
.\" .B clock .B clock
.SH DESCRIPTION .SH DESCRIPTION
Print the date, in the format Print the date, in the format
.PP .PP
@ -34,6 +34,9 @@ If the optional argument
.I seconds .I seconds
is present, it is used as the time to convert rather than is present, it is used as the time to convert rather than
the real time. the real time.
.PP
.I Clock
draws a simple analog clock in its window.
.\" .SH FILES .\" .SH FILES
.\" .TF /adm/timezone/local .\" .TF /adm/timezone/local
.\" .TP .\" .TP
@ -54,5 +57,5 @@ the real time.
.\" draws a simple analog clock in its window. .\" draws a simple analog clock in its window.
.SH SOURCE .SH SOURCE
.B \*9/src/cmd/date.c .B \*9/src/cmd/date.c
.\" .br .br
.\" .B \*9/src/cmd/draw/clock.c .B \*9/src/cmd/draw/clock.c

104
src/cmd/draw/clock.c Normal file
View file

@ -0,0 +1,104 @@
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
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);
}
}
}