home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / time / dclock16.lha / DClock16 / src / Draw.c next >
Encoding:
C/C++ Source or Header  |  1995-03-05  |  14.1 KB  |  585 lines

  1. // Die Funktionen DrawTime() und v.a RedrawTime() sind sehr ineffizient
  2. // und muessen unbedingt verbessert werden. Das Problem war, dass (als
  3. // Folge von CpuBlit ?) RectFill() die jeweils neu gezeichneten Zahlen
  4. // gleich wieder loeschte, obwohl der Aufruf vor Draw() erfolgte.
  5.  
  6.  
  7. #include <graphics/gfx.h>
  8. #include <intuition/intuition.h>
  9. #include <libraries/gadtools.h>
  10. #include <clib/graphics_protos.h>
  11. #include <clib/dos_protos.h>
  12. #include <reqtools/reqtools.h>
  13. #include <time.h>
  14.  
  15. #include "Main.h"
  16. #include "Window.h"
  17. #include "Draw.h"
  18. #include "MenuDefs.h"
  19.  
  20. #define ALARM_X 65
  21. #define ALARM_Y 19
  22. #define TIMER_X 73
  23. #define TIMER_Y 17
  24.  
  25. void TurnAlarmOff(struct AppPrefs *prefs);
  26.  
  27. // STATICS ------------------------------------------------------------------
  28.  
  29. int realtime;
  30.  
  31. BOOL Number[] =
  32. {
  33.     1, 1, 1, 0, 1, 1, 1,   // 0
  34.     0, 0, 1, 0, 0, 1, 0,   // 1
  35.     1, 0, 1, 1, 1, 0, 1,   // 2
  36.     1, 0, 1, 1, 0, 1, 1,   // 3
  37.     0, 1, 1, 1, 0, 1, 0,   // 4
  38.     1, 1, 0, 1, 0, 1, 1,   // 5
  39.     1, 1, 0, 1, 1, 1, 1,   // 6
  40.     1, 0, 1, 0, 0, 1, 0,   // 7
  41.     1, 1, 1, 1, 1, 1, 1,   // 8
  42.     1, 1, 1, 1, 0, 1, 1,   // 9
  43. };
  44.  
  45. SHORT BigNumber[] =
  46. {
  47.     1,  0,    7,  0,   6,  1,   2,  1,  //  -
  48.     0,  1,    0,  7,   1,  6,   1,  2,  // |
  49.     8,  1,    8,  7,   7,  6,   7,  2,  //   |
  50.     2,  8,    6,  8,   6,  9,   2,  9,  //  -
  51.     0,  9,    0, 15,   1, 14,   1, 10,  // |
  52.     8,  9,    8, 15,   7, 14,   7, 10,  //   |
  53.     2, 15,    6, 15,   7, 16,   1, 16   //  -
  54. };
  55.  
  56. SHORT SmallNumber[] =
  57. {
  58.     1,  0,   4,  0,  //  -
  59.     0,  1,   0,  4,  // |
  60.     5,  1,   5,  4,  //   |
  61.     1,  5,   4,  5,  //  -
  62.     0,  6,   0,  9,  // |
  63.     5,  6,   5,  9,  //   |
  64.     1, 10,   4, 10,  //  -
  65.  
  66. };
  67.  
  68.  
  69. SHORT Coords[] =
  70. {
  71.     6,  4,  /* Std. */
  72.     19, 4,
  73.     38, 4,  /* Min. */
  74.     51, 4,
  75.     64, 4,  /* Sec. */
  76.     72, 4,
  77.     32, 8,  /*  :   */
  78.     32, 15,
  79.     8, 25,  /* Day  */
  80.     16, 25,
  81.     27, 25, /* Mon. */
  82.     35, 25,
  83.     46, 25, /* Year */
  84.     54, 25,
  85.     62, 25,
  86.     70, 25,
  87.     24, 35, /* Dots */
  88.     43, 35
  89. };
  90.  
  91.  
  92. void DrawTime(struct Window *win, struct AppPrefs *prefs)
  93. {
  94.     int offx = win->BorderLeft;
  95.     int offy = win->BorderTop;
  96.     int width = DClockWidth;
  97.     int height = DClockHeight;
  98.     int i, j, k, digits = 0, hour;
  99.     int vals[14];
  100.     struct Time myTime;
  101.     struct tm *TM = GetTime( &myTime, prefs );
  102.  
  103.     vals[0] = myTime.hour1; vals[1] = myTime.hour2;
  104.     vals[2] = myTime.min1; vals[3] = myTime.min2;
  105.     vals[4] = myTime.sec1; vals[5] = myTime.sec2;
  106.  
  107.     if (! prefs->twentyfour)
  108.     {
  109.         hour = vals[0] * 10 + vals[1];
  110.         if (hour > 12)
  111.             hour -= 12;
  112.         else if (hour == 0)
  113.             hour = 12;
  114.         vals[0] = hour / 10;
  115.         vals[1] = hour % 10;
  116.     }
  117.  
  118.     if (prefs->date)
  119.     {
  120.         int year = TM->tm_year + 1900;
  121.         int temp;
  122.  
  123.         vals[6]  = TM->tm_mday / 10;
  124.         vals[7]  = TM->tm_mday % 10;
  125.         vals[8]  = (TM->tm_mon + 1) / 10;
  126.         vals[9]  = (TM->tm_mon + 1) % 10;
  127.         vals[10] = year / 1000;
  128.         vals[11] = (year - vals[10] * 1000) / 100;
  129.         vals[12] = (year - vals[10] * 1000 - vals[11] * 100) / 10;
  130.         vals[13] = (year - vals[10] * 1000 - vals[11] * 100) % 10;
  131.         if (! prefs->ddmmyy)
  132.         {
  133.             temp = vals[6]; vals[6] = vals[8]; vals[8] = temp;
  134.             temp = vals[7]; vals[7] = vals[9]; vals[9] = temp;
  135.         }
  136.     }
  137.  
  138.  
  139.     ObtainSemaphore(&draw_semaphore);
  140.  
  141.     SetAPen(win->RPort, prefs->background);
  142.     RectFill(win->RPort, offx + 1, offy + 1, offx + width - 2, offy + height - 2);
  143.  
  144.     SetAPen(win->RPort, prefs->foreground);
  145.  
  146.     if (! prefs->twentyfour)
  147.     {
  148.         if (! vals[0])
  149.             digits = 1;
  150.     }
  151.  
  152.     for (k = 3; k >= digits; k--)
  153.     {
  154.         j = vals[k] * 7;
  155.         for (i = 0; i < 7; i++)
  156.         {
  157.             if (Number[j + i])
  158.             {
  159.                 Move(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 0],
  160.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 1]);
  161.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 2],
  162.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 3]);
  163.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 4],
  164.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 5]);
  165.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 6],
  166.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 7]);
  167.             }
  168.         }
  169.     }
  170.     if (prefs->seconds)
  171.     {
  172.         for (k = 5; k >= 4; k--)
  173.         {
  174.             j = vals[k] * 7;
  175.             for (i = 0; i < 7; i++)
  176.             {
  177.                 if (Number[j + i])
  178.                 {
  179.                     Move(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 0],
  180.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 1]);
  181.                     Draw(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 2],
  182.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 3]);
  183.                 }
  184.             }
  185.         }
  186.     }
  187.     Move(win->RPort, offx + Coords[12] + 0,
  188.                           offy + Coords[13] + 0);
  189.     Draw(win->RPort, offx + Coords[12] + 1,
  190.                           offy + Coords[13] + 0);
  191.     Draw(win->RPort, offx + Coords[12] + 1,
  192.                           offy + Coords[13] + 1);
  193.     Draw(win->RPort, offx + Coords[12] + 0,
  194.                           offy + Coords[13] + 1);
  195.  
  196.     Move(win->RPort, offx + Coords[14] + 0,
  197.                           offy + Coords[15] + 0);
  198.     Draw(win->RPort, offx + Coords[14] + 1,
  199.                           offy + Coords[15] + 0);
  200.     Draw(win->RPort, offx + Coords[14] + 1,
  201.                           offy + Coords[15] + 1);
  202.     Draw(win->RPort, offx + Coords[14] + 0,
  203.                           offy + Coords[15] + 1);
  204.  
  205.  
  206.     if (prefs->date)
  207.     {
  208.         for (k = 15; k >= 8; k--)
  209.         {
  210.             j = vals[k - 2] * 7;
  211.             for (i = 0; i < 7; i++)
  212.             {
  213.                 if (Number[j + i])
  214.                 {
  215.                     Move(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 0],
  216.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 1]);
  217.                     Draw(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 2],
  218.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 3]);
  219.                 }
  220.             }
  221.         }
  222.         WritePixel(win->RPort, Coords[32] + offx, Coords[33] + offy);
  223.         WritePixel(win->RPort, Coords[34] + offx, Coords[35] + offy);
  224.     }
  225.  
  226.  
  227.  
  228.     ReleaseSemaphore(&draw_semaphore);
  229.  
  230.     if (prefs->alarm)
  231.         DrawAlarm(prefs->foreground);
  232.     if (prefs->timer)
  233.         DrawTimer(prefs->foreground);
  234.  
  235.  
  236. }
  237.  
  238. struct tm *GetTime( struct Time *myTime, struct AppPrefs *prefs )
  239. {
  240.     time_t tp = time(0);
  241.     tm *TM;
  242.     TM = localtime(&tp);
  243.  
  244.     myTime->hour1 = TM->tm_hour / 10;
  245.     myTime->hour2 = TM->tm_hour % 10;
  246.  
  247.     myTime->min1 = TM->tm_min / 10;
  248.     myTime->min2 = TM->tm_min % 10;
  249.  
  250.     myTime->sec1 = TM->tm_sec / 10;
  251.     myTime->sec2 = TM->tm_sec % 10;
  252.  
  253.     return TM;
  254. }
  255.  
  256.  
  257. void RedrawTime(struct Window *win, struct AppPrefs *prefs)
  258. {
  259.     int offx = win->BorderLeft;
  260.     int offy = win->BorderTop;
  261.     int i, j, k, lower, hour;
  262.     int vals[14];
  263.  
  264.     static int lastday;
  265.     static int lastmonth;
  266.     static int lastyear;
  267.     static int last[6];
  268.  
  269.     struct Time myTime;
  270.     struct tm *TM = GetTime( &myTime, prefs );
  271.     BOOL dodate = FALSE;
  272.  
  273.     if (prefs->date)
  274.     {
  275.         if ((lastday != TM->tm_mday) || (lastmonth != TM->tm_mon) || (lastyear != TM->tm_year))
  276.         {
  277.             int year = TM->tm_year + 1900;
  278.             int temp;
  279.  
  280.             vals[6]  = TM->tm_mday / 10;
  281.             vals[7]  = TM->tm_mday % 10;
  282.             vals[8]  = (TM->tm_mon + 1) / 10;
  283.             vals[9]  = (TM->tm_mon + 1) % 10;
  284.             vals[10] = year / 1000;
  285.             vals[11] = (year - vals[10] * 1000) / 100;
  286.             vals[12] = (year - vals[10] * 1000 - vals[11] * 100) / 10;
  287.             vals[13] = (year - vals[10] * 1000 - vals[11] * 100) % 10;
  288.             if (! prefs->ddmmyy)
  289.             {
  290.                 temp = vals[6]; vals[6] = vals[8]; vals[8] = temp;
  291.                 temp = vals[7]; vals[7] = vals[9]; vals[9] = temp;
  292.             }
  293.             lastday = TM->tm_mday;
  294.             lastmonth = TM->tm_mon;
  295.             lastyear = TM->tm_year;
  296.             dodate = TRUE;
  297.         }
  298.     }
  299.  
  300.     vals[0] = myTime.hour1; vals[1] = myTime.hour2;
  301.     vals[2] = myTime.min1; vals[3] = myTime.min2;
  302.     vals[4] = myTime.sec1; vals[5] = myTime.sec2;
  303.  
  304.     if (! prefs->twentyfour)
  305.     {
  306.         hour = vals[0] * 10 + vals[1];
  307.         if (hour > 12)
  308.             hour -= 12;
  309.         else if (hour == 0)
  310.             hour = 12;
  311.         vals[0] = hour / 10;
  312.         vals[1] = hour % 10;
  313.     }
  314.  
  315.     if (prefs->alarm)
  316.         CheckAlarm(prefs, &myTime);
  317.     if (prefs->timer)
  318.         if (CheckTimer(prefs, &myTime))
  319.             TurnTimerOff(prefs);
  320.  
  321.     lower = 5;
  322.     for (i = 4; i >=0 ; i--)
  323.     {
  324.         if (last[i] != vals[i])
  325.             lower = i;
  326.         last[i] = vals[i];
  327.     }
  328.  
  329.  
  330.     ObtainSemaphore(&draw_semaphore);
  331.  
  332.     for (k = 3; k >= lower; k--)
  333.     {
  334.         j = vals[k] * 7;
  335.         for (i = 0; i < 7; i++)
  336.         {
  337.             SetAPen(win->RPort, prefs->background);
  338.             if (! Number[j + i])
  339.             {
  340.                 Move(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 0],
  341.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 1]);
  342.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 2],
  343.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 3]);
  344.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 4],
  345.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 5]);
  346.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 6],
  347.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 7]);
  348.             }
  349.             if ((! k) && (! prefs->twentyfour) && (! vals[0]))
  350.                 SetAPen(win->RPort, prefs->background);
  351.             else
  352.                 SetAPen(win->RPort, prefs->foreground);
  353.             if (Number[j + i])
  354.             {
  355.                 Move(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 0],
  356.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 1]);
  357.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 2],
  358.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 3]);
  359.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 4],
  360.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 5]);
  361.                 Draw(win->RPort, offx + Coords[k * 2 + 0] + BigNumber[i * 8 + 6],
  362.                                       offy + Coords[k * 2 + 1] + BigNumber[i * 8 + 7]);
  363.             }
  364.         }
  365.     }
  366.     if (prefs->seconds)
  367.     {
  368.         if (lower < 4)
  369.             lower = 4;
  370.         for (k = 5; k >= lower; k--)
  371.         {
  372.             j = vals[k] * 7;
  373.             for (i = 0; i < 7; i++)
  374.             {
  375.                 SetAPen(win->RPort, prefs->background);
  376.                 if (! Number[j + i])
  377.                 {
  378.                     Move(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 0],
  379.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 1]);
  380.                     Draw(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 2],
  381.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 3]);
  382.                 }
  383.                 SetAPen(win->RPort, prefs->foreground);
  384.                 if (Number[j + i])
  385.                 {
  386.                     Move(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 0],
  387.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 1]);
  388.                     Draw(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 2],
  389.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 3]);
  390.                 }
  391.             }
  392.         }
  393.     }
  394.  
  395.     if (dodate)
  396.     {
  397.         for (k = 15; k >= 8; k--)
  398.         {
  399.             j = vals[k - 2] * 7;
  400.             for (i = 0; i < 7; i++)
  401.             {
  402.                 SetAPen(win->RPort, prefs->background);
  403.                 if (! Number[j + i])
  404.                 {
  405.                     Move(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 0],
  406.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 1]);
  407.                     Draw(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 2],
  408.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 3]);
  409.                 }
  410.                 SetAPen(win->RPort, prefs->foreground);
  411.                 if (Number[j + i])
  412.                 {
  413.                     Move(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 0],
  414.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 1]);
  415.                     Draw(win->RPort, offx + Coords[k * 2 + 0] + SmallNumber[i * 4 + 2],
  416.                                           offy + Coords[k * 2 + 1] + SmallNumber[i * 4 + 3]);
  417.                 }
  418.             }
  419.         }
  420.     }
  421.  
  422.  
  423.     ReleaseSemaphore(&draw_semaphore);
  424. }
  425.  
  426.  
  427. void CheckAlarm(struct AppPrefs *prefs, struct Time *myTime)
  428. {
  429.     realtime = 10000 * (myTime->hour1 * 10 + myTime->hour2) +
  430.                   100 * (myTime->min1  * 10 + myTime->min2) + (myTime->sec1 * 10 + myTime->sec2);
  431.  
  432.     if (realtime == prefs->alarmval)
  433.         Signal(infotask, alarmsig);
  434. }
  435.  
  436.  
  437. void TurnAlarmOff(struct AppPrefs *prefs)
  438. {
  439.     struct MenuItem *it;
  440.  
  441.     it = (struct MenuItem *)ItemAddress(DClockMenus, (ULONG)FULLMENUNUM(MENU_DCLOCK, MENU_ALARMON, 0));
  442.  
  443.     ClearMenuStrip(DClockWnd);
  444.     it->Flags = it->Flags & (~CHECKED);
  445.     SetMenuStrip(DClockWnd, DClockMenus);
  446.  
  447.     prefs->alarm = FALSE;
  448.     EraseAlarm(prefs->background);
  449. }
  450.  
  451.  
  452. void DrawAlarm(int color)
  453. {
  454.     int offx = DClockWnd->BorderLeft;
  455.     int offy = DClockWnd->BorderTop;
  456.     struct RastPort *rport = DClockWnd->RPort;
  457.  
  458.     ObtainSemaphore(&draw_semaphore);
  459.  
  460.     SetAPen(rport, color);
  461.     WritePixel(rport, ALARM_X + offx, ALARM_Y + offy);
  462.     Move(rport, ALARM_X + offx + 2, ALARM_Y + offy - 1);
  463.     Draw(rport, ALARM_X + offx + 2, ALARM_Y + offy + 1);
  464.  
  465.     Move(rport, ALARM_X + offx + 4, ALARM_Y + offy - 2);
  466.     Draw(rport, ALARM_X + offx + 4, ALARM_Y + offy + 2);
  467.  
  468.     ReleaseSemaphore(&draw_semaphore);
  469. }
  470.  
  471. void EraseAlarm(int color)
  472. {
  473.     int offx = DClockWnd->BorderLeft;
  474.     int offy = DClockWnd->BorderTop;
  475.     struct RastPort *rport = DClockWnd->RPort;
  476.  
  477.     ObtainSemaphore(&draw_semaphore);
  478.  
  479.     SetAPen(rport, color);
  480.     RectFill(rport, ALARM_X + offx , ALARM_Y + offy - 2, ALARM_X + offx + 4, ALARM_Y + offy + 2);
  481.  
  482.     ReleaseSemaphore(&draw_semaphore);
  483. }
  484.  
  485. void DrawTimer(int color)
  486. {
  487.     int offx = DClockWnd->BorderLeft;
  488.     int offy = DClockWnd->BorderTop;
  489.     struct RastPort *rport = DClockWnd->RPort;
  490.  
  491.     ObtainSemaphore(&draw_semaphore);
  492.  
  493.     SetAPen(rport, color);
  494.     Move(rport, TIMER_X + offx, TIMER_Y + offy);
  495.     Draw(rport, TIMER_X + offx + 4, TIMER_Y + offy);
  496.     Move(rport, TIMER_X + offx + 2, TIMER_Y + offy);
  497.     Draw(rport, TIMER_X + offx + 2, TIMER_Y + offy + 4);
  498.  
  499.     ReleaseSemaphore(&draw_semaphore);
  500. }
  501.  
  502. void EraseTimer(int color)
  503. {
  504.     int offx = DClockWnd->BorderLeft;
  505.     int offy = DClockWnd->BorderTop;
  506.     struct RastPort *rport = DClockWnd->RPort;
  507.  
  508.     ObtainSemaphore(&draw_semaphore);
  509.  
  510.     SetAPen(rport, color);
  511.     RectFill(rport, TIMER_X + offx, TIMER_Y + offy, TIMER_X + offx + 4, TIMER_Y + offy + 5);
  512.  
  513.     ReleaseSemaphore(&draw_semaphore);
  514. }
  515.  
  516. BOOL CheckTimer(struct AppPrefs *prefs, struct Time *myTime)
  517. {
  518.     int arglist[3];
  519.  
  520.     if ((--prefs->timerval) == 0)
  521.     {
  522.         Signal(infotask, timersig);
  523.         return TRUE;
  524.     }
  525.     else
  526.         return FALSE;
  527. }
  528.  
  529. void TurnTimerOff(struct AppPrefs *prefs)
  530. {
  531.     struct MenuItem *it;
  532.     ULONG menu_num = FULLMENUNUM(MENU_DCLOCK, MENU_TIMERON, 0);
  533.  
  534.     it = (struct MenuItem *)ItemAddress(DClockMenus, menu_num);
  535.  
  536.     ClearMenuStrip(DClockWnd);
  537.     it->Flags = it->Flags & (~CHECKED);
  538.     SetMenuStrip(DClockWnd, DClockMenus);
  539.     OffMenu(DClockWnd, menu_num);
  540.     prefs->timer = FALSE;
  541.     EraseTimer(prefs->background);
  542. }
  543.  
  544.  
  545. void ShowAlarm(struct AppPrefs *prefs)
  546. {
  547.     int arglist[1];
  548.     char buf[16];
  549.     time_t t = time(0);
  550.  
  551.     if (prefs->twentyfour)
  552.         strftime(buf, 16, "%X", localtime(&t));
  553.     else
  554.         strftime(buf, 16, "%I:%M:%S %p", localtime(&t));
  555.  
  556.     arglist[0] = (int)buf;
  557.     DisplayBeep(Scr);
  558.     if (rtEZRequestA("It is %s\n\n"
  559.                           "Whatever you've got to do -\n"
  560.                           "now is the time for doing it",
  561.                           "Turn alarm off|Leave on", NULL, arglist, ezRequestTags))
  562.         TurnAlarmOff(prefs);
  563. }
  564.  
  565.  
  566. void ShowTimer(struct AppPrefs *prefs)
  567. {
  568.     int arglist[1];
  569.     char buf[16];
  570.     time_t t = time(0);
  571.  
  572.     if (prefs->twentyfour)
  573.         strftime(buf, 16, "%X", localtime(&t));
  574.     else
  575.         strftime(buf, 16, "%I:%M:%S %p", localtime(&t));
  576.  
  577.     arglist[0] = (int)buf;
  578.  
  579.     DisplayBeep(Scr);
  580.     rtEZRequestA("It is %s\n\n"
  581.                      "The timer has finished",
  582.                      "Thanks", NULL, arglist, ezRequestTags);
  583. }
  584.  
  585.