ncurses 5.7 - patch 20100116
[ncurses.git] / test / tclock.c
index b46c59980a32a8c15eff477499c9d835bab00270..b6e7d3f371a5218b9c3c14181fc16ea922d543ea 100644 (file)
@@ -1,8 +1,19 @@
-#include "test.priv.h"
+/* $Id: tclock.c,v 1.26 2009/08/29 18:47:26 tom Exp $ */
+
+#include <test.priv.h>
 
-#include <float.h>
 #include <math.h>
-#include <time.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# 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 */
 
 #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())
+       (void) 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(&current, 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, '#');
+
+       (void) attrset(A_REVERSE);
+       dline(2, cx, cy, cx + hdx, cy - hdy, '.');
+       attroff(A_REVERSE);
+
+       if (has_colors())
+           (void) attrset(COLOR_PAIR(1));
+
+       dline(1, cx, cy, cx + sdx, cy - sdy, 'O');
+
+       if (has_colors())
+           (void) 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);
 }