home *** CD-ROM | disk | FTP | other *** search
- /*
- * FoCo: Formatier-Kontroll-Programm
- * (GadTools-Commodities-etc-Einführung)
- * Autor: Michael Balzer
- *
- * 03/91: Erste Version (primär für MacSoft Highlights-Serie)
- * Version 1.0
- *
- * 10/91: Änderung, Delay bevor Drivecheck durchgeführt wird
- * (stand schon lange an...) und Quit-Frage bei CloseWindow
- * Version 1.1
- *
- */
-
- #ifndef FOCO_HDR
- # include "FoCo.h"
- #endif
-
- #include <dos/dosextens.h>
-
- /*------------------------------------------------------------------------*/
- void ende(int, STRPTR);
- struct Gadget *CreateAllGadgets(struct Gadget **glistptr,
- void *vi, UWORD topborder);
- void ShowWindow( void );
- void HideWindow( void );
- int GetBADNum( void );
-
- void ArgArrayDone( void );
- UBYTE **ArgArrayInit( LONG arg1, UBYTE **arg2 );
- LONG ArgInt( UBYTE **arg1, UBYTE *arg2, LONG arg3 );
- UBYTE *ArgString( UBYTE **arg1, UBYTE *arg2, UBYTE *arg3 );
- CxObj *HotKey( UBYTE *arg1, struct MsgPort *arg2, LONG arg3 );
-
- LONG Printf( UBYTE *format, ... );
- LONG CSystem( UBYTE *command, LONG tag1, ... );
-
- /*------------------------------------------------------------------*/
- /* GadgetIDs: */
- #define GAD_DRIVE 1
- #define GAD_NAME 2
- #define GAD_FFS 3
- #define GAD_NOICONS 4
- #define GAD_QUICK 5
- #define GAD_OK 6
- #define GAD_CANCEL 7
-
- /*------------------------------------------------------------------------*/
- /* Globale Variablen... */
- struct IntuitionBase *IntuitionBase = NULL;
- struct GfxBase *GfxBase = NULL;
- struct Library *GadToolsBase = NULL;
- extern struct Library *IconBase;
-
- struct TextFont *font = NULL;
- struct Screen *mysc = NULL;
- struct Gadget *glist = NULL;
- struct Window *mywin = NULL;
-
- void *vi = NULL;
- struct RastPort *rp;
- int Xwidth, WinWidth, WinHeight;
- UWORD topborder;
- ULONG windowsignal=0;
-
- STRPTR DiskList[5] = { NULL,NULL,NULL,NULL,NULL };
- STRPTR DiskName[4] = { "DF0:","DF1:","DF2:","DF3:" };
-
- char *TextSpeicher = 0;
- #define _COUNT_TXT 15
- char *ProgrammText[ _COUNT_TXT ] =
- {
- "Formatter",
- "You just inserted an unreadable disk\n"
- "in drive %s.\n"
- "Do you want it to be formatted?",
- " Yes | NO! ",
- "User-friendly disk formatter",
- "Pops up on disk insertion/hotkey",
- "Drive:",
- "Name:",
- "FFS",
- "NoIcons",
- "Quick",
- "Format!",
- "Cancel!",
- "Format Disk...",
- "CON:0/0/512/83/Formatting Disk...",
- "Quit FoCo?"
- };
- #define TXT(n) ProgrammText[n]
-
- struct EasyStruct formatreq =
- {
- sizeof( struct EasyStruct ), 0,
- 0, 0, 0
- /*TXT(0), TXT(1), TXT(2)*/
- };
-
- struct EasyStruct quitreq =
- {
- sizeof( struct EasyStruct ), 0,
- 0, 0, 0
- /*TXT(0), TXT(14), TXT(2)*/
- };
-
- /*------------------------------------------------------------------------*/
- /* Trackdisk-Variablen */
-
- struct IOExtTD *ioexttd[4]={ 0,0,0,0 };
- int changenum[4];
- struct MsgPort *tdport=0;
-
- /*------------------------------------------------------------------------*/
- /* Adressen der Gadgets, Status-Variablen */
-
- struct Gadget *drivegad, *namegad, *ffsgad, *noiconsgad, *quickgad;
-
- int drive;
- char name[33];
- BOOL bffs=TRUE, bnoicons=TRUE, bquick=FALSE;
-
- /*------------------------------------------------------------------------*/
- /* Commodities-Variablen */
-
- struct Library *CxBase = NULL;
- extern struct Library *IconBase;
-
- char **ttypes = NULL, *hotstr;
-
- struct MsgPort *cxport = 0;
- ULONG cxsigflag = 0; /* signal for above */
-
- CxObj *broker = NULL; /* Our broker */
-
- #define POP_KEY_ID (86L) /* pop up identifier */
-
- struct NewBroker mynb = {
- NB_VERSION, /* Library needs to know version */
- 0 /*TXT(0)*/, /* broker internal name */
- 0 /*TXT(3)*/, /* commodity title */
- 0 /*TXT(4)*/, /* description */
- NBU_NOTIFY | NBU_UNIQUE, /* We want to be the only broker */
- /* with this name and we want to */
- /* be notified of any attempts */
- /* to add a commodity with the */
- /* same name */
- COF_SHOW_HIDE, /* flags */
- 0, /* default priority */
- NULL, /* port, will fill in */
- 0 /* channel (reserved) */
- };
-
- /* Eine "input expression" die auf DISK_INSERTED paßt */
-
- IX diskix = {
- IX_VERSION, /* required */
- IECLASS_DISKINSERTED,
- 0, /* Code */
- ~0, /* CodeMask */
-
- 0, /* qualifier I am interested in */
- 0,
- 0 /* synonyms irrelevant */
- };
-
- #define CX_DISK_ID (87L)
-
- /*-------------------------------------------------------------------------*/
- /* Trackdisk-Support-Funktion(en) */
-
- int GetChangeNum( int unit )
- {
- if( !ioexttd[unit] ) return( 0 );
-
- ioexttd[unit]->iotd_Req.io_Command = TD_CHANGENUM;
- DoIO( ioexttd[unit] );
- return( ioexttd[unit]->iotd_Req.io_Actual );
- }
-
- int GetBADNum( void )
- {
- int result=-1, i, cn;
- struct InfoData *infoData;
- struct MsgPort *port;
-
- if( !(infoData = AllocMem(sizeof(struct InfoData),MEMF_PUBLIC)) )
- return -1;
-
- /* ermitteln, WO eine Disk eingelegt wurde */
- for( i=0; i<=3; i++ )
- {
- if( cn = GetChangeNum(i) )
- {
- if( (cn>changenum[i]) && (port=DeviceProc(DiskName[i])) )
- {
- /* und ob die 'BAD' oder 'NDOS' ist */
- if( DoPkt( port, ACTION_DISK_INFO, MKBADDR(infoData), 0,0,0 ) )
- {
- if( infoData->id_DiskType == ID_UNREADABLE_DISK
- || infoData->id_DiskType == ID_NOT_REALLY_DOS )
- result=i;
- }
- }
-
- changenum[i] = cn;
- }
- }
-
- FreeMem( infoData, sizeof(struct InfoData) );
- return( result );
- }
-
- /*-------------------------------------------------------------------------*/
-
- void LiesProgrammTexte( char *filename )
- {
- BPTR file;
- long size, i;
- char *ts;
-
- if( file=Open(filename,MODE_OLDFILE) )
- {
- size = Seek( file, Seek(file,0,OFFSET_END), OFFSET_BEGINNING );
- if( TextSpeicher=AllocMem(size+4,MEMF_PUBLIC) )
- {
- *((long *)TextSpeicher) = size+4;
- Read( file, TextSpeicher+4, size );
- for( i=0, ts=TextSpeicher+4; i < _COUNT_TXT; i++, ts+=strlen(ts)+1 )
- ProgrammText[i] = ts;
- }
- Close( file );
- }
- }
-
- void InitAll( int argc, char **argv )
- {
- char *str;
- CxObj *cxo;
- int i, dr=0;
-
- /*** Libraries öffnen... ***/
-
- if (!(GfxBase = (struct GfxBase *)
- OpenLibrary("graphics.library", 36L)))
- ende(20, "Requires V36 graphics.library");
-
- if (!(IntuitionBase = (struct IntuitionBase *)
- OpenLibrary("intuition.library", 36L)))
- ende(20, "Requires V36 intuition.library");
-
- if (!(GadToolsBase = OpenLibrary("gadtools.library", 36L)))
- ende(20, "Requires V36 gadtools.library");
-
- CxBase = OpenLibrary("commodities.library", 36);
- if(!CxBase) ende(20,"Requires V36 commodities.library");
- IconBase = OpenLibrary("icon.library", 36);
- if(!IconBase) ende(20,"Requires V36 icon.library");
-
- /*** ToolTypes (Argv) scannen ***/
-
- ttypes = ArgArrayInit( argc, argv );
-
- drive = ArgInt( ttypes, "DRIVE", 0 );
- strcpy( name, ArgString(ttypes, "NAME", "Empty Disk") );
- if( str=ArgString(ttypes,"FLAGS",NULL) )
- {
- bffs = MatchToolValue( str, "FFS" );
- bnoicons = MatchToolValue( str, "NOICONS" );
- bquick = MatchToolValue( str, "QUICK" );
- }
-
- /* Die Texte einlesen */
- LiesProgrammTexte( ArgString(ttypes,"LANGUAGEFILE","FoCo.txt") );
-
- /* und einsetzen */
- formatreq.es_Title = TXT(0);
- formatreq.es_TextFormat = TXT(1);
- formatreq.es_GadgetFormat = TXT(2);
- quitreq.es_Title = TXT(0);
- quitreq.es_TextFormat = TXT(14);
- quitreq.es_GadgetFormat = TXT(2);
- mynb.nb_Name = TXT(0);
- mynb.nb_Title = TXT(3);
- mynb.nb_Descr = TXT(4);
-
- /*** Trackdisk.device öffnen: ***/
-
- if( !(tdport = CreateMsgPort()) )
- ende(20,"Couldn't create TD MsgPort");
-
- /* alle 4 Units antesten */
- for( i=0; i<=3; i++ )
- {
- if( ioexttd[i] = CreateIORequest(tdport, sizeof(struct IOExtTD)) )
- {
- if( OpenDevice(TD_NAME, i, ioexttd[i], TDF_ALLOW_NON_3_5) )
- {
- DeleteIORequest( ioexttd[i] );
- ioexttd[i] = 0;
- }
- else
- {
- changenum[i] = GetChangeNum(i);
- /* in Liste für CycleGadget aufnehmen */
- DiskList[dr++] = DiskName[i];
- }
- }
- }
-
- /*** Hotkey installieren: ***/
-
- cxport = CreateMsgPort();
- if(!cxport) ende(20,"Couldn't create MsgPort");
- cxsigflag = 1L << cxport->mp_SigBit; /* Signal Mask für Wait*/
- mynb.nb_Port = cxport;
-
- /* Versuchen, den Broker zu erzeugen */
- if ( !(broker = CxBroker(&mynb, NULL)) )
- ende(0,0);
-
- /* Hotkey installieren */
- AttachCxObj( broker,
- HotKey( hotstr=ArgString(ttypes,"HOTKEY","lcommand f"),
- cxport, POP_KEY_ID) );
-
- /* Disk-Insert-Filter installieren */
- if( cxo = CxFilter(NULL) )
- {
- SetFilterIX( cxo, &diskix );
- AttachCxObj( cxo, CxSender(cxport, CX_DISK_ID) );
- AttachCxObj( cxo, CxTranslate(NULL) );
-
- AttachCxObj( broker, cxo );
- }
-
- /* Auf summierten Fehler prüfen */
- if( CxObjError(broker) )
- ende(20,"Internal commodities error");
-
- /* Alles o.k., Broker aktivieren */
- ActivateCxObj(broker,1L);
-
- /* soll das Fenster gleich geöffnet werden? */
- if( str=ArgString(ttypes,"SHOWWINDOW",NULL) )
- if( MatchToolValue(str,"ON") )
- ShowWindow();
- }
-
- /*------------------------------------------------------------------------*/
-
- struct Gadget *CreateAllGadgets(
- struct Gadget **glistptr, void *vi, UWORD topborder )
- {
- struct NewGadget ng;
- struct Gadget *gad;
- long tl; /* wg. cc-Fehler */
-
- /* All the gadget creation calls accept a pointer to the previous
- gadget, and link the new gadget to that gadget's NextGadget field.
- Also, they exit gracefully, returning NULL, if any previous gadget
- was NULL. This limits the amount of checking for failure that
- is needed. You only need to check before you tweak any gadget
- structure or use any of its fields, and finally once at the end,
- before you add the gadgets. */
-
- /* We obligingly perform the following operation, required of
- any program that uses the toolkit. It gives the toolkit a
- place to stuff context data: */
- gad = CreateContext(glistptr);
-
- /* Fill out a NewGadget structure to describe the gadget we want
- to create: */
-
- ng.ng_TextAttr = mysc->Font;
- ng.ng_VisualInfo = vi;
-
- /* Längeren Label ermitteln (PropFonts!) */
- tl = TextLength( rp, TXT(5), strlen(TXT(5)) );
- if( TextLength( rp, TXT(6), strlen(TXT(6)) ) > tl )
- tl = TextLength( rp, TXT(6), strlen(TXT(6)) );
-
- /* Drive: Cycler */
- tl += mysc->WBorLeft + INTERWIDTH + 8;
- /* +8 wegen Abstand Text<->Gadget */
- ng.ng_LeftEdge = tl;
- ng.ng_TopEdge = topborder + INTERHEIGHT;
- tl = TextLength( rp, "DFX:", 3 );
- ng.ng_Width = 40 + tl; /* (26) ist das "@" plus Seitenplatz */
- ng.ng_Height = mysc->Font->ta_YSize + 4;
- ng.ng_Flags = NG_HIGHLABEL;
- ng.ng_GadgetText = TXT(5);
- ng.ng_GadgetID = GAD_DRIVE;
- drivegad = gad = CreateGadget(CYCLE_KIND, gad, &ng,
- GTCY_Labels, DiskList,
- GTCY_Active, drive,
- TAG_DONE);
-
- /* Name: String */
- ng.ng_TopEdge += gad->Height + INTERHEIGHT;
- ng.ng_Width = 22 * Xwidth;
- ng.ng_Height = mysc->Font->ta_YSize + 6; /* 2 Border + 1 freie oben&unten */
- ng.ng_GadgetText = TXT(6);
- ng.ng_GadgetID = GAD_NAME;
- namegad = gad = CreateGadget(STRING_KIND, gad, &ng,
- GTST_MaxChars, 32,
- GTST_String, name,
- TAG_DONE);
-
- WinWidth = gad->LeftEdge + ng.ng_Width + INTERWIDTH + mysc->WBorRight;
- /* in ng.ng_Width sind auch die Ränder enthalten */
-
- /* FFS: Checkbox */
- /* Checkbox-Breite: siehe gad->Width */
- tl = mysc->WBorLeft + INTERWIDTH + TextLength( rp, TXT(7), strlen(TXT(7)) )+8;
- ng.ng_LeftEdge = tl;
- ng.ng_TopEdge += ng.ng_Height + INTERHEIGHT;
- ng.ng_Height = mysc->Font->ta_YSize;
- ng.ng_GadgetText = TXT(7);
- ng.ng_Flags = PLACETEXT_LEFT;
- ng.ng_GadgetID = GAD_FFS;
- ffsgad = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- GTCB_Checked, bffs,
- TAG_DONE);
-
- /* NoIcons: Checkbox */
- tl = TextLength( rp, TXT(8), strlen(TXT(8)) )+8;
- ng.ng_LeftEdge += gad->Width + 3*INTERWIDTH + tl;
- ng.ng_GadgetText = TXT(8);
- ng.ng_GadgetID = GAD_NOICONS;
- noiconsgad = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- GTCB_Checked, bnoicons,
- TAG_DONE);
-
- /* NoIcons: Checkbox */
- tl = TextLength( rp, TXT(9), strlen(TXT(9)) )+8;
- ng.ng_LeftEdge += gad->Width + 3*INTERWIDTH + tl;
- ng.ng_GadgetText = TXT(9);
- ng.ng_GadgetID = GAD_QUICK;
- quickgad = gad = CreateGadget(CHECKBOX_KIND, gad, &ng,
- GTCB_Checked, bquick,
- TAG_DONE);
-
- tl = gad->LeftEdge + gad->Width + INTERWIDTH + mysc->WBorRight;
- if( tl > WinWidth ) WinWidth = tl;
-
- /* OK: Button */
- ng.ng_LeftEdge = mysc->WBorLeft + INTERWIDTH;
- /* diese sollten etwas weiter entfernt sein */
- ng.ng_TopEdge += gad->Height + mysc->Font->ta_YSize;
- ng.ng_Height = mysc->Font->ta_YSize + 4;
- tl = TextLength( rp, TXT(10), strlen(TXT(10)) ) + 3*INTERWIDTH;
- /* 1*INTERWIDTH deckt die beiden Ränder ab */
- ng.ng_Width = tl;
- ng.ng_GadgetText = TXT(10);
- ng.ng_Flags = 0;
- ng.ng_GadgetID = GAD_OK;
- gad = CreateGadget(BUTTON_KIND, gad, &ng,
- TAG_DONE);
-
- /* Cancel: Button */
- tl = TextLength( rp, TXT(11), strlen(TXT(11)) ) + 3*INTERWIDTH;
- ng.ng_Width = tl;
- ng.ng_LeftEdge = WinWidth - mysc->WBorRight - INTERWIDTH - ng.ng_Width;
- ng.ng_GadgetText = TXT(11);
- ng.ng_GadgetID = GAD_CANCEL;
- gad = CreateGadget(BUTTON_KIND, gad, &ng,
- TAG_DONE);
-
- WinHeight = ng.ng_TopEdge + gad->Height + INTERHEIGHT - topborder;
- /* bei Buttons ist gad->Height korrekt (wg.3D) */
-
- return(gad);
- }
-
- /*-------------------------------------------------------------------------*/
-
- void ShowWindow( void )
- {
- if( mywin )
- {
- ScreenToFront( mywin->WScreen );
- WindowToFront( mywin );
- ActivateWindow( mywin );
- GT_SetGadgetAttrs( drivegad, mywin, NULL,
- GTCY_Active, drive,
- TAG_END );
- ActivateGadget( namegad, mywin, NULL );
- return;
- }
-
- if (!(mysc = LockPubScreen(NULL)))
- return;
-
- /* den Default-Font des Screens bestimmen */
- font = mysc->RastPort.Font;
- /* Da ich TextLength() benutzen will, brauche ich den RastPort */
- rp = &mysc->RastPort;
-
- topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
- Xwidth = TextLength(rp,"XX",2) / 2;
-
- if( !(vi = GetVisualInfo(mysc, TAG_DONE)) )
- {
- UnlockPubScreen(NULL, mysc);
- return;
- }
-
- if( !CreateAllGadgets(&glist, vi, topborder) )
- {
- FreeVisualInfo(vi);
- UnlockPubScreen(NULL, mysc);
- return;
- }
-
- /* Open the window: */
- if( !(mywin = OpenWindowTags( NULL,
- WA_Title, TXT(12),
- WA_Width, WinWidth,
- WA_InnerHeight, WinHeight,
- WA_AutoAdjust, TRUE,
- WA_PubScreen, mysc,
-
- WA_Activate, TRUE,
- WA_DragBar, TRUE,
- WA_DepthGadget, TRUE,
- WA_CloseGadget, TRUE,
- WA_SimpleRefresh, TRUE,
-
- WA_IDCMP, CLOSEWINDOW | REFRESHWINDOW |
- CYCLEIDCMP | STRINGIDCMP | CHECKBOXIDCMP,
-
- TAG_DONE)) )
- {
- FreeGadgets(glist);
- FreeVisualInfo(vi);
- UnlockPubScreen(NULL, mysc);
- return;
- }
-
- ScreenToFront( mywin->WScreen );
-
- /* AddGadgets + Intuition-Refresh + GadTools-Refresh: */
- AddGList(mywin, glist, -1, -1, NULL);
- RefreshGList(glist, mywin, NULL, -1);
- GT_RefreshWindow(mywin, NULL);
-
- windowsignal = 1 << mywin->UserPort->mp_SigBit;
- ActivateGadget( namegad, mywin, NULL );
- }
-
- void HideWindow( void )
- {
- if( mywin )
- {
- /* Stringgadget auslesen (für nächsten CreateGadgets oder DoFormat) */
- strcpy( name, ((struct StringInfo *)namegad->SpecialInfo)->Buffer );
-
- CloseWindow( mywin );
- FreeGadgets(glist);
- FreeVisualInfo(vi);
- UnlockPubScreen(NULL, mysc);
-
- mywin = 0;
- windowsignal = 0;
- }
- }
-
- /*------------------------------------------------------------------------*/
-
- void ende( int code, STRPTR error )
- {
- struct Message *msg;
- int i;
-
- /********** Hotkey-Cleanup... ***********/
-
- if(broker)
- {
- DeleteCxObjAll(broker); /* safe, even if NULL */
- broker = NULL;
- }
-
- if(cxport)
- {
- /* now that messages are shut off, clear port */
- while(msg=GetMsg(cxport)) ReplyMsg(msg);
- DeleteMsgPort(cxport);
-
- cxport = NULL;
- }
-
- ArgArrayDone();
-
- if(IconBase) CloseLibrary(IconBase);
- if(CxBase) CloseLibrary(CxBase);
-
- /************ Window-Cleanup... *************/
-
- if (mywin)
- {
- CloseWindow(mywin);
- FreeGadgets(glist);
- FreeVisualInfo(vi);
- if(mysc) UnlockPubScreen(NULL, mysc);
- }
-
- /************ Trackdisk-Cleanup... *************/
-
- for( i=0; i<=3; i++ )
- {
- if( ioexttd[i] )
- {
- CloseDevice( ioexttd[i] );
- DeleteIORequest( ioexttd[i] );
- }
- }
-
- if(tdport) DeleteMsgPort(tdport);
-
- /************ Rest... *************/
-
- if(TextSpeicher) FreeMem( TextSpeicher, *((long *)TextSpeicher) );
-
- if(GadToolsBase) CloseLibrary(GadToolsBase);
- if(IntuitionBase) CloseLibrary(IntuitionBase);
- if(GfxBase) CloseLibrary(GfxBase);
-
- if(error) Printf("Error: %s\n", error);
-
- exit(code);
- }
-
-
- /*------------------------------------------------------------------------*/
-
- void DoFormat( void )
- {
- char com[256];
- BPTR ifh=0;
-
- strcpy( com, "SYS:System/Format DRIVE " );
- strcat( com, DiskList[drive] );
- strcat( com, " NAME \"" );
- strcat( com, name );
- strcat( com, "\"" );
- if( bffs ) strcat( com, " FFS" );
- if( bnoicons ) strcat( com, " NOICONS" );
- if( bquick ) strcat( com, " QUICK" );
-
- if( ifh = Open(TXT(13),MODE_NEWFILE) )
- {
- CSystem( com,
- SYS_Input, ifh, /* wird auch als Output benutzt (s.Execute()) */
- /*SYS_Output, 0,*/
- SYS_Asynch, TRUE,
- TAG_END );
-
- /* in dostags.h steht, daß input/output nach Asynchronem Lauf
- * autom. geschlossen werden
- * Achtung! Wenn Output() vorhanden ist, wird der benutzt und
- * hinterher geschlossen --> Absturz!
- */
- }
- }
-
- /*------------------------------------------------------------------------*/
-
- void handleCxMsg( struct Message *msg )
- {
- ULONG msgid;
- ULONG msgtype;
- int d;
-
- msgid = CxMsgID( msg );
- msgtype = CxMsgType( msg );
-
- ReplyMsg( msg );
-
- switch( msgtype )
- {
- case CXM_IEVENT:
- switch(msgid)
- {
- case POP_KEY_ID:
-
- ShowWindow();
- break;
-
- case CX_DISK_ID:
-
- Delay( 50 ); /* Workbench soll erst ran */
-
- d = GetBADNum();
-
- if( d >= 0 )
- {
- if( EasyRequest( NULL, &formatreq, NULL, DiskName[d] ) )
- {
- for( drive=0; drive<=3 && DiskList[drive]; drive++ )
- if( strcmp(DiskList[drive],DiskName[d])==0 )
- break;
- if( !DiskList[drive] )
- drive=0;
-
- ShowWindow();
- }
- }
-
- break;
- }
- break;
-
- case CXM_COMMAND:
- switch(msgid)
- {
- case CXCMD_DISABLE:
- ActivateCxObj(broker,0L);
- break;
- case CXCMD_ENABLE:
- ActivateCxObj(broker,1L);
- break;
-
- case CXCMD_UNIQUE: /* Someone has tried to run us again */
- case CXCMD_APPEAR: /* Time to pop up the window */
- /* If someone tries to run us a second time the second copy
- * of the program will fail and we will be sent a
- * CXCMD_UNIQUE message. If we support a window then we
- * Make our window appear since that is what the user wanted.
- * If we do not support a window then we kill the currently
- * running version 'this one' so that things like autopoint
- * can be toggled on/off by running them a second time.
- */
- ShowWindow();
- break; /* the window */
- case CXCMD_DISAPPEAR:
- HideWindow();
- break;
-
- case CXCMD_KILL:
- ende(0,0);
- break;
- }
- break;
- }
- }
-
- void handleWinMsg( void )
- {
- struct IntuiMessage *imsg;
- struct Gadget *gad;
- ULONG imsgClass;
- UWORD imsgCode;
-
- while( imsg = GT_GetIMsg(mywin->UserPort) )
- {
- imsgClass = imsg->Class;
- imsgCode = imsg->Code;
- /* Gadget vorrausgesetzt natürlich, macht aber nix... */
- gad = (struct Gadget *)imsg->IAddress;
- GT_ReplyIMsg(imsg);
-
- switch (imsgClass)
- {
- case GADGETUP:
- case GADGETDOWN:
- switch (gad->GadgetID)
- {
- case GAD_DRIVE:
- drive = imsgCode;
- break;
- case GAD_NAME:
- strcpy( name, ((struct StringInfo *)gad->SpecialInfo)->Buffer );
- break;
- case GAD_FFS:
- bffs = gad->Flags & SELECTED;
- break;
- case GAD_NOICONS:
- bnoicons = gad->Flags & SELECTED;
- break;
- case GAD_QUICK:
- bquick = gad->Flags & SELECTED;
- break;
-
- case GAD_OK:
- HideWindow();
- DoFormat();
- return;
- break;
- case GAD_CANCEL:
- HideWindow();
- return;
- break;
- }
- ActivateGadget( namegad, mywin, NULL );
- break;
-
- case REFRESHWINDOW:
- GT_BeginRefresh(mywin);
- GT_EndRefresh(mywin, TRUE);
- break;
-
- case CLOSEWINDOW:
- if( EasyRequest(NULL, &quitreq, NULL, NULL) )
- {
- ende(0,0);
- }
- else
- {
- HideWindow();
- return;
- }
- break;
- }
- }
- }
-
- /*------------------------------------------------------------------------*/
- /*------------------------------------------------------------------------*/
- /*------------------------------------------------------------------------*/
-
- void main( int argc, char *argv[] )
- {
- ULONG sigrcvd;
- struct Message *msg;
-
- InitAll( argc, argv );
-
- do
- {
- /* auf eine Msg warten */
- sigrcvd = Wait ( SIGBREAKF_CTRL_E | cxsigflag | windowsignal );
-
- /* Commodities-Konvention: ETK ("easy to kill") */
- if( sigrcvd & SIGBREAKF_CTRL_E )
- ende(0,0);
-
- /* Fenster... */
- if( sigrcvd & windowsignal )
- handleWinMsg();
-
- /* Msg vom Broker... */
- while(cxport && (msg=GetMsg(cxport)))
- handleCxMsg(msg);
-
- } while( 1 );
- }
-