home *** CD-ROM | disk | FTP | other *** search
- /*
- ***************************************************************************
- *
- * Datei:
- * RSys.c
- *
- * Inhalt:
- *
- * --- Globale Routinen ---
- *
- * void About ( void );
- * void HandleMainPort ( void );
- * void main ( int argc , char **argv );
- *
- * --- Lokale Routinen ---
- *
- * static int HandleArguments ( char **str );
- * static int position ( int ch );
- * static void HandleGadgets ( struct Gadget *gad );
- * static void HandleIDPort ( void );
- * static void HandleMenu ( ULONG code );
- * static void HandleRawKeys ( ULONG code , ULONG qualifier );
- * static void HandleVanillaKeys ( ULONG code , ULONG qualifier );
- * static void Jump ( void );
- * static void SelectGadget ( struct Gadget *Gadget );
- * static void SetMainLVTop ( int top );
- * static void UnSelectGadget ( struct Gadget *Gadget );
- *
- * Bemerkungen:
- * Hauptprogramm und Handling-Routinen von RSys.
- *
- * Erstellungsdatum:
- * 07-Jan-93 Rolf Böhme
- *
- * Änderungen:
- * 07-Jan-93 Rolf Böhme Erstellung
- *
- ***************************************************************************
- */
-
- #include "RSys.h"
-
- /*#define BETA 1*/
-
- /*
- * Der Kennstring, der von dem DOS-Befehl Version
- * gefunden wird
- */
- const char *v = "\0$VER: " NAME " " VERSION " (" DATE " " TIME ") " COPYRIGHT " \n";
-
- /*
- * 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"
- " 30459 Hannover 91\n"
- " Germany\n"
- " Z-NET: R.BOEHME@COPS.ZER\n"
- " FIDO: 2:241/37.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;
-
- HandleHelp(MN_About);
-
- 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;
- char savenamebuffer[MAXPUBSCREENNAME + 1];
- int openit;
-
- strcpy(savenamebuffer, (char *)namebuffer);
- /*
- * 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((char *)namebuffer, SCREEN_ERR, FIND_FAIL, NO_KILL);
- }
- else
- {
- 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();
-
- OpenMainWindow();
- RefreshList(LastID);
-
- openit = CloseHelpOnScreen();
- OpenHelpOnScreen(openit);
-
- ClearIntuiMsgPort(SysWnd);
- }
- else
- {
- strcpy((char *)namebuffer, savenamebuffer);
- ErrorHandle("No more Public Screens", 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);
- }
-
- /*
- * 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("TemplateError", TASK_ERR, WRONG_FAIL, KILL);
- 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 Prozedur 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.
- */
- 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 abgefragt 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;
- }
-
- void
- SetMainLVTop(int top)
- {
- GT_SetGadgetAttrs(SysGadgets[GD_ListeLV], SysWnd,
- NULL,
- GTLV_Top, top,
- TAG_DONE);
-
- return;
- }
-
- /*
- * Die Procedure HandleRawKeys() wertet die
- * Tastatureingaben des Hauptfensters aus. Dazu wird
- * das Feld IntuiMessage->Code verwendet.
- */
- static void
- HandleRawKeys(ULONG code, ULONG qualifier)
- {
- /*
- * 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;
- if(qualifier & CTRLKEYS) return;
-
- switch (code)
- {
- /*
- * 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 - newlvh))
- {
- topentry++;
- SetMainLVTop(topentry);
-
- actualfindnode = GetNode(&ListeLVList, topentry);
- actualfindnodenum = 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);
-
- actualfindnode = GetNode(&ListeLVList, topentry);
- actualfindnodenum = 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);
-
- actualfindnode = GetNode(&ListeLVList, topentry);
- actualfindnodenum = topentry;
- }
- break;
-
- /*
- * Das ListView zeigt das Ende der 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 - newlvh))
- {
- topentry = (countentries - newlvh);
- SetMainLVTop(topentry);
-
- actualfindnode = GetNode(&ListeLVList, topentry);
- actualfindnodenum = topentry;
- }
- break;
-
- default:
- /* 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);
-
- 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, ULONG qualifier)
- {
- int ID;
-
- if (qualifier & CTRLKEYS) return;
-
- /*
- * 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 && !Flags.wb_start)
- {
- Flags.quit_flag = 1;
- return;
- }
-
- /*
- * Wurde RSys mit dem Zip-Gadget verkleinert, werden
- * keine Vanillakeys ausgewertet.
- */
- if (SysWnd->Flags & WFLG_ZOOMED) return;
-
- if((char)ToUpper(code) == 'N')
- {
- SelectGadget(SysGadgets[GD_NewGad]);
- RefreshList(LastID);
- UnSelectGadget(SysGadgets[GD_NewGad]);
- 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))
- {
- HandleHelp((enum RSysNumbers)ID);
-
- LastID = ID;
-
- SelectGadget(SysGadgets[LastID]);
- RefreshList(ID);
- UnSelectGadget(SysGadgets[LastID]);
-
- 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.
- */
- 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;
-
- HandleHelp((enum RSysNumbers)ID);
-
- if(ID == GD_NewGad)
- {
- RefreshList(LastID);
- return;
- }
-
- /*
- * 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;
- }
-
- 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;
- int GID;
- static int oldh;
-
- 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);
-
- if(!Flags.helpmode && ICONIFY_REQUESTED)
- {
- Iconify();
- ClearIntuiMsgPort(SysWnd);
-
- return;
- }
-
- /*
- * 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:
- HandleVanillaKeys(code, qualifier);
- 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:
- HandleRawKeys(code, qualifier);
- 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:
- GID = ((struct Gadget *) object)->GadgetID;
-
- if (GID == GD_ListeLV)
- {
- HandleHelp((enum RSysNumbers)GID);
- 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;
-
- case IDCMP_SIZEVERIFY:
- oldh = SysWnd->Height;
- break;
-
- case IDCMP_NEWSIZE:
- if((SysWnd->Height - oldh) != 0) ResizeWindowRefresh();
- 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;
-
- default:
- 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 = 0;
- }
- else Flags.wb_start = 1;
-
- /*
- * 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((char *)ID_PORT_NAME, 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 (Flags.wb_start) 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 (CTRL_C_RECEIVED) Flags.quit_flag = 1;
-
- /*
- * Wenn das Programm ein zweitesmal aufgerufen wird,
- * erhält der ID-Port eine Nachricht.
- */
- if (ID_PORT_SIG_RECEIVED) HandleIDPort();
-
- /*
- * Falls von dem System-Programm Exchange ein Signal
- * gesendet wurde, wird es hier verarbeitet.
- */
- if (BROKER_PORT_SIG_RECEIVED) HandleBrokerPort();
-
- /*
- * Falls das Hauptfenster ein Signal erhalten hat,
- * werden die Daten der Nachricht(en) gemerkt und
- * weiterverarbeitet.
- */
- if (WINDOW_PORT_SIG_RECEIVED) 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();
-
- return;
- }
-