/************************************************************************ * * * Clock v1.4 * * * * © Stuart Mitchell - November 1990 * * * * A simple clock with optional pop-to-front & memory display * * * * NB: 1) Should be linked with cback.o instead of c.o to provide a LSR * * program which then allows original CLI to be closed. * * 2) To enable pop-to-front compile with -dPOPUP option * * 3) To enable memory display compile with -dMEMCLOCK option * * * * v1.0 - Initial release * * v1.1 - fixed timing bug (minclock woken up 4 times too often!!) * * v1.2 - Added code to call RawDoFmt * * v1.3 - Fixed memory loss bug (call _exit instead of Exit) * * v1.4 - Altered to use ARP's resource tracking,cached libraries... * * * ************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include void do_exit(int); #ifdef MEMCLOCK #define PROGNAME "Memclock v1.4" #else #define PROGNAME "MinClock v1.4" #endif long _stack=2000; /* Definitions for cback.o */ char *_procname=PROGNAME; long _priority=0; long _BackGroundIO=0; static struct IntuitionBase *IntuitionBase; static struct GfxBase *GfxBase; struct ArpBase *ArpBase; static struct Window *Window; static struct timerequest Time_Req; static struct MsgPort *Timer_Port; static struct DateStamp Date; static struct IntuiMessage *Msg; char date[LEN_DATSTRING],time[LEN_DATSTRING],day[LEN_DATSTRING]; static struct DateTime datetime={ {0},FORMAT_CDN,0,NULL,date,time }; #ifdef MEMCLOCK #define BUFSIZE 32 #define WIDTH 250 #define XPOS 337 #else #define BUFSIZE 18 #define WIDTH 140 #define XPOS 447 #endif static BYTE Buffer[26]; /* holds time string */ static struct NewWindow nw={ XPOS,0,WIDTH,10,2,1,CLOSEWINDOW,SMART_REFRESH|WINDOWCLOSE|WINDOWDRAG, NULL,NULL,(UBYTE *)PROGNAME,NULL,NULL,0,0,0,0,WBENCHSCREEN }; static struct IntuiText Date_Text={ 2,1,JAM2,0,0,NULL,Buffer,NULL }; void _main() { #ifdef POPUP long lock; #endif if(!(ArpBase=(struct ArpBase *)OpenLibrary("arp.library",39))) do_exit(1); IntuitionBase=(struct IntuitionBase *)ArpBase->IntuiBase; GfxBase=(struct GfxBase *)ArpBase->GfxBase; if(Getenv("dateformat",Buffer,5)==NULL) datetime.dat_Format=FORMAT_DOS; else datetime.dat_Format=Atol(Buffer); if(datetime.dat_Format==FORMAT_DOS) { nw.LeftEdge-=8; nw.Width+=8; }; if((Timer_Port=CreatePort("Timer Port",0))==NULL) do_exit(1); if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)&Time_Req,0)!=NULL) do_exit(1) ; Time_Req.tr_node.io_Message.mn_ReplyPort=Timer_Port; Time_Req.tr_node.io_Command=TR_ADDREQUEST; Time_Req.tr_node.io_Flags=0; Time_Req.tr_node.io_Error=0; if((Window=OpenWindow((struct NewWindow *)&nw))==NULL) do_exit(20); SetRast(Window->RPort,1); for(;;) { /* calculate time from system clock */ DateStamp((struct DateStamp *)&datetime.dat_Stamp); StamptoStr(&datetime); #ifdef MEMCLOCK SPrintf(Buffer,"C:%04ld F:%04ld %s %s",AvailMem(MEMF_CHIP)>>10, AvailMem(MEMF_FAST)>>10,date,time); #else SPrintf(Buffer,"%s %s",date,time); #endif PrintIText(Window->RPort,&Date_Text,2,1); /* put into window */ /* NB : Window only 'pops to front' if Workbench screen is also at the front, otherwise Dpaint (& others?) get very upset */ #ifdef POPUP lock=LockIBase(0); if(IntuitionBase->FirstScreen==Window->WScreen) WindowToFront(Window); UnlockIBase(lock); #endif /* set up next wakeup time */ Time_Req.tr_time.tv_secs=1; Time_Req.tr_time.tv_micro=0; SendIO(&Time_Req.tr_node); /* sleep until woken either by Close Gadget selection or timer event */ Wait(1<UserPort->mp_SigBit | 1<mp_SigBit); while((Msg=(struct IntuiMessage *)GetMsg(Window->UserPort))!=NULL) { if(Msg->Class==CLOSEWINDOW) { ReplyMsg((struct Message *)Msg); do_exit(0); } ReplyMsg((struct Message *)Msg); } GetMsg(Timer_Port); /* must be timer wakeup ... */ } } /*********************************************************************/ void do_exit(code) int code; { AbortIO(&Time_Req.tr_node); if(Window) CloseWindow(Window); if(Time_Req.tr_node.io_Message.mn_ReplyPort) CloseDevice((struct IORequest *)&Time_Req); if(Timer_Port) DeletePort((struct MsgPort *)Timer_Port); if(ArpBase) CloseLibrary((struct Library *)ArpBase); _exit(code); } void MemCleanup() {}