home *** CD-ROM | disk | FTP | other *** search
- /* DClock.c *****************************************************************
- *
- * DClock -------- A Dumb Clock utility, my idea of how a clock
- * should really be like.
- *
- * Author -------- Olaf 'Olsen' Barthel, MXM
- * Brabeckstrasse 35
- * D-3000 Hannover 71
- *
- * Federal Republic of Germany
- *
- * This program truly is in the PUBLIC DOMAIN. Written on a cold
- * and damp September evening, hoping the next morning would be
- * better.
- *
- * Compiled using Aztec C 5.0a, CygnusEd Professional 2 & ARexx.
- *
- ***************************************************************************/
-
- /* This belongs to ARP. */
-
- #define NO_PRAGMAS
-
- #include <libraries/arpbase.h>
-
- /* ARP help messages. */
-
- char *CLI_Template = "Quit/S,Info/S,Version/S,Quiet/S,Refresh/S,Readclock/S,Beep/K,Click/K,\
- Speech/K,Hour/K,Seconds/K,SetEnv/K,Countdown=Tea/K,Sound/K,Textcolour/K,Backcolour/K,\
- Clickvolume/K,Priority/K,Page/K,Alarm/K,Alarmtime/K";
-
- char *CLI_Help = "\nUsage: \33[1mDClock\33[0m [Quit] [Info] [Version] [Quiet] [Refresh] [Readclock]\
- \n [Beep On|Off] [Click On|Off] [Speech On|Off]\
- \n [Hour On|Off] [Seconds On|Off] [SetEnv On|Off]\
- \n [Countdown/Tea #|Off] [Sound \"Name\"|Off]\
- \n [Textcolour #] [Backcolour #]\
- \n [Clickvolume 0..64] [Priority -128..127] [Page 0..4]\
- \n [Alarm On|Off|Show] [Alarmtime HH:MM:SS]\n";
-
- /* Where to find the different arguments (quite a lot). */
-
- #define ARG_QUIT 1
- #define ARG_INFO 2
- #define ARG_VERSION 3
- #define ARG_QUIET 4
- #define ARG_REFRESH 5
- #define ARG_READCLOCK 6
- #define ARG_BEEP 7
- #define ARG_CLICK 8
- #define ARG_SPEECH 9
- #define ARG_HOUR 10
- #define ARG_SECONDS 11
- #define ARG_SETENV 12
- #define ARG_COUNTDOWN 13
- #define ARG_SOUND 14
- #define ARG_TEXTCOLOUR 15
- #define ARG_BACKCOLOUR 16
- #define ARG_CLICKVOLUME 17
- #define ARG_PRIORITY 18
- #define ARG_PAGE 19
- #define ARG_ALARM 20
- #define ARG_ALARMTIME 21
-
- /* Pop-up requester support structure. */
-
- struct PopSupport
- {
- ULONG ps_Flags;
- LONG ps_TimeOut;
- };
-
- /* Pop-up requester support flags. */
-
- #define PS_CENTER 0x00000001 /* Center window on screen. */
- #define PS_TIMEOUT 0x00000002 /* Wait for timeout. */
- #define PS_DONTMOVE 0x00000004 /* Don't move the pointer. */
- #define PS_BEEP 0x00000008 /* Beep on startup. */
- #define PS_STAYACTIVE 0x00000010 /* Keep the window activated. */
-
- /* Prototypes. */
-
- LONG Chk_Abort(VOID);
- VOID _wb_parse(VOID);
-
- LONG MovePointer(struct Screen *mp_Screen, LONG mp_X, LONG mp_Y);
- LONG WriteConsole(struct Window *wc_Window, UBYTE *wc_String);
- VOID CalcDimensions(UBYTE *cd_String, LONG *cd_Width, LONG *cd_Height, LONG cd_MaxWidth);
- VOID EraseGadget(struct RastPort *RPort, struct Gadget *Gadget);
- LONG PopRequest(struct Window *pr_ParentWindow, UBYTE *pr_TitleText, UBYTE *pr_BodyText, UBYTE *pr_PosText, UBYTE *pr_NegText, LONG pr_Default, struct PopSupport *pr_ExtraInfo);
- VOID ProcessIcon(VOID);
- LONG FindChunk(ULONG ChunkName,BPTR FileHandle);
- LONG LoadChimeSound(char *Name);
-
- VOID main(int argc,char **argv);
-
- /* For Workbench startability we need access to the icon info. */
-
- struct Library *IconBase;
- BOOL FromWorkbench = FALSE;
-
- /* Some more libraries... */
-
- extern struct IntuitionBase *IntuitionBase;
- extern struct GfxBase *GfxBase;
- extern struct ExecBase *SysBase;
-
- /* Main communication structure. */
-
- struct DSeg *DSeg;
-
- /* Stubs, don't need these. */
-
- LONG Chk_Abort(VOID) { return(0); }
- VOID _wb_parse(VOID) {}
-
- /* Our current version tag. */
-
- const char *VersionTag = "$VER: DClock 1.27 (26 Jul 1990)\n\r";
-
- /* MovePointer(mp_Screen,mp_X,mp_Y) :
- *
- * Moves the mouse pointer to a given position
- * on a screen.
- */
-
- LONG
- MovePointer(struct Screen *mp_Screen,LONG mp_X,LONG mp_Y)
- {
- static struct InputEvent mp_StaticEvent =
- {
- NULL,
- IECLASS_POINTERPOS,
- 0,
- IECODE_NOBUTTON,
- 0,0,0,0
- };
-
- struct MsgPort *mp_InputPort;
- struct IOStdReq *mp_InputRequest;
- struct InputEvent *mp_FakeEvent;
-
- LONG mp_Success = FALSE;
-
- if(mp_InputPort = (struct MsgPort *)CreatePort(NULL,0))
- {
- if(mp_InputRequest = (struct IOStdReq *)CreateStdIO(mp_InputPort))
- {
- if(!OpenDevice("input.device",0,(struct IORequest *)mp_InputRequest,0))
- {
- if(mp_FakeEvent = (struct InputEvent *)AllocMem(sizeof(struct InputEvent),MEMF_PUBLIC))
- {
- CopyMem(&mp_StaticEvent,mp_FakeEvent,sizeof(struct InputEvent));
-
- mp_InputRequest -> io_Command = IND_WRITEEVENT;
- mp_InputRequest -> io_Flags = 0;
- mp_InputRequest -> io_Length = sizeof(struct InputEvent);
- mp_InputRequest -> io_Data = (APTR)mp_FakeEvent;
-
- mp_FakeEvent -> ie_X = mp_X;
- mp_FakeEvent -> ie_Y = mp_Y;
-
- if(!(mp_Screen -> ViewPort . Modes & HIRES))
- mp_FakeEvent -> ie_X *= 2;
-
- if(!(mp_Screen -> ViewPort . Modes & LACE))
- mp_FakeEvent -> ie_Y *= 2;
-
- mp_FakeEvent -> ie_Y += (2 * mp_Screen -> TopEdge);
-
- DoIO((struct IORequest *)mp_InputRequest);
-
- mp_Success = TRUE;
-
- FreeMem(mp_FakeEvent,sizeof(struct InputEvent));
- }
-
- CloseDevice((struct IORequest *)mp_InputRequest);
- }
-
- DeleteStdIO(mp_InputRequest);
- }
-
- DeletePort(mp_InputPort);
- }
-
- return(mp_Success);
- }
-
- /* WriteConsole(wc_Window,wc_String) :
- *
- * Writes a string to a window (via console.device).
- */
-
- LONG
- WriteConsole(struct Window *wc_Window,UBYTE *wc_String)
- {
- struct IOStdReq *wc_ConWrite;
- struct MsgPort *wc_ConPort;
-
- LONG wc_Success = FALSE;
-
- if(wc_ConPort = (struct MsgPort *)CreatePort(NULL,0))
- {
- if(wc_ConWrite = (struct IOStdReq *)CreateStdIO(wc_ConPort))
- {
- wc_ConWrite -> io_Data = (APTR)wc_Window;
- wc_ConWrite -> io_Length= sizeof(struct Window);
-
- if(!OpenDevice("console.device",0,(struct IORequest *)wc_ConWrite,0))
- {
- wc_ConWrite -> io_Command = CMD_WRITE;
- wc_ConWrite -> io_Data = (APTR)"\2330 p";
- wc_ConWrite -> io_Length = -1;
-
- DoIO((struct IORequest *)wc_ConWrite);
-
- wc_ConWrite -> io_Data = (APTR)wc_String;
- wc_ConWrite -> io_Length = -1;
-
- DoIO((struct IORequest *)wc_ConWrite);
-
- wc_Success = TRUE;
-
- CloseDevice((struct IORequest *)wc_ConWrite);
- }
-
- DeleteStdIO(wc_ConWrite);
- }
-
- DeletePort(wc_ConPort);
- }
-
- return(wc_Success);
- }
-
- /* CalcDimensions(cd_String,cd_Width,cd_Height,cd_MaxWidth) :
- *
- * Calculates the width and height of a formatted
- * string block.
- */
-
- VOID
- CalcDimensions(UBYTE *cd_String,LONG *cd_Width,LONG *cd_Height,LONG cd_MaxWidth)
- {
- LONG i,cd_InLine = 0,cd_NumLines = 0;
-
- *cd_Width = *cd_Height = 0;
-
- for(i = 0 ; i < strlen(cd_String) ; i++)
- {
- if(cd_String[i] == '\n' || cd_InLine == cd_MaxWidth)
- {
- if(cd_InLine > *cd_Width)
- *cd_Width = cd_InLine;
-
- cd_NumLines++;
- cd_InLine = 0;
-
- continue;
- }
-
- if(cd_String[i] == '\33')
- {
- while(cd_String[i] != 'm' && cd_String[i] != 'w' && i < strlen(cd_String))
- i++;
-
- if(i >= strlen(cd_String))
- i = strlen(cd_String) - 1;
-
- continue;
- }
-
- if(cd_String[i] < ' ')
- continue;
-
- cd_InLine++;
- }
-
- *cd_Height = cd_NumLines;
-
- if(cd_InLine > *cd_Width)
- *cd_Width = cd_InLine;
- }
-
- /* EraseGadget(RPort,Gadget) :
- *
- * Clears the background of a gadget.
- */
-
- VOID
- EraseGadget(struct RastPort *RPort,struct Gadget *Gadget)
- {
- SetAPen(RPort,2);
-
- SetDrMd(RPort,JAM1);
-
- RectFill(RPort,Gadget -> LeftEdge,Gadget -> TopEdge,Gadget -> LeftEdge + Gadget -> Width - 1,Gadget -> TopEdge + Gadget -> Height - 1);
-
- SetAPen(RPort,1);
- }
-
- /* PopRequest(pr_ParentWindow,pr_TitleText,pr_BodyText,pr_PosText,pr_NegText,pr_Default,pr_ExtraInfo) :
- *
- * Creates a pop-up requester, note: this function is reentrant,
- * just like all functions above.
- */
-
- LONG
- PopRequest(struct Window *pr_ParentWindow,UBYTE *pr_TitleText,UBYTE *pr_BodyText,UBYTE *pr_PosText,UBYTE *pr_NegText,LONG pr_Default,struct PopSupport *pr_ExtraInfo)
- {
- static struct NewWindow pr_StaticNewWindow =
- {
- 0,0,
- 0,1,
- 0,1,
- VANILLAKEY | MOUSEBUTTONS | GADGETUP | CLOSEWINDOW,
- RMBTRAP | WINDOWDRAG | WINDOWDEPTH,
- (struct Gadget *)NULL,
- (struct Image *)NULL,
- (STRPTR)NULL,
- (struct Screen *)NULL,
- (struct BitMap *)NULL,
- 0,0,
- 0,0,
- WBENCHSCREEN
- };
-
- static struct Gadget pr_StaticGadget =
- {
- (struct Gadget *)NULL,
- 0,0,
- 0,0,
- GADGHBOX,
- RELVERIFY | GADGIMMEDIATE,
- BOOLGADGET,
- (APTR)NULL,
- (APTR)NULL,
- (struct IntuiText *)NULL,
- NULL,
- (APTR)NULL,
- 0,
- (APTR)NULL
- };
-
- static struct TextAttr pr_TextAttr =
- {
- (UBYTE *)"topaz.font",
- 8,
- FS_NORMAL,
- FPF_ROMFONT
- };
-
- struct NewWindow *pr_NewWindow;
- struct Window *pr_Window;
- struct IntuiMessage *pr_IMsg;
- struct Gadget *pr_PosGadget = NULL,*pr_NegGadget = NULL,*pr_TempGadget;
-
- struct Screen pr_Screen,*pr_FirstScreen;
- struct TextFont *pr_TextFont;
-
- LONG pr_Width,pr_Height;
- LONG pr_Result = FALSE;
-
- LONG pr_TickCount = 0;
-
- ULONG pr_IntuiLock;
-
- if(!pr_BodyText)
- return(pr_Result);
-
- if(!(pr_NewWindow = (struct NewWindow *)AllocMem(sizeof(struct NewWindow),MEMF_PUBLIC)))
- return(pr_Result);
-
- CopyMem(&pr_StaticNewWindow,pr_NewWindow,sizeof(struct NewWindow));
-
- pr_IntuiLock = LockIBase(NULL);
-
- pr_FirstScreen = IntuitionBase -> FirstScreen;
-
- UnlockIBase(pr_IntuiLock);
-
- if(pr_ParentWindow)
- {
- pr_NewWindow -> Type = CUSTOMSCREEN;
- pr_NewWindow -> Screen = pr_ParentWindow -> WScreen;
- }
- else
- OpenWorkBench();
-
- if(!GetScreenData(&pr_Screen,sizeof(struct Screen),pr_NewWindow -> Type,pr_NewWindow -> Screen))
- {
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
- return(pr_Result);
- }
-
- CalcDimensions(pr_BodyText,&pr_Width,&pr_Height,(pr_Screen . Width - 6) / 8);
-
- if(pr_Height > (pr_Screen . Height - 15 - 13) / 8)
- {
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
- return(pr_Result);
- }
-
- pr_NewWindow -> Width = pr_Width * 8 + 6 + 4;
- pr_NewWindow -> Height = pr_Height * 8 + 15 + 19 + 2;
-
- if(pr_TitleText)
- pr_NewWindow -> Title = pr_TitleText;
- else
- pr_NewWindow -> Title = (UBYTE *)"System Request";
-
- if(!pr_PosText && !pr_NegText)
- pr_NegText = (UBYTE *)"Okay";
-
- if(pr_PosText)
- {
- if(!(pr_PosGadget = (struct Gadget *)AllocMem(sizeof(struct Gadget),MEMF_PUBLIC)))
- {
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
- return(pr_Result);
- }
-
- CopyMem(&pr_StaticGadget,pr_PosGadget,sizeof(struct Gadget));
-
- pr_PosGadget -> Width = 8 * strlen(pr_PosText) + 4;
- pr_PosGadget -> Height = 8 + 2;
-
- pr_PosGadget -> LeftEdge= 3 + 2 + 3;
- pr_PosGadget -> TopEdge = pr_NewWindow -> Height - 13 - 1;
- }
-
- if(pr_NegText)
- {
- if(!(pr_NegGadget = (struct Gadget *)AllocMem(sizeof(struct Gadget),MEMF_PUBLIC)))
- {
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
-
- if(pr_PosGadget)
- FreeMem(pr_PosGadget,sizeof(struct Gadget));
-
- return(pr_Result);
- }
-
- CopyMem(&pr_StaticGadget,pr_NegGadget,sizeof(struct Gadget));
-
- pr_NegGadget -> Width = 8 * strlen(pr_NegText) + 4;
- pr_NegGadget -> Height = 8 + 2;
-
- pr_Width = pr_NegGadget -> Width + 6 + 4 + 6;
-
- if(pr_PosGadget)
- pr_Width += (pr_PosGadget -> Width + 12);
-
- if(pr_NewWindow -> Width < pr_Width)
- pr_NewWindow -> Width = pr_Width;
-
- pr_NegGadget -> LeftEdge= pr_NewWindow -> Width - pr_NegGadget -> Width - 3 - 2 - 3;
- pr_NegGadget -> TopEdge = pr_NewWindow -> Height - 13 - 1;
-
- pr_NegGadget -> GadgetID= 1;
- }
-
- if(!pr_NegGadget && pr_NewWindow -> Width < pr_PosGadget -> Width + 6 + 4 + 6)
- pr_NewWindow -> Width = pr_PosGadget -> Width + 6 + 4 + 6;
-
- if(pr_Default && !pr_PosGadget)
- pr_Default = FALSE;
-
- if(!pr_Default && !pr_NegGadget)
- pr_Default = TRUE;
-
- if(pr_Default)
- pr_TempGadget = pr_PosGadget;
- else
- pr_TempGadget = pr_NegGadget;
-
- pr_NewWindow -> LeftEdge= pr_Screen . MouseX - (pr_TempGadget -> LeftEdge + pr_TempGadget -> Width / 2);
- pr_NewWindow -> TopEdge = pr_Screen . MouseY - (pr_TempGadget -> TopEdge + pr_TempGadget -> Height / 2);
-
- while(pr_NewWindow -> LeftEdge < 0)
- pr_NewWindow -> LeftEdge++;
-
- while(pr_NewWindow -> TopEdge < 0)
- pr_NewWindow -> TopEdge++;
-
- while(pr_NewWindow -> LeftEdge + pr_NewWindow -> Width >= pr_Screen . Width)
- pr_NewWindow -> LeftEdge--;
-
- while(pr_NewWindow -> TopEdge + pr_NewWindow -> Height >= pr_Screen . Height)
- pr_NewWindow -> TopEdge--;
-
- if(!(pr_TextFont = (struct TextFont *)OpenFont(&pr_TextAttr)))
- {
- if(pr_PosGadget)
- FreeMem(pr_PosGadget,sizeof(struct Gadget));
-
- if(pr_NegGadget)
- FreeMem(pr_NegGadget,sizeof(struct Gadget));
-
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
-
- return(pr_Result);
- }
-
- if(pr_ExtraInfo)
- {
- if(pr_ExtraInfo -> ps_Flags & PS_CENTER)
- {
- pr_NewWindow -> LeftEdge = (pr_Screen . Width - pr_NewWindow -> Width) / 2;
- pr_NewWindow -> TopEdge = (pr_Screen . Height - pr_NewWindow -> Height) / 2;
- }
-
- if(pr_ExtraInfo -> ps_Flags & PS_TIMEOUT)
- pr_NewWindow -> IDCMPFlags |= INTUITICKS;
-
- if(pr_ExtraInfo -> ps_Flags & PS_STAYACTIVE)
- pr_NewWindow -> IDCMPFlags |= INACTIVEWINDOW;
- }
-
- if(!(pr_Window = (struct Window *)OpenWindow(pr_NewWindow)))
- {
- CloseFont(pr_TextFont);
-
- if(pr_PosGadget)
- FreeMem(pr_PosGadget,sizeof(struct Gadget));
-
- if(pr_NegGadget)
- FreeMem(pr_NegGadget,sizeof(struct Gadget));
-
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
-
- return(pr_Result);
- }
-
- SetFont(pr_Window -> RPort,pr_TextFont);
-
- WriteConsole(pr_Window,pr_BodyText);
-
- if(pr_PosGadget)
- {
- AddGadget(pr_Window,pr_PosGadget,1);
-
- EraseGadget(pr_Window -> RPort,pr_PosGadget);
-
- Move(pr_Window -> RPort,pr_PosGadget -> LeftEdge + 2,pr_PosGadget -> TopEdge + 1 + pr_TextFont -> tf_Baseline);
- Text(pr_Window -> RPort,pr_PosText,strlen(pr_PosText));
- }
-
- if(pr_NegGadget)
- {
- AddGadget(pr_Window,pr_NegGadget,1);
-
- EraseGadget(pr_Window -> RPort,pr_NegGadget);
-
- Move(pr_Window -> RPort,pr_NegGadget -> LeftEdge + 2,pr_NegGadget -> TopEdge + 1 + pr_TextFont -> tf_Baseline);
- Text(pr_Window -> RPort,pr_NegText,strlen(pr_NegText));
- }
-
- MoveScreen(pr_Window -> WScreen,0,- pr_Window -> WScreen -> TopEdge);
- ScreenToFront(pr_Window -> WScreen);
- ActivateWindow(pr_Window);
-
- if(pr_ExtraInfo && pr_ExtraInfo -> ps_Flags & PS_DONTMOVE)
- goto Skip1;
-
- MovePointer(pr_Window -> WScreen,
- pr_Window -> LeftEdge + (pr_TempGadget -> LeftEdge + pr_TempGadget -> Width / 2),
- pr_Window -> TopEdge + (pr_TempGadget -> TopEdge + pr_TempGadget -> Height / 2));
-
- Skip1: if(pr_ExtraInfo)
- {
- if(pr_ExtraInfo -> ps_Flags & PS_BEEP)
- DisplayBeep(pr_Window -> WScreen);
-
- if(pr_ExtraInfo -> ps_Flags & PS_TIMEOUT)
- pr_TickCount = pr_ExtraInfo -> ps_TimeOut * 10;
- }
-
- FOREVER
- {
- ULONG pr_Class,pr_Code,pr_Qualifier;
- struct Gadget *pr_Gadget;
-
- WaitPort(pr_Window -> UserPort);
-
- if(pr_IMsg = (struct IntuiMessage *)GetMsg(pr_Window -> UserPort))
- {
- pr_Class = pr_IMsg -> Class;
- pr_Code = pr_IMsg -> Code;
- pr_Qualifier = pr_IMsg -> Qualifier;
- pr_Gadget = (struct Gadget *)pr_IMsg -> IAddress;
-
- ReplyMsg((struct Message *)pr_IMsg);
-
- if(pr_Class == INTUITICKS)
- {
- if(pr_TickCount)
- pr_TickCount--;
- else
- {
- pr_Result = pr_Default;
- break;
- }
-
- continue;
- }
-
- if(pr_Class == INACTIVEWINDOW)
- {
- MoveScreen(pr_Window -> WScreen,0,- pr_Window -> WScreen -> TopEdge);
- ScreenToFront(pr_Window -> WScreen);
- ActivateWindow(pr_Window);
-
- if(!(pr_ExtraInfo -> ps_Flags & PS_DONTMOVE))
- {
- MovePointer(pr_Window -> WScreen,
- pr_Window -> LeftEdge + (pr_TempGadget -> LeftEdge + pr_TempGadget -> Width / 2),
- pr_Window -> TopEdge + (pr_TempGadget -> TopEdge + pr_TempGadget -> Height / 2));
- }
-
- if(pr_ExtraInfo -> ps_Flags & PS_BEEP)
- DisplayBeep(pr_Window -> WScreen);
-
- continue;
- }
-
- if(pr_Class == GADGETUP)
- {
- if(pr_Gadget -> GadgetID == 0)
- pr_Result = TRUE;
-
- break;
- }
-
- if(pr_Class == CLOSEWINDOW)
- break;
-
- if(pr_Class == VANILLAKEY)
- {
- pr_Code = Toupper(pr_Code);
-
- if((pr_Code == 'Y' || pr_Code == 'J' || pr_Code == 'V' || pr_Code == 'C' || pr_Code == 'R' || pr_Code == '\r') && pr_PosText)
- {
- pr_Result = TRUE;
- break;
- }
-
- if((pr_Code == 'N' || pr_Code == 'Q' || pr_Code == 'B' || pr_Code == '\33') && pr_NegText)
- break;
-
- continue;
- }
-
- if(pr_Class == MOUSEBUTTONS && pr_Code == MENUDOWN)
- {
- MovePointer(pr_Window -> WScreen,
- pr_Window -> LeftEdge+ (pr_TempGadget -> LeftEdge + pr_TempGadget -> Width / 2),
- pr_Window -> TopEdge + (pr_TempGadget -> TopEdge + pr_TempGadget -> Height / 2));
- }
- }
- }
-
- CloseFont(pr_TextFont);
-
- if(pr_PosGadget)
- {
- RemoveGadget(pr_Window,pr_PosGadget);
- FreeMem(pr_PosGadget,sizeof(struct Gadget));
- }
-
- if(pr_NegGadget)
- {
- RemoveGadget(pr_Window,pr_NegGadget);
- FreeMem(pr_NegGadget,sizeof(struct Gadget));
- }
-
- FreeMem(pr_NewWindow,sizeof(struct NewWindow));
-
- if(pr_FirstScreen != pr_Window -> WScreen)
- ScreenToBack(pr_Window -> WScreen);
-
- CloseWindow(pr_Window);
-
- return(pr_Result);
- }
-
- /* FindChunk(ChunkName,FileHandle):
- *
- * Tries to locate a an iff-chunk inside a file.
- */
-
- LONG
- FindChunk(ULONG ChunkName,BPTR FileHandle)
- {
- LONG OldPosition;
- ULONG FormType = 0;
-
- /* The format of a typical IFF-chunk. */
-
- struct
- {
- ULONG IFF_Type;
- ULONG IFF_Length;
- } Chunk;
-
- /* Remember initial file position. */
-
- OldPosition = Seek(FileHandle,0,OFFSET_CURRENT);
-
- /* Try to find it. */
-
- FOREVER
- {
- /* Read the first bytes. */
-
- if(Read(FileHandle,&Chunk,sizeof(Chunk)) != sizeof(Chunk))
- {
- Seek(FileHandle,OldPosition,OFFSET_BEGINNING);
- return(FALSE);
- }
-
- /* Is it a FORM-chunk? */
-
- if(OldPosition == 0 && FormType == 0 && Chunk . IFF_Type == 'FORM')
- {
- Read(FileHandle,&FormType,sizeof(LONG));
-
- /* Check the form type. */
-
- if(FormType == ChunkName)
- return(TRUE);
-
- continue;
- }
-
- /* Is it the chunk type we want? */
-
- if(Chunk . IFF_Type == ChunkName)
- return(TRUE);
-
- /* Skip chunk. */
-
- Seek(FileHandle,Chunk . IFF_Length,OFFSET_CURRENT);
- }
- }
-
- /* LoadChimeSound(Name):
- *
- * Loads an IFF-8SVX-soundfile to be used as the hour
- * chime sound.
- */
-
- LONG
- LoadChimeSound(char *Name)
- {
- BPTR SoundHandle;
-
- APTR SoundData;
- LONG SoundRate,SoundLength,SoundVolume;
-
- /* The format of the VoiceHeader chunk. */
-
- struct
- {
- ULONG oneShotHiSamples,
- repeatHiSamples,
- samplesPerHiCycle;
- UWORD samplesPerSec;
- UBYTE ctOctave,
- sCompression;
- LONG volume;
- } VoiceHeader;
-
- /* No name? Reset to defaults. */
-
- if(!Strcmp(Name,"OFF"))
- {
- ObtainSemaphore(DSeg -> SoundSemaphore);
-
- /* Free the memory. */
-
- if(DSeg -> SoundLength && DSeg -> SoundData)
- FreeMem(DSeg -> SoundData,DSeg -> SoundLength);
-
- /* Mark sound slot as vacant. */
-
- DSeg -> SoundLength = 0;
- DSeg -> SoundData = NULL;
-
- ReleaseSemaphore(DSeg -> SoundSemaphore);
-
- return(TRUE);
- }
-
- /* Open the file for reading. */
-
- if(!(SoundHandle = Open(Name,MODE_OLDFILE)))
- {
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","No such sound file found!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m No such sound file found!");
-
- return(FALSE);
- }
-
- /* Is it a sound file? */
-
- if(!FindChunk('8SVX',SoundHandle))
- {
- Close(SoundHandle);
-
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","File is not an IFF-8SVX-file!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m File is not an IFF-8SVX-file!");
-
- return(FALSE);
- }
-
- /* Look for the VoiceHeader. */
-
- if(!FindChunk('VHDR',SoundHandle))
- {
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","Didn't find VHDR chunk!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m Didn't find VHDR chunk!");
-
- Close(SoundHandle);
- return(FALSE);
- }
-
- /* Read the header. */
-
- if(Read(SoundHandle,&VoiceHeader,sizeof(VoiceHeader)) != sizeof(VoiceHeader))
- {
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","Error while reading file!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m Error while reading file!");
-
- Close(SoundHandle);
- return(FALSE);
- }
-
- /* Fill in the more important information. */
-
- SoundLength = VoiceHeader . oneShotHiSamples + VoiceHeader . repeatHiSamples;
- SoundRate = ((GfxBase -> DisplayFlags & PAL) ? 3546895 : 3579545) / VoiceHeader . samplesPerSec;
- SoundVolume = (VoiceHeader . volume > 64 ? 64 : VoiceHeader . volume);
-
- /* Proceed with the body chunk. */
-
- if(!FindChunk('BODY',SoundHandle))
- {
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","Didn't find BODY chunk!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m Didn't find BODY chunk!");
-
- Close(SoundHandle);
- return(FALSE);
- }
-
- /* Allocate space for the sound data. */
-
- if(!(SoundData = (APTR)AllocMem(SoundLength,MEMF_PUBLIC | MEMF_CHIP)))
- {
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","Not enough memory for sound data!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m Not enough memory for sound data!");
-
- Close(SoundHandle);
- return(FALSE);
- }
-
- /* Read the sound data. */
-
- if(Read(SoundHandle,SoundData,SoundLength) != SoundLength)
- {
- if(FromWorkbench)
- PopRequest(NULL,"DClock problem:","Error while reading file!",NULL,"Continue?",FALSE,NULL);
- else
- Puts("\33[1mDClock:\33[0m Error while reading file!");
-
- FreeMem(SoundData,SoundLength);
- Close(SoundHandle);
- return(FALSE);
- }
-
- /* Close the file. */
-
- Close(SoundHandle);
-
- /* Lock access to sound data. */
-
- ObtainSemaphore(DSeg -> SoundSemaphore);
-
- /* Free last sound. */
-
- if(DSeg -> SoundLength && DSeg -> SoundData)
- FreeMem(DSeg -> SoundData,DSeg -> SoundLength);
-
- /* Fill in the data. */
-
- DSeg -> SoundData = SoundData;
- DSeg -> SoundLength = SoundLength;
- DSeg -> SoundRate = SoundRate;
- DSeg -> SoundVolume = SoundVolume;
-
- /* Unlock it again. */
-
- ReleaseSemaphore(DSeg -> SoundSemaphore);
-
- return(TRUE);
- }
-
- /* ProcessIcon():
- *
- * To add startability from Workbench this function
- * checks for the approritate tooltype entries.
- */
-
- VOID
- ProcessIcon()
- {
- struct DiskObject *DiskObject;
- extern struct WBStartup *WBenchMsg;
- char *Option;
-
- /* No need to continue? */
-
- if(!DSeg || !FromWorkbench)
- {
- if(!DSeg && FromWorkbench)
- PopRequest(NULL,"DClock problem:","Can't find \33[1m\"DClock-Handler\"\33[0m!\nCheck L: and current directory.",NULL,"Continue?",FALSE,NULL);
-
- return;
- }
-
- /* Try to open the icon.library. */
-
- if(!(IconBase = (struct Library *)OpenLibrary("icon.library",0)))
- {
- PopRequest(NULL,"DClock problem:","Unable to open \33[1micon.library\33[0m!",NULL,"Continue?",FALSE,NULL);
- return;
- }
-
- /* Can we read the icon file please? */
-
- if(!(DiskObject = (struct DiskObject *)GetDiskObject(WBenchMsg -> sm_ArgList -> wa_Name)))
- {
- PopRequest(NULL,"DClock problem:","Couldn't read icon information file!",NULL,"Continue?",FALSE,NULL);
-
- CloseLibrary(IconBase);
- return;
- }
-
- /* Adjust Click volume? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"CLICKVOLUME"))
- {
- if(Atol(Option) > 64 || Atol(Option) < 0)
- PopRequest(NULL,"DClock problem:","Illegal value for click volume (must be between 0 and 64)!",NULL,"Continue?",FALSE,NULL);
- else
- DSeg -> ClickVolume = Atol(Option);
- }
-
- /* Adjust task priority? */
-
- if((Option = FindToolType(DiskObject -> do_ToolTypes,"PRIORITY")) && DSeg -> Child)
- {
- if(Atol(Option) > 127 || Atol(Option) < -128)
- PopRequest(NULL,"DClock problem:","Illegal value for handler task priority (must be between -128 and 127)!",NULL,"Continue?",FALSE,NULL);
- else
- {
- DSeg -> Priority = Atol(Option);
- SetTaskPri(DSeg -> Child,DSeg -> Priority);
- }
- }
-
- /* Turn DisplayBeep() off? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"BEEP"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> Beep = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> Beep = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Beep settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Turn keyboard click off? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"CLICK"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> Click = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> Click = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Click settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Set text colour? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"TEXTCOLOUR"))
- DSeg -> TextColour = Atol(Option);
-
- /* Set background colour? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"BACKCOLOUR"))
- DSeg -> BackColour = Atol(Option);
-
- /* Turn alarm on? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"ALARM"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> Alarm = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> Alarm = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Alarm settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Set alarm time? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"ALARMTIME"))
- {
- char TimeBuff[3];
- LONG TheTime;
-
- TimeBuff[2] = 0;
-
- TimeBuff[0] = Option[0];
- TimeBuff[1] = Option[1];
-
- TheTime = Atol(TimeBuff);
-
- if(TheTime >= 0 && TheTime <= 23)
- DSeg -> AlarmHour = TheTime;
- else
- PopRequest(NULL,"DClock problem:","Illegal value for alarm hour (must be between 0 and 23)!",NULL,"Continue?",FALSE,NULL);
-
- TimeBuff[0] = Option[3];
- TimeBuff[1] = Option[4];
-
- TheTime = Atol(TimeBuff);
-
- if(TheTime >= 0 && TheTime <= 59)
- DSeg -> AlarmMinute = TheTime;
- else
- PopRequest(NULL,"DClock problem:","Illegal value for alarm minute (must be between 0 and 59)!",NULL,"Continue?",FALSE,NULL);
-
- TimeBuff[0] = Option[6];
- TimeBuff[1] = Option[7];
-
- TheTime = Atol(TimeBuff);
-
- if(TheTime >= 0 && TheTime <= 59)
- DSeg -> AlarmSecond = TheTime;
- else
- PopRequest(NULL,"DClock problem:","Illegal value for alarm seconds (must be between 0 and 59)!",NULL,"Continue?",FALSE,NULL);
- }
-
- /* Set environment variables? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"SETENV"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> SetEnv = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> SetEnv = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Environment settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Start countdown? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"COUNTDOWN"))
- {
- if(Atol(Option) > 0)
- DSeg -> Countdown = Atol(Option);
- else
- PopRequest(NULL,"DClock problem:","Countdown must be greater than 0!",NULL,"Continue?",FALSE,NULL);
- }
-
- /* Set hour chime? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"HOUR"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> Hour = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> Hour = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Hour settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Turn seconds off? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"SECONDS"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> Seconds = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> Seconds = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Second settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Load a chime sound? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"SOUND"))
- LoadChimeSound(Option);
-
- /* Show which page on startup? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"PAGE"))
- {
- if(Atol(Option) < 0 || Atol(Option) > 4 || (Atol(Option) == 4 && DSeg -> Countdown < 1))
- PopRequest(NULL,"DClock problem:","Illegal value for page!",NULL,"Continue?",FALSE,NULL);
- else
- DSeg -> Page = Atol(Option);
- }
-
- /* Turn the speech off? */
-
- if(Option = FindToolType(DiskObject -> do_ToolTypes,"SPEECH"))
- {
- if(!Strcmp(Option,"OFF"))
- DSeg -> Speech = FALSE;
- else
- {
- if(!Strcmp(Option,"ON"))
- DSeg -> Speech = TRUE;
- else
- PopRequest(NULL,"DClock problem:","Speech settings not understood (must be OFF or ON)!",NULL,"Continue?",FALSE,NULL);
- }
- }
-
- /* Read the system clock? */
-
- if(FindToolType(DiskObject -> do_ToolTypes,"READCLOCK"))
- {
- if(!ReadClock())
- PopRequest(NULL,"DClock problem:","Could not find battery backed up clock!",NULL,"Continue?",FALSE,NULL);
- }
-
- /* Free the rest... */
-
- FreeDiskObject(DiskObject);
-
- CloseLibrary(IconBase);
- }
-
- /* main(argc,argv):
- *
- * That's where all the trouble starts.
- */
-
- VOID
- main(int argc,char **argv)
- {
- BOOL Quiet = FALSE;
- struct Process *ThatsMe = (struct Process *)SysBase -> ThisTask;
-
- /* Init important pointers. */
-
- if(!ThatsMe -> pr_CLI)
- FromWorkbench = TRUE;
-
- /* Are we already running? */
-
- DSeg = (struct DSeg *)FindPort(PORTNAME);
-
- /* Restart? */
-
- if(FromWorkbench && DSeg)
- {
- ProcessIcon();
- exit(RETURN_OK);
- }
-
- /* Yeah... push it! */
-
- if(FromWorkbench)
- goto PushIt;
-
- /* Be quiet? */
-
- if(argv[ARG_QUIET])
- Quiet = TRUE;
-
- /* No argument and DClock's already running? */
-
- if(argc < 2 && DSeg)
- {
- Printf("Can't install \33[1mDClock\33[0m, handler process \33[33malready running\33[31m\7!\n");
-
- exit(RETURN_OK);
- }
-
- /* Read the system clock? */
-
- if(argv[ARG_READCLOCK])
- {
- if(!ReadClock() && !Quiet)
- Puts("\33[1mDClock:\33[0m Could not find battery backed up clock.");
- }
-
- /* User wants information. */
-
- if(argv[ARG_INFO])
- {
- Printf("\n\33[1m\33[33mDClock\33[0m\33[31m - A \33[33mD\33[31mumb \33[33mClock\33[31m. Renders time and date\n");
- Printf(" into the Workbench title bar. Place\n");
- Printf(" \33[33mDClock-Handler\33[31m in L:, \33[33mDClock\33[31m somewhere\n");
- Printf(" in C: or in SYS:. Type '\33[1m\33[33mDClock\33[31m\33[0m' to\n");
- Printf(" install, '\33[1m\33[33mDClock quit\33[31m\33[0m' to remove.\n\n");
- Printf(" \33[33mDClock\33[31m is \33[1mfree\33[0m and in the \33[33m\33[1mPUBLIC-DOMAIN\33[31m\33[0m!\n\n");
-
- Printf("\33[1m\33[33mAuthor\33[31m\33[0m - Olaf Barthel, MXM\n");
- Printf(" Brabeckstrasse 35\n");
- Printf(" D-3000 Hannover 71\n\n");
-
- Printf(" Federal Republic of Germany.\n\n");
-
- exit(RETURN_OK);
- }
-
- /* Print current release version number. */
-
- if(argv[ARG_VERSION])
- {
- Printf("\33[1mDClock\33[0m version 1.%ld, created \33[33mThursday, 27-Jul-90, 11:32\33[31m.\n",DSeg ? DSeg -> Revision : REVISION);
- exit(RETURN_OK);
- }
-
- /* Terminate dumb clock? */
-
- if(argv[ARG_QUIT])
- {
- Printf("Removing \33[1m\33[33mDClock\33[31m\33[0m (DClock-Handler revision 1.%ld), ",DSeg ? DSeg -> Revision : -1);
-
- /* Segment not loaded. */
-
- if(!DSeg)
- {
- Printf("failed!\7\n");
- exit(RETURN_FAIL);
- }
-
- /* We are the caller. */
-
- DSeg -> Father = (struct Task *)ThatsMe;
-
- /* Child still present? */
-
- if(DSeg -> Child)
- {
- Signal(DSeg -> Child,SIGBREAKF_CTRL_D);
- Wait(SIGBREAKF_CTRL_D);
- }
-
- /* Remove port and associated data. */
-
- RemPort(&DSeg -> Port);
- FreeMem(DSeg -> Port . mp_Node . ln_Name,sizeof(PORTNAME));
-
- if(DSeg -> SoundData && DSeg -> SoundLength)
- FreeMem(DSeg -> SoundData,DSeg -> SoundLength);
-
- FreeMem(DSeg -> SoundSemaphore,sizeof(struct SignalSemaphore));
-
- if(DSeg -> Segment)
- UnLoadSeg(DSeg -> Segment);
-
- FreeMem(DSeg,DSeg -> SegSize);
-
- Printf("OK.\n");
-
- exit(RETURN_OK);
- }
-
- /* Create global communication structure. */
-
- PushIt: if(!DSeg)
- {
- if(DSeg = (struct DSeg *)AllocMem(sizeof(struct DSeg),MEMF_PUBLIC | MEMF_CLEAR))
- {
- ULONG Micros;
-
- /* Dummy MessagePort. */
-
- DSeg -> Port . mp_Flags = PA_IGNORE;
- DSeg -> Port . mp_Node . ln_Pri = 1;
- DSeg -> Port . mp_Node . ln_Type = NT_MSGPORT;
- DSeg -> Port . mp_Node . ln_Name = AllocMem(sizeof(PORTNAME),MEMF_PUBLIC);
- DSeg -> Child = NULL;
- DSeg -> Father = (struct Task *)ThatsMe;
- DSeg -> SoundSemaphore = (struct SignalSemaphore *)AllocMem(sizeof(struct SignalSemaphore),MEMF_PUBLIC | MEMF_CLEAR);
-
- if(!DSeg -> Port . mp_Node . ln_Name || !DSeg -> SoundSemaphore)
- goto Purge;
-
- /* For future expansion of this structure;
- * this will insure that any version of
- * DClock will be able to free the memory
- * occupied by the segment.
- */
-
- DSeg -> SegSize = sizeof(struct DSeg);
-
- /* We'll wait for this signal to come from
- * the handler process.
- */
-
- DSeg -> RingBack = SIGBREAKF_CTRL_C;
-
- /* Enable beep and disable click feature. */
-
- DSeg -> Beep = TRUE;
- DSeg -> Click = FALSE;
-
- /* So we have valid time counter. */
-
- CurrentTime(&DSeg -> LastSecs,&Micros);
-
- /* Click volume and handler priority. */
-
- DSeg -> ClickVolume = 64;
- DSeg -> Priority = 5;
-
- /* Rendering colours. */
-
- DSeg -> TextColour = 0;
- DSeg -> BackColour = 1;
-
- /* Set alarm default. */
-
- DSeg -> Alarm = FALSE;
-
- DSeg -> AlarmHour = 12;
- DSeg -> AlarmMinute = 0;
- DSeg -> AlarmSecond = 0;
-
- /* Disable countdown & hour chime. */
-
- DSeg -> Countdown = 0;
- DSeg -> Hour = FALSE;
-
- /* Seconds are by default enabled. */
-
- DSeg -> Seconds = TRUE;
-
- /* Set environment variables. */
-
- DSeg -> SetEnv = FALSE;
-
- /* Install the current revision number. */
-
- DSeg -> Revision = REVISION;
-
- /* Init port. */
-
- strcpy(DSeg -> Port . mp_Node . ln_Name,PORTNAME);
-
- if(!FromWorkbench)
- Printf("Installing \33[33m\33[1mDClock\33[0m\33[31m, ");
-
- /* Load the handler code. */
-
- DSeg -> Segment = LoadSeg("DClock-Handler");
-
- if(!DSeg -> Segment)
- DSeg -> Segment = LoadSeg("L:DClock-Handler");
-
- if(!DSeg -> Segment)
- {
- if(!FromWorkbench)
- Printf("unable to find \33[33mL:DClock-Handler\33[31m\7!\n");
- else
- PopRequest(NULL,"DClock problem:","Can't find \33[1m\"DClock-Handler\"\33[0m!\nCheck L: and current directory.",NULL,"Continue?",FALSE,NULL);
-
- Purge: if(DSeg)
- {
- if(DSeg -> Port . mp_Node . ln_Name)
- FreeMem(DSeg -> Port . mp_Node . ln_Name,sizeof(PORTNAME));
-
- if(DSeg -> SoundSemaphore)
- FreeMem(DSeg -> SoundSemaphore,sizeof(struct SignalSemaphore));
-
- FreeMem(DSeg,DSeg -> SegSize);
- }
- }
- else
- {
- /* Install the port and start the handler. */
-
- AddPort(&DSeg -> Port);
-
- CreateProc("DClock-Handler",DSeg -> Priority,DSeg -> Segment,4096);
-
- /* Wait for child task to ring back... */
-
- Wait(SIGBREAKF_CTRL_C);
-
- if(!DSeg -> Child)
- {
- if(!FromWorkbench)
- Printf("\33[33mFAILED!\33[31m (care to retry?)\n");
- else
- PopRequest(NULL,"DClock problem:","Handler process didn't reply startup-message.",NULL,"Continue?",FALSE,NULL);
-
- RemPort(&DSeg -> Port);
- FreeMem(DSeg -> Port . mp_Node . ln_Name,sizeof(PORTNAME));
-
- if(DSeg -> Segment)
- UnLoadSeg(DSeg -> Segment);
-
- FreeMem(DSeg,DSeg -> SegSize);
-
- if(FromWorkbench)
- Delay(TICKS_PER_SECOND * 2);
-
- exit(RETURN_FAIL);
- }
- else
- {
- if(!FromWorkbench)
- Printf("\33[3mOkay. \33[0m\33[33mDClock v1.%ld\33[31m, by \33[4mMXM\33[0m. \33[1mPUBLIC DOMAIN\33[0m.\n",REVISION);
- else
- PopRequest(NULL,"DClock Message:","Handler process successfully installed!\n\n\33[33mDClock\33[31m (C) Copyright 1989, 1990 \33[3mby MXM.\33[0m \33[1mPUBLIC DOMAIN\33[0m.",NULL,"Continue?",FALSE,NULL);
- }
- }
- }
- }
-
- /* Deal with the icon... */
-
- if(FromWorkbench)
- {
- ProcessIcon();
- exit(RETURN_OK);
- }
-
- /* Change click volume. */
-
- if(argv[ARG_CLICKVOLUME] && DSeg)
- {
- if(Atol(argv[ARG_CLICKVOLUME]) >= 0 && Atol(argv[ARG_CLICKVOLUME]) <= 64 )
- {
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Click volume set to %ld.\n",DSeg -> ClickVolume = Atol(argv[ARG_CLICKVOLUME]));
- }
- else
- Puts(CLI_Help);
- }
-
- /* Change handler priority? */
-
- if(argv[ARG_PRIORITY] && DSeg)
- {
- if(DSeg -> Child)
- {
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Handler priority set to %ld.\n",DSeg -> Priority = Atol(argv[ARG_PRIORITY]));
-
- SetTaskPri(DSeg -> Child,DSeg -> Priority);
- }
- else
- Puts("\33[1mDClock:\33[0m Unable to find handler task.");
- }
-
- /* Turn beeping on/off? */
-
- if(argv[ARG_BEEP] && DSeg)
- {
- if(!Strcmp(argv[ARG_BEEP],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Beep disabled.");
-
- DSeg -> Beep = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_BEEP],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Beep enabled.");
-
- DSeg -> Beep = TRUE;
- }
- else
- Puts(CLI_Help);
- }
- }
-
- /* Turn clicking on/off? */
-
- if(argv[ARG_CLICK])
- {
- if(!Strcmp(argv[ARG_CLICK],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Click disabled.");
-
- DSeg -> Click = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_CLICK],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Click enabled.");
-
- DSeg -> Click = TRUE;
- }
- else
- Puts(CLI_Help);
- }
- }
-
- /* Select new front colour? */
-
- if(argv[ARG_TEXTCOLOUR])
- {
- DSeg -> TextColour = Atol(argv[ARG_TEXTCOLOUR]);
-
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Text colour set to %ld.\n",DSeg -> TextColour);
- }
-
- /* Select new background colour? */
-
- if(argv[ARG_BACKCOLOUR])
- {
- DSeg -> BackColour = Atol(argv[ARG_BACKCOLOUR]);
-
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Background colour set to %ld.\n",DSeg -> BackColour);
- }
-
- /* Set/check alarm status. */
-
- if(argv[ARG_ALARM])
- {
- if(!Strcmp(argv[ARG_ALARM],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Alarm disabled.");
-
- DSeg -> Alarm = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_ALARM],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Alarm enabled.");
-
- DSeg -> Alarm = TRUE;
- }
- else
- {
- if(!Strcmp(argv[ARG_ALARM],"SHOW"))
- Printf("\33[1mDClock:\33[0m Current alarm time is %02ld:%02ld:%02ld.\n",DSeg -> AlarmHour,DSeg -> AlarmMinute,DSeg -> AlarmSecond);
- else
- Puts(CLI_Help);
- }
- }
- }
-
- /* Adjust alarm time. */
-
- if(argv[ARG_ALARMTIME])
- {
- char TimeBuff[3];
- LONG TheTime;
-
- TimeBuff[2] = 0;
-
- if(strlen(argv[ARG_ALARMTIME]) != 8)
- {
- Puts("\33[1mDClock:\33[0m Alarm time format = HH:MM:SS, example: 09:03:07.");
- exit(RETURN_ERROR);
- }
-
- TimeBuff[0] = argv[ARG_ALARMTIME][0];
- TimeBuff[1] = argv[ARG_ALARMTIME][1];
-
- TheTime = Atol(TimeBuff);
-
- if(TheTime < 0 || TheTime > 23)
- {
- Puts("\33[1mDClock:\33[0m Illegal time value, Hours must be within 0 ... 23.");
- exit(RETURN_ERROR);
- }
-
- DSeg -> AlarmHour = TheTime;
-
- TimeBuff[0] = argv[ARG_ALARMTIME][3];
- TimeBuff[1] = argv[ARG_ALARMTIME][4];
-
- TheTime = Atol(TimeBuff);
-
- if(TheTime < 0 || TheTime > 59)
- {
- Puts("\33[1mDClock:\33[0m Illegal time value, Minutes must be within 0 ... 59.");
- exit(RETURN_ERROR);
- }
-
- DSeg -> AlarmMinute = TheTime;
-
- TimeBuff[0] = argv[ARG_ALARMTIME][6];
- TimeBuff[1] = argv[ARG_ALARMTIME][7];
-
- TheTime = Atol(TimeBuff);
-
- if(TheTime < 0 || TheTime > 59)
- {
- Puts("\33[1mDClock:\33[0m Illegal time value, Seconds must be within 0 ... 59.");
- exit(RETURN_ERROR);
- }
-
- DSeg -> AlarmSecond = TheTime;
-
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Alarm time set to %02ld:%02ld:%02ld.\n",DSeg -> AlarmHour,DSeg -> AlarmMinute,DSeg -> AlarmSecond);
- }
-
- if(argv[ARG_REFRESH])
- {
- if(CloseWorkBench())
- OpenWorkBench();
-
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Main window refreshed.");
- }
-
- /* Set environment variables? */
-
- if(argv[ARG_SETENV])
- {
- if(!Strcmp(argv[ARG_SETENV],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Environment variables disabled.");
-
- DSeg -> SetEnv = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_SETENV],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Environment variables enabled.");
-
- DSeg -> SetEnv = TRUE;
- }
- else
- Puts(CLI_Help);
- }
- }
-
- /* Set countdown timeout? */
-
- if(argv[ARG_COUNTDOWN])
- {
- if(Atol(argv[ARG_COUNTDOWN]) > 0)
- {
- DSeg -> Countdown = Atol(argv[ARG_COUNTDOWN]);
-
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Countdown set to %ld.\n",DSeg -> Countdown);
- }
- else
- Puts(CLI_Help);
- }
-
- /* Enable/disable the hour chime? */
-
- if(argv[ARG_HOUR])
- {
- if(!Strcmp(argv[ARG_HOUR],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Hour chime disabled.");
-
- DSeg -> Hour = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_HOUR],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Hour chime enabled.");
-
- DSeg -> Hour = TRUE;
- }
- else
- Puts(CLI_Help);
- }
- }
-
- /* Display seconds or not? */
-
- if(argv[ARG_SECONDS])
- {
- if(!Strcmp(argv[ARG_SECONDS],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Seconds disabled.");
-
- DSeg -> Seconds = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_SECONDS],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Seconds enabled.");
-
- DSeg -> Seconds = TRUE;
- }
- else
- Puts(CLI_Help);
- }
- }
-
- /* Load a sound file? */
-
- if(argv[ARG_SOUND])
- {
- if(LoadChimeSound(argv[ARG_SOUND]))
- {
- if(!Strcmp(argv[ARG_SOUND],"OFF") && !Quiet)
- Puts("\33[1mDClock:\33[0m Chime sound reset.");
- }
- }
-
- /* Show a special page on startup? */
-
- if(argv[ARG_PAGE] && DSeg)
- {
- UBYTE Page = Atol(argv[ARG_PAGE]);
-
- if(Page >= 0 && Page <= 4 || (Page == 4 && DSeg -> Countdown > 0))
- {
- if(!Quiet)
- Printf("\33[1mDClock:\33[0m Showing display page %ld.\n",DSeg -> Page = Page);
- }
- else
- Puts("\33[1mDClock:\33[0m Page value out of limits (must be 0-3/4).");
- }
-
- /* Turn the speech on/off? */
-
- if(argv[ARG_SPEECH])
- {
- if(!Strcmp(argv[ARG_SPEECH],"OFF"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Speech now off.");
-
- DSeg -> Speech = FALSE;
- }
- else
- {
- if(!Strcmp(argv[ARG_SPEECH],"ON"))
- {
- if(!Quiet)
- Puts("\33[1mDClock:\33[0m Speech now on.");
-
- DSeg -> Speech = TRUE;
- }
- else
- Puts(CLI_Help);
- }
- }
-
- exit(RETURN_OK);
- }
-