X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Ftclock.c;h=394ee81385b0d25347d31d5deb7b2f9fe4898e02;hp=b46c59980a32a8c15eff477499c9d835bab00270;hb=7a27c7d49c2e8b4a1ecbe85b4423d647cbc75ea5;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/test/tclock.c b/test/tclock.c index b46c5998..394ee813 100644 --- a/test/tclock.c +++ b/test/tclock.c @@ -1,8 +1,19 @@ -#include "test.priv.h" +/* $Id: tclock.c,v 1.25 2005/04/16 16:39:27 tom Exp $ */ + +#include -#include #include -#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif /* tclock - analog/digital clock for curses. @@ -19,9 +30,9 @@ 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. + colleagues. */ /* To compile: cc -o tclock tclock.c -lcurses -lm */ @@ -32,146 +43,216 @@ #define sign(_x) (_x<0?-1:1) +#define ASPECT 2.2 +#define ROUND(value) ((int)((value) + 0.5)) + +#define A2X(angle,radius) ROUND(ASPECT * radius * sin(angle)) +#define A2Y(angle,radius) ROUND(radius * cos(angle)) + /* Plot a point */ static void -plot(int x,int y,char col) +plot(int x, int y, char col) { - mvaddch(y,x,(chtype)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) +dline(int pair, 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; - } + int dx, dy; + int ax, ay; + int sx, sy; + int x, y; + int d; + + if (has_colors()) + attrset(COLOR_PAIR(pair)); + + 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; - } + } 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 GCC_UNUSED, - char *argv[] GCC_UNUSED) +main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) { - 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; + int i, cx, cy; + double cr, mradius, hradius, mangle, hangle; + double sangle, sradius, hours; + int hdx, hdy; + int mdx, mdy; + int sdx, sdy; + int ch; + int lastbeep = -1; + bool odd = FALSE; + time_t tim; + struct tm *t; + char szChar[10]; + char *text; + int my_bg = COLOR_BLACK; +#if HAVE_GETTIMEOFDAY + struct timeval current; + double fraction = 0.0; +#endif + + setlocale(LC_ALL, ""); + + initscr(); + noecho(); + cbreak(); + nodelay(stdscr, TRUE); + curs_set(0); + + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (use_default_colors() == OK) + my_bg = -1; +#endif + init_pair(1, COLOR_RED, my_bg); + init_pair(2, COLOR_MAGENTA, my_bg); + init_pair(3, COLOR_GREEN, my_bg); + init_pair(4, COLOR_WHITE, COLOR_BLUE); + } +#ifdef KEY_RESIZE + keypad(stdscr, TRUE); + restart: +#endif + cx = (COLS - 1) / 2; /* 39 */ + cy = LINES / 2; /* 12 */ + if (cx / ASPECT < cy) + cr = cx / ASPECT; + else + cr = cy; + sradius = (5 * cr) / 6; /* 10 */ + mradius = (3 * cr) / 4; /* 9 */ + hradius = cr / 2; /* 6 */ + + for (i = 0; i < 12; i++) { + sangle = (i + 1) * (2.0 * PI) / 12.0; + sdx = A2X(sangle, sradius); + sdy = A2Y(sangle, sradius); + sprintf(szChar, "%d", i + 1); + + mvaddstr(cy - sdy, cx + sdx, szChar); + } + + mvaddstr(0, 0, "ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994"); + + sradius = (4 * sradius) / 5; + for (;;) { + napms(100); + + 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 + (t->tm_sec / 60.0)) * (2 * PI) / 60.0); + mdx = A2X(mangle, mradius); + mdy = A2Y(mangle, mradius); + + hangle = ((hours) * (2.0 * PI) / 12.0); + hdx = A2X(hangle, hradius); + hdy = A2Y(hangle, hradius); + +#if HAVE_GETTIMEOFDAY + gettimeofday(¤t, 0); + fraction = (current.tv_usec / 1.0e6); +#endif + sangle = ((t->tm_sec + fraction) * (2.0 * PI) / 60.0); + sdx = A2X(sangle, sradius); + sdy = A2Y(sangle, sradius); + + dline(3, cx, cy, cx + mdx, cy - mdy, '#'); + + attrset(A_REVERSE); + dline(2, cx, cy, cx + hdx, cy - hdy, '.'); + attroff(A_REVERSE); + + if (has_colors()) + attrset(COLOR_PAIR(1)); + + dline(1, cx, cy, cx + sdx, cy - sdy, 'O'); + + if (has_colors()) + attrset(COLOR_PAIR(0)); + + text = ctime(&tim); + mvprintw(2, 0, "%.*s", (int) (strlen(text) - 1), text); + refresh(); + if ((t->tm_sec % 5) == 0 + && t->tm_sec != lastbeep) { + lastbeep = t->tm_sec; + if (has_colors()) { + odd = !odd; + bkgd((chtype) (odd ? COLOR_PAIR(4) : COLOR_PAIR(0))); + } + beep(); + } + + if ((ch = getch()) != ERR) { +#ifdef KEY_RESIZE + if (ch == KEY_RESIZE) { + flash(); + erase(); + wrefresh(curscr); + goto restart; + } +#endif + break; + } + + dline(0, cx, cy, cx + hdx, cy - hdy, ' '); + dline(0, cx, cy, cx + mdx, cy - mdy, ' '); + dline(0, cx, cy, cx + sdx, cy - sdy, ' '); + + } + + curs_set(1); + endwin(); + ExitProgram(EXIT_SUCCESS); }