diff options
Diffstat (limited to 'libslang/src/curses/tclock.c')
-rw-r--r-- | libslang/src/curses/tclock.c | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/libslang/src/curses/tclock.c b/libslang/src/curses/tclock.c new file mode 100644 index 0000000..12c0125 --- /dev/null +++ b/libslang/src/curses/tclock.c @@ -0,0 +1,177 @@ +#include <stdio.h> +#include <float.h> +#include <math.h> +#include <time.h> +#include <stdlib.h> +#include <unistd.h> +#include <curses.h> + +/* + tclock - analog/digital clock for curses. + If it gives you joy, then + (a) I'm glad + (b) you need to get out more :-) + + This program is copyright Howard Jones, September 1994 + (ha.jones@ic.ac.uk). It may be freely distributed as + long as this copyright message remains intact, and any + modifications are clearly marked as such. [In fact, if + you modify it, I wouldn't mind the modifications back, + especially if they add any nice features. A good one + would be a precalc table for the 60 hand positions, so + that the floating point stuff can be ditched. As I said, + it was a 20 hackup minute job.] + + COMING SOON: tfishtank. Be the envy of your mac-owning + colleagues. +*/ + +/* To compile: cc -o tclock tclock.c -lcurses -lm */ + +#ifndef PI +#define PI 3.141592654 +#endif + +#define sign(_x) (_x<0?-1:1) + +/* Plot a point */ +static void +plot(int x,int y,char col) +{ + mvaddch(y,x,(chtype)col); +} + + +/* Draw a diagonal(arbitrary) line using Bresenham's alogrithm. */ +static void +dline(int from_x, int from_y, int x2, int y2, char ch) +{ + int dx,dy; + int ax,ay; + int sx,sy; + int x,y; + int d; + + dx=x2-from_x; + dy=y2-from_y; + + ax=abs(dx*2); + ay=abs(dy*2); + + sx=sign(dx); + sy=sign(dy); + + x=from_x; + y=from_y; + + if(ax>ay) + { + d=ay-(ax/2); + + while(1) + { + plot(x,y,ch); + if(x==x2) return; + + if(d>=0) + { + y+=sy; + d-=ax; + } + x+=sx; + d+=ay; + } + } + else + { + d=ax-(ay/2); + + while(1) + { + plot(x,y,ch); + if(y==y2) return; + + if(d>=0) + { + x+=sx; + d-=ay; + } + y+=sy; + d+=ax; + } + } +} + +int +main(int argc, char **argv) +{ + int i,cx,cy; + double mradius, hradius, mangle, hangle; + double sangle, sradius, hours; + int hdx, hdy; + int mdx, mdy; + int sdx, sdy; + time_t tim; + struct tm *t; + char szChar[10]; + + initscr(); + noecho(); + + cx=39; + cy=12; + mradius=9; + hradius=6; + sradius=8; + + for(i=0;i<12;i++) + { + sangle=(i+1)*(2.0*PI)/12.0; + sradius=10; + sdx=2.0*sradius*sin(sangle); + sdy=sradius*cos(sangle); + sprintf(szChar,"%d",i+1); + + mvaddstr((int)(cy-sdy),(int)(cx+sdx),szChar); + } + + mvaddstr(0,0,"ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994"); + + sradius=8; + while(1) + { + sleep(1); + + tim=time(0); + t=localtime(&tim); + + hours=(t->tm_hour + (t->tm_min/60.0)); + if(hours>12.0) hours-=12.0; + + mangle=(t->tm_min)*(2*PI)/60.0; + mdx=2.0*mradius*sin(mangle); + mdy=mradius*cos(mangle); + + hangle=(hours)*(2.0*PI)/12.0; + hdx=2.0*hradius*sin(hangle); + hdy=hradius*cos(hangle); + + sangle=(t->tm_sec%60)*(2.0*PI)/60.0; + sdx=2.0*sradius*sin(sangle); + sdy=sradius*cos(sangle); + + plot(cx+sdx,cy-sdy,'O'); + dline(cx,cy,cx+hdx,cy-hdy,'.'); + dline(cx,cy,cx+mdx,cy-mdy,'#'); + + mvaddstr(23,0,ctime(&tim)); + + refresh(); + plot(cx+sdx,cy-sdy,' '); + dline(cx,cy,cx+hdx,cy-hdy,' '); + dline(cx,cy,cx+mdx,cy-mdy,' '); + + } + + return 0; +} |