home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / src / linux / old-src / ncurses-1.8.5 / gdc.c < prev    next >
C/C++ Source or Header  |  1993-11-27  |  3KB  |  163 lines

  1. /*
  2.  * Grand digital clock for curses compatible terminals
  3.  * Usage: gdc [-s] [n]   -- run for n seconds (default infinity)
  4.  * Flags: -s: scroll
  5.  *
  6.  * modified 10-18-89 for curses (jrl)
  7.  * 10-18-89 added signal handling
  8.  */
  9.  
  10. #include <time.h>
  11. #include <signal.h>
  12. #include <ncurses.h>
  13.  
  14. /* it won't be */
  15. long now; /* yeah! */
  16. struct tm *tm;
  17.  
  18. short disp[11] = {
  19.     075557, 011111, 071747, 071717, 055711,
  20.     074717, 074757, 071111, 075757, 075717, 002020
  21. };
  22. long old[6], next[6], new[6], mask;
  23. char scrol;
  24.  
  25. int sigtermed=0;
  26.  
  27. int hascolor = 0;
  28.  
  29. void sighndl(signo)
  30. int signo;
  31. {
  32.     signal(signo, sighndl);
  33.     sigtermed=signo;
  34. }
  35.  
  36. main(argc, argv)
  37. char **argv;
  38. {
  39. long t, a;
  40. int i, j, s, k;
  41. int n = 0;
  42.  
  43.     signal(SIGINT,sighndl);
  44.     signal(SIGTERM,sighndl);
  45.     signal(SIGKILL,sighndl);
  46.  
  47.     initscr();
  48.     cbreak();
  49.     noecho();
  50.     
  51.     hascolor = has_colors();
  52.  
  53.     if(hascolor) {    
  54.         start_color();
  55.         init_pair(1, COLOR_BLACK, COLOR_RED);
  56.         init_pair(2, COLOR_RED, COLOR_BLACK);
  57.     }
  58.     
  59.     clear();
  60.     refresh();
  61.     while(--argc > 0) {
  62.         if(**++argv == '-')
  63.             scrol = 1;
  64.         else
  65.             n = atoi(*argv);
  66.     }
  67.     do {
  68.         mask = 0;
  69.         time(&now);
  70.         tm = localtime(&now);
  71.         set(tm->tm_sec%10, 0);
  72.         set(tm->tm_sec/10, 4);
  73.         set(tm->tm_min%10, 10);
  74.         set(tm->tm_min/10, 14);
  75.         set(tm->tm_hour%10, 20);
  76.         set(tm->tm_hour/10, 24);
  77.         set(10, 7);
  78.         set(10, 17);
  79.         for(k=0; k<6; k++) {
  80.             if(scrol) {
  81.                 for(i=0; i<5; i++)
  82.                     new[i] = new[i]&~mask | new[i+1]&mask;
  83.                 new[5] = new[5]&~mask | next[k]&mask;
  84.             } else
  85.                 new[k] = new[k]&~mask | next[k]&mask;
  86.             next[k] = 0;
  87.             for(s=1; s>=0; s--) {
  88.                 standt(s);
  89.                 for(i=0; i<6; i++) {
  90.                     if(a = (new[i]^old[i])&(s ? new : old)[i]) {
  91.                         for(j=0,t=1<<26; t; t>>=1,j++) {
  92.                             if(a&t) {
  93.                                 if(!(a&(t<<1))) {
  94.                                     movto(i, 2*j);
  95.                                 }
  96.                                 addstr("  ");
  97.                             }
  98.                         }
  99.                     }
  100.                     if(!s) {
  101.                         old[i] = new[i];
  102.                     }
  103.                 }
  104.                 if(!s) {
  105.                     refresh();
  106.                 }
  107.             }
  108.         }
  109.         movto(6, 0);
  110.         refresh();
  111.         sleep(1);
  112.         if (sigtermed) {
  113.             standend();
  114.             clear();
  115.             refresh();
  116.             endwin();
  117.             fprintf(stderr, "gdc terminated by signal %d\n", sigtermed);
  118.             exit(1);
  119.         }
  120.     } while(--n);
  121.     standend();
  122.     clear();
  123.     refresh();
  124.     endwin();
  125.     return(0);
  126. }
  127.  
  128. set(t, n)
  129.     register n;
  130. {
  131.     register i, m;
  132.  
  133.     m = 7<<n;
  134.     for(i=0; i<5; i++) {
  135.         next[i] |= ((disp[t]>>(4-i)*3)&07)<<n;
  136.         mask |= (next[i]^old[i])&m;
  137.     }
  138.     if(mask&m)
  139.         mask |= m;
  140. }
  141.  
  142. standt(on)
  143. int on;
  144. {
  145.     if (on) {
  146.         if(hascolor)
  147.             attron(COLOR_PAIR(1));
  148.         else
  149.             attron(A_STANDOUT);        
  150.     } else {
  151.         if(hascolor)
  152.             attron(COLOR_PAIR(2));
  153.         else
  154.             attroff(A_STANDOUT);
  155.     }
  156. }
  157.  
  158. movto(line,col)
  159. {
  160.     move(line, col);
  161. }
  162.  
  163.