home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d01xx
/
d0151.lha
/
Pcopy
/
pc1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-06-15
|
7KB
|
285 lines
/* pc1.c - Some other functions */
#include "pcopy.h"
/* Our startup is calling it, so we why shouldn't we define it?
*/
void MemCleanup(){}
/*
* Open all windows, open a Console device for the history window and
* a port to it.
*/
OpenUser()
{
TxT[SHORTTIME]='\0'; /* cut the string just before the sizing gadgets */
WT=OpenWindow(&NwT);
W1=OpenWindow(&Nw1);
W0=OpenWindow(&Nw0);
WH=OpenWindow(&NwH);
WS=OpenWindow(&NwS);
if (!(WT&&W1&&W0&&WH&&WS)) return(-1); /* any missing window? */
if (!(MPHist=CreatePort("History",0))) return(-1);
if (!(IOHist=CreateStdIO(MPHist))) return(-1);
IOHist->io_Data=(APTR)WH;
IOHist->io_Length=sizeof(*WH);
return(OpenDevice("console.device",0,IOHist,0));
}
/*
* The same as the preceding function but now !
*/
void CloseUser()
{
if (IOHist){
if (IOHist->io_Device) CloseDevice(IOHist);
DeleteStdIO(IOHist);
}
if (MPHist) DeletePort(MPHist);
if (WT) CloseWindow(WT);
if (WH) CloseWindow(WH);
if (W1) CloseWindow(W1);
if (W0) CloseWindow(W0);
if (WS) CloseWindow(WS);
}
/*
* We donot want to refresh all gadgets, so a patch again
*/
void RefOneGadget(G,W,R)
struct Gadget *G; struct Window *W; struct Requester *R;
{
RemoveGadget(W,G);
AddGadget(W,G,-1);
RefreshGadgets(G,W,R);
}
/*
* This way you should make a beep! It's the multitasking way. It's a
* decent way. No pumping words into a DAC which was just busy converting
* The Dutch National Anthem.
*/
Beep(type)
short type;
{
/* We need these to get the adress of unmerged memory */
static UBYTE *SDA=SoundData;
static UBYTE *SDA1=SoundData1;
UBYTE sunit=0x0f;
short done=0;
/*
if (!BeepAllowed) return(0);
*/
if (Sound.ioa_Request.io_Message.mn_ReplyPort=CreatePort("p3",0)){
Sound.ioa_Request.io_Message.mn_Node.ln_Pri=BEEP_PRI;
Sound.ioa_Data=&sunit;
Sound.ioa_Length=(ULONG)sizeof(sunit);
Sound.ioa_Request.io_Flags=ADIOF_NOWAIT;
if (!OpenDevice(AUDIONAME,0L,&Sound,0L)){
Sound.ioa_Request.io_Command=CMD_WRITE;
Sound.ioa_Request.io_Flags=ADIOF_PERVOL | IOF_QUICK;
Sound.ioa_Data=SDA;
Sound.ioa_Length=SDA1-SDA;
/*
Sound.ioa_Data=GetSoundDataAddress();
Sound.ioa_Length=GetSoundDataSize();
*/
Sound.ioa_Volume=64;
if (type){ /* alarm tune */
DoBeep(406,26);
Delay(1);
DoBeep(406,45);
DoBeep(304,35);
DoBeep(406,26);
DoBeep(304,35);
DoBeep(406,80);
} else{ /* ready tune */
DoBeep(406,32);
Delay(1);
DoBeep(406,110);
}
CloseDevice(&Sound);
done=1;
}
DeletePort(Sound.ioa_Request.io_Message.mn_ReplyPort);
}
if (!done) DisplayBeep(IntuitionBase->ActiveScreen);
/* if no Sound device at least this */
return((int)done);
}
void DoBeep(period,cycles)
{
Sound.ioa_Period=period;
Sound.ioa_Cycles=cycles;
BeginIO(&Sound);
WaitIO(&Sound);
}
void ConPutStr(req,str)
struct IOStdReq *req;
char *str;
{
register int saveD7; /* Is it true that DoIO() to a console trashes D7? */
req->io_Command=CMD_WRITE;
req->io_Data=(APTR)str;
req->io_Length=-1;
DoIO(req);
}
/*
* AutoRequest is not handsome enough, we make it nice here.
*/
Request(text0,text1,text2,text3)
char *text0, *text1, *text2, *text3;
{
static struct IntuiText ITBod1={ 0,0,JAM1,10,14,0,0,0 };
static struct IntuiText ITBod0={ 0,0,JAM1,10, 4,0,0,0 };
static struct IntuiText ITPos={ 0,0,JAM1, 6, 3,0,0,0 };
static struct IntuiText ITNeg={ 0,0,JAM1, 6, 3,0,0,0 };
register int width0, width1;
ITBod0.IText=text0;
ITPos.IText=text2;
ITNeg.IText=text3;
if (ITBod1.IText=text1){
ITBod0.NextText=&ITBod1;
width1=IntuiTextLength(&ITBod1)+48;
} else{
ITBod0.NextText=0;
width1=0;
}
width0=IntuiTextLength(&ITBod0)+48;
if (width0<152) width0=152; /* a minimum width */
return (AutoRequest(WS,&ITBod0,&ITPos,&ITNeg,
GADGETDOWN,GADGETDOWN,(width1<width0)?width0:width1,60));
}
/*
* Careful analises of some Manx "objects", delivered this function.
*/
long dos_packet(port, type, arg1, arg2)
struct MsgPort *port; long type, arg1, arg2;
{
register struct StandardPacket *sp;
register struct MsgPort *rp, *CreatePort();
long ret;
ret=0;
if (rp=CreatePort(0L,0L)){
if (sp=(struct StandardPacket *)
AllocMem((long)sizeof(struct StandardPacket),PUBCLR)){
sp->sp_Msg.mn_Node.ln_Name=(char *)&sp->sp_Pkt;
sp->sp_Pkt.dp_Link=&sp->sp_Msg;
sp->sp_Pkt.dp_Port=rp;
sp->sp_Pkt.dp_Type=type;
sp->sp_Pkt.dp_Arg1=arg1;
sp->sp_Pkt.dp_Arg2=arg2;
PutMsg(port,&sp->sp_Msg);
WaitPort(rp);
GetMsg(rp);
ret=sp->sp_Pkt.dp_Res1;
FreeMem(sp,(long)sizeof(*sp));
}
DeletePort(rp);
}
return(ret);
}
/*
* Some people donot have a df1:, but a df2:. Thats why this drive
* selection function is implemented. It builds up a requesterlike
* window, asking the user to select two drives. If he did not select
* them, ignore his done pushes. Then check if the names are not
* assigned to the same drive.
*/
AskDrives(){
ULONG proc;
struct InfoData *Info;
struct Window *WR;
short nr,i,dok,error;
char *dname;
if (!(Info=(struct InfoData *)AllocMem((long)sizeof(struct InfoData),
MEMF_PUBLIC|MEMF_CLEAR))) return(-1);
if (WR=OpenWindow(&NwR)){
for (nr=0;nr!=2;){
while (!(GDONE.Flags&SELECTED)) ;
GDONE.Flags&=~SELECTED;
for (nr=0,i=0;i<NDRIVES;++i) if (GList[i]->Flags&SELECTED) ++nr;
}
CloseWindow(WR); /* two names were selected, now get their #'s */
for (i=0,nr=0,error=0;i<NDRIVES;++i){
if (GList[i]->Flags&SELECTED){
dname=GList[i]->GadgetText->IText;
if (proc=DeviceProc(dname)){
if (dok=dos_packet(proc,ACTION_DISK_INFO,((ULONG)Info)>>2)){
DriveName[nr]=dname;
DriveNr[nr++]=Info->id_UnitNumber;
}
}
if (!(proc&&dok)) ++error;
}
}
} else error=-1; /* no window */
FreeMem(Info,(long)sizeof(struct InfoData));
return(error||(DriveNr[0]==DriveNr[1]));
}
/*
* Quite simple: a block of 1 kB is shifted over 32 bytes, to make place
* for the new name.
*/
void EnterHist(name)
char *name;
{
register ULONG *s,*d;
register short i;
s=(ULONG *)(Hist+((MHIST-1)*MVOLNAME));
d=(ULONG *)(Hist+(MHIST*MVOLNAME));
for (i=0;i<((MHIST-1)*MVOLNAME/4);++i) *(--d)=*(--s);
strncpy(Hist,name,MVOLNAME-1);
}
/*
* Here the Copy History window is completely written over again.
*/
void RefHist()
{
short lines;
ConPutStr(IOHist,"\x0c"); /* clear screen */
for (lines=(WH->Height-12)/8;lines>=0;--lines){
ConPutStr(IOHist,"\n ");
ConPutStr(IOHist,&Hist[lines*MVOLNAME]);
}
}
/* end of pc1.c */