home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
system_utils
/
clocks
/
clock
/
clock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-16
|
5KB
|
183 lines
/************************************************************************
* *
* 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 <stdio.h>
#include <exec/types.h>
#include <exec/exec.h>
#include <devices/timer.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <libraries/arpbase.h>
#include <proto/arp.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/exec.h>
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<<Window->UserPort->mp_SigBit | 1<<Timer_Port->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() {}