home *** CD-ROM | disk | FTP | other *** search
/ MACD 4 / MACD4.iso / cdity / memclock.lha / MemClock / MemClock.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-17  |  6.2 KB  |  266 lines

  1. /***************************************************************************/
  2. /*                                       */
  3. /* This magnificient piece of software is real PD, so you do not need to   */
  4. /* send any money to me, but I would like to receive some good sourcecodes */
  5. /* especially for OS2.0 [ amiga, of course ;-) ]               */
  6. /*                                       */
  7. /***************************************************************************/
  8. /*                                       */
  9. /* PS: most of this program is stolen from several commodities written       */
  10. /*     by Stefan Sticht. Thank you very much ;-)               */
  11. /*                                       */
  12. /***************************************************************************/
  13. /*                                       */
  14. /*    Michael Illgner                            */
  15. /*    Theodorstr. 27                             */
  16. /*    W-4790 Paderborn                           */
  17. /*    Germany                                */
  18. /*    Tel.: 05251/26488 or 05251/60-2331                   */
  19. /*                                       */
  20. /*    email: fillg1@uni-paderborn.de                     */
  21. /*                                       */
  22. /***************************************************************************/
  23.  
  24. #define COM_NAME    "MemClock"
  25. #define VERSION     "V1.05"
  26. #define RETRY_TEXT  "Retry|Cancel"
  27. #define LIB_ERROR   "%s (V%ld+) can't be opened!"
  28.  
  29. #define CX_PRIORITY  "CX_PRIORITY"
  30. #define DEF_PRIORITY 0
  31. #define TT_UPDATE    "UPDATE"
  32. #define DEF_UPDATE   10
  33. #define TT_LEFT      "LEFT"
  34. #define DEF_LEFT     370
  35. #define TT_TOP       "TOP"
  36. #define DEF_TOP      0
  37. #define TT_WIDTH     "WIDTH"
  38. #define DEF_WIDTH    270
  39. #define TT_HEIGHT    "HEIGHT"
  40. #define DEF_HEIGHT   14
  41.  
  42. char Version[] = "\0$VER: " COM_NAME " " VERSION;
  43.  
  44. char Help[] = "\033[1m" COM_NAME "\033[0m " VERSION " (Public Domain) by Michael Illgner\n"
  45.           "Usage: " COM_NAME " [" CX_PRIORITY "=<n>] [" TT_UPDATE "=<clock update time>] "
  46.           "[" TT_LEFT " = <n>] [ " TT_TOP " = <n>] [ " TT_WIDTH " = <n>] ["
  47.           TT_HEIGHT " = <n>]\n";
  48.  
  49.  
  50.  
  51. struct Library  *CxBase     = NULL;
  52. struct MsgPort  *CxPort     = NULL;
  53. struct Window    *ClockWindow    = NULL;
  54. ULONG         CxSigFlag    = 0;
  55. CxObj        *Broker     = NULL;
  56.  
  57. ULONG         Update;
  58.  
  59.  
  60. struct NewBroker nb =
  61. {
  62.  NB_VERSION, COM_NAME, COM_NAME " " VERSION, "clock and memory display",
  63.  NBU_NOTIFY|NBU_UNIQUE, 0, 0, NULL, 0
  64. };
  65.  
  66. struct NewWindow nw =
  67. {
  68.  DEF_LEFT, DEF_TOP, DEF_WIDTH, DEF_HEIGHT, 0, 1, NULL, WFLG_DRAGBAR,
  69.  NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN
  70. };
  71.  
  72. IX TimeIX =
  73. {
  74.  IX_VERSION, IECLASS_TIMER, 0, 0, 0, 0, 0
  75. };
  76.  
  77. /* disable SAS/C stack checking, saving some bytes */
  78. void chkabort(void) {}
  79.  
  80. /* use sprintf from ROM */
  81. void sprintf(char *, char *, ...);
  82.  
  83. /* don't forget ro link with ddebug.lib */
  84. #ifdef DEBUG
  85. void DPutStr(char *);
  86. void DPrintF(char *, ...);
  87. #endif
  88.  
  89. /* a simple requester, stolen from Stefan Sticht */
  90. long SimpleRequest(char *Title, char *Gadgets, char *Text, ...)
  91. {
  92.  static struct EasyStruct SimpleReq =
  93.  {
  94.   sizeof(struct EasyStruct),
  95.   0L,
  96.   NULL, NULL, NULL
  97.  };
  98.  va_list ap;
  99.  long     rc;
  100.  
  101.  va_start(ap, Text);
  102.  SimpleReq.es_Title = (UBYTE *)Title;
  103.  SimpleReq.es_TextFormat = (UBYTE *)Text;
  104.  SimpleReq.es_GadgetFormat = (UBYTE *)Gadgets;
  105.  
  106.  rc = EasyRequestArgs(NULL, &SimpleReq, NULL, ap);
  107.  va_end(ap);
  108.  
  109.  return rc;
  110. }
  111.  
  112. /* more comfortable than OpenLibrary() */
  113. struct Library *OpenLib(char *Name, ULONG Version)
  114. {
  115.  struct Library *Lib;
  116.  BOOL         Ok = TRUE;
  117.  
  118.  do
  119.  {
  120.   if (!(Lib = OpenLibrary(Name, Version)))
  121.   {
  122.    if (IntuitionBase) Ok = SimpleRequest(COM_NAME":", RETRY_TEXT, LIB_ERROR, Name, Version);
  123.    else Ok = FALSE;
  124.   }
  125.  } while (!Lib && Ok);
  126.  
  127.  return Lib;
  128. }
  129.  
  130. void Process(void)
  131. {
  132.  struct Message *Msg;
  133.  ULONG       MsgID, MsgType;
  134.  BOOL         quit = FALSE;
  135.  ULONG       sig;
  136.  
  137.  do
  138.  {
  139.   sig = Wait(SIGBREAKF_CTRL_C | CxSigFlag);
  140.  
  141.   if (sig & SIGBREAKF_CTRL_C) quit = TRUE;
  142.  
  143.   if (sig & CxSigFlag) while (Msg = GetMsg(CxPort))
  144.   {
  145.    MsgID = CxMsgID((CxMsg *)Msg);
  146.    MsgType = CxMsgType((CxMsg *)Msg);
  147.  
  148.    ReplyMsg(Msg);
  149.  
  150.    switch(MsgType)
  151.    {
  152.     case CXM_IEVENT :
  153.      break;
  154.     case CXM_COMMAND :
  155.      switch(MsgID)
  156.      {
  157.       case CXCMD_UNIQUE:
  158.       case CXCMD_KILL:
  159.        quit = TRUE;
  160.        break;
  161.       case CXCMD_DISABLE:
  162.        ActivateCxObj(Broker, FALSE);
  163.        break;
  164.       case CXCMD_ENABLE:
  165.        ActivateCxObj(Broker, TRUE);
  166.        break;
  167.      }
  168.      break;
  169.    }
  170.   }
  171.  } while (!quit);
  172. }
  173.  
  174. void __saveds TimerProc(CxMsg *cm)
  175. {
  176.  struct InputEvent *ie;
  177.  static ULONG OldSecs = 0;
  178.  ULONG Hour, Min, Sec;
  179.  ULONG Chip, Fast;
  180.  char  TimeStr[40];
  181.  
  182.  if (ie = (struct InputEvent *)CxMsgData(cm))
  183.  {
  184.   if ((ie->ie_TimeStamp.tv_secs - OldSecs) >= Update)
  185.   {
  186.    OldSecs = ie->ie_TimeStamp.tv_secs;
  187.    Sec = OldSecs % 60;
  188.    Min = (OldSecs / 60) % 60;
  189.    Hour = (OldSecs / 3600) % 24;
  190.  
  191.    Fast = AvailMem(MEMF_FAST) / 1024;
  192.    Chip = AvailMem(MEMF_CHIP) / 1024;
  193.  
  194.    sprintf(TimeStr, "Chip:%4ldk Fast:%5ldk  %2ld:%02ld:%02ld", Chip, Fast, Hour, Min, Sec);
  195.    SetWindowTitles(ClockWindow, TimeStr, (UBYTE *)~0);
  196.   }
  197.  }
  198. }
  199.  
  200. void __saveds __stdargs main(int argc, char *argv[])
  201. {
  202.  char        **ToolTypes;
  203.  struct Message *Msg;
  204.  CxObj      *Timer, *TimerFilter;
  205.  
  206.  if ((argc > 1) && (*argv[1] == '?'))
  207.  {
  208.   Write(Output(), Help, sizeof(Help)-1);
  209.   return;
  210.  }
  211.  
  212.  if (IntuitionBase = OpenLib("intuition.library", 37))
  213.  {
  214.   if (CxBase = OpenLib("commodities.library", 37))
  215.   {
  216.    if (IconBase = OpenLib("icon.library", 37))
  217.    {
  218.     ToolTypes = ArgArrayInit(argc, argv);
  219.     Update = ArgInt(ToolTypes, TT_UPDATE, DEF_UPDATE);
  220.     nw.LeftEdge = ArgInt(ToolTypes, TT_LEFT, DEF_LEFT);
  221.     nw.TopEdge = ArgInt(ToolTypes, TT_TOP, DEF_TOP);
  222.     nw.Width = ArgInt(ToolTypes, TT_WIDTH, DEF_WIDTH);
  223.     nw.Height = ArgInt(ToolTypes, TT_HEIGHT, DEF_HEIGHT);
  224.  
  225.     if (CxPort = CreateMsgPort())
  226.     {
  227.      CxSigFlag = 1L << CxPort->mp_SigBit;
  228.      nb.nb_Pri = ArgInt(ToolTypes, CX_PRIORITY, DEF_PRIORITY);
  229.      nb.nb_Port = CxPort;
  230.  
  231.      if (Broker = CxBroker(&nb, NULL))
  232.      {
  233.       if (TimerFilter = CxFilter(NULL))
  234.       {
  235.        AttachCxObj(Broker, TimerFilter);
  236.        SetFilterIX(TimerFilter, &TimeIX);
  237.        if (Timer = CxCustom(TimerProc, NULL))
  238.        {
  239.     AttachCxObj(TimerFilter, Timer);
  240.     if (ClockWindow = OpenWindow(&nw))
  241.     {
  242.      ActivateCxObj(Broker, TRUE);
  243.      Process();
  244.      ActivateCxObj(Broker, FALSE);
  245.  
  246.      CloseWindow(ClockWindow);
  247.     }
  248.        }
  249.        DeleteCxObj(Broker);
  250.       }
  251.      }
  252.  
  253.      Forbid();
  254.      while (Msg = GetMsg(CxPort)) ReplyMsg(Msg);
  255.      DeleteMsgPort(CxPort);
  256.      Permit();
  257.     }
  258.     ArgArrayDone();
  259.     CloseLibrary(IconBase);
  260.    }
  261.    CloseLibrary(CxBase);
  262.   }
  263.   CloseLibrary(IntuitionBase);
  264.  }
  265. }
  266.