home *** CD-ROM | disk | FTP | other *** search
- /*
- ***************************************************************************
- *
- * Datei:
- * RSys.c
- *
- * Inhalt:
- * void About(void);
- * void HandleMainPort(void);
- * void main(int argc, char **argv);
- *
- * Bemerkungen:
- * Hauptprogramm und Handling-Routinen von RSys.
- *
- * Erstellungsdatum:
- * 07-Jan-93 Rolf Böhme
- *
- * Änderungen:
- * 07-Jan-93 Rolf Böhme Erstellung
- *
- ***************************************************************************
- */
-
- #include "RSysDebug.h"
- #include "RSysFunc.h"
-
- #define CTRLKEYS (AMIGAKEYS | IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT | \
- IEQUALIFIER_CAPSLOCK | IEQUALIFIER_CONTROL | IEQUALIFIER_LALT | IEQUALIFIER_RALT |\
- IEQUALIFIER_NUMERICPAD)
-
- /*
- * Der Kennstring, der von dem DOS-Befehl Version
- * gefunden wird
- */
- const char *v =
- "\0$VER: " NAME " " VERSION " (" DATE " " TIME ") " COPYRIGHT " \n";
-
- /*#define BETA 1*/
-
- /*
- * Die Prozedur About() gibt eine Kurzinformation zum
- * Programm RSys aus
- */
- void
- About(void)
- {
-
- UBYTE info[]= (UBYTE *)
- "\n»»»»»»»»»»»» " NAME " " VERSION " ««««««««««««\n\n "
- " The Program was written by\n\n"
- " Rolf Böhme\n"
- " Stammestr. 48\n"
- " 3000 Hannover 91\n"
- " Germany\n"
- " Z-NET: R.BOEHME@COPS.ZER\n"
- " FIDO: 2:245/44.2 (Rolf Boehme)\n\n"
- #ifdef BETA
- " !This is a BETA-RELEASE!\n"
- " Please do not redistribute!\n"
- #endif
- " It's placed in Public Domain\n"
- " under the terms of Giftware!\n"
- "Please send small donations, gifts\n"
- " or other little sweeties to me!!\n";
-
- DPOS;
-
- MyEasyRequest(SysWnd, (UBYTE *) NAME " Info (" DATE ", " TIME ")",
- (UBYTE *) "Continue", info);
- return;
- }
-
- /*
- * Die Prozedur Jump() sucht den nächsten
- * PublicScreen in der Systemliste, holt ihn nach
- * vorn und öffnet auf ihm das RSys-Hauptfenster
- */
- static void
- Jump(void)
- {
- struct Screen *NewScr = NULL;
- struct List *PSList = NULL;
- struct Node *Node = NULL;
- extern struct Screen *lastpubscreen;
-
- /*
- * Sperren der Systemliste aller PubScreens
- */
- PSList = LockPubScreenList();
-
- /*
- * Aktuellen Knoten finden, also den Screen auf dem sich
- * RSys im Moment befindet
- */
- Forbid();
- Node = FindName(PSList, namebuffer);
- Permit();
-
- if (NOT(Node))
- {
- UnlockPubScreenList();
- ErrorHandle(SCREEN_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- while (Node)
- {
- /*
- * Falls der gefundene PubScreen der letzte im System ist,
- * wird dieser gelocked
- */
- if (NOT(Node->ln_Succ))
- {
- Node = PSList->lh_Head;
- strcpy((char *)namebuffer, Node->ln_Name);
- NewScr = LockPubScreen(namebuffer);
-
- break;
- }
- else
- if (NewScr = LockPubScreen((UBYTE *)Node->ln_Succ->ln_Name))
- {
- strcpy((char *)namebuffer, Node->ln_Succ->ln_Name);
- break;
- }
-
- /*
- * Falls der Nachfolger-PubScreen nicht gesperrt werden konnte,
- * wird der nächste gesucht.
- */
- Node = Node->ln_Succ;
- }
-
- UnlockPubScreen(NULL, NewScr);
-
- UnlockPubScreenList();
-
- if (NewScr != lastpubscreen)
- {
- ScreenToFront(NewScr);
-
- CloseASysWindow(&SysWnd, &SysGList, &SysMenus);
- CloseDownScreen();
-
- if (!SetupScreen())
- OpenASysWindow(OpenSysWindow, KILL);
- else
- ErrorHandle(SCREEN_ERR, INFO_FAIL, KILL);
-
- RefreshList(LastID);
- }
- else
- ErrorHandle(SCREEN_ERR, FIND_FAIL, NO_KILL);
-
- return;
- }
-
- /*
- * Die Funktion position() gibt für die
- * Gadget-Tastatturabfrage die Position des Zeichens
- * ch in der Zeichenkette itemcode[] zurück
- */
- static int
- position(int ch)
- {
- char *itemcode = "TLMPVAFRIWSHYD J";
-
- /*
- * Die Position des Zeichens errechnet sich aus der
- * Differenz der Zeiger auf das gefundene Zeichen und
- * dem auf die Zeichenkette itemcode
- */
- int pos = (int)(strchr(itemcode, (int)ToUpper((ULONG) ch)) - itemcode);
-
- return ((pos < 0) ? ~0 : pos);
- }
-
- /*
- * Dieses Template wird von der Funktion ReadArgs()
- * verwendet, um die Argumente auf der Kommandozeile
- * zu parsen. Es erscheint auch, wenn man das
- * Programm RSys mit dem Parameter "?" aufruft
- */
- #define TEMPLATE \
- (UBYTE *)"T=TASKS/S,L=LIBRARIES/S,M=MEMORY/S,P=PORTS/S,V=VOLUMES/S,\
- A=ASSIGNS/S,F=FONTS/S,R=RESOURCES/S,I=INTERRUPTS/S,W=WINDOWS/S,\
- S=SCREENS/S,H=INPUTHDL/S"
-
- /*
- * In diesem Feld stehen nach dem Aufruf die
- * erwarteten Parameter. Im Falle der verwendeten
- * Schalter steht im entsprechenden Feld opts[i] ein
- * TRUE oder FALSE, jenachdem, ob der Schalter beim
- * Aufruf angegeben wurde oder nicht
- */
- LONG opts[COUNT_FLAGS];
-
- /*
- * Diese Funktion parst die Kommandozeile und gibt
- * die Nummer des entsprechenden Schalters zurück.
- * Defaultmäßig wird 12 (Systeminfo) zurückgegeben
- */
- static int
- HandleArguments(char **str)
- {
- int ret = 12,
- j;
- struct RDArgs *argsptr;
-
- /*
- * Die Kommandozeile wird geparst. Falls ein Fehler
- * beim Parsen auftrat, wird das Programm mit einer
- * Fehlermeldung verlassen
- */
- if ((argsptr = ReadArgs(TEMPLATE, opts, NULL)) == NULL)
- {
- ErrorHandle(TASK_ERR, WRONG_FAIL, KILL);
- return (ret);
- }
- else
- {
- /*
- * Das Feld opts[] wird durchsucht, ob ein Flag
- * gesetzt wurde. Falls eine gesetzte Option gefunden
- * wurde, wird die Schleife abgebrochen und der
- * entsprechende Rückgabewert gesetzt
- */
- for (j = 0; j < COUNT_FLAGS; j++)
- if (opts[j])
- {
- ret = j;
- break;
- }
-
- /*
- * Die Funktion ReadArgs() reserviert intern
- * Speicherplatz für die Kommandoargumente. Dieser
- * Platz muß dem System mit der Prozedur FreeArgs()
- * zurückgegeben werden
- */
- FreeArgs(argsptr);
- }
-
- return (ret);
- }
-
- /*
- * Die Procedure HandleIDPort() wird aufgerufen, wenn RSys
- * ein zweites Mal gestartet wird. Wird dabei ein Parameter
- * übergeben, so wird dieser mit dem Message-System des
- * AmigaDOS an den ID-Port des bereitsgestarteten Programms
- * versendet und hier ausgewertet. Die Struktur SysMsg
- * enthält neben der Standard-System-Message noch die ID
- * der anzuzeigenden Liste.
- */
- static void
- HandleIDPort(void)
- {
- SysMsg *arrived_mess;
- int ID;
-
- /*
- * Es werden alle Nachrichten ausgewertet, solange, bis
- * die Message-Queue leer ist. Die jeweils zuletzt
- * ermittelte ID wird gemerkt.
- */
- while (arrived_mess = (SysMsg *) GetMsg(SysIdPort))
- {
- ID = arrived_mess->sm_newtype;
- ReplyMsg((struct Message *) arrived_mess);
- }
-
- /*
- * Falls das RSys-Hauptfenster mit dem Zip-Gadget auf
- * eine kleine Fenstergröße gebracht wurde, wird es
- * jetzt nach vorne geholt und auf normale Größe
- * gebracht.
- */
- if (SysWnd->Flags & WFLG_ZOOMED)
- {
- WindowToFront(SysWnd);
- ZipWindow(SysWnd);
- }
-
- /*
- * In jedem Fall wird das RSys-Hauptfenster aktiviert.
- */
- ActivateWindow(SysWnd);
-
- /*
- * Ist die erhaltene Nachricht von einem zweiten
- * RSys-Aufruf ohne Parameter abgesendet worden, steht
- * das ID-Feld der SysMsg-Struktur auf SYSTEMINFO.
- * Falls ein Parameter angegeben wurde, wird die
- * Anzeigeliste mit dem neuen Parameter aktualisiert
- * und in der globalen Variablen LastID gemerkt.
- */
- if (ID != SYSTEMINFO)
- RefreshList(LastID = ID);
-
- /*
- * Während der ID-Port abgefrag wird, kann das
- * Hauptfenster Nachrichten empfangen haben. Diese
- * sollen nach dem Empfang der Nachricht vom zweiten
- * Programmaufruf nicht ausgewertet werden. Deshalb
- * werden jetzt die evtl. vorhandenen Nachrichten des
- * Hauptfenster-Ports gelöscht.
- */
- ClearIntuiMsgPort(SysWnd);
-
- return;
- }
-
- static void
- SetMainLVTop(int top)
- {
- GT_SetGadgetAttrs(SysGadgets[GD_ListeLV], SysWnd,
- NULL,
- GTLV_Top, top,
- TAG_DONE);
- }
-
- /* Folding
- * Die Procedure HandleRawKeys() wertet die
- * Tastatureingaben des Hauptfensters aus. Dazu wird
- * das Feld IntuiMessage->Code verwendet.
- */
- static void
- HandleRawKeys(ULONG code)
- {
- /*
- * Es werden bei einem Tastatur-Event zwei Messages
- * an den Hauptfenster-Port versendet, wenn die Taste
- * gedrückt und dann, wenn sie losgelassen wurde.
- * Hier sollen nur die Events ausgewertet werden, die
- * direkt nach dem Drücken einer Taste anliegen.
- */
- if (code & IECODE_UP_PREFIX)
- return;
-
- switch (code)
- {
- /*
- * Falls die Help-Taste gedrückt wurde, wird eine
- * kleine Hilfe-Datei geladen, in denen die
- * wichtigsten Punkte von RSys erklärt werden.
- */
- case KEY_HELP:
- Help();
- break;
-
- /*
- * Falls die "Cursor-Down"-Taste gedrückt wurde, wird
- * der oberste Eintrag des ListViews aktualisiert und
- * auf den nächsten Eintrag gesetzt, falls es nicht
- * schon der letzte oberste Eintrag war. Der globale
- * Zähler topentry wird dann um eins erhöht.
- */
- case CURSORDOWN:
- if (topentry < (countentries - MAXSHOW))
- {
- topentry++;
- SetMainLVTop(topentry);
- }
- break;
-
- /*
- * Falls die "Cursor-Up"-Taste gedrückt wurde, wird
- * der oberste Eintrag des ListViews aktualisiert und
- * auf den vorherigen Eintrag gesetzt, falls es nicht
- * schon der erste Eintrag der Liste war. Der globale
- * Zähler topentry wird dann um eins erniedrigt.
- */
- case CURSORUP:
- if (topentry > 0)
- {
- topentry--;
- SetMainLVTop(topentry);
- }
- break;
-
- /*
- * Das ListView zeigt den Anfang der Liste. Der
- * Zähler topentry wird auf Null gesetzt.
- */
- case CURSORLEFT:
- if (topentry != 0)
- {
- topentry = 0;
- SetMainLVTop(topentry);
- }
- break;
-
- /*
- * Das ListView zeigt das Endeder Liste. Der
- * Zähler topentry wird auf den Eintrag mit der
- * Nummer (Anzahl der Einträge - Anzahl der
- * sichtbaren Einträge) gesetzt.
- */
- case CURSORRIGHT:
- if (topentry != (countentries - MAXSHOW))
- {
- topentry = (countentries - MAXSHOW);
- SetMainLVTop(topentry);
- }
- break;
-
- /*
- * Alle anderen Tastendrücke werden nicht
- * ausgewertet. Es erscheint im Message-Feld des
- * Hauptfensters lediglich die Nachricht, das die
- * Taste RSys unbekannt ist. Nach einer kurzen
- * Wartezeit wird das Message-Feld dann wieder
- * aktualisiert.
- */
- default:
- PrintInfo("Key not known!", SPEAK, SEC);
- PrintStatistics();
- break;
- }
-
- return;
- }
-
- /*
- * Die Funktion SelectGadget() simuliert den
- * Gadget-Down-Klick eines Boolean-Gadgets.
- */
- static void
- SelectGadget(struct Gadget *Gadget)
- {
- UWORD oldpos;
-
- /*
- * Dazu wird das Gadget aus der Gadget-Liste
- * entfernt, das SELECTED-Flag gesetzt und das Gadget
- * wieder an der gleichen Position in die Liste
- * eingehängt.
- */
- oldpos = RemoveGadget(SysWnd, Gadget);
- Gadget->Flags |= GFLG_SELECTED;
- AddGadget(SysWnd, Gadget, (ULONG) oldpos);
-
- /*
- * Nun wird das Gadget wieder aktualisiert und ein
- * wenig gewartet.
- */
- RefreshGList(Gadget, SysWnd, NULL, 1);
-
- Delay(5);
-
- return;
- }
-
- /*
- * Die Funktion UnSelectGadget() simuliert den
- * Gadget-Up-Klick eines Boolean-Gadgets.
- */
- static void
- UnSelectGadget(struct Gadget *Gadget)
- {
- UWORD oldpos;
-
- /*
- * Dazu wird das Gadget aus der Gadget-Liste
- * entfernt, das SELECTED-Flag entfernt und das
- * Gadget wieder an der gleichen Position in die
- * Liste eingehängt.
- */
- oldpos = RemoveGadget(SysWnd, Gadget);
- Gadget->Flags &= ~GFLG_SELECTED;
- AddGadget(SysWnd, Gadget, (ULONG) oldpos);
-
- /*
- * Nun wird das Gadget wieder aktualisiert.
- */
- RefreshGList(Gadget, SysWnd, NULL, 1);
-
- return;
- }
-
- /*
- * Die Procedure HandleVanillaKeys() wertet die
- * Tastatureingaben des Hauptfensters aus. Dazu wird
- * das Feld IntuiMessage->Code verwendet.
- */
- static void
- HandleVanillaKeys(ULONG code)
- {
- int ID;
-
- /*
- * Wurde die Esc-Taste gedrückt, werden zwei Fälle
- * unterschieden. Wurde RSys von der WB gestartet,
- * geht RSys in den AppIcon-Modus, wurde es von einem
- * CLI gestartet, wird RSys beendet, indem das globale
- * Flag Flags.quit_flag gesetzt wird.
- */
- if ((char)code == ESC)
- {
- if (Flags.wb_start)
- Iconify();
- else
- Flags.quit_flag = 1;
-
- return;
- }
-
- /*
- * Wurde RSys mit dem Zip-Gadget verkleinert, werden
- * keine Vanillakeys ausgewertet.
- */
- if (SysWnd->Flags & WFLG_ZOOMED)
- return;
-
- /*
- * Wurde die Leertaste betätigt, erscheint die
- * Hilfe-Datei im ListView.
- */
- if ((char)code == ' ')
- {
- Help();
- return;
- }
-
- /*
- * Nun wird die Listen-ID aus dem Code des Gadgets
- * ermittelt, dessen entsprechende Taste gedrückt
- * wurde.
- */
- ID = position((int)code);
-
- /*
- * Entspricht die ID einer Gadget-ID, wird das
- * entsprechende Gadget aktiviert und die
- * entsprechende Aktion ausgeführt. Dabei wird die
- * ID des aktuellen ListView-Inhalts in LastID
- * gemerkt.
- */
- if ((ID < GD_SaveListGad) && (ID != ~0))
- {
- LastID = ID;
-
- SelectGadget(SysGadgets[LastID]);
- UnSelectGadget(SysGadgets[LastID]);
-
- RefreshList(ID);
-
- return;
- }
-
- /*
- * Wurde das Jump-Gadget aktiviert, schließt RSys sein
- * Hauptfenster und öffnet es auf dem vordersten
- * PublicScreen.
- */
- if (ID == GD_JumpGad)
- {
- Jump();
- return;
- }
-
- /*
- * Kommt das Programm bis hierhin, konnte der
- * Tastenklick nicht erkannt werden. Es erfolgt eine
- * entsprechende Nachricht im Message-Feld von RSys.
- */
- PrintInfo("Key not known!", SPEAK, SEC);
- PrintStatistics();
-
- return;
- }
-
- /*
- * Die Prozedur HandleGadgets() verarbeitet die
- * Gadgetevents. Zu einem Parameter gad wird die
- * entsprechende Aktion ausgelöst.
- */
- static void
- HandleGadgets(struct Gadget *gad)
- {
- char fileout[MAXFULLNAME];
- int ID = (int)gad->GadgetID;
-
- /*
- * Falls die ListView-Liste abgespeichert werden
- * soll, wird ein Asl-Requester angeboten und die
- * Liste in eine ausgewählte Datei als Textdatei
- * weggeschrieben.
- */
- if (ID == GD_SaveListGad)
- {
- sprintf(fileout, "RSys-%s.dat", EntryAttr[LastID].ea_type);
-
- if (GetFile(SysWnd, "RAM:", fileout, "#?.dat",
- "Select File for saving list", "Save"))
- SaveList(SysWnd, (char *)_fullpath,
- EntryAttr[LastID].ea_type, &ListeLVList, TRUE);
-
- return;
- }
-
- /*
- * Handelt es sich um die anderen Gadgets, wird
- * entsprechend der GadgetID das ListView
- * aktualisiert.
- */
- if (ID < GD_SaveListGad)
- {
- LastID = ID;
- RefreshList(ID);
- return;
- }
-
- /*
- * Wurde das Jump-Gadget aktiviert, schließt RSys sein
- * Hauptfenster und öffnet es auf dem vordersten
- * PublicScreen.
- */
- if (ID == GD_JumpGad)
- Jump();
-
- return;
- }
-
- /*
- * Die Prozedur HandleMenu() verwaltet die
- * Menu-Eingaben.
- */
- static void
- HandleMenu(ULONG code)
- {
- struct MenuItem *item;
- USHORT nextcode = (USHORT) code;
- void (*fptr) (void);
- extern int ReopenWindow;
-
- ReopenWindow = FALSE;
-
- DPOS;
-
- /*
- * Falls ein Menüpunkt ausgewählt wurde, wird das
- * entsprechende Menü-Item ermittelt. Aus dem
- * UserData-Feld dieses Menüpunktes erhält man
- * schließlich einen Zeiger auf die Funktion, die
- * ausgeführt werden soll.
- * Erweiterung: Werden mehrere Menüpunkte hintereinander
- * angewählt, ohne das Menü zu desaktivieren, werden
- * auch alle ausgewählt.
- */
- while (nextcode != MENUNULL && !ReopenWindow)
- {
- if ((item = ItemAddress(SysMenus, (long)nextcode)) != NULL)
- {
- /*
- * Falls das UserData-Feld initialisiert wurde, wird
- * der dort eingetragene Zeiger als Zeiger auf eine
- * auszuführende Funktion genommen und ausgeführt.
- */
- if (fptr = GTMENUITEM_USERDATA(item))
- (*fptr) ();
- }
- else
- break;
-
- nextcode = item->NextSelect;
- }
-
- DPOS;
-
- return;
- }
-
- /*
- * HandleMainPort() bearbeitet die Nachrichten vom RSys-
- * Hauptfenster und ruft die entsprechenden Unter-
- * programme auf
- */
- void
- HandleMainPort(void)
- {
- register struct IntuiMessage *message;
- ULONG class,
- code,
- qualifier;
- APTR object;
- static int refr = TRUE;
-
- while ((message = (struct IntuiMessage *)
- GT_GetIMsg(SysWnd->UserPort)) != NULL)
- {
- /*
- * Die wichtigsten Daten werden aus der erhaltenen
- * Nachricht kopiert.
- */
- object = message->IAddress;
- class = message->Class;
- code = message->Code;
- qualifier = message->Qualifier;
-
- /*
- * Die Nachricht wird sofort beantwortet, damit
- * Intuition nicht länger als notwendig auf eine
- * Antwort wartet.
- */
- GT_ReplyIMsg(message);
-
- /*
- * Entsprechend der Art (der Klasse) der Nachricht
- * werden die Aktionen ausgeführt.
- */
- switch (class)
- {
- /*
- * Ist die Volumes-Liste im ListView aktiv und wurde
- * ein Diskettenwechsel in den Laufwerken erkannt,
- * wird die Liste automatisch aktualisiert.
- */
- case IDCMP_DISKINSERTED:
- case IDCMP_DISKREMOVED:
- if (LastID == VOLUMES)
- RefreshList(LastID);
-
- break;
-
- /*
- * Wurde eine Taste gedrückt, wird eine entsprechende
- * Aktion gestartet. Falls ein Qualifier (also einer
- * der Shift-, Amiga- und Control-Tasten oder eine
- * Kombination von diesen) erkannt wurde, wird keine
- * Aktion gestartet.
- */
- case IDCMP_VANILLAKEY:
- if (NOT(qualifier & CTRLKEYS))
- HandleVanillaKeys(code);
- break;
-
- /*
- * Wurde eine Taste oder Sondertaste gedrückt, wird
- * eine entsprechende Aktion gestartet. Falls ein
- * Qualifier (also einer der Shift-, Amiga- und
- * Control-Tasten oder eine Kombination von diesen)
- * erkannt wurde, wird keine Aktion gestartet.
- */
- case RAWKEY:
- if (NOT(qualifier & CTRLKEYS))
- HandleRawKeys(code);
- break;
-
- /*
- * Wird ein Gadget auf dem Hauptfenster angeklickt,
- * wird eine entsprechende Aktion gestartet. Wurde
- * das ListView angeklickt, wird versucht, den
- * Eintrag zu modifizieren.
- */
- case IDCMP_GADGETUP:
- if (((struct Gadget *) object)->GadgetID == GD_ListeLV)
- ModifyObject(LastID, code);
- else
- HandleGadgets((struct Gadget *) object);
- break;
-
- /*
- * Wird das Hauptfenster gezipt, wird der Inhalt des
- * Fensters und das Hintergrundmuster erneuert.
- */
- case IDCMP_CHANGEWINDOW:
- if (NOT(SysWnd->Flags & WFLG_ZOOMED))
- {
- /*
- * Das Fenster soll nur EINMAL refreshed werden.
- * Diese IDCMP-Message kommt aber auch dann, wenn ein
- * Fenster verschoben wurde, weshalb ein Flag extra
- * eingeführt wurde.
- */
- if (NOT(refr))
- {
- RefreshMainWindowPattern();
-
- refr = TRUE;
-
- if (Flags.autofront)
- {
- WindowToFront(SysWnd);
- ActivateWindow(SysWnd);
- }
- }
- }
- else
- refr = FALSE;
- break;
-
- /*
- * Ein Menüpunkt wurde ausgewählt.
- */
- case MENUPICK:
- HandleMenu(code);
- break;
-
- /*
- * Das Closegadget des Hauptfensters wurde geklickt.
- * Nach einer Sicherheitsabfrage wird das Programm
- * beendet.
- */
- case IDCMP_CLOSEWINDOW:
- quit(TRUE);
- break;
- }
- }
-
- return;
- }
-
- /*
- * Das Hauptprogramm. Hier werden alle
- * Intuition-Events abgeholt und die entsprechenden
- * Auswerteprozeduren aufgerufen.
- */
- void
- main(int argc, char **argv)
- {
- ULONG mask;
-
- DPOS;
-
- /*
- * Das Flag, daß die Beendung des Programms
- * signalisiert wird initialisiert.
- */
- Flags.quit_flag = 0;
-
- InstallTrapHandlers();
-
- /*
- * Falls RSys vom CLI aus gestartet wurde, erscheint
- * eine kleine Infozeile im CLI. Dann wird die
- * globale Variable Flags.wb_start auf FALSE gesetzt, da
- * das Programm in diesem Fall nicht von der WB aus
- * gestartet wurde.
- */
- if (argc)
- {
- PutStr((UBYTE *) & v[7]);
- Flags.wb_start = FALSE;
- }
-
- /*
- * Falls bei einem CLI-Aufruf Parameter mit angegeben
- * wurden, werden diese ausgewertet.
- */
- if (argc >= 2)
- LastID = HandleArguments(argv);
-
- /*
- * Es wird festgestellt, ob das Programm bereits
- * gestartet wurde. Wurde es bereits gestartet, wird
- * das Programm beendet. Dabei werden die evtl.
- * angegebenen und verarbeiteten Parameter an das
- * bereits laufende Programm verschickt.
- */
- if (SysStarted(LastID))
- CloseAll();
-
- /*
- * Alle notwendigen Ressourcen (Libraries, RSys-Ports
- * etc.) werden eröffnet und bereitgestellt.
- */
- OpenLibs();
-
- /*
- * Der ID-Port wird erzeugt. An der Existenz dieses
- * Ports kann bei einem zweiten Aufruf des Programms
- * festgestellt werden, ob RSys bereits gestartet
- * wurde.
- */
- if (!(SysIdPort = CreatePort(ID_PORT_NAME, 0)))
- ErrorHandle(PORT_ERR, CREATE_FAIL, KILL);
-
- /*
- * Das ListView wird initialisiert.
- */
- NewList(&ListeLVList);
-
- /*
- * Falls der Aufruf von der WB aus geschah, wird RSys
- * "iconifiziert", d.h. ein AppIcon wird auf der
- * WB erzeugt. Andernfalls wird das Hauptfenster
- * geöffnet und entsprechend der Nummer LastID das
- * ListView aktualisiert.
- */
- if (argc == 0)
- Iconify();
- else
- {
- OpenMainWindow();
- RefreshList(LastID);
- }
-
- /*
- * Schleifenbeginn. Solange, bis ein
- * Abbruchkriterium erkannt wurde (Flags.quit_flag ist
- * TRUE), wird auf das Setzen der entsprechenden
- * Flags gewartet.
- */
- do
- {
- /*
- * Warten auf folgende Events:
- * - ^C wurde eingegeben
- * - Events vom Hauptfenster
- * - Events vom ID-Port
- * - Events vom Broker-Port.
- */
- mask = Wait(SIGBREAKF_CTRL_C |
- (1L << SysWnd->UserPort->mp_SigBit) |
- (1L << SysIdPort->mp_SigBit) |
- (1L << broker_mp->mp_SigBit));
-
- /*
- * Falls ein ^C eingegeben wurde, wird das
- * Programmbeendigungsflag gesetzt.
- */
- if (mask & SIGBREAKF_CTRL_C)
- Flags.quit_flag = 1;
-
- /*
- * Wenn das Programm ein zweitesmal aufgerufen wird,
- * erhält der ID-Port eine Nachricht.
- */
- if (mask & (1L << SysIdPort->mp_SigBit))
- HandleIDPort();
-
- /*
- * Falls von dem System-Programm Exchange ein Signal
- * gesendet wurde, wird es hier verarbeitet.
- */
- if (mask & (1L << broker_mp->mp_SigBit))
- HandleBrokerPort();
-
- /*
- * Falls das Hauptfenster ein Signal erhalten hat,
- * werden die Daten der Nachricht(en) gemerkt und
- * weiterverarbeitet.
- */
- if (mask & (1L << SysWnd->UserPort->mp_SigBit))
- HandleMainPort();
- }
- /*
- * Das Programm läuft solange, bis das Flags.quit_flag
- * gesetzt wurde.
- */
- while (NOT((Flags.quit_flag)));
-
- /*
- * Die geöffneten Resourcen werden geschlossen und
- * das Programm beendet.
- */
- CloseAll();
- }
-