home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / time / tbc / source / tbc_252.c < prev   
Encoding:
C/C++ Source or Header  |  1994-06-11  |  26.7 KB  |  900 lines

  1. #include <clib/alib_stdio_protos.h>
  2. #include <clib/exec_protos.h>
  3. #include <clib/dos_protos.h>
  4. #include <clib/graphics_protos.h>
  5. #include <clib/intuition_protos.h>
  6. #include <clib/alib_protos.h>
  7. #include <clib/diskfont_protos.h>
  8. #include <clib/timer_protos.h>
  9. #include <clib/utility_protos.h>
  10.  
  11. #include <dos/dos.h>
  12. #include <dos/notify.h>
  13. #include <dos/datetime.h>
  14. #include <dos/dostags.h>
  15. #include <devices/timer.h>
  16.  
  17. #include <exec/types.h>
  18. #include <exec/memory.h>
  19.  
  20. #include <graphics/gfxmacros.h>
  21.  
  22. #include <intuition/intuitionbase.h>
  23. #include <intuition/intuition.h>
  24. #include <intuition/gadgetclass.h>
  25.  
  26. #include <libraries/gadtools.h>
  27. #include <clib/gadtools_protos.h>
  28.  
  29. #include <string.h>
  30. #include <stdlib.h>
  31.  
  32. #include <workbench/workbench.h>
  33.  
  34. #define PREFDIR   "ENV:Sys"
  35. #define GAD_AB     1
  36. #define GAD_DELAY  2
  37. #define GAD_QUIT   3
  38. #define GAD_FOR    4
  39. #define GAD_BAC    5
  40. #define GAD_NEWL   6
  41. #define GAD_TIME   7
  42. #define GAD_HIDE   8
  43. #define GAD_HOUR   9
  44. #define GAD_MINS   10
  45. #define GAD_ALARM  11
  46. #define GAD_USE    12
  47. #define GAD_COM    13
  48. #define GAD_SCREEN 15
  49. #define GAD_DATE   16
  50. #define GAD_CHIME  17
  51. #define GAD_MEM    22
  52. #define GAD_WTYPE  23
  53.  
  54. static UBYTE         *VersTag = "\0$VER: TBC 39.51 (12.6.94)" ;
  55. static char          *sc_title = "TBC v2.52 by DM Hollway 1994" ;
  56. struct NotifyRequest *notifyrequest = NULL ;
  57. struct TextFont      *myfont = NULL ;
  58. struct TextAttr      myattr ;
  59. struct IntuitionBase *IntuitionBase = NULL ;
  60. struct GfxBase       *GfxBase = NULL ;
  61. struct Library       *DiskfontBase = NULL ;
  62. struct Library       *UtilityBase = NULL ;
  63. struct Library       *TimerBase = NULL ;
  64. struct Library       *GadToolsBase = NULL;
  65. struct Library       *IconBase = NULL ;
  66. struct Gadget        *glistprefs = NULL, *foregad=NULL, *backgad = NULL, *newgad = NULL ;
  67. struct Gadget        *alarmgad, *mingad, *hourgad, *comgad, *warngad, *memgad ;
  68. struct RastPort      *myrast ;
  69. struct Window        *cwin = NULL, *ConfWin=NULL ;
  70. struct Screen        *mysc = NULL, *tempsc ;
  71. struct DrawInfo      *drawinfo = NULL ;
  72. struct ClockData     *clockdata =NULL ;
  73. struct timerequest   *tr = NULL ;
  74. struct timeval       *tv = NULL ;
  75. struct MsgPort       *timerport ;
  76. struct Message       *timermsg ;
  77. struct IntuiMessage  *msg ;
  78. struct Requester     wreq, areq ;
  79. struct EasyStruct    aboutreq =
  80. {
  81.  sizeof(struct EasyStruct), 0, "About TBC",
  82.  "TBC - The Title Bar Clock\nby David M Hollway in 1994\n(dmh11@tower.york.ac.uk)\n\nGIFTWARE\nAMIGA - Others follow, we lead!",
  83.  "OK",
  84. } ;
  85. struct EasyStruct    memreq =
  86. {
  87.  sizeof(struct EasyStruct), 0, "TBC Warning",
  88.  "Low Memory!",
  89.  "OK",
  90. } ;
  91.  
  92. struct TextAttr Topaz80 =
  93. {
  94.     "topaz.font",
  95.     8,         
  96.     0,         
  97.     0,
  98. };
  99.  
  100. extern struct Library *DOSBase ;
  101.  
  102. struct Gadget *ConfigGads(struct Gadget **glistptr, void *vi, struct Screen *) ;
  103. void   bailout(int err, char *message) ;
  104. int    winloop(void) ;
  105. void   ConfigWin(struct Window *, struct Screen *) ;
  106. void   SetData(struct Window *) ;
  107. void   time(void) ;
  108. LONG   beginCommand(UBYTE *) ;
  109.  
  110. long   delay=1, backpen=1, forepen=0, blockpen=1, detailpen=0, depth, timeout=200 ;
  111. int    termlevel=0, hour=0, min=0, sec=0, chime=0, offsetY = 0, command=0 ;
  112. long   alarm_hour=12, alarm_min=0, alarm_state=0, lastmin=0, warn ;
  113. long   format, date=0, winWidth, cwidth, off, delta, freemem=200 ;
  114. char   com[66] ;
  115. BOOL   done=FALSE, newlook=TRUE ;
  116. BOOL   pubscreen=TRUE, secs=FALSE, s_change=FALSE, pm, memwatch=FALSE ;
  117. UBYTE  *filename ;
  118. LONG   signum, code ;
  119. ULONG  signals, WA_Sc, IBase ;
  120. char   *hourstr="     ", *minstr="      ", *secstr = "            " ;
  121. STRPTR types[]={"6:34 pm", "6:34:00", "18:34", "18:34:00", NULL,} ;
  122. STRPTR dates[]={"No Date", "25.12.94", "12.25.94", NULL,} ;
  123. STRPTR alarms[]={"No Alarm", "Flash", "Command", "Do Both", NULL,} ;
  124. STRPTR warns[]={"ignore it", "flash screen", "show requester", "show alert", NULL,} ;
  125. STRPTR *tooltypes ;
  126.  
  127. void main (int argc, char *argv[])
  128. {
  129.    if (DOSBase->lib_Version < 37)
  130.      bailout (20,"Need Kickstart v37 (2.04) or greater!") ;
  131.  
  132.    sprintf(com, "%s","") ;
  133.  
  134.    DiskfontBase = OpenLibrary("diskfont.library", 37);
  135.    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 37);
  136.    IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37);
  137.    GadToolsBase = OpenLibrary("gadtools.library", 37) ;
  138.    UtilityBase = OpenLibrary("utility.library", 37) ;
  139.    if (!(DiskfontBase&&GfxBase&&IntuitionBase&&GadToolsBase&&UtilityBase))
  140.      bailout(20, "Couldn't open v37+ of a library!") ;
  141.      
  142.    if (!(timerport = CreatePort(0,0)))
  143.      bailout(20,"Can't create timer port!") ;
  144.  
  145.    if (!(tr = (struct timerequest *)CreateExtIO(timerport,
  146.         sizeof(struct timerequest))))
  147.      bailout(20,"Can't CreateExtIO") ;
  148.  
  149.    if (!(tv = AllocMem(sizeof(struct timeval), MEMF_CLEAR)))
  150.      bailout(20,"Low mem!") ;
  151.  
  152.    if (!(clockdata = AllocMem(sizeof(struct ClockData), MEMF_CLEAR)))
  153.      bailout(20,"Low mem!") ;
  154.  
  155.    if (OpenDevice("timer.device", UNIT_VBLANK, (struct IORequest *)tr, 0L) )
  156.      bailout(20,"Can't open timer.device") ;
  157.  
  158.    TimerBase = (struct Library *)tr->tr_node.io_Device ;
  159.  
  160.    if (!(notifyrequest = AllocMem(sizeof(struct NotifyRequest), MEMF_CLEAR)))
  161.      bailout(20,"Low memory!") ;
  162.  
  163.    if ((signum = AllocSignal(-1L)) == -1)
  164.      bailout(20,"Can't alloc signal") ;
  165.  
  166.    filename = PREFDIR ;
  167.    notifyrequest->nr_Name=filename ;
  168.    notifyrequest->nr_Flags = NRF_SEND_SIGNAL ;
  169.    notifyrequest->nr_stuff.nr_Signal.nr_Task = (struct Task *)FindTask(NULL) ;
  170.    notifyrequest->nr_stuff.nr_Signal.nr_SignalNum = signum ;
  171.  
  172.    if (IconBase = OpenLibrary("icon.library",37L))
  173.    {
  174.      tooltypes = ArgArrayInit(argc, argv) ;
  175.      forepen = (LONG)ArgInt(tooltypes, "FOREPEN", 0) ;
  176.      if (forepen < 0) forepen = 0 ;
  177.  
  178.      backpen = (LONG)ArgInt(tooltypes, "BACKPEN", 1) ;
  179.      if (backpen < 0) backpen = 1 ;
  180.  
  181.      format  = (LONG)ArgInt(tooltypes, "FORMAT", 0) ;
  182.      if ((format<0)||(format>3)) format = 0 ;
  183.  
  184.      timeout  = 50 * (LONG)ArgInt(tooltypes, "IPREFSWAIT", 5) ;
  185.      if (timeout < 50) timeout = 50 ;
  186.  
  187.      if (ArgInt(tooltypes, "NONEWLOOK",0)>0) newlook = FALSE ;
  188.  
  189.      delay = (LONG)ArgInt(tooltypes, "DELAY", 1) ;
  190.      if (delay < 1) delay = 1 ;
  191.  
  192.      chime = (LONG)ArgInt(tooltypes, "CHIME", 0) ;
  193.      if (chime < 0) chime = 0 ;
  194.      
  195.      alarm_hour = (LONG)ArgInt(tooltypes, "ALARMHOUR", 12) ;
  196.      if ((alarm_hour < 0)||(alarm_hour > 23)) alarm_hour = 12 ;
  197.  
  198.      alarm_min = (LONG)ArgInt(tooltypes, "ALARMMIN", 0) ;
  199.      if ((alarm_min < 0)||(alarm_min > 59)) alarm_min = 0 ;
  200.  
  201.      command=ArgInt(tooltypes, "ALARM", 0) ;
  202.      if ((command>0)&&(command<4)) alarm_state=TRUE ;
  203.       else command = 0 ; 
  204.  
  205.      if (ArgInt(tooltypes, "SCREENLEAP", 0) > 0) pubscreen = FALSE ;
  206.  
  207.      date = (LONG)ArgInt(tooltypes, "DATE", 0) ;
  208.      if ((date<0)||(date>2)) date = 0 ;
  209.  
  210.      if (ArgString(tooltypes, "ALARMRUN",NULL)) 
  211.       {
  212.        sprintf(com, "%s", ArgString(tooltypes, "ALARMRUN", NULL)) ; 
  213.       }
  214.     freemem = (LONG)ArgInt(tooltypes, "MEMWARN", 200) ;
  215.      if (freemem < 1) freemem = 200 ;
  216.     warn = (LONG)ArgInt(tooltypes, "WARNTYPE", 0) ;
  217.      if (warn < 1) warn = 0 ;
  218.  
  219.  
  220.      ArgArrayDone() ;
  221.      CloseLibrary(IconBase) ;
  222.     }
  223.    secs=((format==0)||(format==2))?(FALSE):(TRUE); 
  224.  
  225.    while(termlevel < 3)
  226.    {
  227.     termlevel=winloop() ;
  228.     if (termlevel==2) Delay(50) ;
  229.     if (termlevel==1)
  230.      {
  231.       Delay(timeout) ;
  232.       while (!(mysc=LockPubScreen(NULL))) {Delay(50) ;}
  233.       UnlockPubScreen(NULL, mysc) ;
  234.      }
  235.    }
  236.    bailout(0,NULL) ;
  237. }
  238.  
  239. void clear_IO(void)
  240. {
  241.  AbortIO((struct IORequest *)tr) ;
  242.  WaitIO((struct IORequest *)tr) ;
  243. }
  244.  
  245. void DrawBevels(struct Window *ConfWin, void *vi)
  246. {
  247.  DrawBevelBox(ConfWin->RPort, 10, (ConfWin->BorderTop)+2, 220, 101,
  248.               GT_VisualInfo, vi, GTBB_Recessed, TRUE, 
  249.               GTBB_FrameType, BBFT_RIDGE, TAG_DONE) ;
  250.  DrawBevelBox(ConfWin->RPort, 233, (ConfWin->BorderTop)+38, 217, 65,
  251.               GT_VisualInfo, vi, GTBB_Recessed, TRUE, 
  252.               GTBB_FrameType, BBFT_RIDGE, TAG_DONE) ;
  253.  DrawBevelBox(ConfWin->RPort, 233, (ConfWin->BorderTop)+2, 217, 34,
  254.               GT_VisualInfo, vi, GTBB_Recessed, TRUE, 
  255.               GTBB_FrameType, BBFT_RIDGE, TAG_DONE) ;
  256.  DrawBevelBox(ConfWin->RPort, 10, (ConfWin->BorderTop)+105, 440, 22,
  257.               GT_VisualInfo, vi, GTBB_Recessed, TRUE, 
  258.               GTBB_FrameType, BBFT_RIDGE, TAG_DONE) ;
  259.  DrawBevelBox(ConfWin->RPort, 10, (ConfWin->BorderTop)+129, 440, 22,
  260.               GT_VisualInfo, vi, GTBB_Recessed, TRUE, 
  261.               GTBB_FrameType, BBFT_RIDGE, TAG_DONE) ;
  262.  
  263. }
  264.  
  265. void ConfigWin(struct Window *win, struct Screen *confsc)
  266. {
  267.  void   *vi ;
  268.  int    aok=1 ;
  269.  struct IntuiMessage *imsg;
  270.  struct Gadget *gad=NULL;
  271.  ULONG  imsgClass=0, confsig ;
  272.  UWORD  imsgCode=0;
  273.  
  274.  termlevel=0 ;
  275.  if (!(vi = GetVisualInfo(confsc, TAG_DONE)))
  276.      return ;
  277.  
  278.  if (!(ConfigGads(&glistprefs, vi, confsc)))
  279.      {FreeVisualInfo(vi) ;
  280.       return ;
  281.      }
  282.  
  283.  ConfWin = OpenWindowTags(NULL,
  284.              WA_Left, (confsc->Width)-460, WA_Top, (confsc->BarHeight)+1,
  285.              WA_Width, 460, WA_InnerHeight, 169,
  286.              WA_ScreenTitle, sc_title,
  287.              WA_DragBar, TRUE, WA_CloseGadget, TRUE,
  288.              WA_SimpleRefresh, TRUE, WA_RMBTrap, TRUE,
  289.              WA_IDCMP, REFRESHWINDOW|GADGETUP|CLOSEWINDOW|
  290.                        SLIDERIDCMP,
  291.              WA_DepthGadget, TRUE, WA_Gadgets, glistprefs,
  292.              WA_Sc, confsc, WA_Activate, TRUE,
  293.              WA_SizeGadget, FALSE, WA_Title, "TBC Configuration",
  294.              TAG_DONE) ;
  295.  
  296.  if (!(ConfWin))
  297.    {
  298.     FreeVisualInfo(vi) ;
  299.     FreeGadgets(glistprefs) ;
  300.     return ;
  301.    }
  302.  
  303.  DrawBevels(ConfWin, vi) ;
  304.  
  305.  GT_RefreshWindow(ConfWin, NULL);
  306.  
  307.  while (aok==1)
  308.    {
  309.     confsig = Wait( (1L<<ConfWin->UserPort->mp_SigBit) |
  310.                     (1L<<timerport->mp_SigBit) ) ;
  311.  
  312.      if (confsig & (1L<<ConfWin->UserPort->mp_SigBit))
  313.      {
  314.       while ((aok==1) && (imsg = GT_GetIMsg(ConfWin->UserPort)))
  315.       {
  316.         imsgClass = imsg->Class;
  317.         imsgCode = imsg->Code;
  318.         gad = (struct Gadget *)imsg->IAddress;
  319.         GT_ReplyIMsg(imsg);
  320.         switch (imsgClass)
  321.         {
  322.          case CLOSEWINDOW:
  323.               aok=0 ;
  324.               break ;
  325.          case GADGETUP:
  326.            switch(gad->GadgetID)
  327.            {
  328.             case GAD_DELAY:
  329.                delay=((struct StringInfo *)gad->SpecialInfo)->LongInt ;
  330.                if (delay <= 0) delay = 1 ;
  331.                clear_IO() ;
  332.                time() ;
  333.                break ;
  334.             case GAD_AB:
  335.                InitRequester(&areq) ;
  336.                if (Request(&areq,ConfWin))
  337.                {
  338.                 EasyRequest(ConfWin, &aboutreq, NULL) ;
  339.                }
  340.                EndRequest(&areq, ConfWin) ;
  341.                break ;
  342.             case GAD_HIDE:
  343.                termlevel = 1 ;
  344.                aok=0 ;
  345.                break ;
  346.             case GAD_QUIT:
  347.                termlevel=3 ;
  348.                aok=0 ;
  349.                break ;
  350.             case GAD_FOR:
  351.                forepen=imsgCode ;
  352.             case GAD_BAC:
  353.                if (gad->GadgetID==GAD_BAC) backpen=imsgCode ;
  354.                GT_SetGadgetAttrs(newgad, ConfWin, NULL,
  355.                      GTCB_Checked, FALSE, TAG_END) ;
  356.                newlook=FALSE ;
  357.                clear_IO() ;
  358.                SetData(win) ;
  359.                break ;
  360.             case GAD_NEWL:
  361.                newlook=(gad->Flags & SELECTED) ;
  362.                if (newlook)
  363.                  {
  364.                   backpen=blockpen ;
  365.                   forepen=detailpen ;
  366.                   GT_SetGadgetAttrs(foregad, ConfWin, NULL,
  367.                                     GTPA_Color, forepen, TAG_END) ;
  368.                   GT_SetGadgetAttrs(backgad, ConfWin, NULL,
  369.                                     GTPA_Color, backpen, TAG_END) ;
  370.                   clear_IO() ;
  371.                   SetData(win) ;
  372.                  }
  373.                break ;
  374.             case GAD_TIME:
  375.                format = imsgCode ;
  376.                secs=((format==0)||(format==2))?(FALSE):(TRUE); 
  377.             case GAD_DATE:
  378.                if (gad->GadgetID==GAD_DATE) date = imsgCode ;
  379.                clear_IO() ;
  380.                SetData(win) ;
  381.                break ;
  382.  
  383.             case GAD_ALARM:
  384.                command=imsgCode ;
  385.                if (command>0) alarm_state=1 ; else alarm_state=0 ;
  386.                GT_SetGadgetAttrs(hourgad, ConfWin, NULL,
  387.                            GA_Disabled, (alarm_state==0), TAG_END) ;
  388.                GT_SetGadgetAttrs(mingad, ConfWin, NULL,
  389.                            GA_Disabled, (alarm_state==0), TAG_END) ;
  390.                GT_SetGadgetAttrs(comgad, ConfWin, NULL,
  391.                            GA_Disabled, (command<2), TAG_END) ;
  392.                break ;
  393.             case GAD_COM:
  394.                sprintf(com,"%s",((struct StringInfo *)gad->SpecialInfo)->Buffer) ;
  395.                break ;
  396.             case GAD_SCREEN:
  397.                pubscreen=!(gad->Flags & SELECTED) ;
  398.                if (pubscreen) s_change = TRUE ;
  399.                break ;
  400.             case GAD_USE:
  401.                aok=0 ;
  402.                break;
  403.             case GAD_CHIME:
  404.                chime=((struct StringInfo *)gad->SpecialInfo)->LongInt ;
  405.                if (chime <= 0) chime = 0 ;
  406.                lastmin=-1 ;
  407.                break ;
  408.             case GAD_MEM:
  409.                freemem=((struct StringInfo *)gad->SpecialInfo)->LongInt ;
  410.                break ;
  411.             case GAD_WTYPE:
  412.                warn = imsgCode ;
  413.                break ;
  414.            }
  415.            break ;
  416.  
  417.          case MOUSEMOVE:
  418.            switch(gad->GadgetID)
  419.            {
  420.             case GAD_HOUR:
  421.                alarm_hour = imsgCode ;
  422.                break ;
  423.  
  424.             case GAD_MINS:
  425.                alarm_min = imsgCode ;
  426.                break ;
  427.            }
  428.            break ;
  429.  
  430.          case REFRESHWINDOW:
  431.            GT_BeginRefresh(ConfWin);
  432.            DrawBevels(ConfWin, vi) ;
  433.            GT_EndRefresh(ConfWin, TRUE);
  434.            break;
  435.         }
  436.       }
  437.      }
  438.      if (confsig & (1L<<timerport->mp_SigBit))
  439.       {
  440.         timermsg = GetMsg(timerport);
  441.         time() ;
  442.       }
  443.  
  444.    }
  445.    sprintf(com,"%s",((struct StringInfo *)comgad->SpecialInfo)->Buffer) ;
  446.    freemem=((struct StringInfo *)memgad->SpecialInfo)->LongInt ;
  447.    CloseWindow(ConfWin);
  448.    ConfWin=NULL ;
  449.    FreeGadgets(glistprefs) ;
  450.    FreeVisualInfo(vi) ;
  451. }
  452.  
  453.  
  454. int winloop(void)
  455. {
  456.    termlevel= 0 ; 
  457.    done = FALSE ;
  458.    if ((StartNotify(notifyrequest)) != DOSTRUE)
  459.     bailout(20,"Can't StartNotify()!") ;
  460.  
  461.    if (pubscreen) if (!(mysc=LockPubScreen(NULL)))
  462.     {
  463.      EndNotify(notifyrequest) ;
  464.      bailout(20,"Couldn't lock public screen!") ;
  465.     }
  466.    if (!pubscreen) 
  467.       {IBase = LockIBase(0) ;
  468.        mysc=IntuitionBase->ActiveScreen ; 
  469.        UnlockIBase(IBase) ;}
  470.    cwidth = TextLength(&mysc->RastPort, ":", 1) ;
  471.  
  472.    drawinfo=GetScreenDrawInfo(mysc) ;
  473.    depth=drawinfo->dri_Depth ;
  474.  
  475.    if ((drawinfo->dri_Version) > 1)
  476.      {
  477.       blockpen = drawinfo->dri_Pens[BARBLOCKPEN] ;
  478.       detailpen = drawinfo->dri_Pens[BARDETAILPEN] ;
  479.      }
  480.    FreeScreenDrawInfo(mysc, drawinfo) ;
  481.  
  482.    if (newlook)
  483.    {
  484.     backpen = blockpen ;
  485.     forepen = detailpen ;
  486.    }
  487.    myattr.ta_Name  = mysc->Font->ta_Name  ;
  488.    myattr.ta_YSize = mysc->Font->ta_YSize ;
  489.    myattr.ta_Style = mysc->Font->ta_Style ;
  490.    myattr.ta_Flags = mysc->Font->ta_Flags ;
  491.    myfont = OpenFont(&myattr) ;
  492.    winWidth = 3+TextLength(&mysc->RastPort, "88:88:mm", 8) ;
  493.    offsetY = (myfont->tf_Baseline)+1 ;
  494.    WA_Sc = (pubscreen)?(WA_PubScreen):(WA_CustomScreen) ;
  495.    
  496.    cwin=OpenWindowTags(NULL,
  497.       WA_Left, ((mysc->Width) - winWidth)-23, WA_Top, 0, WA_Width, winWidth,
  498.       WA_Height, (mysc->BarHeight), WA_IDCMP, IDCMP_MOUSEBUTTONS,
  499.       WA_DetailPen, forepen, WA_BlockPen, backpen,
  500.       WA_ScreenTitle, sc_title,
  501.       WA_DragBar, FALSE, WA_CloseGadget, FALSE, WA_Activate, FALSE,
  502.       WA_SmartRefresh, TRUE, WA_DepthGadget, FALSE,
  503.       WA_Sc, mysc, WA_RMBTrap, TRUE,
  504.       WA_Borderless, TRUE, TAG_END) ;
  505.       
  506.    if (pubscreen) UnlockPubScreen(NULL, mysc) ;
  507.    if (!(cwin)) return(3) ;
  508.    myrast = cwin->RPort ;
  509.    SetFont(myrast, myfont) ;
  510.    SetData(cwin) ;
  511.  
  512.    while(!done)
  513.    {
  514.       signals = Wait( (1L<<signum) |
  515.                       (1L<<cwin->UserPort->mp_SigBit) |
  516.                       (1L<<timerport->mp_SigBit) ) ;
  517.  
  518.       if (signals & (1L<<cwin->UserPort->mp_SigBit))
  519.       {
  520.             while (msg = (struct IntuiMessage *)GetMsg(cwin->UserPort))
  521.             {
  522.              code = msg->Code ;
  523.              ReplyMsg((struct Message *)msg) ;
  524.  
  525.              if (code == SELECTDOWN)
  526.                  if (alarm_state==2) alarm_state=0 ;
  527.              else
  528.              {
  529.               InitRequester(&wreq) ;
  530.               if (Request(&wreq,cwin))
  531.                 {
  532.                  s_change = FALSE ;
  533.                  ConfigWin(cwin, mysc) ;
  534.                  if ((s_change == TRUE)&&(termlevel==0)) termlevel=2 ;
  535.                 }
  536.               EndRequest(&wreq, cwin) ;
  537.               if (termlevel >0) done=TRUE ;
  538.              }
  539.             } 
  540.       }
  541.       
  542.       if (signals & (1L<<signum))
  543.        {
  544.              done = TRUE ;
  545.              termlevel = 1 ;
  546.        }
  547.       if (signals & (1L<<timerport->mp_SigBit))
  548.        {
  549.            while (timermsg = GetMsg(timerport))
  550.            {
  551.             time() ;
  552.             if (!pubscreen)
  553.              {
  554.               IBase = LockIBase(0) ;
  555.               tempsc=IntuitionBase->ActiveScreen ;
  556.               if ((mysc != tempsc)&&(tempsc->Width>600)&&(tempsc->Title)) 
  557.                 {termlevel=2 ;
  558.                  done = TRUE ;}
  559.               UnlockIBase(IBase) ;
  560.              }
  561.            }   
  562.        }
  563.    }
  564.    clear_IO() ;
  565.    EndNotify(notifyrequest) ;
  566.    CloseFont(myfont) ;
  567.    CloseWindow(cwin) ;
  568.    return(termlevel) ;
  569. }
  570.  
  571. void SetData(struct Window *win)
  572. {
  573.  SetRast(myrast, backpen) ;        
  574.  SetBPen(myrast, backpen) ;
  575.  if (format==2) delta=TextLength(&mysc->RastPort,"88:", 3) ;
  576.    else delta = 2 ;
  577.  time() ;
  578. }
  579.  
  580. void time(void)
  581. {
  582.  pm = FALSE ;
  583.  GetSysTime(tv) ;
  584.  Amiga2Date(tv->tv_secs, clockdata) ;
  585.  hour = clockdata->hour ;
  586.  min  = clockdata->min ;
  587.  
  588.  if (warn >0)
  589.   {
  590.    if ((freemem*1000) > (AvailMem(MEMF_ANY))) 
  591.     {
  592.      switch (warn)
  593.       {
  594.        case 1:
  595.             DisplayBeep(NULL) ;
  596.             break ;
  597.        case 2:
  598.             EasyRequest(cwin, &memreq, NULL) ;
  599.             break;
  600.        case 3:
  601.             DisplayAlert(RECOVERY_ALERT, "\x00\xe0\x0e" "TBC reports low memory!" "\x00\x01" "\x00\xac\x19" "Press either mousebutton to continue" "\x00", 36) ;
  602.             break ;
  603.       }
  604.      warn=0 ;
  605.      if (ConfWin) 
  606.         {
  607.          GT_SetGadgetAttrs(warngad, ConfWin, NULL, GTCY_Active, 0, TAG_END) ;
  608.         }
  609.     }
  610.   }
  611.  
  612.  if (chime>0) 
  613.   if (((min%chime)==0)&&(min!=lastmin)) {lastmin=min ; DisplayBeep(NULL) ;}
  614.  
  615.  if (alarm_state==1)
  616.   if ((hour==alarm_hour) && (min == alarm_min))
  617.    {
  618.     alarm_state = 2 ;
  619.     if (command>1) beginCommand(com) ;
  620.    }
  621.  
  622.  if (alarm_state == 2) if ((command==1)||(command==3)) DisplayBeep(NULL) ;
  623.  
  624.  SetAPen(myrast,forepen) ;
  625.  sec = clockdata->sec ;
  626.  
  627.  if (date>0) SetRast(myrast, backpen) ;
  628.  
  629.  if ((sec%4==0)&&(date>0))
  630.   {
  631.    hour = clockdata->mday ;
  632.    min  = clockdata->month ;
  633.    sprintf(secstr, "%ld.%ld.%ld",(date==1)?(hour):(min),(date==1)?(min):(hour),
  634.      (clockdata->year)-1900) ;
  635.    Move(myrast, 2, offsetY) ;
  636.    Text(myrast, secstr, strlen(secstr)) ;
  637.   }
  638.  else
  639.  {
  640.   if (format < 2)
  641.    {if (hour > 11) {pm=TRUE ; if (hour >12) hour = hour - 12 ;}
  642.    if (hour < 1) hour = 12 ;}
  643.  
  644.   sprintf( hourstr, "%s%d ", (hour<10)?(" "):(""),hour) ;
  645.   sprintf( minstr, "%02d   ", min) ;
  646.   switch (format)
  647.    {
  648.     case 0:
  649.          sprintf( secstr, "%s   ", (pm==TRUE) ? ("pm") : ("am")) ;
  650.          break ;
  651.     case 2:
  652.          sprintf(secstr, "       ") ;
  653.          break ;
  654.     case 1:
  655.     case 3:
  656.          sprintf( secstr, "%02d   ", sec) ;
  657.          break ;
  658.    }
  659.  
  660.   off = delta + cwidth + TextLength(&mysc->RastPort, hourstr, 2) ;
  661.  
  662.   Move(myrast, delta, offsetY) ;
  663.   Text(myrast, hourstr, 3) ;
  664.  
  665.   Move(myrast, off, offsetY) ;
  666.   Text(myrast, minstr, 5) ;
  667.  
  668.   min=TextLength(&mysc->RastPort, minstr, 2) ;
  669.   Move(myrast, off+cwidth+min, offsetY) ;
  670.   Text(myrast, secstr, 5) ;
  671.  
  672.   SetAPen(myrast, (sec%2==0)?(forepen):(backpen)) ;
  673.   Move (myrast, off-cwidth, offsetY) ;
  674.   Text(myrast, ":", 1) ;
  675.   Move (myrast, off + min, offsetY) ;
  676.   if (secs) Text(myrast, ":", 1) ;
  677.  }
  678.  
  679.  tr->tr_node.io_Command = TR_ADDREQUEST ;
  680.  tr->tr_time.tv_secs = delay ;
  681.  tr->tr_time.tv_micro = 0 ;
  682.  SendIO((struct IORequest *)tr) ;
  683. }
  684.  
  685. LONG beginCommand(UBYTE *comm)
  686.  {
  687.     UBYTE *autocon="CON:00/40/640/150/TBC Output/auto/close/wait";
  688.     struct TagItem stags[5];
  689.     LONG result = -2L;
  690.     BPTR file;
  691.  
  692.     if(file = Open(autocon, MODE_OLDFILE))
  693.     {
  694.      stags[0].ti_Tag = SYS_Input;
  695.      stags[0].ti_Data = file;
  696.      stags[1].ti_Tag = SYS_Output;
  697.      stags[1].ti_Data = NULL;
  698.      stags[2].ti_Tag = SYS_Asynch;
  699.      stags[2].ti_Data = TRUE;
  700.      stags[3].ti_Tag = SYS_UserShell;
  701.      stags[3].ti_Data = FALSE;
  702.      stags[4].ti_Tag = TAG_DONE;
  703.      result = System(comm, stags);
  704.       if(result == -1L)
  705.         {
  706.         Close(file);
  707.         }
  708.     }
  709.     return(result);
  710. }
  711.  
  712.  
  713. void bailout(int err, char *message)
  714. {
  715.   if (message) printf("%s\n",message) ;
  716.  
  717.   if (signum)
  718.     FreeSignal(signum) ;
  719.  
  720.   if (notifyrequest)
  721.     FreeMem(notifyrequest, sizeof(struct NotifyRequest)) ;
  722.  
  723.   if (GadToolsBase)
  724.      CloseLibrary(GadToolsBase) ;
  725.  
  726.   if (IntuitionBase)
  727.     CloseLibrary((struct Library *)IntuitionBase) ;
  728.  
  729.   if (GfxBase)
  730.     CloseLibrary((struct Library *)GfxBase) ;
  731.     
  732.   if (clockdata)
  733.     FreeMem(clockdata, sizeof(struct ClockData)) ;
  734.  
  735.   if (tv)
  736.     FreeMem(tv, sizeof(struct timeval)) ;
  737.  
  738.   if(tr)
  739.     {
  740.      CloseDevice((struct IORequest *)tr) ;
  741.      DeleteExtIO((struct IORequest *)tr) ;
  742.      DeletePort(timerport) ;
  743.     }
  744.  
  745.   if (DiskfontBase)
  746.     CloseLibrary(DiskfontBase) ;
  747.   if (UtilityBase)
  748.     CloseLibrary(UtilityBase) ;
  749.  
  750.   exit(err) ;
  751. }
  752.  
  753. struct Gadget *ConfigGads(struct Gadget **glistptr, void *vi, struct Screen *confsc)
  754.  
  755. {
  756.     struct NewGadget ng;
  757.     int toparea = (confsc->Font->ta_YSize)+(confsc->WBorTop)+1 ;
  758.     struct Gadget *gad;
  759.     gad = CreateContext(glistptr);
  760.  
  761.     ng.ng_TextAttr = &Topaz80;
  762.     ng.ng_VisualInfo = vi;
  763.     ng.ng_Flags = PLACETEXT_LEFT ;
  764.  
  765.     ng.ng_TopEdge    = toparea+6 ;
  766.     ng.ng_LeftEdge   = 113 ;
  767.     ng.ng_Width      = 110 ;
  768.     ng.ng_Height     = 23 ;
  769.     ng.ng_GadgetText = "Foreground:";
  770.     ng.ng_GadgetID   = GAD_FOR ;
  771.        foregad = gad = CreateGadget(PALETTE_KIND, gad, &ng, GTPA_Depth, depth,
  772.                        GTPA_Color, forepen, GTPA_IndicatorWidth, 20, TAG_DONE) ;
  773.  
  774.     ng.ng_TopEdge   += 24 ;
  775.     ng.ng_GadgetText = "Background:";
  776.     ng.ng_GadgetID   = GAD_BAC ;
  777.        backgad = gad = CreateGadget(PALETTE_KIND, gad, &ng, GTPA_Depth, depth,
  778.                        GTPA_Color, backpen, GTPA_IndicatorWidth, 20, TAG_DONE) ;
  779.  
  780.     ng.ng_TopEdge   += 26 ;
  781.     ng.ng_Height     = 14 ;
  782.     ng.ng_GadgetText = "Use Pens:";
  783.     ng.ng_GadgetID   = GAD_NEWL ;
  784.         newgad = gad = CreateGadget(CHECKBOX_KIND, gad, &ng, GTCB_Checked, newlook,
  785.                        TAG_DONE) ;
  786.  
  787.     ng.ng_TopEdge   += 14 ;
  788.     ng.ng_GadgetText = "Time:" ;
  789.     ng.ng_GadgetID   = GAD_TIME ;
  790.                  gad = CreateGadget(CYCLE_KIND, gad, &ng, GTCY_Labels, types,
  791.                                     GTCY_Active, format, TAG_DONE) ;
  792.     ng.ng_TopEdge   += 15 ;
  793.     ng.ng_GadgetText = "Date:" ;
  794.     ng.ng_GadgetID   = GAD_DATE ;
  795.                  gad = CreateGadget(CYCLE_KIND, gad, &ng, GTCY_Labels, dates,
  796.                                     GTCY_Active, date, TAG_DONE) ;
  797.  
  798.     ng.ng_TopEdge    = toparea+6 ;
  799.     ng.ng_LeftEdge   = 384 ;
  800.     ng.ng_Width      = 40 ;
  801.     ng.ng_GadgetText = "Update (seconds):";
  802.     ng.ng_GadgetID   = GAD_DELAY ;
  803.                  gad = CreateGadget(INTEGER_KIND, gad, &ng, GTIN_Number, delay,
  804.                        GTIN_MaxChars, 2, TAG_DONE) ;
  805.  
  806.     ng.ng_TopEdge   += 15 ;
  807.     ng.ng_Height     = 13 ;
  808.     ng.ng_GadgetText = "Leap (danger!):";
  809.     ng.ng_GadgetID   = GAD_SCREEN ;
  810.                  gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
  811.                        GTCB_Checked, !(pubscreen), TAG_DONE) ;
  812.  
  813.     ng.ng_TopEdge   += 21 ;
  814.     ng.ng_LeftEdge   = 336 ;
  815.     ng.ng_Width      = 82 ;
  816.     ng.ng_GadgetText = "Alarm Hour:";
  817.     ng.ng_GadgetID   = GAD_HOUR ;
  818.     hourgad = gad    = CreateGadget(SLIDER_KIND, gad, &ng,
  819.                       GTSL_LevelFormat, "%02ld", GTSL_MaxLevelLen, 2,
  820.                       GTSL_LevelPlace, PLACETEXT_RIGHT, GTSL_Min, 0,
  821.                       GTSL_Max, 23, GA_RelVerify, TRUE, PGA_Freedom,
  822.                       LORIENT_HORIZ, GA_Disabled, (alarm_state==0),
  823.                       GTSL_Level, alarm_hour, TAG_DONE) ;
  824.  
  825.     ng.ng_TopEdge   += 14 ;
  826.     ng.ng_GadgetText = "Alarm Mins:";
  827.     ng.ng_GadgetID   = GAD_MINS ;
  828.     mingad = gad     = CreateGadget(SLIDER_KIND, gad, &ng,
  829.                       GTSL_LevelFormat, "%02ld", GTSL_MaxLevelLen, 2,
  830.                       GTSL_LevelPlace, PLACETEXT_RIGHT, GTSL_Min, 0,
  831.                       GTSL_Max, 59, GA_RelVerify, TRUE, PGA_Freedom,
  832.                       LORIENT_HORIZ, GA_Disabled, (alarm_state==0),
  833.                       GTSL_Level, alarm_min, TAG_DONE) ;
  834.  
  835.     ng.ng_TopEdge   += 14 ;
  836.     ng.ng_Width      = 40 ;
  837.     ng.ng_Height     = 14 ;
  838.     ng.ng_GadgetText = "Chime each:";
  839.     ng.ng_GadgetID   = GAD_CHIME ;
  840.                  gad = CreateGadget(INTEGER_KIND, gad, &ng, GTIN_Number, chime,
  841.                        GTIN_MaxChars, 2, TAG_DONE) ;
  842.  
  843.     ng.ng_TopEdge   += 15 ;
  844.     ng.ng_Width      = 104 ;
  845.     ng.ng_GadgetText = "Alarm:";
  846.     ng.ng_GadgetID   = GAD_ALARM ;
  847.       alarmgad = gad = CreateGadget(CYCLE_KIND, gad, &ng,
  848.                        GTCY_Labels, alarms, GTCY_Active, command, TAG_DONE) ;
  849.  
  850.     ng.ng_TopEdge   += 24 ;
  851.     ng.ng_LeftEdge   = 89 ;
  852.     ng.ng_Width      = 351 ;
  853.     ng.ng_GadgetText = "Command:" ;
  854.     ng.ng_GadgetID   = GAD_COM ;
  855.         comgad = gad = CreateGadget(STRING_KIND, gad, &ng, GTST_String, com,
  856.                        GTST_MaxChars, 64, GA_Disabled, (command<2),
  857.                        TAG_DONE) ;
  858.  
  859.     ng.ng_LeftEdge   = 217 ;
  860.     ng.ng_TopEdge   += 24 ;
  861.     ng.ng_Width      = 55 ;
  862.     ng.ng_GadgetText = "If free mem is less than" ;
  863.     ng.ng_GadgetID   = GAD_MEM ;
  864.         memgad = gad = CreateGadget(INTEGER_KIND, gad, &ng, GTIN_Number, freemem,
  865.                        GTIN_MaxChars, 5, TAG_DONE) ;
  866.  
  867.     ng.ng_LeftEdge  += 83 ;
  868.     ng.ng_Width      = 140 ;
  869.     ng.ng_GadgetText = "K," ;
  870.     ng.ng_GadgetID   = GAD_WTYPE ;
  871.        warngad = gad = CreateGadget(CYCLE_KIND, gad, &ng,
  872.                        GTCY_Labels, warns, GTCY_Active, warn, TAG_DONE) ;
  873.  
  874.     ng.ng_TopEdge   += 20 ;
  875.     ng.ng_LeftEdge   = 10 ;
  876.     ng.ng_Width      = 109 ;
  877.     ng.ng_GadgetText = "Use";
  878.     ng.ng_Flags      = PLACETEXT_IN ;
  879.     ng.ng_GadgetID   = GAD_USE ;
  880.                  gad = CreateGadget(BUTTON_KIND, gad, &ng, TAG_DONE) ;
  881.  
  882.     ng.ng_LeftEdge  += 110 ;
  883.     ng.ng_GadgetText = "Hide";
  884.     ng.ng_GadgetID   = GAD_HIDE ;
  885.                  gad = CreateGadget(BUTTON_KIND, gad, &ng, TAG_DONE) ;
  886.  
  887.     ng.ng_LeftEdge  += 110 ;
  888.     ng.ng_GadgetText = "About";
  889.     ng.ng_GadgetID   = GAD_AB ;
  890.                  gad = CreateGadget(BUTTON_KIND, gad, &ng, TAG_DONE) ;
  891.  
  892.     ng.ng_LeftEdge  += 110 ;
  893.     ng.ng_GadgetText = "Quit";
  894.     ng.ng_GadgetID   = GAD_QUIT ;
  895.                  gad = CreateGadget(BUTTON_KIND, gad, &ng, TAG_DONE) ;
  896.  
  897.  
  898.     return(gad) ;
  899. }
  900.