
 0. INHALT:
============

 I.   Allgemeine Hinweise

        0.  Hinweise zu dieser Dokumentation
        1.  bersetzung der Library mit Pure C, GNU-C und Lattice C
              a. Pure C
              b. GNU-C/Lattice C
        2.  Nutzung der Library mit Pure C, GNU-C und Lattice C

 II.  Neue Mglichkeiten in Eingabefeldern

 III. erweiterte Objekt-Typen sowie Resource-Aufbau

        1.  Debugging
        2.  Highbyte des Objekt-Typs

 IV.  Globale Variablen der Library

 V.   Funktionen, Strukturen und Konstanten der Library

        1.  Routinen zur Verwaltung des Cookie-Jars
        2.  Routinen zur Verwaltung des Environments
        3.  Erweiterte Objekt-Routinen (u.a. kompatibel zum PC-GEM 2.0)
        4.  Erweiterte Rechteck-Routinen (u.a. kompatibel zum PC-GEM 2.0)
        5.  VDI-(Attribut-) und Clipping-Funktionen
        6.  Erweiterte Scrap-Directory-Routinen
        7.  Erweiterte Grafik-Routinen
        8.  Men-Funktionen
        9.  Dialog-Optionen und -optik setzen
        10. Bibliothek (AES,VDI) sowie Resource (de-) initialisieren
        11. Resource- und Objekt-Initialisierung
        12. Ereignis-Auswertung
        13. Library-spezifische Nachrichten
        14. Dialog-Funktionen
        15. Fenster-Funktionen
        16. Update/Control-Funktionen
        17. Popup-Funktion
        18. XAcc-2- und AV-Protokoll-Funktionen
        19. Drag & Drop-Funktionen
        20. Auskunftsfunktionen
        21. Datei-/Pfadfunktionen
        22. Font-Funktionen
        23. Paula-Protokoll
        24. Timer-Funktionen
        25. Maus/Tastatur-Funktionen
        26. Verschiedene Funktionen
        27. Definitionen hufig bentigter (Protokoll-) Konstanten

 I. Allgemeine Hinweise:
=========================

 0. Hinweise zu dieser Dokumentation
    --------------------------------

    Die in diesem Text dokumentierten Strukturen und ihre Variablen haben
    teilweise einen von der Dokumentation abweichenden Aufbau, d.h. die
    Reihenfolge der Variablen ist nicht garantiert und es knnen weitere,
    intern bentigte Variablen vorhanden sein. Einzig und allein die Be-
    deutung einer Variablen kann als gegeben hingenommen werden, whrend
    der genaue Aufbau einer Struktur aus der Include-Datei 'E_GEM.H' ent-
    nommen werden mu.

 1. bersetzung der Library mit Pure C, GNU-C und Lattice C
    -------------------------------------------------------

    WICHTIG:
    Bei der bersetzung der Library darf keine Stack-berprfung aktiviert
    sein, da einige Library-Funktionen (z.B. benutzerdefinierte Objekte) vom
    AES aufgerufen werden und somit den AES-Stack verwenden.

    Light-Version:
    --------------
    Durch Definition einer der folgenden Konstanten-Makros knnen evtl.
    nicht bentigte Teile der Library bei der bersetzung deaktiviert
    werden, so da die resultierenden Programme teilweise deutlich krzer
    werden (bis zu 40 KByte).
    Der Code-Overhead der Library betrgt dann - abhngig von der Art der
    bersetzung und der Ausnutzung - zwischen 20 und 80 KByte (absolut)
    und im Vergleich zur eigenen Implementation entsprechender, nicht so
    flexibler Routinen ungefhr 10 bis 30 KByte, wobei der Overhead i.A.
    mit der Gre der Anwendung abnimmt.
    (Angaben fr Pure C mit Pure-Libraries)

    ACHTUNG:
    Wird ein Programm mit einer Library gelinkt, welche mit anderen
    Optimierungen bersetzt wurde, so kann es zu Abstrzen oder Fehl-
    funktionen kommen, da die Strukturen der Library ebenfalls optimiert
    werden!

    /* Minimale Anzahl an Image-Varianten bei erweiterten Objekttypen */
    #define SMALL_EGEM

    /* Minimale Anzahl an Alert-Icons (die definierten Icons (s. Funktion
       xalert) sind weiterhin vorhanden) */
    #define SMALL_ALERT

    /* Kein erweiterter Text mit Attributen in Dialogen und Alertboxen
       (Funktion get_xtext() und Struktur X_TEXT sind nicht vorhanden) */
    #define SMALL_NO_XTEXT

    /* Menu-Funktionen (auer MenuItems) und Variable menu_available sind
       nicht vorhanden; Pull-Down-Mens werden nicht untersttzt (nur als
       Fenstermen) */
    #define SMALL_NO_MENU

    /* Keine Eingabefelder in Dialogen (OBJC_EDITED-Nachricht sowie die
       Funktionen ob_edit_init(), ob_edit_handler() und ob_set_cursor()
       stehen nicht zur Verfgung, s.a. SMALL_EDIT und SMALL_NO_HZ) */
    #define SMALL_NO_EDIT

    /* Kein blinkender Eigabecursor (entsprechende Option bei dial_options
       ist wirkungslos) */
    #define SMALL_NO_HZ

    /* Sonderzeicheneingabe/ASCII-Dialog (Funktionen MakeAscii, ExitAscii,
       ascii_box), History, Clipboard-Untersttzung, erweiterten Eingabe-
       masken, ACC_TEXT-Eingabe, Eingabefelder in Slidern und Lschen aller
       Eingabefelder per Shift-Escape sind nicht vorhanden,
       s.a. SMALL_NO_HZ) */
    #define SMALL_EDIT

    /* Keine Clipboard-Untersttzung in Eingabefeldern (entsprechende
       Option der Funktion dial_options() ist ohne Wirkung) und Scrap-Funk-
       tionen sind nicht vorhanden (GEM-Clipboard wird nicht initialisiert) */
    #define SMALL_NO_CLIPBRD

    /* Keine Zeichensatzfunktionen (Funktionen FontInfo, FastFontInfo,
       FontList, FontSizes sind nicht vorhanden), kein Fontselector
       (s. SMALL_NO_FSEL); bei den Funktionen v_set_text und v_set_point
       knnen keine Zwischengren bei Vektorfonts eingestellt werden */
    #define SMALL_NO_FONT

    /* Kein Fontselector (FONTSEL-Struktur, Funktionen FontSelect und
       UpdateFsel sowie Variable FSelDialog sind nicht vorhanden) */
    #define SMALL_NO_FSEL

    /* Keine Untersttzung des internen Drag&Drop-Fontselectors */
    #define SMALL_NO_DD_FSEL

    /* Keine Popup-Mens (POPUP_CHANGED-Nachricht, Funktion Popup sowie
       Strukturen POPUP und XPOPUP sind nicht vorhanden) und Font-
       Funktionen (s. SMALL_NO_FONT))
       (Modul 'POPUP.C' wird nicht bentigt) */
    #define SMALL_NO_POPUP

    /* Keine Echtzeitschieber (Nachricht SLIDER_CHANGED sowie Funktionen
       graf_arrows, graf_set_slider, graf_rt_slidebox und
       graf_rt_slidecursor stehen nicht zur Verfgung), keine Font-
       Funktionen (s. SMALL_NO_FONT)) */
    #define SMALL_NO_GRAF

    /* Kein Drag&Drop (DRAG_DROP-Struktur, OBJC_DRAGGED-Nachricht sowie
       D&D-Funktionen sind nicht vorhanden) */
       (Modul 'DRAGDROP.C' wird nicht bentigt) */
    #define SMALL_NO_DD

    /* Kein XAcc/AV-Protokoll (XAcc-Struktur, XACC_AV_INIT/EXIT/CLOSE-
       Nachrichten sowie alle Protokoll-Funktionen (auer AppLoaded,
       GetMsgBuffer und AvSendMsg) sowie scrp_changed und drive_changed
       sind nicht vorhanden); kein Font-Protokoll (Funktionen FontChanged,
       FontAck und CallFontSelector sind nicht vorhanden);
       kein Paula-Protokoll (s. SMALL_NO_PAULA) */
    #define SMALL_NO_XACC_AV

    /* Kein Paula-Protokoll (Funktionen PaulaStop, PaulaShutDown sowie
       PaulaStart sind nicht vorhanden) */
    #define SMALL_NO_PAULA

    /* Keine Fenster-Scrollroutinen (SCROLL-Struktur, WIN_SCROLLED-
       Nachricht und Funktion scroll_window sind nicht vorhanden)
    #define SMALL_NO_SCROLL

    /* Keine Ikonfizierung von Fenstern (Variable iconified, Kommandos
       W_(UN)ICONIFY(ALL) der Funktion WindowHandler sind nicht vorhanden;
       Parameter fr ikonifizierte Darstellung beim ffnen von Fenstern/
       Dialogen sowie bei den Funktionen MenuItems und window_set_mouse()
       sind wirkungslos) */
    #define SMALL_NO_ICONIFY

    /* Alle oben aufgefhrten Makros setzen */
    #define SMALL_LIGHT


    a. Pure C

    EnhancedGEM lt sich sowohl mit den Pure-C-Libraries als auch mit den
    MiNT-Libraries ab Patchlevel 30 compilieren.
    EnhancedGEM lt sich sowohl mit den Pure-C-Libraries als auch mit den
    MiNT-Libraries ab Patchlevel 30 compilieren.
    Hierzu mu jedoch mindestens Pure C V1.1 vorhanden sein und im
    Header-File AESBIND.H der MiNT-Libraries mu die Zeile

    __EXTERN int    evnt_timer __PROTO((unsigned long Interval));

    in

    __EXTERN int    evnt_timer __PROTO((int Int_locount,int Int_hicount));

    abgendert werden.
    Weiterhin mu das Makro __MINT_LIB__ bei Benutzung der MiNT-Library
    definiert werden.

    b. GNU-C/Lattice C

    Ebenfalls lt sich EnhancedGEM mit GNU-C und Lattice C bersetzen,
    wobei allerdings die MiNT-Library sowie die entsprechenden Makefiles
    (Makefile.GCC bzw. Makefile.LCC) benutzt werden mssen. Eventuell auf-
    tretende Warnungen bei der bersetzung sind (hoffentlich) bedeutungslos.

 2. Nutzung der Library mit Pure C, GNU-C und Lattice C
    -------------------------------------------------------

    a. Wurde EnhancedGEM mit Hilfe der MiNT-Libraries bersetzt, so MSSEN
    die MiNT-Libraries und die dazugehrigen Header-Dateien auch benutzt
    werden. Ansonsten sind die Reaktionen nicht vorhersehbar, aber hchst-
    wahrscheinlich resultieren daraus Fehlfunktionen (auer evtl. bei
    GNU-C).

    b. Alle (AES-) Funktionen, die bzw. deren Funktionalitt in hnlicher
    Form von der Library angeboten werden, sollten idR nicht mehr benutzt
    werden (z.B. Ereignisfunktionen evnt_..., Fenster-Funktionen wind_...,
    nderung des Mauszeigers per graf_mouse usw.). Die AES-Fensterfunk-
    tionen drfen NUR fr Fenster, die nicht von der Library verwaltet wer-
    den (z.B. Desktop oder Fenster anderer Anwendungen), oder wenn eine
    Funktion nicht von der Library angeboten wird, aufgerufen werden.
    I.A. sind auch die angebotenen Routinen der Library schneller (teil-
    weise deutlich schneller)

    Wird die interne VDI-Workstation der Library benutzt, so mu sicherge-
    stellt sein, da entweder Library-Funktionen benutzt oder die Attribute
    in ihren ursprnglichen Zustand zurckgesetzt werden.
    Ist dies nicht der Fall, mu sofort nach Vernderung der Attribute
    die Funktion vs_attr() aufgerufen werden. Allerdings darf auf keinen
    Fall der Clipping-Bereich verndert werden, d.h. er ist mit den Funk-
    tionen save_clipping()/restore_clipping wiederherzustellen.

    c. Alle internen, modulbergreifenden globalen Variablen und Funktionen
    der Library beginnen mit einem Unterstrich '_', so da es zu keinen
    berschneidungen kommen sollte.

    d. Die Gre des Stacks sollte mindestens 4, bei greren Programmen
    mindestens 8 KByte betragen.

    e. EGEM-Programme laufen unter MultiTasking automatisch in der MiNT-
    Domain (sofern vorhanden), whrend unter SingleTasking (TOS) die
    normale TOS-Domain voreingestellt ist.

 II. Neue Mglichkeiten in Eingabefeldern:
===========================================

    - zustzliche Gltigkeitsmasken:
        'c','C': Ziffern "0-9", Komma ".,", Rechenzeichen "+-*/^",
                 Klammern "(){}[]"
        'l','L': LED-Ziffern "0-9"
        '<Ziffer>': Ziffer='0'-'9', alle Ziffern von '0' bis <Ziffer>, z.B.
                 '1': Binrziffern '01'
                 '7': Oktalziffernn '01234567'
                 '9': Dezimalziffern '0123456789'
        'h','H': Hexadezimalziffern "0-9A-F",
                 Umwandlung in Klein/Grobuchstaben
        'u','U': ASCII 32-127, Umwandlung in Klein-/Grobuchstaben
        'v','V': ASCII 32-255, Umwandlung in Klein-/Grobuchstaben
        'w','W': ASCII 32-127
        'y','Y': ASCII 32-255

        Mit Hilfe des Eingabehandlers (s. Funktion ob_edit_handler) knnen
        diese Masken beliebig erweitert und gendert werden.

    - kleiner/groer System-Font knnen in Eingabefeldern benutzt
      werden. Untersttzt das AES auch nicht-proportionale GDOS-Fonts,
      so knnen diese ebenfalls in Eingabefeldern verwendet werden.

    - ein Eingabefeld darf maximal MAX_EDIT-Zeichen lang werden (ansonsten
      mu die Konstante bei Bedarf in der Datei 'E_GEM.H' gendert und die
      Library neu bersetzt werden)

    - Eingabefelder drfen einen Klammeraffen '@' am Anfang besitzen

 III. erweiterte Objekt-Typen sowie Resource-Aufbau:
=====================================================

    1. Debugging:
    -------------

    Wird die Library mit definiertem Konstanten-Makro DEBUG (s.a.
    Projekt-Datei 'E_GEM.PRJ' bzw. 'EGEMLGHT.PRJ') bersetzt, so gibt die
    Library Fehlermeldungen (Alert-Boxen) aus, wenn Fehler im Resource-
    Aufbau gefunden wurden (z.B. doppelt vergebene Hotkeys, mehr als ein
    Help-/Undo-/Escape/-Default-Button usw.). Dabei werden die Art des
    Fehlers und evtl. die Nummer des fehlerhaften Objekts ausgegeben.

    2. Highbyte des Objekt-Typs (s.a. STARTUP.RSC):
    -----------------------------------------------

        TriState-Checkboxen:
        --------------------

        Ist das Flag TOUCHEXIT bei einer Checkbox gesetzt, so kann die
        Checkbox noch einen dritten Zustand (neben selektiert und nicht
        selektiert) annehmen, bei dem das Innere der Checkbox mit einem
        grauen Muster gezeichnet wird. In diesem Zustand ist der Status
        CHECKED gesetzt.

        #define CHECKBOX        1   /* Check-Box */
        #define HEADER          2   /* berschrift */
        #define RADIO           3   /* Radio-Button */
        #define UNDERLINE       4   /* Unterstrich */

        Hotkeys:
        --------
        (Indirekte) Hotkeys knnen jedem Text-Objekt (G_STRING, G_TITLE,
        G_BUTTON, G_(F)TEXT, G_(F)BOXTEXT, G_BOXCHAR sowie erweitertem
        Attributtext ATTR_TEXT (Hotkey wird bei prop. Fonts nicht korrekt
        positioniert!)) zugeordnet werden. Hotkeys mssen dabei
        jeweils ein untergeordnetes Kind-Objekt des gewnschten Objekts
        sein.

        #define HOTKEY          5   /* Hotkey-Objekt */
        #define CHKHOTKEY       6   /* Check-Box mit Hotkey */
        #define RBHOTKEY        7   /* Radio-Button mit Hotkey */
        #define INDHOTKEY       8   /* Hotkey-Objekt einer Check-Box oder
                                       eines Radio-Buttons */
        #define FLYDIAL         9   /* Flugecke */
        #define TXTDEFAULT      10  /* Status des DEFAULT-Objekts ist von
                                       diesem Text-Objekt abhngig */
        #define USERFLY         11  /* beliebiges Flugobjekt */
        #define HELP_BTN        12  /* Help-Button */

        GDOS-Fonts:
        -----------

        Der erweiterte Objekttyp ATTR_TEXT untersttzt auch die Ausgabe
        von beliebigen, u.a. proportionalen GDOS-Fonts unabhngig vom
        AES! Dabei mssen die Felder te_fontid, te_fontsize der
        TEDINFO-Struktur auf die ID und die Gre in Punkt des Fonts ge-
        setzt werden. Auerdem mu das Feld te_font auf eine der fol-
        genden Konstanten gesetzt werden:

             #define GDOS_PROP    0 /* Speedo GDOS font */
             #define GDOS_MONO    1 /* Speedo GDOS font, monospace */
             #define GDOS_BITM    2 /* GDOS bit map font */

        Nach dem Initialisieren der Objekte durch fix_objects(), rsrc_calc()
        oder rsrc_init() ist der Objekttyp auf G_XTEXT und der Objekt-
        status auf NORMAL gesetzt sowie die Variable ob_spec der OBJECT-
        Struktur zeigt auf einen benutzerdefinierten Block USERBLK, dessen
        Parameter ub_parm auf folgende Struktur zeigt, welche mit den
        Werten aus der Resource-Datei initialisiert ist (ein evtl. vorhan-
        denes EDITABLE-Flag wird gelscht, alle anderen Flags und Stati
        knnen benutzt werden):

        X_TEXT-Struktur:
        ----------------

        typedef struct
        {
            /* Zeiger auf Text (sollte nur mit ob_get_text()/ob_set_text()
               gesetzt oder ermittelt werden) */
            char    *string;

            /* Font-ID, -hhe (<0: in Punkt, >0: in Pixel) */
            int     font_id,font_size;

            /* Farbe (0-15, kann nachtrglich auf beliebige VDI-Farbe
               gesetzt werden) */
            int     color;

            /* Zentrierung des Textes (TE_LEFT,TE_CNTR,TE_RIGHT) */
            int     center;

            /* Schreibmodus (MD_REPLACE,MD_TRANS,MD_XOR,MD_ERASE) */
            int     mode;

            /* Bitmap der Text-Effekte (X_SHADOWED, X_TITLE, X_3D und
               X_INVERS schlieen sich gegenseitig aus!) */
            int     effect;

                #define X_FAT           1   /* Fett SELECTED) */
                #define X_LIGHT         2   /* Hell (DISABLED) */
                #define X_ITALICS       4   /* Kursiv (CROSSED) */
                #define X_UNDERLINED    8   /* Unterstrichen (CHECKED) */
                #define X_OUTLINED      16  /* Umrandet (OUTLINED)*/
                #define X_SHADOWED      32  /* Schattiert (SHADOWED) */
                #define X_INVERS        64  /* Invers */
                #define X_3D            256 /* 3D (DRAW3D) */
                #define X_TITLE         512 /* Titel (WHITEBAK) */

            /* Alle weiteren Variablen dieser Struktur sind fr interne
               Zwecke reserviert! */
        } X_TEXT;

        #define ATTR_TEXT       13  /* Text mit Attributen */

        /* Cycle-Button, der vorrangig fr Popups benutzt wird, und
           optional schattiert ist (Status-Bit SHADOWED) */
        #define CYCLE_BUTTON    14  /* Cycle-Button */

        /* Pfeile, die hauptschlich fr Slider benutzt werden, und
           optional umrandet sind (Status-Bit OUTLINED) */
        #define ARROW_LEFT      15  /* Pfeil links */
        #define ARROW_RIGHT     16  /* Pfeil rechts */
        #define ARROW_UP        17  /* Pfeil hoch */
        #define ARROW_DOWN      18  /* Pfeil runter */

        #define UNDO_BTN        19  /* Undo-Button */
        #define ESC_BTN         21  /* Escape-Button */

    Jedem Objekt knnen die erweiterten Typen UNDO_BTN, HELP_BTN, ESC_BTN,
    HEADER und USERFLY zugeordnet werden, wobei bei HEADER-Objekten die Ein-
    stellungen (Funktion header_options) nur dann gelten, wenn es sich
    um ein G_(F)BOXTEXT oder G_(F)TEXT-Objekt handelt (bei Button-Objekten
    G_BUTTON wird nur die Ausrichtung gesetzt). Bei ATTR_TEXT sowie
    TXTDEFAULT mu es sich um ein Text-Objekt (auch G_STRING, G_TITLE und
    G_BUTTON), bei UNDERLINE sollte es sich um den Typ G_BOX handeln. Alle
    anderen erweiterten Typen sollten (mssen aber nicht) dem Typ G_BOXCHAR
    oder G_IBOX zugeordnet werden.

        #define G_UNMODAL   0x4000  /* unmodales Objekt */
        #define G_MODAL     0x8000  /* modales Objekt */

    Zustzlich knnen alle (!) Objekte durch Setzen von Bit 14 (G_UNMODAL)
    bzw. Bit 15 (G_MODAL) im Objekt-Typ (erweiterter Objekttyp mit 64 bzw.
    128 verodern) zu einem unmodalen oder modalen Objekt deklariert werden,
    welches nur in unmodalen bzw. modalen Dialogen erscheint.

    Untersttzen die AES 3D-Effekte, so knnen die entsprechenden Bits 9 u.
    10 in den Objekt-Flags weiterhin gesetzt werden. Die erweiterten Objekte
    untersttzen bisher kein 3D, wobei aber durch die variable Optik der
    Images (Check-Box, Radio-Button, Arrows, Cycle-Buttons) und die ein-
    stellbaren Farben bei Bedarf auch 3D-Effekte erreicht werden knnen. Bei
    allen anderen erweiterten Objekten ist ein 3D-Effekt berflssig (z.B.
    bei Hotkeys, da diese unabhngig vom zugehrigen Objekt gezeichnet wer-
    den, so da das eigentliche Objekt im 3D-Look dargestellt werden kann)
    oder kann durch die Objekt-Flag-Bits erreicht werden (z.B. bei Rahmen-
    objekten (HEADER), s.a. Optionen edit_3d und draw_3d bei der Funk-
    tion dial_colors())

    Durch Setzen des Bits 7 (DRAW3D) im Objektstatus wird das entsprechende
    Objekt auf selektierten 3D-Look eingestellt, sofern 3D-Look vorhanden
    und die entsprechende Option der Funktion dial_colors() gesetzt ist.
    Ist kein 3D vorhanden, so wird das Objekt nicht verndert (funktioniert
    nur in Dialogen, die mit open_dialog() geffnet werden, d.h. u.a. nicht
    in Popups).

    WICHTIG:
    --------
    Will man den Objekttyp ermitteln, so sollte man die Variable ob_type
    der OBJECT-Struktur mit der Konstante G_TYPE maskieren!

    Nach dem Initialisieren der Resource durch die Library werden der
    Objekttyp und teilweise das obere Byte des Objektstatus der erweiterten
    Objekte verndert. Ebenso zeigt ob_spec meistens auf den USERBLK des
    Objekts. Daher sollte man auf diese Variablen nicht mehr zugreifen,
    sofern die nderungen nicht dokumentiert sind (wie z.B. bei ATTR_TEXT)

    Weitere (Kombinations-) Mglichkeiten s.a. Beispielprogramme sowie
    Startup-Resource (STARTUP.RSC).

    WICHTIG:
    --------
    Werden die Funktionen rsrc_calc() oder rsrc_init() mit der Gre des
    Entwurfsfonts aufgerufen, so SOLLTEN nur Pull-Down-Mens G_TITLE-
    Objekte enthalten. Ansonsten wird der Dialog normal vom AES an die
    Gre des System-Fonts skaliert.

 IV. Globale Variablen der Library:
====================================

    int _app;
        -> Programm wurde als Applikation (_app!=0) oder Accessory (_app==0)
           gestartet

    int ap_id:
        -> Applikationsidentifikation (Rckgabewert von appl_init())
           oder negativer Wert, wenn AES-Initialisierung nicht erfolg-
           reich war

    int menu_id:
        -> Nummer des Eintrags im Accessory-Men oder negativer Wert

    int menu_available;
        -> Anwendung darf eigene Drop-Down-Menleiste anmelden
           (menu_available!=0)

    int grhandle:
        -> Handle der AES-Workstation (Rckgabewert von graf_handle)

    int x_handle:
        -> Handle der Library-Workstation

    int work_out[57];
       -> Ausgabefeld vom ffen der virtuellen internen Workstation

    int ext_work_out[57];
       -> erweitertes Ausgabefeld (s. Funktion vq_extnd())

    int gr_cw,gr_ch:
        -> Breite/Hhe des System-Zeichensatzes (IBM) in Pixel

    int gr_bw,gr_bh:
        -> Breite/Hhe eines Rechtecks, das jedes einzelne Zeichen
           des System-Zeichensatzes (IBM) vollstndig umgibt.

    int gr_sw,gr_sh:
        -> Breite/Hhe des kleinen System-Zeichensatzes (SMALL) in Pixel

    int ibm_font,ibm_font_id;
        -> Hhe des System-Zeichensatzes (IBM) in Pixel sowie Font-ID

    int small_font,small_font_id;
        -> Hhe des kleinen System-Zeichensatzes (SMALL) in Pixel
           sowie Font-ID

    int speedo:
        -> FSM-GDOS (1), Speedo-GDOS (2), Speedo 5.0/NVDI 3.0 (3)
           oder keine Vektorfonts (0)

    int fonts_loaded;
        -> Anzahl der Zeichenstze (GDOS-Fonts u. System-Fonts) der
           internen Library-Workstation

    int max_w,max_h:
        -> Breite/Hhe des Bildschirms in Pixel

    int planes, colors:
        -> Anzahl der Farbebenen sowie gleichzeitig darstellbaren
           Farben

    int colors_available;
        -> Anzahl der Farbabstufungen der Farbpalette
           (2: monochrom, 0: mehr als 32767 Farben)

    MFDB *screen;
        -> Memory Form Definition Block des Bildschirms

    GRECT desk;
    VRECT clip;
        -> Ausmae des Desktop-Fensters als GRECT bzw. VRECT

    int aes_version:
        -> AES-Versionsnummer

    int multi:
        -> AES-Multitasking-Betriebssystem vorhanden

    int mtos:
        -> Multi-TOS vorhanden (mtos!=0)

    int magx:
        -> Versionsnummer von MagiC ab Version 2.00

    int winx:
        -> Versionsnummer von Winx ab Version 2.10

    int mint:
        -> MiNT-Versionsnummer

    unsigned int gemdos_version:
        -> Versionsnummer des GEMDOS in korrekter Reihenfolge
           (High- und Lowbyte des Rckgabewerts von Sversion() vertauscht)
           High-Byte: Haupt-Revision, Low-Byte: Unter-Revision

    int has_3d;
        -> AES-3D-Effekte (Bits 9/10 der Objekts-Flags) sind vorhanden

    int search:
        -> appl_search()-Funktion vorhanden

    int bevent,bottom,owner;
        -> wind_get/wind_set-Modi WF_BEVENT, WF_BOTTOM und WF_OWNER sind
           vorhanden

    int AvServer;
        -> Applikations-ID des AV-Protokoll-Servers oder negativer Wert

    OBJECT *iconified;
        -> Zeiger auf Objektbaum, der fr die Darstellung von ikonifizierten
           Fenstern benutzt wird (ansonsten weier Hintergrund des Fensters,
           falls Zeiger nicht gesetzt wurde)

    DIAINFO *FSelDialog;
        -> Zeiger auf DIAINFO-Struktur des Fontselector-Dialogs, sofern
           dieser geffnet ist (ansonsten NULL). Dadurch kann man notwendige
           Informationen ber den Dialog, den Objektbaum oder das Fenster
           ermitteln.

 V. Funktionen, Strukturen und Konstanten der Library:
=======================================================

    1. Routinen zur Verwaltung des Cookie-Jars
       ---------------------------------------

        COOKIE-Struktur:
        ----------------
            typedef struct
            {
                long    cookie_id;      /* ID des Cookies */
                long    cookie_value;   /* Wert des Cookies */
            } COOKIE;

        void create_cookie(COOKIE *cookie,long id,long value);
            -> Cookie 'cookie' wird mit der Identifikation 'id' und
               dem Wert 'value' initialisiert

        boolean new_cookie(COOKIE *cookie);
            -> Cookie 'cookie' in Cookie-Jar einfgen (Rckgabewert
               gleich FALSE, falls Cookie-Jar nicht existiert oder
               keine freien Eintrge mehr vorhanden sind)

        boolean get_cookie(long id,long *value);
            -> Cookie mit der Identifikation 'id' im Cookie-Jar suchen
               und Wert gegebenenfalls in der Variable '*value' sichern
               (sofern value!=NULL)
            -> Rckgabewert ungleich FALSE, wenn Cookie gefunden wurde

        void remove_cookie(long id);
            -> Cookie mit der Identifikation 'id' aus dem Cookie-Jar
               entfernen

        void move_cookiejar(long *new_cookie_jar,long size);
            -> neuen Cookie-Jar 'new_cookie_jar' mit Platz fr 'size'
               Eintrge anlegen und alten Cookie-Jar gegebenfalls
               kopieren
            -> neuer Cookie-Jar mu mindestens so viele Eintrge wie
               der alte Cookie-Jar haben

        long cookie_size(void);
            -> Anzahl der maximalen Eintrge im Cookie-Jar ermitteln

    2. Routinen zur Verwaltung des Environments
       ----------------------------------------

        char *getenv(const char *entry);
            -> Variable 'entry' im Environment suchen und im Erfolgsfall
               Zeiger auf Wert der Variable zurckgeben (ansonsten NULL)

        int putenv(const char *entry);
            -> Zeichenkette 'entry' ins Environment einfgen
            -> Rckgabewert ungleich Null im Erfolgsfall

    3. Erweiterte Objekt-Routinen (u.a. kompatibel zum PC-GEM 2.0)
       -----------------------------------------------------------

        WICHTIG:
        Werden Objekte ber die AES-Funktionen objc_draw bzw. objc_change
        ausgegeben, so drfen diese in keinem Dialog enthalten sein und es
        darf sich nicht um erweiterte Objekte handeln! Auerdem sollte immer
        ein Begrenzungsrechteck (z.B. Desktopbereich) angegeben werden!

        void ob_dostate(OBJECT *tree,int object,int masc);
            -> einzelne Bits 'masc' des Objektstatus des Objekts 'object'
               im Baum 'tree' durch Veroderung setzen

        void ob_undostate(OBJECT *tree,int object,int masc);
            -> einzelne Bits 'masc' des Objektstatus des Objekts 'object'
               im Baum 'tree' durch Maskierung lschen

        int ob_isstate(OBJECT *tree,int object,int masc);
            -> Bits 'masc' im Objektstatus des Objekts 'object' im Baum
               'tree' testen
            -> Rckgabewert:
               TRUE (1):  alle Bits gesetzt
               FALSE (0): Bits (teilweise) nicht gesetzt

        void ob_setstate(OBJECT *tree,int object,int state);
            -> Objektstatus des Objekts 'object' im Baum 'tree' auf den
               Wert 'state' setzen

        void ob_select(DIAINFO *info,OBJECT *tree,int object,int select,
                       int draw)
            -> Objekt 'object' im Baum 'tree' selektieren (select!=0) oder
               deselektieren (select==0) und evtl. neuzeichnen (draw!=0).
               Gehrt der Objektbaum zu einem geffneten Dialog, so sollte
               ein Zeiger auf die DIAINFO-Struktur des Dialogs bergeben
               werden, damit gegebenenfalls der Ausgabebereich korrekt be-
               rechnet werden kann.

        void ob_disable(DIAINFO *info,OBJECT *tree,int object,int disable,
                       int draw)
            -> Objekt 'object' im Baum 'tree' disablen (disable!=0) oder
               enablen (disable==0) und evtl. neuzeichnen (draw!=0).
               Gehrt der Objektbaum zu einem geffneten Dialog, so sollte
               ein Zeiger auf die DIAINFO-Struktur des Dialogs bergeben
               werden, damit gegebenenfalls der Ausgabebereich korrekt be-
               rechnet werden kann.

        void ob_hide(OBJECT *tree,int obj,int hide)
            -> Objekt 'obj' im Baum 'tree' verstecken (hide==0) oder
               anzeigen (hide!=0)

        void ob_doflag(OBJECT *tree,int object,int masc);
            -> einzelne Bits 'masc' der Objektflags des Objekts 'object'
               im Baum 'tree' durch Veroderung setzen

        void ob_undoflag(OBJECT *tree,int object,int masc);
            -> einzelne Bits 'masc' der Objektflags des Objekts 'object'
               im Baum 'tree' durch Maskierung lschen

        int ob_isflag(OBJECT *tree,int object,int masc);
            -> Bits 'masc' der Objektflags des Objekts 'object' im Baum
               'tree' testen
            -> Rckgabewert:
               TRUE (1):  alle Bits gesetzt
               FALSE (0): Bits (teilweise) nicht gesetzt

        void ob_setflags(OBJECT *tree,int object,int flags);
            -> Objektflags des Objekts 'object' im Baum 'tree' auf den
               Wert 'flags' setzen

        void ob_xywh(OBJECT *tree,int object,GRECT *rect);
            -> Ausmae und Koordinaten (relativ zur linken oberen Ecke
               des bergeordneten Objekts) des Objekts 'object' im Baum
               'tree' ermitteln und in der GRECT-Struktur 'rect' sichern

        void ob_pos(OBJECT *tree,int object,GRECT *rect);
            -> Ausmae und absolute Koordinaten des Objekts 'object' im
               Baum 'tree' ermitteln u. in der GRECT-Struktur 'rect' sichern

        char *ob_get_text(OBJECT *tree,int object,int clear);
            -> Zeiger auf den Text des Objekts 'object' im Baum 'tree'
               ermitteln und Text lschen, sofern 'clear' ungleich Null
               (Funktion beachtet erweiterte Objekttypen (Attribut-Text)
                und funktioniert auch bei Icons (G_ICON))
            -> Rckgabewert gleich NULL, wenn es sich um kein Text-Objekt
               handelt

        X_TEXT *get_xtext(OBJECT *tree,int object)
            -> Zeiger auf X_TEXT-Struktur des Attributtextes 'object'
               im Baum 'tree' ermitteln. Hierbei handelt es sich bisher
               nur um eine Makro-Funktion, d.h. es wird nicht geprft,
               ob es sich tatschlich um ein Attributtext-Objekt handelt!

        void ob_set_text(OBJECT *tree,int object,char *text);
            -> Text des Objekts 'object' im Baum 'tree' auf 'text' setzen
               (Funktion beachtet erweiterte Objekttypen (Attribut-Text)
                und funktioniert auch bei Icons (G_ICON))

        void ob_set_cursor(DIAINFO *info,int obj,int index,int insert)
            -> Eingabecursor neu setzen/Eingabemodus umschalten
            -> Parameter: (negative Parameter (FAIL) verndern die
                           aktuellen Einstellungen (s. DIAINFO-Struktur,
                           di_ed_obj, di_ed_index, di_ed_insert) nicht)
               obj:    Objektnummer des neuen Eingabefelds
               index:  Cursorposition im Eingabefeld (wird automatisch
                       auf gltigen Wert gesetzt, so da z.B. mit
                       index>=MAX_EDIT der Cursor ans Ende des Eingabe-
                       feldes gesetzt wird)
               insert: Einfge- (insert==TRUE) oder berschreibenmodus
                       (insert==FALSE)

        void ob_clear_edit(OBJECT *tree)
            -> Text in allen Eingabefeldern des Baums 'tree' lschen

        void ob_edit_init(DIAINFO *info,int first_edit)
            -> Eingabefelder des Dialogs 'info' intern neu initialisieren
               (NICHT lschen!) und den Cursor in das Feld mit der Objekt-
               nummer 'first_edit' setzen. Ist der Parameter 'first_edit'
               kleinergleich Null, dann wird der Cursor entweder an seine
               ursprngliche Position gesetzt oder - wenn dies nicht mg-
               lich ist - in das erste Eingabefeld des Dialogs.
               Diese Funktion mu aufgerufen werden, wenn der Status
               DISABLED, das Flag HIDETREE, die Variablen/Zeichenketten
               der TEDINFO-Strukturen, die Objektposition/-gre (auer
               wenn diese durch eine Library-Funktion wie z.B.
               graf_set_slider()) verndert wurde) oder die Objektstruktur
               (z.B. Eingabefelder entfernt oder hinzugefgt) eines oder
               mehrerer Eingabefelder innerhalb eines geffneten Dialogs
               gendert wurden.
               Allerdings darf diese Funktion nur fr Dialoge aufgerufen
               werden, in denen eine Ausgabe mglich ist (s. Funktion
               get_dialog_info())

        void ob_edit_handler(boolean (*handler)(char valid,char input,
                             char *out))
            -> Handler fr Gltigkeitsmasken in Eingabefeldern an-
               (handler!=NULL) oder abmelden (handler==NULL). Hierdurch
               knnen neue Gltigkeitsmasken implementiert sowie vor-
               handene gendert oder ergnzt werden.
            -> Parameter des Handlers:
                 valid: Zeichen aus der Gltigkeitsmaske
                 input: Eingegebenes Zeichen
            -> Rckgabewert:
                 TRUE:  Maske wurde bearbeitet (in *out wird das Zeichen,
                        welches eingefgt werden soll, oder Null, falls
                        kein Zeichen eingefgt werden soll, zurckgegeben)
                 FALSE: Maske wurde nicht bearbeitet und wird somit von
                        den normalen EGEM-Routinen bearbeitet

        int ob_set_hotkey(OBJECT *tree,int object,char hotkey);
            -> Hotkey des Objekts 'object' im Baum 'tree' auf den
               Buchstaben 'hotkey' setzen (Hotkey-Unterstrich wird
               automatisch angepat) oder entfernen (hotkey=='\0')
            -> Rckgabewert ungleich FALSE -> Hotkey konnte gesetzt werden

        char ob_get_hotkey(OBJECT *tree,int object);
            -> Hotkey des Objekts 'object' im Baum 'tree' ermitteln
            -> Rckgabewert gleich Null, wenn kein Hotkey gesetzt war

        OBJECT *ob_copy_tree(OBJECT *tree)
            -> Erzeugt von dem Objektbaum 'tree' eine Kopie (z.B. damit
               man einen Dialog mehrmals ffnen kann), wobei u.a. auch die
               TEDINFO-Strukturen und alle Zeichenketten (auch erweiterter
               Attribut-Text (G_XTEXT/ATTR_TEXT)) kopiert werden. Alle
               anderen Zeiger (USERBLK, BITBLK, ICONBLK, CICONBLK) des
               Objektbaums zeigen weiterhin auf die Originalstrukturen!
               Wird die Kopie nicht mehr bentigt, so sollte der angefor-
               derte Speicher (=der zurckgegebene Zeiger) durch die
               Funktion free() freigegeben werden.
            -> Rckgabewert: Zeiger auf Kopie im Erfolgsfall oder NULL

        int ob_draw_chg(DIAINFO *info,int object,GRECT *area,int new_state);
            -> Objekt 'object' (und untergeordnete Objekte) des Dialogs
               'info' darstellen und gegebenenfalls Objektstatus ndern
               (new_state>=0, s. objc_change).
               Wird das Eingabefeld, in dem sich der Cursor befindet, ausge-
               geben, so wird der Cursor - sofern er vorher aktiviert war -
               anschlieend an das Ende des Feldes gesetzt. Ist er nicht
               aktiv oder wird ein bergeordnetes Objekt des Eingabefeldes
               ausgegeben, so behlt der Cursor seinen aktuellen Status und
               seine Position.
            -> Begrenzung des Ausgabebereichs auf das Reckteck 'area' oder
               auf die Ausmae des Dialogs (area==NULL)
            -> Rckgabewert:
                TRUE:  Okay
                FALSE: Objekt konnte nicht ausgegeben werden (z.B. Dialog
                       nicht geffnet (info==NULL oder info->di_flag==CLOSED)
                       oder Ausgabe in Dialog nicht mglich)
                FAIL:  Objekt-Status konnte nicht gesetzt werden

        int ob_draw(DIAINFO *info,int object)
            -> Objekt 'object' (und untergeordnete Objekte) des Dialogs
               'info' darstellen (verkrzter Aufruf von
               ob_draw_chg(info,object,NULL,FAIL))

        int ob_draw_list(DIAINFO *info,int *objects,GRECT *area);
            -> Liste von Objekten 'objects' (und untergeordnete Objekte)
               des Dialogs 'info' darstellen (Abbruch der Liste mit
               negativem Wert oder Null). Eingabecursorbehandlung s.
               Funktion ob_draw_chg().
            -> Begrenzung des Ausgabebereichs auf das Reckteck 'area' oder
               auf die Ausmae des Dialogs (area==NULL)
            -> Diese Funktion ist schneller als die einzelne Ausgabe
               von mehreren Objekten ber ob_draw_chg()
            -> Rckgabewert:
                TRUE:  Okay
                FALSE: Objekte konnten nicht ausgegeben werden (z.B. Dialog
                       nicht geffnet (info==NULL oder info->di_flag==CLOSED)
                       oder Ausgabe in Dialog nicht mglich)

        void ob_draw_dialog(OBJECT *tree,int x,int y,int w,int h);
            -> Dialog 'tree' zentrieren, Bildschirmbereich reservieren,
               eine sich ffnende Box von der Dialogmitte zu den
               Koordinaten (x,y,w,h) zeichnen (sofern Parameter x,y,w,h
               grer als Null sind) und Dialog darstellen

        void ob_undraw_dialog(OBJECT *tree,int x,int y,int w,int h);
            -> Eine sich schlieende Box von den Koordinaten (x,y,w,h) zur
               Dialogmitte zeichnen (sofern Parameter x,y,w,h grer als
               Null sind) und Bildschirmbereich freigeben

        int ob_radio(OBJECT *tree,int parent,int object)
            -> Radio-Buttons innerhalb des bergeordneten Objekts 'parent'
               im Baum 'tree' auf neues Objekt 'object' (Index des
               Radio-Buttons, nicht Objekt-Nummer!) setzen bzw.
               aktuell gesetztes Objekt ermitteln (object<0)
            -> Rckgabewert: Gesetztes Objekt

        int ob_get_parent(OBJECT *tree,int object);
            -> Elternobjekt des Objekts 'object' im Baum 'tree' ermitteln

    4. Erweiterte Rechteck-Routinen (u.a. kompatibel zum PC-GEM 2.0)
       -------------------------------------------------------------

        void rc_grect_to_array(GRECT *rect,int *array);
            -> Reckteck 'rect' in Koordinaten-Feld 'array' wandeln

        void rc_array_to_grect(int *array,GRECT *rect);
            -> Koordianten-Feld 'array' in Rechteck 'rect' wandeln

        int rc_copy(GRECT *src,GRECT *dst);
            -> Rechteck 'src' nach Rechteck 'dst' kopieren
            -> Rckgabewert ist immer Null

        int rc_equal(GRECT *rect1,GRECT *rect1);
            -> Testet die Rechtecke 'rect1' und 'rect2' auf Gleichheit
               (Rckgabewert ungleich Null)

        int rc_intersect(GRECT *src,GRECT *dst);
            -> schneidet das Rechteck 'src' mit dem Rechteck 'dst'
               und gibt den gemeinsamen Bereich in 'dst' zurck
            -> Rckgabewert gleich Null, sofern die Rechtecke keinen
               gemeinsamen Bereich besitzen

        int rc_inside(int x,int y,GRECT *rect);
            -> Testet, ob die Koordinaten (x,y) im Rechteck 'rect'
               liegen (Rckgabewert ungleich Null)

        WICHTIG:
        Alle rc_sc_()-Funktionen schalten weder die Maus an/aus noch
        setzen sie den wind_update()-Status! Auerdem ist das Clipping
        grundstzlich auf den Bildschirm eingestellt.

        RC_RECT-Struktur:
        -----------------

        typedef struct
        {
            /* Rechteck-Struktur gltig? (valid!=0) */
            int valid;

            /* Koordinaten des ursprnglichen Bildschirmrechtecks */
            GRECT   area;

            /* alle weiteren Variablen dieser Struktur sind nur fr INTERNE
               Zwecke */
        } RC_RECT;

        int rc_sc_save(GRECT *area,RC_RECT *rc)
            -> Bildschirmbereich 'area' in Rechteck-Struktur 'rc' sichern
            -> Rckgabewert: (entsprechend rc->valid)
                TRUE:  Bereich konnte gesichert werden
                FALSE: Nicht gengend Speicher oder Bereich teilweise
                       auerhalb des Bildschirms

        int rc_sc_freshen(int sx,int sy,RC_RECT *rc)
            -> Rechteck-Struktur 'rc' erneuern, d.h. Bildschirmbereich
               an den Koordinaten (sx,sy) in Puffer kopieren
            -> Rckgabewert:
                TRUE:  Bereich konnte gesichert werden
                FALSE: Rechteck-Struktur nicht gltig oder Bereich
                       teilweise auerhalb des Bildschirms

        int rc_sc_restore(int dx,int dy,RC_RECT *rc,int mode)
            -> Rechteck-Struktur 'rc' freigeben und/oder an Position
               (dx,dy) zurckkopieren
            -> Parameter 'mode':
                TRUE:  Bereich zurckkopieren und Speicher freigeben
                FALSE: Bereich nur zurckkopieren
                FAIL:  Nur Speicher freigeben
            -> Rckgabewert:
                TRUE:  Alles in Ordnung
                FALSE: Rechteck-Struktur ungltig

        void rc_sc_copy(GRECT *src,int x,int y,int mode);
            -> Kopiert den Bildschirmbereich 'src' zu den Koordinaten
               (x,y) (Kopiermodus 'mode' s. vro_cpyfm)

        void rc_sc_clear(GRECT *rect);
            -> Lscht den Bildschirmbereich 'rect'

        void rc_sc_invert(GRECT *rect);
            -> Invertiert den Bildschirmbereich 'rect'

        int rc_sc_scroll(GRECT *in_out,int dist_x,int dist_y,GRECT *out2)
            -> Rechteck 'in_out' um Distanz (dist_x,dist_y) verschieben
               und neuzuzeichnende Rechtecke in 'in_out' und 'out2'
               zurckgeben. Dabei wird automatisch der Bereich auf den
               Bildschirm beschrnkt. (diese Funktion ist die Grundlage
               der Funktion scroll_window())
            -> Rckgabewerte:
               0 - kein Redraw ntig
               1 - Rechteck 'in_out' mu neugezeichnet werden
               2 - Rechtecke 'in_out' und 'out2' mssen neugezeichnet
                   werden (nur bei diagonalem Scrolling)

    5. VDI-(Attribut-) und Clipping-Funktionen
       ---------------------------------------

        Hinweis:
        --------
        Das Clipping der internen Workstation ist normalerweise auf das
        Desktopfenster oder whrend eines Redraws auf Bereiche der
        Rechteckliste eines Fensters gesetzt. Grundstzlich ist der
        Ausgabebereich aber INNERHALB des Bildschirms!

        void vsf_aespattern(int handle, int x, int y, int pattern)
            -> an die Koordinaten (x,y) angepates AES-Fllmuster
               'pattern' (0-7) berechnen und als neues Fllmuster der
               Workstation 'handle' setzen

        void vs_attr(void);
            -> wurden die Attribute der internen VDI-Workstation x_handle
               nicht ber Library-Funktionen verndert, so mu diese
               Funktion sofort danach aufgerufen werden, um dies der
               Library mitzuteilen

        int v_set_font(int font_id)
            -> Zeichensatz mit der Font-ID 'font_id' einstellen
            -> Rckgabewert: Tatschlich eingestellte Font-ID

        int v_set_point(int all,int height)
            -> Zeichenhhe 'height' in Punkt einstellen. Zwischengren
               knnen bei Vektorfonts nur eingestellt werden, sofern der
               Parameter 'all' ungleich Null ist und die Library mit den
               Font-Funktionen bersetzt wurde (ohne SMALL_NO_FONT-Makro)
            -> Rckgabewert: Tatschlich eingestellte Gre

        Hinweis:
        --------
        Wird fr einen Attribut-Parameter der folgenden Funktionen ein
        negativer Wert bergeben, so wird die Einstellung nicht gendert!

        void v_set_text(int font,int height,int color,int effect,
                        int rotate,int out[4])
            -> VDI-Text-Attribute der internen Workstation x_handle setzen:
               font:    Font-ID
               height:  Hhe in Pixel (>0) oder in Punkt (<0, bei Vektor-
                        fonts auch Zwischengren, sofern die Library
                        mit den Font-Funktionen (ohne SMALL_NO_FONT-Makro)
                        bersetzt wurde) (keine Vernderung bei 0)
               color:   Text-Farbe
               effect:  Text-Effekte
               rotate:  Text-Winkel in 1/10-Grad
               out:     Array fr Rckgabewerte von vst_height/vst_point
                        oder NULL

        void v_set_mode(int mode);
            -> Grafikmodus der internen Workstation x_handle auf
               den Wert 'mode' (0-3) setzen

        void v_set_line((int color,int width,int type,int start,int end)
            -> VDI-Linien-Attribute der internen Workstation x_handle
               setzen:
               color: Linien-Farbe
               width: Linien-Dicke
               type:  Linien-Stil (benutzerdefiniertes Muster (type==7) mu
                      u.a. vor der Benutzung gesetzt werden!)
               start: Linien-Anfang
               end:   Linien-Ende

        void v_set_fill(int color,int interior,int style,int peri);
            -> VDI-Fllmuster-Attribute der internen Workstation
               x_handle setzen:
               color:    Fllmuster-Farbe
               interior: Fllmuster-Typ (0-4, benutzerdefinierte Muster
                         mssen vor der Benutzung gesetzt werden!)
               style:    Fllmuster-Stil
               peri:     Umrandung

        void v_aespattern(int x,int y,int pattern);
            -> an die Koordinaten (x,y) angepates AES-Fllmuster
               'pattern' (0-7) berechnen und als neues Fllmuster der
               internen Workstation x_handle setzen

        void save_clipping(int *array);
            -> aktuellen Clipping-Bereich im Koordinaten-Feld 'array'
               sichern

        void restore_clipping(int *array);
            -> Clipping-Bereich auf Koordinaten-Feld 'array' setzen

        void v_line(int x1,int y1,int x2,int y2)
            -> Linie von den Koordinaten (x1,y1) zu den Koordinaten (x2,y2)
               entsprechend den Linien-Attributen der internen Workstation
               x_handle zeichnen

        void v_rect(int x1,int y1,int x2,int y2)
            -> Rechteck mit der linken oberen Ecke (x1,y1) und der rechten
               unteren Ecke (x2,y2) entsprechend den Linien-Attributen der
               internen Workstation x_handle zeichnen

    6. Erweiterte Scrap-Directory-Routinen
       -----------------------------------

        int scrp_path(char *path,char *file)
            -> vollstndigen Zugriffspfad der Clipboard-Datei 'file'
               (sofern file!=NULL) ermitteln. Wird fr den Parameter 'file'
               NULL bergeben, so wird nur der Clipboard-Pfad ermittelt.
            -> Rckgabewert:
               TRUE:  Alles in Ordnung
               FALSE: Kein Clipboard-Pfad gesetzt

        void scrp_clear(int all);
            -> Alle Dateien (all!=0) oder nur die 'SCRAP.*'-Dateien
               im Scrap-Directory lschen

        long scrp_length(void);
            -> Berechnung der Lnge des Inhalts des Scrap-Directories

        int scrp_find(char *extensions,char *filename);
            -> Scrap-Directory (Clipboard) nach Scrap-Datei mit einer
               der durch Komma, Punkt oder Leerzeichen getrennten
               Erweiterungen 'extensions' durchsuchen, z.B.
               scrp_find("img.txt.asc.ps",scrap). Dabei wird die Liste
               von links nach rechts abgearbeitet.
            -> String 'filename' enthlt im Erfolgsfall (Rckgabewert
               ungleich Null) den kompletten Pfad der gefundenen Datei

        void scrp_changed(int format,long best_ext);
            -> Clipboard-Inhalt wurde verndert (SC_CHANGED-Nachricht
               wird (per XAccBroadCast) an alle Applikationen gesendet),
               wobei nach dem Lschen des Clipboards
               scrp_changed(SCF_INDEF,0l) aufgerufen werden sollte.
            -> format: Bitmap des Dateiformats

            #define SCF_INDEF   0x0000  /* undefiniert */
            #define SCF_DBASE   0x0001  /* Datenbank */
            #define SCF_TEXT    0x0002  /* Text */
            #define SCF_VECTOR  0x0004  /* Vektor-Grafik */
            #define SCF_RASTER  0x0008  /* Raster-Grafik */
            #define SCF_SHEET   0x0010  /* Tabellen-Kalkulation */
            #define SCF_SOUND   0x0020  /* Sound */

            -> best_ext: 4 Zeichen (z.B. ".RTF") fr die "beste" der
                         abgespeicherten Dateien

    7. Erweiterte Grafik-Routinen
       --------------------------

        Hinweis:
        --------
        Im Gegensatz zu den entsprechenden AES-Grafik-Funktionen blockieren
        die Echtzeit-Funktionen der Library die Ereignis-Auswertung nicht,
        so da z.B. im Hintergrund weiterhin Timer-Ereignisse stattfinden
        knnen.

        void graf_busy_mouse(void);
            -> Maus als rotierende Scheibe darstellen

        void graf_set_slider(SLINFO *slider,OBJECT *tree,int mode);
            -> Elemente des Sliders 'slider' im Baum 'tree' anhand der
               Werte der SLINFO-Struktur initialisieren und gegebenenfalls
               neuzeichnen. Dabei wird auch eine evtl. angegebene Funktion
               'sl_do' (s. SLINFO-Struktur) aufgerufen und die Position
               (sl_pos) auf gltige Werte gesetzt, sofern der Modus
               'GRAF_SET_SIZE_POS' gesetzt ist.
            -> mode: Bitmap der Initialisierung

            #define GRAF_SET_ARROWS     1
                -> Slider-Pfeile setzen
            #define GRAF_SET_SIZE_POS   2
                -> Gre/Position des Schiebers berechnen und setzen:

                   Ist die Seitengre 'sl_page' grergleich des Maximal-
                   werts 'sl_max' des Schiebers, so wird die Gre des
                   Sliders auf die Gre des Elternobjekts gesetzt. Ist
                   'sl_page' kleinergleich 1, so wird die Gre auf den
                   'sl_max'-ten Bruchteil der Gre des Elternobjekts ge-
                   setzt. In allen anderen Fllen wird die Gre des Sliders
                   aus dem Verhltnis der Seitengre zum Maximalwert ge-
                   bildet.
                   Setzt man die minimale Gre auf die Gre des Eltern-
                   objekts, so kann man mit den Sliderfunktionen auch
                   automatische Zhlboxen realisieren (s. Beispielprogramm
                   'DialDemo')

            #define GRAF_SET            3
                -> wie GRAF_SET_ARROWS und GRAF_SET_SIZE_POS
            #define GRAF_DRAW_SLIDER    4
                -> Slider-Elemente zeichnen
            #define GRAF_DRAW           7
                -> wie GRAF_SET und GRAF_DRAW_SLIDER

        void graf_arrows(SLINFO *slider,OBJECT *tree,int draw);
            -> Pfeile des Sliders 'slider' im Baum 'tree' initialisieren
               und gegebenenfalls neuzeichnen (draw!=0)

        void graf_rt_slidebox(SLINFO *slider,int object,int double_click,
                              int pos,int cursor);
            -> Echtzeitslider auswerten und darstellen (diese Routine wird
               intern automatisch aufgerufen, wenn die SLINFO-Strukturen
               bei open_dialog() bergeben wurden)
            -> Parameter:
                slider: Zeiger auf SLINFO-Struktur des Sliders

                #define HOR_SLIDER      0   /* horizontaler Slider */
                #define VERT_SLIDER     1   /* vertikaler Slider */

                #define SL_STEP         0   /* Einzelschritt */
                #define SL_LINEAR       1   /* linear */
                #define SL_LOG          2   /* logarithmisch */
                #define SL_EXP          3   /* exponential */

                SLKEY-Struktur:
                ---------------

                typedef struct
                {
                    /* Scan-Code des Ereignisses
                       Highbyte: Scan-Code oder Null
                       Low-Byte: ASCII-Code oder Null */
                    int     scan;

                    /* Sondertastenstatus (K_SHIFT ist dabei eine
                       Abkrzung fr (K_RSHIFT|K_LSHIFT)) */
                    int     state;

                    /* Slider-Kommando (s. Beschreibung des
                       Parameters 'object')
                    int     cmd;
                } SLKEY;

                SLINFO-Struktur:
                ----------------

                typedef struct
                {
                    /* Zeiger auf DIAINFO-Struktur des Dialogs. Wenn die
                       SLINFO-Struktur bei open_dialog() bergeben wird,
                       dann mu diese Variable nicht initialisiert werden,
                       d.h. wird automatisch (zurck-) gesetzt. Ansonsten
                       sollte man die Variable auf NULL setzen, wenn der
                       Dialog geschlossen ist, v.a. wenn die SLINFO-
                       Struktur in diesem Fall noch benutzt wird. */
                    DIAINFO *sl_info;

                    /* Nummer des Ausgabe-Objekts (z.B. Liste mit Eintrgen)
                       oder negativer Wert, falls nicht vorhanden oder
                       manuelle Ausgabe. Wird das Ausgabeobjekt angegeben,
                       so wird der Bereich bei einer Vernderung der Slider-
                       position automatisch gescrollt und aktualisiert
                       (siehe z.B. Hilfe-Fenster im Beispielprogramm
                        'DialDemo') */
                    int     sl_view;

                    /* Breite/Hhe einer Spalte/Zeile in Pixel (wird fr
                       den Cursor und das Ausgabeobjekt bentigt) */
                    int     sl_line;

                    /* Nummer des Elternobjekts */
                    int     sl_parent;

                    /* Objektnummer des Schiebers (einzige Bedingung
                       ist, da der Schieber sich komplett innerhalb
                       des Elternobjekts befindet. Ansonsten ist der
                       Aufbau (Objekt-Typen, Gren, Existenz) eines
                       Echtzeitschiebers beliebig) */
                    int     sl_slider;

                    /* Minimale Gre des Schiebers (wird gegebenenfalls
                       auf Gre einer Zeichenbox hochgesetzt) */
                    int     sl_min_size;

                    /* Objektnummern der Pfeile oder negative Werte */
                    int     sl_dec,sl_inc;

                    /* Position, Seitenlnge (>=1) und Maximalwert des
                       Schiebers. Die Position kann die Werte von 0 bis
                       max(sl_max-sl_page,0) durchlaufe */
                    int     sl_pos,sl_page,sl_max;

                    /* Position des Cursors oder negativer Wert, falls keine
                       Cursor-Verwaltung gewnscht. Dabei werden von der
                       Library nur die Position automatisch verwaltet u. die
                       entsprechenden Bereiche des Ausgabeobjekts neu ausge-
                       geben (u.a. Scrolling, falls Cursor an den Rand des
                       Ausgabeobjekts kommt). Der Cursor kann dabei die
                       Werte von 0 bis max(sl_max-1,0) durchlaufen.
                       Ob und wie der Cursor dargestellt wird, bleibt dem
                       Programmierer berlassen.
                       WICHTIG:
                       Fr die Cursorverwaltung mssen die Variablen
                       sl_view und sl_line ebenfalls gesetzt sein! */
                    int     sl_cursor;

                    /* Richtung des Sliders: */
                    char    sl_vh;      /* HOR_SLIDER,VERT_SLIDER */

                    /* Wiederholungs-Modus der Pfeile */
                    char    sl_mode;    /* SL_STEP,SL_LINEAR,SL_LOG,SL_EXP */

                    /* Verzgerungsdauer in Milisekunden vor und whrend der
                       Wiederholung */
                    int     sl_delay,sl_speed;

                    /* Zeiger auf Routine (oder NULL), welche nach jeder
                       Vernderung der Sliderposition (sl_pos) oder Cursor-
                       position (sl_cursor) bzw. bei vollautomatischen
                       Slidern in der Initialisierung aufgerufen wird */
                    void    (*sl_do)(SLINFO *sl,OBJECT *tree,
                                     int pos,int prev,int max_pos,
                                     int cursor,int prev_crs);
                    /* sl:      Zeiger auf SLINFO-Struktur des Sliders
                                (bei geschlossenem Dialog ist sl->sl_info
                                 ein NULL-Pointer!)
                       tree:    Zeiger auf Slider-Baum
                       pos:     aktuelle Position des Schiebers
                       prev:    vorherige Position des Schiebers
                       max_pos: maximale Position des Schiebers
                       cursor:  aktuelle Position des Cursors (negativer
                                Wert bedeutet, da der Cursor inaktiv ist)
                       prev_crs:vorherige Position des Cursors */

                    /* Zeiger auf Feld mit Slider-Hotkeys oder NULL (wird
                       nur ausgewertet, wenn die SLINFO-Struktur bei
                       open_dialog() bergeben wurde) */
                    SLKEY   *sl_keys;

                    /* Anzahl der Hotkeys im Feld 'sl_keys' */
                    int     sl_keys_cnt;
               } SLINFO;

               object: angeklicktes Objekt oder eines der folgenden
                       Kommandos:

                        #define SL_UP       -1  /* Zeile/Spalte hoch */
                        #define SL_DOWN     -2  /* Zeile/Spalte runter */
                        #define SL_PG_UP    -3  /* Seite hoch */
                        #define SL_PG_DN    -4  /* Seite runter */
                        #define SL_START    -5  /* Slider-Anfang */
                        #define SL_END      -6  /* Slider-Ende */
                        #define SL_CRS_UP   -7  /* Cursor eine Zeile/Spalte
                                                   nach oben */
                        #define SL_CRS_DN   -8  /* Cursor eine Zeile/Spalte
                                                   nach unten */
                        #define SL_SET      -9  /* Slider- und Cursorposi-
                                                   tion auf Werte 'pos' und
                                                   'cursor' setzen */

               double_click: Objekt wurde per Doppelklick angeklickt
               pos,cursor:   neue Slider- und Cursorpositionen fr das
                             Kommando 'SL_SET'. Dabei wird der Anzeige-
                             bereich und der Cursor gegebenenfalls automa-
                             tisch neugzeichnet.

        void graf_rt_slidecursor(SLINFO *slider,int exit)
            -> automatische Positionierung des Slidercursors (sl_cursor)
               und evtl. Scrolling des Sliders 'slider' in Abhngigkeit von
               der Mausposition.
               Der Cursor wird auf das Objekt unter dem Mauszeiger gesetzt
               und wenn der Mauszeiger den Bereich des Sliders (sl_view-
               Objekt) verlt, dann wird der Slider automatisch gescrollt.
               Abgebrochen wird die Funktion, sobald die Maustaste losge-
               lassen wird oder nach dem ersten Setzen des Cursors, sofern
               exit!=0 ist.

        int graf_rt_rubberbox(int desk_clip,int s_x,int s_y,
                              int min_w,int min_h,GRECT *rect,int *w,int *h,
                              void (*box_do)(boolean draw,int *array,
                                             MKSTATE *mk));
            -> Echtzeitgummiband innerhalb des Rechtecks 'rect' mit den
               Start-Koordinaten (s_x,s_y) darstellen und auswerten (bei
               einer gedrckten Sondertaste (Shift, Alternate oder Control)
               wird ein quadratisches Gummiband aufgezogen).
               Wird die Funktion bei gedrckter linker oder rechter Maus-
               taste aufgerufen, so wird das Rechteck whrend des Gedrckt-
               haltens aufgezogen. Ist keine Maustaste beim Aufruf der Funk-
               tion gedrckt, so wird das Rechteck durch einen Mausklick
               besttigt.
            -> Parameter:
               desk_clip:   Ist dieser Paramter gesetzt und eine Ausgabe auf
                            dem Desktop mglich, so wird das Rechteck nur im
                            Desktopbereich - ansonsten im Vordergrund - aus-
                            gegeben
               min_w,min_h: Minimale Breite/Hhe des Rechtecks (bei nega-
                            tiven Werten kann das Rechteck in jede Richtung
                            aufgezogen werden)
               box_do:      Zeiger auf eine Funktion (oder NULL), welche
                            nach jeder Vernderung des Rechtecks aufgerufen wird.
                            Dadurch knnen z.B. Icons innerhalb des Recht-
                            ecks selektiert werden.
                            Parameter:
                            draw:  Rechteck wird gerade gezeichnet (TRUE)
                                   oder gelscht (FALSE)
                            array: Zeiger auf das Koordinaten-Array des
                                   Rechtecks (entspricht Zeiger auf eine
                                   GRECT-Struktur)
                            mk:    Zeiger auf MKSTATE-Struktur, welche
                                   Informationen ber die Maus und die
                                   Umschalttasten enthlt
            -> Rckgabewert:
               TRUE:  Rechteck wurde aufgezogen
                      *w,*h: Breite/Hhe des Rechtecks
               FALSE: Rechteck konnte nicht aufgezogen werden (z.B.
                      Startkoordinaten auerhalb des Begrenzungsrechtecks)
               FAIL:  wie TRUE, nur da die Funktion per Rechtsklick ab-
                      gebrochen wurde

        int graf_rt_dragbox(int desk_clip,GRECT *start,GRECT *bound,
                            int *x,int *y,
                            void (*box_do)(boolean draw,int *array,
                                           MKSTATE *mk));
            -> Verschieben des Rechtecks 'start' innerhalb des greren
               Begrenzungsrechtecks 'bound'.
               Wird die Funktion bei gedrckter linker oder rechter Maus-
               taste aufgerufen, so wird das Rechteck whrend des Gedrckt-
               haltens verschoben. Ist keine Maustaste beim Aufruf der Funk-
               tion gedrckt, so wird das Rechteck durch einen Mausklick
               positioniert.
            -> Parameter:
               desk_clip: Ist dieser Paramter gesetzt und eine Ausgabe auf
                          dem Desktop mglich, so wird das Rechteck nur im
                          Desktopbereich - ansonsten im Vordergrund - aus-
                          gegeben
               box_do:    Zeiger auf eine Funktion (oder NULL), welche nach
                          jeder Vernderung des Rechtecks aufgerufen wird.
                          Dadurch knnen z.B. Icons unterhalb des Recht-
                          ecks selektiert werden.
                          Parameter:
                          draw:  Rechteck wird gerade gezeichnet (TRUE) oder
                                 gelscht (FALSE)
                          array: Zeiger auf das Koordinaten-Array des Recht-
                                 ecks (entspricht Zeiger auf eine
                                 GRECT-Struktur)
                          mk:    Zeiger auf MKSTATE-Struktur, welche Infor-
                                 mationen ber die Maus und die Umschalt-
                                 tasten enthlt
            -> Rckgabewert:
               TRUE:  Rechteck wurde verschoben
                      *x/*y: Koordinaten des Rechtecks
               FALSE: Rechteck konnte nicht verschoben werden (z.B.
                      Rechteck grer als Begrenzungsrechteck)
               FAIL:  wie TRUE, nur da die Funktion per Rechtsklick ab-
                      gebrochen wurde

        void graf_rt_lines(int *objects,boolean close)
            -> mehrere graue Objektrahmen (diese sollten nur aus horizon-
               talen und vertikalen Linien bestehen) im XOR-Modus zeichnen.
               Die Funktion schaltet weder die Maus aus/ein noch setzt sie
               den wind_update()-Status! Ebenso werden die Objektrahmen im
               aktuellen Clippingbereich der internen VDI-Workstation
               x_handle gezeichnet.
            -> Parameter:
               close:   evtl. nicht geschlossene Objekte werden automatisch
                        geschlossen (close==TRUE)
               objects: Aufbau des Arrays:
                        Zuerst kommt ein Integerwert, der die Anzahl der
                        folgenden Koordinaten des Objekts angibt oder ein
                        Wert kleinergleich Null fr das Ende der Liste.
                        Anschlieend folgen die Koordinaten (jeweils 2
                        Integerwerte). Danach folgt das nchste Objekt usw.

        int graf_rt_dragobjects(int desk_clip,int *objects,GRECT *bound,
               void (*object_do)(boolean draw,int *objects,MKSTATE *mk));
            -> Verschieben der Objekte 'objects' (Aufbau des Array s.
               Funktion graf_rt_lines) innerhalb des Begrenzungsrechtecks
               'bound'.
               Wird die Funktion bei gedrckter linker oder rechter Maus-
               taste aufgerufen, so werden die Objekte whrend des Gedrckt-
               haltens verschoben. Ist keine Maustaste beim Aufruf der Funk-
               tion gedrckt, so werden die Objekte durch einen Mausklick
               positioniert.
            -> Parameter:
               desk_clip: Ist dieser Paramter gesetzt und eine Ausgabe auf
                          dem Desktop mglich, so werden die Objekte nur im
                          Desktopbereich - ansonsten im Vordergrund - aus-
                          gegeben
               objects_do:Zeiger auf eine Funktion (oder NULL), welche nach
                          jeder Positionsvernderung der Objekte aufgerufen
                          wird. Dadurch knnen z.B. Icons unterhalb der
                          Objekte/des Mauszeigers selektiert werden.
                          Parameter:
                          draw:    Objekte werden gerade gezeichnet (TRUE)
                                   oder gelscht (FALSE)
                          objects: Zeiger auf das Objekt-Array (die
                                   Koordinaten werden automatisch angepat)
                          mk:      Zeiger auf MKSTATE-Struktur, welche
                                   Informationen ber die Maus und die Um-
                                   schalttasten enthlt
            -> Rckgabewert:
               TRUE:  Objekte wurden verschoben (Array 'objects' enthlt
                      die neuen Objektkoordinaten)
               FALSE: Objekte konnten nicht verschoben werden (z.B.
                      Ausmae der Objekte grer als Begrenzungsrechteck)
               FAIL:  wie TRUE, nur da die Funktion per Rechtsklick ab-
                      gebrochen wurde

    8. Men-Funktionen
       ---------------

        WICHTIG:
        --------
        Alle Men-Funktionen, bei denen kein Zeiger auf den Objektbaum
        bergeben wird, funktionieren nur, wenn vorher eine Men-Leiste
        per menu_install() angemeldet wurde! Ansonsten mssen die
        entsprechenden AES-Funktionen benutzt oder die Objekt-Attribute
        direkt manipuliert werden.
        Unter MultiTasking wird beachtet, welcher Applikation die Men-
        leiste gehrt, um unntige Prozeumschaltungen zu verhindern.

        int menu_install(OBJECT *menu,int show);
            -> Men-Leiste 'menu' darstellen (show!=0) oder lschen
               (show==0). Diese Funktion bercksichtigt, ob gegebenenfalls
               auch ein Accessory eine Men-Leiste besitzen darf und ini-
               tialisiert die Men-Punkte 'Fenster wechseln' und 'Fenster
               schlieen'
            -> Rckgabewert wie bei 'menu_bar'

        void menu_enable(boolean enable);
            -> Men-Leiste aktivieren (enable==TRUE) bzw. deaktivieren
               (enable==FALSE) und neuzeichnen.

        void menu_item_enable(int object,int enable)
            -> Men-Eintrag 'object' aktivieren (enable!=0) oder
               deaktivieren (enable==0)

        void menu_select(int title,int select)
            -> Men-Titel 'title' normal (select==0) oder invers
               (select!=0) darstellen

        boolean menu_dropped();
            -> Testen, ob ein Drop-Down-Men der Menleiste heruntergeklappt
               ist

        MITEM-Struktur:
        ---------------

        typedef struct
        {
            /* Objektnummer des entsprechenden Meneintrages oder
               negativer Wert, falls nicht vorhanden */
            int menu;

            /* Scan-Code des Hotkeys:
               Highbyte: Scan-Code oder Null
               Lowbyte:  ASCII-Code oder Null */
            int scan;

            /* Sondertastenstatus (K_SHIFT ist dabei eine Abkrzung fr
               (K_RSHIFT|K_LSHIFT)) */
            int state;

            /* gewnschtes Fensterkommando (mgliche Werte siehe Kommandos
               der Funktionen WindowHandler und scroll_window (letzteres
               nur, falls Library nicht mit SMALL_NO_SCROLL bersetzt
               wurde)) */
            int mode;

            int msg; /* reserviert (0) */
        } MITEM;

        void MenuItems(MITEM *close,MITEM *closeall,
                       MITEM *cycle,MITEM *invcycle,MITEM *globcycle,
                       MITEM *full,MITEM *bottom,
                       MITEM *iconify,MITEM *iconify_all,
                       MITEM *menu,int menu_cnt)
            -> Hotkeys und Menpunkte fr verschiedene Fenster-Funktionen
               definieren. Wird fr einen MITEM-Zeiger ein NULL-Pointer
               bergeben, so werden die vordefinierten Hotkeys/Kommandos
               verwendet. Die jeweiligen Menpunkte werden entsprechend
               dem Kommando und der Anzahl der geffneten Fenster (de-)
               aktiviert und die dazugehrigen Aktionen (Auswahl des
               Menpunkts oder Tastendruck) automatisch ausgewertet. ber-
               gibt man fr einen Parameter eine MITEM-Struktur, deren
               Elemente alle auf Null gesetzt sind, so ist die zugehrige
               Funktion inaktiv.
            -> Parameter:
               close:       MITEM-Struktur fr Menpunkt 'Fenster schlieen'
                            (voreingestell: CTRL-U, Kommando W_CLOSE)
               closeall:    MITEM-Struktur fr Menpunkt 'Alle Fenster
                            schlieen' (voreingestellt: CTRL-SHIFT-U,
                            Kommando W_CLOSEALL)
               cycle:       MITEM-Struktur fr Menpunkt 'Fenster wechseln'
                            (voreingestellt: CTRL-W, Kommando W_CYCLE)
               invcycle:    MITEM-Struktur fr Menpunkt 'Fenster invers
                            wechseln' (voreingestellt: CTRL-SHIFT-W,
                            Kommando W_INVCYCLE)
               globcycle:   MITEM-Struktur fr Menpunkt 'Fenster global
                            wechseln' (voreingestellt: ALT-CTRL-W,
                            Kommando W_GLOBALCYCLE)
               full:        MITEM-Struktur fr Menpunkt 'Volle Gre'
                            (voreingestellt: CTRL-#*, Kommando W_FULL)
               bottom:      MITEM-Struktur fr Menpunkt 'In Hintergrund
                            legen' (voreingestellt: CTRL-#/,
                            Kommando W_BOTTOM)
               iconify:     MITEM-Struktur fr Menpunkt 'Fenster ikonifi-
                            zieren' (voreingestellt: CTRL-Space,
                            Kommando W_ICONIFY)
               iconify_all: MITEM-Struktur fr Menpunkt 'Alle Fenster iko-
                            nifizieren' (voreingestellt: CTRL-SHIFT-Space),
                            Kommando W_ICONIFYALL)
               menu:        reserviert (NULL)
               menu_cnt:    reserviert (0)

    9. Dialog-Optionen und -optik setzen
       ---------------------------------

        void dial_colors(int dial_pattern,int dial_color,int dial_frame
                         int hotkey,int alert,int cycle_button,
                         int check_box,int radio_button,int arrow,
                         int cycle_backgrnd,int check_backgrnd,
                         int radio_backgrnd,int arrow_backgrnd,
                         int edit_3d,int draw_3d)
            -> Dialog-Optik setzen. Unter neueren AES-Versionen mit 3D-Look
               sollte man die AES-3D-Farben verwenden, indem man fr den
               Parameter dial_color einen negativen Wert bergibt.
               Die Parameter dial_pattern, cycle_backgrnd, check_backgrnd,
               radio_backgrnd und arrow_backgrnd werden dann automatisch ge-
               setzt, sofern man fr diese einen negativen Wert bergibt.

               @{B}Hinweis:@{0}
               Hintergrundfarbe u. -muster des Dialogs sowie 3D-Optionen
               gelten nur fr die Dialoge, die nach dem Aufruf dieser Funk-
               tion geffnet werden, whrend alle anderen Einstellungen ab
               sofort gelten, d.h. ab dem nchsten Neuzeichnen der ent-
               sprechenden Objekte.
               Auerdem knnen nur die 16 AES-Farben verwendet werden.

               dial_pattern:   Hintergrundmuster des Dialogs (0-7)
               dial_color:     Hintergrundfarbe des Dialogs
               dial_frame:     Farbe des Dialograhmens
               hotkey:         Farbe des Hotkey-Unterstrichs
               alert:          Farbe des Alert-Icons
               cycle_button:   Cycle-Button-Farbe
               check_box:      Checkbox-Farbe
               radio_button:   Radio-Button-Farbe
               arrow:          Slider-Arrow-Farbe
               cycle_backgrnd: Cycle-Button-Hintergrundfarbe
               check_backgrnd: Checkbox-Hintergrundfarbe
               radio_backgrnd: Radio-Button-Hintergrundfarbe
               arrow_backgrnd: Slider-Arrow-Hintergrundfarbe
               edit_3d:        Eingabefelder automatisch auf selektierten
                               3D-Look bei vorhandenem AES-3D-Look setzen
                               und OUTLINED-Status lschen, wenn entweder
                               das Eingabefeld einen Rahmen besitzt oder
                               mehr als 4 Farben verfgbar sind.
               draw_3d:        Objekte mit gesetztem DRAW3D-Status bei vor-
                               handenem AES-3D-Look auf selektierten
                               3D-Look setzen.

        void dial_options(boolean round,boolean niceline,boolean standard,
                          boolean return_default,boolean background,
                          boolean nonselectable,boolean always_keys,
                          boolean toMouse,boolean clipboard,int hz);
            -> verschiedene Optionen setzen:
               round:          Dialogpositionen und Fensterpositionen
                               auf Bytegrenzen (aus Geschwindigkeits-
                               grnden) runden
               niceline:       Niceline fr Trennstriche in Mens/Popups
               standard:       gewhnliche GEM-Optik bei Checkboxen, Slider-
                               Pfeilen und Cycle-Buttons verwenden (kann
                               auch durch die Verwendung normaler Objekte
                               im Resource oder durch entsprechende Button-
                               Images erreicht werden)
               return_default: RETURN_DEFAULT:
                                -> Return selektiert Default-Objekt
                               RETURN_NEXT_EDIT:
                                -> Return springt zum nchsten Eingabefeld
                               RETURN_LAST_DEFAULT:
                                -> Return selektiert Default-Objekt beim
                                   letzten Eingabefeld (ansonsten wie
                                   RETURN_NEXT_EDIT)
               background:     ALWAYS_BACK:
                                 -> Fenster (-dialoge) knnen unter jeder
                                   TOS-Version im Hintergrund bedient werden
                               NO_BACK:
                                 -> Keine Hintergrundbedienung
                               AES_BACK:
                                 -> Hintergrundbedienung nur, wenn dies
                                    durch GEM untersttzt wird (MTOS,
                                    MagiC, Geneva, Winx, Falcon-TOS)
               nonselectable:  Fliegende Dialoge fliegen auch beim Anklicken
                               von nicht-selektierbaren/editierbaren
                               Objekten (analog lassen sich Fensterdialoge
                               verschieben)
               always_keys:    KEY_FIRST:
                                -> Tastendruck erst an Event-Handler weiter-
                                   leiten und danach nicht ausgewertete
                                   Tastendrcke in Dialogroutinen auswerten
                               KEY_STD:
                                -> Tastendruck wird zuerst von Dialog-
                                   routinen ausgewertet und nicht ausge-
                                   wertete Tastendrcke werden an Event-
                                   Handler weitergeleitet (auer bei
                                   modalen/fliegenden Dialogen)
                               KEY_ALWAYS:
                                -> wie KEY_STD, nur da nicht ausgewertete
                                   Tastendrcke immer weitergeleitet wer-
                                   den
               toMouse:        Tastendrcke an Fensterdialog unter Maus-
                               zeiger senden, sofern oberster Dialog
                               weder modal noch fliegend ist
                               -> zusammen mit 'background' ist somit eine
                                  vollstndige Bedienung von Hintergrund-
                                  dialogen mglich
               clibpoard:      Klemmbrettuntersttzung in Eingabefeldern
               hz:             Blinkrate (in Hertz) des Cursors in Eingabe-
                               feldern oder statischer Cursor (hz<=0)

        void header_options(boolean set,boolean center,boolean frame,
                            boolean small,boolean transp,int tcolor,
                            int fcolor,int bcolor,int bpattern)
            -> Optik der Rahmen-Objekte (erweiterter Typ HEADER) setzen
               (wirkt sich nur bei Dialogen aus, die nach dieser Funktion
                geffnet werden)
               set:      Optik der Rahmen-Objekte entsprechend den
                         Einstellungen setzen (set==TRUE) oder die Ein-
                         stellungen im Objektbaum/Resource unverndert
                         lassen (set==FALSE)
               center:   berschrift zentriert (center==TRUE) oder links-
                         bndig
               frame:    berschriften umrahmen
               small:    Kleiner System-Font (SMALL)
               transp:   transparente Schrift
               tcolor:   Farbe der Schrift (0-15)
               fcolor:   Farbe des Rahmens (0-15)
               bcolor:   Innenfarbe (0-15)
               bpattern: Innenmuster (0-7)

        void title_options(boolean mode,int color,int size);
            -> Unterstrichenen Text (erweiterter Typ UNDERLINE) setzen:
               mode:  Strich wird ber die ganze Breite des Dialogs (TRUE)
                      oder ber die im Resource vorgebenen Koordinaten
                      (FALSE) gezeichnet
               color: Strichfarbe (0-15)
               size:  Strickdicke in Pixel oder Null, wenn der Wert aus
                      der Resource-Struktur entnommen werden soll

        BUTTON-Struktur:
        ----------------
            typedef struct
            {
                /* Zeiger auf monochrome 16x16-Bitmap (32 Bytes) des
                   selektierten und des normalen Buttons im gerte-
                   abhngigen Format */
                int *but_on,*but_off;
            } BUTTON;

        void radio_image(int index,BUTTON *radiobutton);
            -> vordefinierte Images (index: 0-8) oder benutzerdefinierten
               Button 'radiobutton' (radiobutton!=NULL) fr Radio-Buttons
               auswhlen

        void check_image(int index,BUTTON *checkbox);
            -> vordefinierte Images (index: 0-5) oder benutzerdefinierten
               Button 'checkbox' (checkbox!=NULL) fr Check-Box auswhlen
               (keine Auswirkung auf Optik der TriState-Checkbox!)

        void cycle_image(int index,BUTTON *cyclebutton,char cycle);
            -> vordefinierte Images (index: 0-2) oder benutzerdefinierten
               Button 'cyclebutton' (cyclebutton!=NULL) fr Cycle-Buttons
               auswhlen. Der Parameter 'cycle' gibt an (sofern cycle!=0),
               welches Zeichen fr den Cycle-Button verwendet werden soll,
               wenn die Images aufgrund der Ausmae des Systemfonts nicht
               verwendet werden knnen.

        void arrow_image(int index,BUTTON *down,BUTTON *up,BUTTON *left,
                         BUTTON *right);
            -> vordefinierte Images (index: 0-2) oder benutzerdefinierte
               Buttons 'down', 'up' 'left', 'right' (sofern ungleich NULL)
               fr Slider-Pfeile auswhlen. Dabei knnen in den BUTTON-
               Strukturen fr den selektierten Zustand (but_on) optional
               NULL-Pointer gesetzt werden, so da dann einfach der normale
               Zustand (but_off) bei Selektion invertiert wird.

    10. Bibliothek (AES,VDI) sowie Resource (de-) initialisieren
        --------------------------------------------------------

        boolean open_work(int *handle,int *work_out);
            -> virtuelle Bildschirm-Workstation ffnen
            -> Rckgabewert gleich TRUE, wenn Workstation geffnet
               werden konnte
            -> handle:   VDI-Handle im Erfolgsfall
               work_out: work_out[57]-Feld

        void close_work(int handle);
            -> virtuelle Bildschirm-Workstation 'handle' schlieen

        boolean open_device(int dev,int *handle,int *work_out);
            -> GDOS-Treiber mit Gertenummer 'dev' (mgliche Werte s.
               Funktion driver_available) ffnen
            -> Rckgabewert gleich TRUE, wenn Gert geffnet werden konnte
            -> handle:   Device-Handle im Erfolgsfall
               work_out: work_out[57]-Feld

        void close_device(int handle)
            -> GDOS-Treiber mit Device-Handle 'handle' schlieen

        boolean init_gem(char *win_id,char *m_entry,char *x_name,
                         char *a_name,int av_msgs,int va_msgs,int xacc_msgs)
            -> Initialisierung der Library
                - Anmeldung beim AES
                - Xacc-2/AV-Protokolle initialisieren
                - interne VDI-Workstation ffnen
                - GDOS-Fonts laden
                - Scrap-Directory initialisieren
                - globale Variablen sowie interne Strukturen initialisieren
            -> Parameter:
                win_id:    Programmkrzel vor jedem Fenster-Titel oder
                           NULL
                m_entry:   Eintrag im Accessory-Men (als Accessory oder
                           unter MTOS) oder NULL
                x_name:    (erweiterter) XAcc-2-Programmname
                a_name:    AV-Programmname (maximal 8 Zeichen wie bei
                           appl_find, wobei die Library den Namen gegebenen-
                           falls mit Leerzeichen erweitert)
                av_msgs:   Bitmap der untersttzten Nachrichten bei der
                           Nachricht AV_PROTOKOLL:
                           VA_START und AV_STARTED werden von der Library
                           angegeben, sofern die Library mit Drag&Drop
                           bersetzt wurde. Das Dateinamen-Quoting wird
                           grundstzlich angegeben.

                #define MSG_SETSTATUS     0x001 /* VA_SETSTATUS */
                #define MSG_START         0x002 /* VA_START */
                #define MSG_AVSTARTED     0x004 /* AV_STARTED */
                #define MSG_AVFONTCHANGED 0x008 /* VA_FONTCHANGED */
                #define MSG_AVQUOTE       0x010 /* Quoting von Dateinamen */

                va_msgs:   Bitmap der untersttzten Nachrichten bei der
                           Nachricht VA_PROTOSTATUS:
                           Quoting von Dateinamen, AV_SENDKEY, AV_EXIT,
                           AV_ACCWINDOPEN/AV_ACCWINDCLOSED sowie
                           AV_PATH_UPDATE werden von der Library immer an-
                           gegeben. Falls die Library mit Drag&Drop ber-
                           setzt wurde, so werden noch AV_STARTED,
                           AV_OPENWIND und AV_XWIND untersttzt.

                #define MSG_SENDKEY       0x001  /* AV_SENDKEY */
                #define MSG_ASKFILEFONT   0x002  /* AV_ASKFILEFONT */
                #define MSG_ASKCONFONT    0x004  /* AV_ASKCONFONT,
                                                    AV_OPENCONSOLE */
                #define MSG_ASKOBJECT     0x008  /* AV_ASKOBJECT */
                #define MSG_OPENWIND      0x010  /* AV_OPENWIND */
                #define MSG_STARTPROG     0x020  /* AV_STARTPROG */
                #define MSG_ACCWINDOPEN   0x040  /* AV_ACCWINDOPEN,
                                                    AV_ACCWINDCLOSED */
                #define MSG_STATUS        0x080  /* AV_STATUS, AV_GETSTATUS */
                #define MSG_COPY_DRAGGED  0x100  /* AV_COPY_DRAGGED */
                #define MSG_PATH_UPDATE   0x200  /* AV_PATH_UPDATE,
                                                    AV_WHAT_IZIT,
                                                    AV_DRAG_ON_WINDOW */
                #define MSG_EXIT          0x400  /* AV_EXIT */
                #define MSG_XWIND         0x800  /* AV_XWIND */
                #define MSG_VAFONTCHANGED 0x1000 /* VA_FONTCHANGED */
                #define MSG_VASTARTED     0x2000 /* AV_STARTED */
                #define MSG_VAQUOTE       0x4000 /* Quoting von Dateinamen */

                xacc_msgs: Bitmap der untersttzten ACC-Nachrichten (alle
                           anderen ACC-Nachrichten werden automatisch
                           ausgewertet)

                #define X_MSG_TEXT      0x001 /* ACC_TEXT */
                #define X_MSG_META      0x002 /* ACC_META */
                #define X_MSG_IMG       0x004 /* ACC_IMG */

            -> Rckgabewert:
                TRUE:  Ok
                FALSE: Anmeldung beim AES oder ffnen der Workstation
                       schlug fehl

        void exit_gem(boolean all,int status);
            -> Deinitialisierung der Library:
                - Dialoge und Fenster schlieen
                - Menleiste abmelden
                - Beenden der XAcc-2-/AV-Protokolle
                - geladene GDOS-Fonts wieder entfernen
                - interne VDI-Workstation schlieen
                - Abmeldung beim AES, sofern Anwendung als Programm ge-
                  startet wurde (ansonsten Endlos-Timer)
                - Programm beenden und Wert 'status' zurckgeben, sofern
                  all==TRUE

        boolean open_rsc(char *rscname,char *win_id,char *m_entry,
                         char *x_name,char *a_name,int av_msgs,int va_msgs,
                         int xacc_msgs)
            -> Initialisierung der Library (s. init_gem()) sowie Resource
               'rscname' laden
            -> Parameter: s. init_gem()
            -> Rckgabewert:
                TRUE:  Ok
                FALSE: Anmeldung beim AES oder ffnen der Workstation
                       schlug fehl
                FAIL:  Resource-File konnte nicht geladen werden (Speicher-
                       mangel oder falscher Pfad)

        void close_rsc(boolean all,int status);
            -> Resource-Speicher freigeben und Library deinitialisieren
               (Parameter s. exit_gem())

    11. Resource- und Objekt-Initialisierung
        ------------------------------------

            void fix_objects(OBJECT *tree,int scaling,
                             int orig_cw,int orig_ch);
                -> erweiterte Objekte des Baums 'tree' initialisieren sowie
                   gegebenenfalls Images/Icons skalieren (scale_image())
                   und ins Gerteformat konvertieren (trans_image())

                -> Parameter:
                   orig_cw: Breite des Entwurfsfonts in Pixel (meistens 8)
                            oder negativer Wert fr rsrc_obfix()-kompatible
                            Anpassung
                   orig_ch: Hhe des Entwurfsfonts in Pixel (meistens 8 oder
                            16) oder negativer Wert fr rsrc_obfix()-kompa-
                            tible Anpassung
                   scaling: Bitmap des Image/Icon-Skalierungs-Modus

                    #define NO_SCALING      0   /* keine Skalierung */
                    #define SCALING         1   /* Skalierung */
                    #define TEST_SCALING    2   /* Testen, ob Skalierung not-
                                                   wendig ist */
                    #define DARK_SCALING    4   /* dunkle Skalierung */
                    #define STATIC_SCALING  8   /* Dialog immer in Original-
                                                   gre skalieren */

                    Beispiele:
                    /* Nie skalieren */
                        images = NO_SCALING;

                    /* Immer skalieren */
                        images = SCALING;

                    /* Bei Bedarf (System-Font kleiner als Entwurfsfont)
                       skalieren */
                        images = SCALING|TEST_SCALING;

                    /* Bei Bedarf dunkel skalieren */
                        images = SCALING|TEST_SCALING|DARK_SCALING;

        void scale_image(OBJECT *object,int scaling,
                         int orig_cw, int orig_ch);
            -> Image/Icon 'object' skalieren
            -> Parameter s. fix_objects()

        void trans_image(OBJECT *object);
            -> Image/Icon 'object' in Gerteformat konvertieren

        void rsrc_calc(OBJECT *tree,int scaling,int orig_cw,int orig_ch);
            -> Koordinaten und Ausmae der Objekte des Baums 'tree' an
               Ausmae des System-Fonts unter Beachtung der Ausmae des
               Fonts, mit welchem die Resource-Datei erstellt wurde, an-
               passen und anschlieend erweiterte Objekte initialisieren
               (s. fix_objects())
            -> Parameter s. fix_objects()

        void rsrc_init(int n_tree,int n_obs,int n_frstr,int n_frimg,
                       int scaling,char **rs_strings,long *rs_frstr,
                       BITBLK *rs_bitblk,long *rs_frimg,
                       ICONBLK *rs_iconblk,TEDINFO *rs_tedinfo,
                       OBJECT *rs_object,OBJECT **rs_trindex,
                       RS_IMDOPE *rs_imdope,int orig_cw,int orig_ch)
            -> in Quelltext eingebundene Resource-Datei (*.RSH)
               initialisieren

            -> Parameter:
               n_tree:     Anzahl der Bume (NUM_TREE)
               n_obs:      Anzahl der Objekte (NUM_OBS)
               n_frstr:    Anzahl der freien Strings (NUM_FRSTR)
               n_frimg:    Anzahl der freien Images (NUM_FRIMG)

               rs_strings: String-Array (Pointer zeigen auf alle
                           Zeichenketten der Resource-Datei)
               rs_frstr:   Index-Array (Indizes der freien Strings
                           fr das rs_strings-Array)
               rs_bitblk:  BITBLK-Array (enthlt alle Bit-Blcke)
               rs_frimg:   Index-Array (Indizes der freien Images
                           fr das rs_bitblk-Array)
               rs_iconblk: ICONBLK-Array (enthlt alle icons)
               rs_tedinfo: TEDINFO-Array (enthlt alle TEDINFO-Strukturen)
               rs_object:  OBJECT-Array (enthlt alle Objekte)
               rs_trindex: Index-Array (Indizes der Objektbume
                           fr das rs_object-Array)
               rs_imdope:  RS_IMDOPE-Array

                RS_IMDOPE-Struktur:
                -------------------

                typedef struct
                {
                    int dummy;
                    /* Zeiger auf Bitmap (Image) */
                    int *image;
                } RS_IMDOPE;

               scaling: s. fix_objects()
               orig_cw: s. fix_objects()
               orig_ch: s. fix_objects()

               HINWEIS:
               An allen Stellen der Resource, an denen normalerweise
               Pointer vorkommen, mu der Element-Index (Long-Wert) des
               entsprechenden Arrays stehen. Die Image-Zeiger der
               Strukturen BITBLK und ICONBLK enthalten den Index des
               zugehrigen RS_IMDOPE-Elements.

    12. Ereignis-Auswertung
        -------------------

        XEVENT-Struktur:
        ----------------

        typedef struct
        {
            /* PARAMETER: */

            /* Bitmap der gewnschten Events:
               MU_KEYBD:     Tastatur-Ereignis
               MU_MESAG:     Nachrichten-Ereignis
               MU_TIMER1-4:  Timer-Ereignis 1-4
               MU_BUTTON1/2: Button-Ereignis 1/2
               MU_M1-4:      Rechteck-Ereignis 1-4 (sofern MU_M1/2 verfgbar
                             sind, sollten diese aus Geschwindigkeitsgrnden
                             auch benutzt werden!) */
            int ev_mflags;

            /* Parameter des 1. Button-Events MU_BUTTON1 */
            int ev_mb1clicks,ev_mb1mask,ev_mb1state

            /* Parameter des 1. Mouse-Event-Rechtecks MU_M1 */
            int ev_mm1flags,ev_mm1x,ev_mm1y,ev_mm1width,ev_mm1height,

            /* Parameter des 2. Mouse-Event-Rechtecks MU_M2 */
            int ev_mm2flags,ev_mm2x,ev_mm2y,ev_mm2width,ev_mm2height;

            /* Parameter des 1. Timer-Events MU_TIMER1 */
            unsigned int ev_mtlocount,ev_mthicount;

            /* RCKGABEWERTE: */

            /* eingetretene Ereignisse */
            int ev_mwich;

            /* Position des Mauszeigers sowie Zustand der Maustasten
               beim Auftreten des Events */
            int ev_mmox,ev_mmoy,ev_mmobutton;

            /* Zustand der Sondertasten beim Auftreten des Events */
            int ev_mmokstate;

            /* Scancode der gedrckten Taste (High-Byte: Scan-Code,
               Low-Byte: ASCII-Code oder Null) */
            int ev_mkreturn;

            /* Anzahl der Klicks mit der Maustaste (MU_BUTTON1) */
            int ev_mb1return;

            /* Nachrichten-Puffer */
            int ev_mmgpbuf[8];

            /* erweiterte PARAMETER: */

            /* Parameter des 2. Button-Events MU_BUTTON2 */
            int ev_mb2clicks,ev_mb2mask,ev_mb2state;

            /* Parameter des 3. Mouse-Event-Rechtecks MU_M3 */
            int ev_mm3flags,ev_mm3x,ev_mm3y,ev_mm3width,ev_mm3height;

            /* Parameter des 4. Mouse-Event-Rechtecks MU_M4 */
            int ev_mm4flags,ev_mm4x,ev_mm4y,ev_mm4width,ev_mm4height;

            /* Parameter des 2-4. Timer-Events MU_TIMER2-4 */
            long ev_mt2count,ev_mt3count,ev_mt4count;

            /* Zeitpunkt in Milisekunden des letzten Timer-Events
               MU_TIMER1-4 oder Null fr aktuelle System-Zeit */
            long ev_mt1last,ev_mt2last,ev_mt3last,ev_mt4last;

            /* Anzahl der Klicks mit der Maustaste (MU_BUTTON2) */
            int ev_mb2return;
        } XEVENT;

        Kompatibilitts-Makros fr EVENT-Struktur und AES-Event-Routinen:
        -----------------------------------------------------------------

            #define ev_mbclicks     ev_mb1clicks
            #define ev_mbmask       ev_mb1mask
            #define ev_bmask        ev_mb1mask
            #define ev_mbstate      ev_mb1state
            #define ev_mbreturn     ev_mb1return

            #define ev_mtlocount    ev_mt1locount
            #define ev_mthicount    ev_mt1hicount
            #define ev_mtlast       ev_mt1last

            #define MU_TIMER1       MU_TIMER
            #define MU_BUTTON1      MU_BUTTON

        int Event_Multi(XEVENT *event);
            -> Auf Ereignis 'event' warten (bentigte Parameter der
               Struktur mssen initialisiert sein, sofern dies nicht
               die Initialisierungs-Routine von Event_Handler(), s.u.,
               bernimmt). Die Library wertet dabei selbstndig Nachrichten
               der XAcc-2-, AV- und Drag&Drop-Protokolle aus und wandelt
               diese gegebenenfalls um. Ebenso werden Ereignisse, welche
               Fenster (-dialoge) bzw. allgemein die Library betreffen,
               ausgewertet.

               WICHTIG:
               Es werden nur Ereignisse zurckgeliefert, welche nicht von
               der Library oder dem durch die Funktion Event_Handler()
               definierten Handler ausgewertet wurden!
               Setzt man die Variable 'ev_mflags' auf Null oder bergibt man
               den Wert NULL fr den Parameter 'event', so werden KEINE
               Events zurckgeliefert! Alle Ereignisse mssen dann vom
               Handler initialisiert und ausgewertet werden!
               Library-spezifische Nachrichten (s.u.) werden NUR an den
               Event-Handler geliefert!!!

            -> Rckgabewert: Bitmap der eingetretenen Ereignisse

        void Event_Timer(int locount,int hicount,int nokeys)
            -> Wartet bis die durch lo_count und hi_count in Millisekunden
               vorgebene Zeit verstrichen ist. Dabei werden allerdings
               noch Nachrichten durch die Library (der Nachrichtenpuffer
               wird komplett geleert) sowie Ereignisse durch den Handler
               ausgewertet, so da diese Funktion z.B. whrend eines
               rechenintensiven Vorgangs dazu benutzt werden kann,
               (Benutzer-) Ereignisse durch einen Aufruf mit kurzer Warte-
               zeit (0) auszuwerten (z.B. Fenster verschieben, neuzeichnen,
               ikonifizieren etc...).
               Ebenso wird noch die Form des Mauszeigers (sofern nicht
               blockiert (s. beg_ctrl() oder MouseUpdate()) verwaltet und
               alle automatischen Tastaturkommandos (s. Funktionen
               MenuItems() und WindowItems()) werden ausgewertet (sofern
               Parameter nokeys==FALSE)

        void Event_Handler(int (*init)(XEVENT *,int,int),
                           int (*handler)(XEVENT *));
            -> Routinen zur Ereignisauswertung festlegen, wobei diese Rou-
               tinen diejenigen Ereignisse auswerten, welche nicht auto-
               matisch von der Library bearbeitet wurden. Durch bergabe
               von NULL knnen bereits angemeldete Funktionen wieder
               abgemeldet werden. Ebenso kann man die Routinen beliebig
               oft neu setzen, z.B. fr eine lokale Ereignisauswertung.

            -> Parameter:
                int (*init)(XEVENT *event,int available):
                    -> Routine, welche vor jeder Ereignisfunktion zur Ini-
                       tialisierung aufgerufen wird und daher mglichst
                       keine langsamen Funktionen ausfhren sollte. Die Rou-
                       tine gibt eine Bitmap der gewnschten Events zurck
                       und initialisiert gegebenenfalls Variablen der ber-
                       gebenen XEVENT-Struktur 'event' (dabei darf nicht
                       nicht davon ausgegangen werden, da es sich immer um
                       die gleiche Struktur handelt!!!) Angefordert werden
                       knnen nur die Events, welche in der Bitmap
                       'available' gesetzt sind! (die Events MU_TIMER2/3/4
                       und MU_MESAG sind immer verfgbar, d.h. werden nicht
                       von der Library benutzt/gesperrt)

                int (*handler)(XEVENT *event):
                    -> Routine, welche u.a. von X_Form_Do sowie Event_Multi
                       aufgerufen wird und die Ereignisse, welche von der
                       Library nicht verarbeitet wurden, auswertet. Zurck-
                       gegeben wird eine Bitmap der ausgewerteten Ereig-
                       nisse. V.a. bei Tastatur-Ereignissen, welche nicht
                       ausgewertet wurden, sollte MU_KEYBD nicht gesetzt
                       werden, damit die Library gegebenenfalls den Tasten-
                       druck per Xacc-2- oder AV-Protokoll weiterleiten
                       kann.

                       WICHTIG:
                       Diese Routine darf keine Variablen der XEVENT-Struk-
                       tur (abgesehen von den Ausgabewerten) verndern!


    13. Library-spezifische Nachrichten
        -------------------------------

        Hinweis:
        Bei den Nachrichten AC_CLOSE/AP_TERM werden alle geffneten
        Fenster und Dialoge AUTOMATISCH geschlossen, wobei bei
        AP_TERM anschlieend die Applikation beendet werden sollte.

        OBJC_EDITED:
            -> Eingabefeld wurde verndert:
            msg[0]        = OBJC_EDITED
            msg[3]        = Nummer des aktuellen Eingabeobjekts
                            oder negativer Wert, falls alle
                            Eingabefelder betroffen sind
            msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des
                            Dialogs

        OBJC_CHANGED:
            -> Status eines Objekts (kein EXIT-/TOUCHEXIT-Objekt)
               hat sich gendert:
            msg[0]        = OBJC_CHANGED
            msg[3]        = Nummer des Objekts
            msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des
                            Dialogs

        OBJC_SIZED:
            -> Gre oder Position des Dialogs hat sich gendert,
               wobei die Ausmae des Wurzelobjekts bereits angepat
               wurden (wird auch bei ikonifizierter Fensterdialogen
               verschickt!)
            msg[0]        = OBJC_SIZED
            msg[4]/msg[5] = Zeiger auf die DIAINFO-Struktur des
                            Dialogs

        OBJC_DRAGGED:
            -> Daten wurden an Applikation per Drag&Drop bergeben
            msg[0]        = OBJC_DRAGGED
            msg[4]/msg[5] = Zeiger auf DRAG_DROP-Struktur

        SLIDER_CHANGED:
            -> (Cursor-) Position eines vollautomatischen Sliders,
               der bei der Funktion open_dialog bergeben wurde,
               hat sich gendert
            msg[0]        = SLIDER_CHANGED
            msg[4]/msg[5] = Zeiger auf SLINFO-Struktur

        POPUP_CHANGED:
            -> Eintrag eines vollautomatischen Popups, welches bei der
               Funktion open_dialog bergeben wurde, wurde selektiert bzw.
               neuer aktueller Eintrag. Setzt man die Variable 'current'
               der XPOPUP-Struktur nach jeder Selektion auf einen negativen
               (=ungltigen) Wert, so bekommt man bei JEDER Selektion
               eine Nachricht (ansonsten nur, wenn ein anderer Eintrag ge-
               whlt wurde)
            msg[0]        = POPUP_CHANGED
            msg[3]        = aktueller Eintrag
            msg[4]/msg[5] = Zeiger auf XPOPUP-Struktur

        MN_SELECTED:
            -> Ein Meneintrag (Pull-Down-Men oder vollautomatisches
               Fenstermen, dessen XPOPUP-Struktur bei open_dialog() ber-
               geben wurde) wurde selektiert
            msg[0]        = MN_SELECTED
            msg[3]        = Objektnummer des Titeleintrags (>0)
                            oder negative Identifikationsnummer (-id)
                            aus der XPOPUP-Struktur
            msg[4]        = Objektnummer des Eintrags
            msg[5]/msg[6] = Zeiger auf Objektbaum des (Fenster-) Mens
            msg[7]        = bergeordnetes Objekt (-1 bei Pull-Down-Mens,
                            parent-Objekt aus POPUP-Struktur bei Fenster-
                            Mens)

        XACC_AV_INIT:
            -> Applikation hat sich per XAcc-2- oder AV-Protokoll
               angemeldet
            msg[0]        = XACC_AV_INIT
            msg[3]        = Applikations-ID
            msg[4]/msg[5] = Zeiger auf XAcc-Struktur

        XACC_AV_EXIT:
            -> Applikation hat sich per XAcc-2- oder AV-Protokoll
               abgemeldet
            msg[0]        = XACC_AV_EXIT
            msg[3]        = Applikations-ID

        XACC_AV_CLOSE:
            -> alle anderen Applikationen haben sich per XAcc-2-
               oder AV-Protokoll abgemeldet bzw. die Protokolle
               wurden reinitialisiert
            msg[0]        = XACC_AV_CLOSE

        WIN_CHANGED:
            -> Status eines Fenster hat sich gendert (z.B. wurde
               das Fenster ikonifiziert/deikonifiziert). U.a. kann
               sich auch das Fenster-Handle ndern!
            msg[0]        = WIN_CHANGED
            msg[3]        = Fenster-Handle oder negativer Wert,
                            falls alle Fenster betroffen sind
            msg[4]/msg[5] = Zeiger auf die WIN-Struktur des
                            Fensters oder NULL, falls alle
                            Fenster betroffen sind

        WIN_NEWTOP:
            -> neues oberstes Fenster (Nachricht wird sowohl bei
               Benutzeraktionen als auch beim ffnen, Schlieen und
              (De-) Ikonifizieren von Fenstern verschickt)
            msg[0]        = WIN_NEWTOP
            msg[3]        = Fenster-Handle des obersten Fensters
                            (kann auch ein Fenster einer anderen
                             Applikation oder eines Dialogs sein)

        WIN_SIZED:
            -> Fenstergre/-position hat sich gendert (bei Fenster-
               dialogen wird die Nachricht OBJC_SIZED verschickt!),
               wobei diese Nachricht auch verschickt hat, wenn das
               Fenster ikonifiziert ist
            msg[0]        = WIN_SIZED
            msg[3]        = Fenster-Handle
            msg[4]/msg[5] = Zeiger auf die WIN-Struktur des
                            Fensters

        WIN_SCROLLED:
            -> Scrollposition eines Fensters wurde gendert
            msg[0]        = WIN_SCROLLED
            msg[3]        = Fenster-Handle
            msg[4]/msg[5] = Zeiger auf die WIN-Struktur des
                            Fensters


    14. Dialog-Funktionen
        -----------------

        DIAINFO-Struktur:
        -----------------

        typedef struct
        {
            /* Dialog-Typ
                CLOSED      -> geschlossen
                OPENED      -> normaler Dialog
                FLYING      -> fliegender Dialog
                WINDOW      -> Fenster-Dialog
                WIN_MODAL   -> modaler Fenster-Dialog */
            DIALMODE di_flag;

            /* Zeiger auf Objektbaum */
            OBJECT   *di_tree;

            /* Zeiger auf Fenster-Struktur (nur gltig, wenn
               di_flag>=WINDOW!!!) */
            WIN      *di_win;

            /* bei open_dialog() angegebener Dialog-Modus */
            int      di_mode;

            /* aktuelles Eingabeobjekt oder negativer Wert */
            int      di_ed_obj;

            /* aktuelle Position des Cursors im Eingabefeld oder negativer
               Wert */
            int      di_ed_index;

            /* Einfge (!=0)/berschreibenmodus (==0) in Eingabefeldern */
            int      di_insert;

            /* Offset von der linken oberen Ecke des Fensterarbeitsbereichs
               bis zur linken oberen Ecke des Dialogwurzelobjekts
               (Variable darf nicht verndert werden und ist nur bei
                Fensterdialogen gltig)
            int      di_xy_off;

            /* Differenz zwischen der Breite/Hhe des Fensterarbeitsbereichs
               und der Breite/Hhe des Dialogwurzelobjekts
               (Variable darf nicht verndert werden und ist nur bei
                Fensterdialogen gltig)
            int      di_wh_off;

            /* Zeiger auf ALERT-Struktur einer Alertbox (Rckgabewert
               der Funktion MakeAlert). Ist dieser Zeiger gesetzt, so
               wird u.a. der durch die Alertbox angeforderte Speicher beim
               Schlieen des Dialogs automatisch freigegeben */
            ALERT    *di_alert;

            /* Zeiger auf Speicher, der per malloc/calloc/strdup oder einer
               Library-Funktion (auer GetMsgBuffer) angefordert wurde, und
               automatisch beim Schlieen des Dialogs per free() freigeben
               werden soll (wird u.a. fr nonmodale/mehrfach geffnete
               Sonderzeicheneingabe- sowie Alertboxen bentigt) */
            void     *di_mem;

            /* alle weiteren Variablen dieser Struktur sind nur fr INTERNE
               Zwecke */
        } DIAINFO;

        DIAINFO *open_dialog(OBJECT *tree,char *title,char *icon_title,
                OBJECT *icon,boolean center,boolean grow_box,
                int dialog_mode,int edit,SLINFO **slider,XPOPUP *popup);
            -> Dialog ffnen und darstellen
            -> Rckgabewert: Zeiger auf initialisierte DIAINFO-Struktur des
                             Dialogs oder NULL, falls Dialog nicht geffnet
                             werden konnte
            -> Parameter:
                tree:        Zeiger auf Objektbaum
                title:       Zeiger auf Fenster-Titel fr Fensterdialoge
                icon_title:  Zeiger auf Fenstertitel im ikonifizierten Zu-
                             stand oder NULL
                icon:        Zeiger auf Objektbaum, der fr die ikonifi-
                             zierte Darstellung benutzt wird, oder NULL (in
                             diesem Fall wird der globale Objektbaum
                             iconified benutzt)
                center:      DIA_MOUSEPOS: Dialog um Mauszeiger zentrieren
                             DIA_CENTERED: Dialog in Bildschirmmitte zen-
                                           trieren (sichtbarer Ausschnitt
                                           des Bildschirms, d.h. VSCR-Cookie
                                           von virtuellen Bildschirmerwei-
                                           terungen wird beachtet)
                             DIA_LASTPOS:  Dialog an letzter Position ffnen
                                           (beim ersten ffnen des Dialogs
                                            analog wie DIA_CENTERED)
                grow_box:    sich vergrernder Rechtecke zeichnen
                dialog_mode: Bitmap des Dialogtyps:

                        /* fliegender Dialog */
                        #define FLY_DIAL        0x01

                        /* Fenster-Dialog */
                        #define WIN_DIAL        0x02

                        /* Fenster-Dialog, sofern Fenster geffnet werden
                           kann, ansonsten fliegender Dialog
                        #define AUTO_DIAL       (FLY_DIAL|WIN_DIAL)

                        /* modaler Fensterdialog */
                        #define MODAL           0x04

                        /* Fenster-Dialog mit dickem Rahmen */
                        #define FRAME           0x08

                        /* Fenster-Dialog kann nicht ikonifiziert werden
                           (ist bei bersetzung der Library mit
                            SMALL_NO_ICONIFY immer gesetzt!) */
                        #define NO_ICONIFY      0x10

                        /* Fenster-Dialog mit dnnem Rahmen (hat Vorrang vor
                           FRAME) */
                        #define SMALL_FRAME     0x20

                        /* Fenster-Dialog mit mittlerem Rahmen */
                        #define SMART_FRAME     (FRAME|SMALL_FRAME)

                        /* Die folgenden Fensterelemente (auer WD_CLOSER)
                           des Dialogfensters mssen von der Anwendung ausge-
                           wertet u. gesetzt werden!
                           Dabei wird die Gre des Fensters automatisch
                           gesetzt, wenn WD_SET_SIZE bergeben wird. An-
                           sonsten darf die Gre NICHT verndert werden! */

                        /* fliegender Dialog mit 3D-Rahmen unter 3D-AES */
                        #define DDD_DIAL         0x40

                        /* Fenster-Dialog mit horizontalem Slider
                           (Slider,Pfeile rechts/links) */
                        #define WD_HSLIDER      0x80

                        /* Fenster-Dialog mit vertikalem Slider
                           (Slider,Pfeile hoch/runter) */
                        #define WD_VSLIDER      0x100

                        /* Fenster-Dialog mit Sizer */
                        #define WD_SIZER        0x200

                        /* Fenster-Dialog mit Closer (auch bei modalen
                           Dialogen!) */
                        #define WD_CLOSER       0x400

                        /* Fenster-Dialog mit Fuller */
                        #define WD_FULLER       0x800

                        /* Fenster-Dialog mit Info-Zeile */
                        #define WD_INFO         0x1000

                        /* Gre bei WM_FULLED/WM_SIZED automatisch an-
                           passen (Nachricht OBJC_SIZED wird anschlieend
                           an Anwendung geschickt) */
                        #define WD_SET_SIZE     0x2000

                        /* maximale Gre des Fensters auf Gre des Dialogs
                           setzen und Dialoggre bei WD_SET_SIZE nicht ver-
                           ndern. Auerdem wird bei WM_FULLED nur die
                           Gre, aber nicht die Position des Dialogs ge-
                           ndert (s.a. Beispielprogramm 'DialogDemo') */
                        #define WD_TREE_SIZE    0x4000

                edit:        Objektnummer des Eingabefeldes, in welchem
                             sich der Cursor befinden soll
                             (oder negativer Wert)

                slider:      Zeiger auf Liste mit Adressen der SLINFO-
                             Strukturen (letzter Listen-Eintrag gleich
                             NULL) der Slider des Dialogs oder NULL, wenn
                             die Slider nicht automatisch verwaltet werden
                             sollen. Dabei werden die angegebenen Slider vor
                             dem ffnen des Dialogs intern durch
                             graf_set_slider(...,GRAF_SET) gesetzt. S.a.
                             Nachricht SLIDER_CHANGED

                popup:       Zeiger auf Liste mit Adressen der XPOPUP-
                             Strukturen (letzter Listen-Eintrag gleich
                             NULL) der Popups des Dialogs oder NULL, wenn
                             keine Popups automatisch verwaltet werden
                             sollen. S.a. Nachricht POPUP_CHANGED

            Hinweis:
            Werden nach dem ffnen des Dialogs Vernderungen am Objekt-
            baum des Dialogs vorgenommen, die Eingabefelder betreffen, so
            ist sofort danach die Funktion ob_edit_init() aufzurufen.
            (Art der Vernderungen s. Beschreibung dieser Funktion)

            Help-, Undo-, Escape- und Default-Button drfen nach dem
            ffnen des Dialogs weder versteckt/gezeigt noch in der Baum-
            struktur hinzugefgt/gelscht werden!

        int close_dialog(DIAINFO *dialog,boolean shrink_box);
            -> Dialog 'dialog' schlieen und gegebenenfalls sich
               verkleinernde Rechtecke zeichnen (shrink_box!=0)
            -> Rckgabewert: TRUE:  Dialog wurde geschlossen
                             FALSE: Dialog konnte nicht geschlossen werden
                                    (z.B. nicht oberster fliegender Dialog
                                     oder Popup geffnet)

        void close_all_dialogs(void)
            -> alle geffneten Dialoge schlieen

        int X_Form_Do(DIAINFO **dialog)
            -> Bearbeitung der geffneten Dialoge
            -> Zurckgegeben wird die Nummer des angewhlten Exit-Objekts
               (bei einem Doppelklick ist Bit 15 (0x8000,DOUBLE_CLICK), bei
                einem Rechtsklick optional Bit 14 (0x4000,RIGHT_CLICK) ge-
                setzt, Ausmaskieren dieser Bits mit der Konstante NO_CLICK)
               oder die Werte
               W_ABANDON -> Abbruch der Dialogbearbeitung, alle Dialoge
                            wurden automatisch geschlossen (z.B. durch
                            AC_CLOSE/AP_TERM) bzw. beim Aufruf der Funktion
                            waren keine Dialoge geffnet (*dialog enthlt
                            einen NULL-Pointer)
               W_CLOSED  -> Fensterschlieknopf wurde angeklickt (Dialog
                            mu noch geschlossen werden)
            -> '*dialog' enthlt (sofern ungleich NULL) einen Zeiger auf
               die DIAINFO-Struktur des aktuellen Dialogs

        int FormObject(int exit)
            -> Objektnummer aus X_Form_Do-Rckgabewert 'exit' ermitteln
               (Doppel-/Rechtsklick ausmaskieren) oder negativer Wert, falls
               kein Objekt ausgewhlt wurde.

        int XFormObject(DIAINFO **back,int *form_do)
            -> entspricht FormObject(X_Form_Do(back)) (s. Beschreibung
               dieser Funktionen). Im Parameter 'form_do' (sofern ungleich
               NULL) wird der Original-Rckgabewert von X_Form_Do() ge-
               speichert.

        int xdialog(OBJECT *tree,char *title,char *icon_title,OBJECT *icon,
                    boolean center,boolean grow_box,int dialog_mode);
            -> komplette Dialogbearbeitung (Dialog ffnen, bearbeiten und
               schlieen), wobei diese Funktion nur verwendet werden sollte,
               wenn sonst kein Dialog geffnet ist oder ein modaler oder
               fliegender Dialog geffnet wird (z.B. um auf eine Benutzer-
               eingabe zu warten)
            -> Parameter und Rckgabewerte s. open_dialog() sowie
               X_Form_Do()

        void dialog_mouse(DIAINFO *info,
                          int (*mouse)(DIAINFO *info,OBJECT *tree,int obj,
                          int last_obj,int x,int y,GRECT *out))
            -> Handler fr objektabhngige Dialogmausform des Dialogs 'info'
               anmelden (mouse!=NULL) oder abmelden (mouse==NULL). Dieser
               Handler kann sowohl fr Fenster- als auch fr fliegende Dia-
               loge angemeldet werden und wird aufgerufen, sobald der Maus-
               zeiger ein Objekt verlt/betritt.
            -> Parameter an Handler:
               info:     Zeiger auf DIAINFO-Struktur des Dialogs
               tree:     Zeiger auf Objektbaum des Dialogs
               obj:      Objekt unter dem Mauszeiger oder negativer Wert
               last_obj: Vorheriges Objekt unter dem Mauszeiger oder
                         negativer Wert
               x,y:      Mauskoordinaten
               rect:     Zeiger auf GRECT-Struktur des Rechtecks, welches
                         verlassen werden soll
            -> Rckgabe:
               DIALOG_MOVEMENT: Mausform wurde vom Handler gesetzt;
                                Handler beim Verlassen des zurckge-
                                lieferten Rechtecks in '*rect' wieder auf-
                                rufen
               DIALOG_OBJECT:   Betreten und Verlassen der Objekte melden
               DIALOG_MOUSE:    Mausform wurde vom Handler gesetzt;
                                Betreten und Verlassen der Objekte melden

        int xalert(int default,int undo,int icon,BITBLK *user_icon,
                   int modal,int center,int width,
                   char *title,char *text,char *buttons)
            -> erweiterte Alertbox darstellen, wobei mehrere Alerts auf
               einmal geffnet sein knnen (zurckgeliefert wird der
               Index des ausgewhlten Buttons oder FAIL im Fehlerfall)
            -> default:   Index des DEFAULT-Buttons oder negativer Wert
               undo:      Index des UNDO-Buttons oder negativer Wert
               icon:      Nummer des Icons oder negativer Wert

                X_ICN_NONE:      /* kein Icon */
                X_ICN_MAX:       /* maximale Icon-Nummer */

                X_ICN_STOP:      /* Stop-Schild (Hinweis) */
                X_ICN_QUESTION:  /* Fragezeichen (Nachfrage) */
                X_ICN_ALERT:     /* Ausrufezeichen (Warnung) */

                X_ICN_DISC_ERR:  /* Disketten-I/O-Fehler */
                X_ICN_ERROR:     /* Bomben-Fehler */
                X_ICN_FLOPPY:    /* Disketten-Station */
                X_ICN_DISC:      /* Diskette */
                X_ICN_INFO:      /* Informations-Zeichen */
                X_ICN_PRT_ERR:   /* Drucker-I/O-Fehler */

               user_icon: Zeiger auf benutzerdefiniertes Icon oder NULL
               modal:     System-/Applikations-modale Alert-Box

                #define SYS_MODAL           0 /* System-Modal */
                #define APPL_MODAL          1 /* Applikations-Modal */

               center:    Ausrichtung der Buttons

                #define BUTTONS_CENTERED    0 /* zentriert */
                #define BUTTONS_LEFT        1 /* linksbndig */
                #define BUTTONS_RIGHT       2 /* rechtsbndig */

               width:     einheitliche Breite der Buttons (width!=0)
               title:     Zeiger auf Fenster-Titel bei applikationsmodalen
                          bzw. berschrift bei systemmodalen Dialogen
               text:      Zeiger auf Text (maximal 24 Zeilen getrennt
                          durch '|'). Die Textattribute knnen durch die
                          folgenden Zeichen (in beliebiger Reihenfolge)
                          am ANFANG einer Textzeile gesetzt werden:

                          Fett          = '!'
                          Unterstrichen = '_'
                          Kursiv        = '/'
                          Hell          = '~'
                          Umrandet      = '#'
                          Schattiert    = '@'
                          3D            = '%'

                          Linksbndig   = '<' (voreingestellt)
                          Zentriert     = ':'
                          Rechtsbndig  = '>'

                          Kleiner Font  = '^'

               buttons:   Button-Text (maximal 6 Buttons getrennt durch
                          '|', Hotkeymarkierung durch '[') oder NULL fr
                          "[Ok"

        ALERT-Struktur:
        ---------------

        typedef struct
        {
            /* Zeiger auf Objektbaum der Alertbox */
            OBJECT  *tree;

            /* alle weiteren Variablen dieser Struktur sind nur fr INTERNE
               Zwecke */
        } ALERT;

        ALERT *MakeAlert(int default,int undo,int icon,BITBLK *user_icon,
                        int modal,int center,int width,
                        char *title,char *text,char *buttons)
            -> Erzeugt einen neuen Objektbaum einer Alertbox mit den
               gewnschten Parametern (s. Funktion xalert()). Hierdurch
               kann dieser Dialog selber verwaltet/fr eigene Zwecke ver-
               wendet und auch nonmodal sowie mehrfach geffnet werden.
               Der Zeiger auf die ALERT-Struktur mu SOFORT nach dem ffnen
               des Dialogs in der Variablen 'di_alert' der DIAINFO-Struktur
               eingetragen werden, damit die Speicherbereiche fr die Alert-
               box beim Schlieen des Dialogs automatisch freigegeben wer-
               den.
            -> Rckgabewert:
               Zeiger auf ALERT-Struktur oder NULL, falls nicht gengend
               Speicher vorhanden ist

        int ExitAlert(ALERT *alert,int exit)
            -> Button-Index aus angeklicktem Alert-Objekt berechnen.
               Diese Funktion schliet weder den Dialog noch gibt sie den
               Speicher der Alertbox frei!
            -> Parameter:
               alert: Zeiger auf ALERT-Struktur der Alertbox
               exit:  Rckgabewert der Funktion X_Form_Do() bzw. selek-
                      tiertes Objekt
            -> Rckgabewert:
               Index des Buttons (s. Funktion xalert()) oder FAIL, falls
               Close-Box angeklickt oder Dialog beendet wurde

        char ascii_box(DIAINFO *dialog,char *title)
            -> Sonderzeicheneingabebox ffnen (kann mehrfach geffnet
               werden)
            -> Parameter:
                 dialog: Zeiger auf DIAINFO-Struktur des Dialogs, in
                         dessen aktuelles Eingabefeld die Sonderzeichen
                         eingefgt werden sollen oder NULL, wenn die
                         Sonderzeichen zurckgeliefert werden sollen
                 title:  Zeiger auf Titel fr Fensterdialog oder NULL
            -> Rckgabewert: ausgewhltes Zeichen oder Null

        OBJECT *MakeAscii(void)
            -> Erzeugt eine Kopie des Sonderzeicheneingabebaums. Hierdurch
               kann dieser Dialog selber verwaltet/fr eigene Zwecke ver-
               wendet und auch nonmodal sowie mehrfach geffnet werden.
               Der Zeiger auf den Objektbaum mu NACH dem ffnen des Dialogs
               in der Variablen 'di_mem' der DIAINFO-Struktur eingetragen
               werden, damit der Speicherbereich fr den Objektbaum beim
               Schlieen des Dialogs automatisch freigegeben wird. Ansons-
               ten mu der Speicher von der Anwendung freigegeben werden.
            -> Rckgabewert:
               Zeiger auf Objektbaum oder NULL, falls nicht gengend
               Speicher vorhanden ist

        char ExitAscii(OBJECT *tree,int exit)
            -> gewnschten ASCII-Wert in Sonderzeicheneingabebox aus an-
               geklicktem Objekt berechnen. Diese Funktion schliet weder
               den Dialog noch gibt sie den Speicher des Baums frei!
            -> Parameter:
               tree: Zeiger auf Baum der Sonderzeicheneingabebox
               exit: Rckgabewert der Funktion X_Form_Do() bzw. selektiertes
                     Objekt
            -> Rckgabewert:
               ASCII-Wert des Zeichens oder Null, falls Hintergrund oder
               Close-Box angeklickt wurde.

    15. Fenster-Funktionen
        ------------------

        WIN-Struktur:
        -------------

        typedef struct
        {
             /* Handle des Fensters (handle>0, falls Fenster geffnet) */
             int handle;

             /* VDI-Handle der zum Fenster gehrenden VDI-Workstation
               (nach Aufruf von open_window() ist die Library-Workstation
                x_handle als VDI-Workstation gesetzt. Bei Bedarf kann
                man danach dieses Handle auf den Wert einer anderen
                Workstation oder auf einen ungltigen Wert (<0) setzen,
                so da im letzten Fall das Clipping bei einer Fenster-
                ausgabe nicht von der Library gesetzt wird) */
             int vdi_handle;

             /* Bitmap der Fensterelemente (s. wind_create). Wurde beim
                ffnen das Element SMALLER angegeben, so kann durch nach-
                trgliches Lschen dieses Bits in dieser Variablen die
                automatische Ikonifizierung deaktiviert werden. */
             int gadgets;

             /* Bitmap des Fenster-Status (ICONIFIED und ICFS sind nie
                gesetzt, wenn Library mit SMALL_NO_ICONIFY bersetzt
                wurde) */
             char iconified;

                 #define SHADE      1  /* Fenster eingeklappt (Winx 2.3) */
                 #define ICONIFIED  2  /* Fenster ikonifiziert (MTOS) */
                 #define ICFS       4  /* Fenster ikonifiziert (ICFS) */

             /* Fenster hat maximale Ausmae */
             char fulled;

             /* Gre (1-1000)/Position (0-1000) des horiz. Sliders */
             int sl_hpos,sl_hsize;

             /* Gre (1-1000)/Position (0-1000) des vert. Sliders */
             int sl_vpos,sl_vsize;

             /* Zeiger auf SCROLL-Struktur oder NULL (nicht vorhanden,
                wenn Library mit SMALL_NO_SCROLL bersetzt wurde) */
             SCROLL *scroll;

             /* Zeiger auf Fenster-Titel u. -infozeile oder NULL */
             char   *name,*info;

             /* minimale Fensterbreite/-hhe */
             int min_w,min_h;

             /* maximale Fensterausmae */
             GRECT max;

             /* bei open_window()-angegebener beliebiger Parameter */
             void *para;

             /* Zeiger auf DIAINFO-Struktur des zugehrigen Fenster-Dialogs
                oder NULL, falls es sich um ein normales Fenster handelt */
             void *dialog;

             /* Die folgenden 3 Variablen icon, icon_name und icon_work
                sind nicht vorhanden, falls Library mit SMALL_NO_ICONIFY
                bersetzt wurde */

             /* Zeiger auf Objektbaum, der fr die ikonifizierte Darstellung
                benutzt wird, oder
                NULL: globaler Objektbaum iconified wird benutzt. Ist
                      dieser nicht gesetzt, so wird in der ikonifizierten
                      Darstellung nur ein weier Hintergrund gezeichnet.
                NIL:  Redraw-Handler aufrufen oder, falls dieser nicht ge-
                      setzt ist, WM_REDRAW-Nachrichten an Applikation durch-
                      reichen */
             OBJECT *icon;

             /* Zeiger auf Titel im ikonifizierten Zustand oder NULL */
             char   *icon_name;

             /* Arbeitsbereich des ikonifizierten Fensters */
             GRECT  icon_work;

             /* Die folgenden Variablen beziehen sich IMMER auf den
                nicht ikonifizierten Zustand des Fensters! */

             /* aktuelle Fensterausmae */
             GRECT curr;

             /* vorherige Fensterausmae */
             GRECT prev;

             /* Fensterarbeitsbereich */
             GRECT work;

            /* alle weiteren Variablen dieser Struktur sind fr
               INTERNE Zwecke reserviert */
        } WIN;

        SCROLL-Struktur:
        ----------------

        typedef struct
        {
            /* Scroll-Modus:
               NO_SCROLL   -> nur Slider (Position und Gre) setzen und
                              neue Werte der SCROLL-Struktur berechnen
                              (Fensterinhalt kann z.B. manuell nach Erhalt
                               der Nachricht WIN_SCROLLED angepat werden)
               AUTO_SCROLL -> Fensterinhalt wird zustzlich automatisch
                              verschoben und neugezeichnet
               FAST_SCROLL -> schnelles automatisches Fensterscrolling
                              (nur mglich, wenn das Fenster ber einen
                              Redraw-Handler verfgt und Winx nicht vor-
                              handen ist). Whrend des Scrollings ist das
                              Event-Handling blockiert, so da u.a. keine
                              Timer-Events mehr vorkommen, weswegen man bei
                              kritischen Programmen/Routinen AUTO_SCROLL
                              verwenden sollte */
            int scroll;

            /* Index des Objekts, welches beim automatischen Scrolling
               (AUTO_SCROLL/FAST_SCROLL) eines Dialogs neugezeichnet werden
               soll. Hier kann natrlich immer das Wurzelobjekt angegeben
               werden (Clipping wird von der Library durchgefhrt), aber
               aus Geschwindigkeitsgrnden sollte man nur das betreffende
               Objekt angeben */
            int obj;

            /* Breite des Bereichs am linken/rechten Rand, der nicht
               verschoben werden darf (z.B. eine Toolbar). Diese Werte
               werden auch fr die Berechnung der Sliderposition/-gre
               bentigt */
            int tbar_l,tbar_r;

            /* Breite des Bereichs am oberen/unteren Rand, der nicht
               verschoben werden darf (z.B. eine Toolbar) Diese Werte
               werden auch fr die Berechnung der Sliderposition/-gre
               bentigt */
            int tbar_u,tbar_d;

            /* Breite/Hhe einer Spalte/Zeile
               (z.B. bei Textfenstern die Fontgre, bei Grafikfenstern
                meistens 1) */
            int px_hline,px_vline;

            /* Horizontale/vertikale Position des Fensterinhalts
               (in Spalten/Zeilen) */
            long hpos,vpos;

            /* Horizontale/vertikale Position des Fensterinhalts in
               Pixeln. Diese Variablen drfen nicht verndert werden bzw.
               werden von der Library berechnet! Auerdem sind sie nicht
               gltig, wenn vorher die Variablen 'hpos' bzw. 'vpos'
               manuell gendert wurden und das Fenster noch nicht
               angepat wurde (mit einer der Funktionen redraw_window,
               scroll_window oder window_reinit)) */
            long px_hpos,px_vpos;

            /* Horizontale/vertikale Fenstergre (in Spalten/Zeilen) */
            long hsize,vsize;

            /* Horizontale/vertikale Seitengre (in Spalten/Zeilen)
               (diese Variablen drfen nicht verndert werden bzw. werden
               von der Library berechnet!) */
            int hpage,vpage;

            /* Horizontale/vertikale Schrittweite (in Spalten/Zeilen) */
            int hscroll,vscroll;

             /* alle weiteren Variablen dieser Struktur sind fr
               INTERNE Zwecke reserviert */
        } SCROLL;

        Hinweis:
        Sowohl die SCROLL-Struktur als auch die Funktion scroll_window()
        sind unabhngig von den vorhandenen Fensterelementen, d.h. es
        knnen z.B. auch Fenster ohne Schieber/Pfeile verschoben bzw.
        ausgewertet werden.
        Bei geffneten systemmodalen Dialogen oder Popups werden Nach-
        richten und zu setzende Werte automatisch bis zum Schlieen der
        der Dialoge/Popups gepuffert und dann an die Ereignisverwaltung
        weitergeleitet.

        WIN *open_window(char *title,char *icon_title,char *info,
                         OBJECT *icon,int gadgets,int box,
                         int min_w,int min_h,
                         GRECT *max,GRECT *curr,SCROLL *scroll,
                         void (*redraw)(int first,WIN *win,GRECT *area),
                         void *para,int msgs)
            -> Fenster ffnen und bei einem evtl. vorhandenen AV-Server
               anmelden (AV_ACCWINDOPEN) sowie gegebenenfalls die Hinter-
               grundbedienung aktivieren
            -> Parameter:
               title:      Zeiger auf Fenstertitel oder NULL
               icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu-
                           stand oder NULL (in diesem Fall wird der Titel
                           'title' benutzt)
               info:       Zeiger auf Infozeile oder NULL
               icon:       Zeiger auf Objektbaum, der fr die ikonifizierte
                           Darstellung benutzt wird, oder
                           NULL: globaler Objektbaum iconified wird be-
                                 nutzt. Ist dieser nicht gesetzt, so wird
                                 in der ikonifizierten Darstellung nur ein
                                 weier Hintergrund gezeichnet.
                           NIL:  Redraw-Handler aufrufen oder, falls dieser
                                 nicht gesetzt ist, WM_REDRAW-Nachrichten an
                                 Applikation durchreichen
               gadgets:    Bitmap der Fensterelemente wie bei wind_create().
                           Ist SMALLER gesetzt, so kann das Fenster ikoni-
                           fiziert werden, auch wenn dies vom AES nicht
                           untersttzt wird.
               box:        sich vergrernde Rechtecke zeichnen (box!=0)
               min_w,min_h:minimale Fensterbreite/Hhe. Diese Werte werden
                           evtl. intern auf sinnvolle Werte gesetzt, wenn
                           die bergebenen Werte zu klein sind (z.B. Null)
               min_h:      minimale Fensterhhe
               max:        maximale Fensterausmae (wird gegebenenfalls
                           auf die Desktopausmae beschrnkt) oder NULL fr
                           den Desktopbereich
                           max->g_x/g_y: minimale linke, obere Fenster-
                                         koordinaten (normalerweise die
                                         entsprechenden Koordinaten des
                                         Desktopfensters 'desk')
                           max->g_w/g_h: maximale Fensterbreite/-hhe
               curr:       Fensterausmae
               scroll:     Zeiger auf initialisierte SCROLL-Struktur fr
                           automatisches Scrolling oder NULL. Wurde die
                           Scroll-Position gendert, so wird eine Nachricht
                           WIN_SCROLLED verschickt. U.a. werden von der
                           Library in diesem Fall auch Slidergre und
                           -position automatisch gesetzt. (Dummy-Parameter,
                           falls Library mit SMALL_NO_SCROLL bersetzt
                           wurde)
               redraw:     Routine, die den Fenster-Redraw bernimmt. Dabei
                           mu weder das bergebene Rechteck 'area' mit der
                           Rechteckliste geschnitten noch das Clipping der
                           VDI-Workstation gesetzt werden! (VDI-Handle der
                           WIN-Struktur nach Aufruf von open_window()
                           gegebenenfalls auf anderen Wert als die globale
                           Library-Workstation x_handle setzen). Wird fr
                           'redraw' NULL bergeben, so wird die Nachricht
                           WM_REDRAW wie blich weitergeleitet.
                           Parameter 'first':
                           Bit 0: (RC_FIRST)
                             -> erstes Rechteck der Rechteckliste
                           Bit 1: (RC_SCROLL)
                             -> Scrolling (Bit gesetzt) oder Redraw
                           Der Redraw-Handler wird allerdings NUR aufgerufen,
                           wenn das Fenster NICHT ikonifiziert ist, d.h. in
                           diesem Fall wird der Redraw automatisch von der
                           Library vorgenommen.
               para:       beliebiger Parameter, der in der WIN-Struktur ge-
                           speichert wird und beispielsweise auf die zum
                           Fenster gehrigen Daten-Strukturen zeigt
               msgs:       Bitmap der Fenster-Nachrichten, die automatisch
                           ausgewertet werden sollen (WM_REDRAW und Slider-
                           Nachrichten (WM_ARROWED,WM_HSLID,WM_VSLID) werden
                           in Abhngigkeit von den anderen Parametern ausge-
                           wertet; WM_CLOSED mu von der Applikation ausge-
                           wertet werden)

                             XM_TOP:    WM_TOPPED
                             XM_BOTTOM: WM_BOTTOMED
                             XM_SIZE:   WM_FULLED,WM_SIZED,WM_MOVED
                                        (Nachricht WIN_SIZED wird an Event-
                                         Handler bei Positions-/Gren-
                                         nderung verschickt)

            -> Rckgabewert: Zeiger auf WIN-Struktur oder NULL

        void window_reinit(WIN *win,char *title,char *icon_title,
                           char *info,int home,int draw)
            -> Fenster 'win' reinitialisieren und evtl. neuzeichnen. U.a.
               wird gegebenenfalls die SCROLL-Struktur auf gltige
               Werte gesetzt und die Gre des Fensters an die maximalen
               bzw. minimalen Ausmae angepat.
            -> Parameter:
               title:      Zeiger auf Fenstertitel oder NULL
               icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu-
                           stand oder NULL
               info:       Zeiger auf Infozeile oder NULL
               home:       Scroll-Position in linke obere Ecke (home!=0)
                           (keine Bedeutung, falls Library mit
                            SMALL_NO_SCROLL bersetzt wurde)
               draw:       TRUE  -> Fenster ohne Toolbar-Bereich neuzeichnen
                           FALSE -> komplettes Fenster neuzeichnen
                           FAIL  -> Fenster nicht neuzeichnen

        int close_window(WIN *window,int box)
            -> Fenster 'window' schlieen und gegebenenfalls (box!=0) sich
               verkleinernde Rechtecke zeichnen. Auerdem wird das Fenster
               bei einem evtl. vorhandenem AV-Server abgemeldet
               (AV_ACCWINDCLOSE).
            -> Rckgabewert gleich Null, wenn ein Fehler auftrat

        void close_all_windows(void)
            -> Alle geffneten Fenster schlieen. Sind vorher noch Dialoge
               geffnet, so werden diese ebenfalls geschlossen.

        void draw_window(WIN *win,GRECT *area,void *para,int mouse,
                         void (*draw)(int first,WIN *win,GRECT *area,
                         GRECT *work,void *para))
            -> beliebige Ausgabe in Fenster 'win' ber Ausgabe-Funktion
               'draw' vornehmen. Dabei mu es sich nicht um den Redraw-
               Handler handeln, so da z.B. einzelne Objekte des Fensters
               ausgegeben werden knnen. Ebenso kann eine Ausgabe in
               ikonifizierten Fenstern vorgenommen werden.
            -> Parameter:
               win:        Zeiger auf WIN-Struktur des Ausgabe-Fensters
               area:       Ausgabebereich oder NULL fr Desktop (wird mit
                           der Rechteckliste des Fensters geschnitten)
               para:       beliebiger Parameter, der an den Ausgabe-Handler
                           bergeben wird
               mouse:      MOUSE_OFF: Maus vor Ausgabe ausschalten und
                                      anschlieend wieder einschalten
                           MOUSE_ON:  Maus nicht aus-/anschalten (z.B. bei
                                      AES-Objektausgabe per objc_draw
                                      unntig)
                           MOUSE_TEST:Maus nur aus-/anschalten, wenn der
                                      Mauszeiger sich innerhalb des Ausgabe-
                                      bereichs befindet. Dies kann in man-
                                      chen Fllen bei sehr schnellen Maus-
                                      bewegungen und einer relativ langsamen
                                      Ausgabe zu kleineren Redraw-Fehlern
                                      fhren
               draw:       Parameter der Ausgabe-Funktion:
                           first: Bit 0: (RC_FIRST)
                                    -> erstes Ausgaberechteck des Fensters
                           win:   Zeiger auf WIN-Struktur des Fensters
                           area:  Ausgabebereich (Clipping mu nicht ge-
                                  setzt werden, wenn das VDI-Handle der WIN-
                                  Struktur gltig ist)
                           work:  Arbeitsbereich des Fensters (entspricht
                                  den Variablen 'work' bzw. 'icon_work'
                                  (im ikonifizierten Zustand) der WIN-Struk-
                                  tur)
                           para:  Parameter, der bei draw_window() ber-
                                  geben wurde

        void redraw_window(WIN *win,GRECT *area)
            -> Lst einen Redraw ber das Rechteck 'area' (area!=NULL) des
               Fensters 'win' oder den gesamten Fensterbereich (area==NULL)
               aus. Wurde fr das Fenster kein Redraw-Handler angemeldet,
               so wird eine WM_REDRAW-Nachricht verschickt.

        void scroll_window(WIN *win,int mode,GRECT *area)
            -> Fensterinhalt des Fensters 'win' in Abhngigkeit vom Para-
               meter 'mode' scrollen (Fenster mu ber eine SCROLL-Struktur
               verfgen!), wobei sowohl Slidergre als auch -position
               automatisch angepat werden.
            -> Parameter:
                area: Bereich des Fensters oder NULL fr gesamtes Fenster
                      abzglich der in der SCROLL-Struktur angegebenen
                      Toolbar-Bereiche
                mode:
                /* an Anfang/Ende der Zeile */
                LINE_START,LINE_END

                /* an Anfang/Ende des Fensterinhalts */
                WIN_START,WIN_END

                /* Position (hpos,vpos) bereits gesetzt (wird automatisch
                   an gltigen Bereich angepat) */
                WIN_SCROLL

                /* Seite nach links/oben/rechts/unten */
                PAGE_LEFT,PAGE_UP,PAGE_RIGHT,PAGE_DOWN

                /* Zeile/Spalte nach links/oben/rechts/unten */
                LINE_LEFT,LINE_UP,LINE_RIGHT,LINE_DOWN

        WIN *get_window(int handle)
            -> WIN-Struktur zum Fenster 'handle' ermitteln
            -> Rckgabewert gleich NULL, falls Struktur nicht gefunden
               werden konnte

        WIN *get_top_window(void)
            -> WIN-Struktur zum obersten Fenster ermitteln
            -> Rckgabewert gleich NULL, falls Struktur nicht gefunden
               werden konnte (Fenster gehrt anderer Applikation oder
               kein Fenster geffnet)

        WIN *get_window_list(int first)
            -> erste (first==TRUE) oder nchste (first==FALSE) WIN-Struktur
               der internen Fensterliste ermitteln. Dabei sind die Fenster
               entsprechend der Reihenfolge auf dem Bildschirm sortiert,
               d.h. get_window_list(TRUE) liefert z.B. immer das oberste
               Fenster der Applikation, unabhngig davon ob es von den
               Fenstern einer anderen Applikation verdeckt wird
            -> Rckgabewert gleich NULL, falls kein Fenster geffnet ist
               oder Liste bereits komplett abgearbeitet

        int GetTop(void)
            -> Handle des obersten Fensters ermitteln (Fenster kann auch
               einer anderen Applikation gehren), funktioniert auch unter
               Mag!C/Mag!X

        int window_first(WIN *win,GRECT *rect);
            -> Verkrzter und optimierter Aufruf von
               wind_xget(handle,WF_FIRSTXYWH,...)
            -> Falls der Rckgabewert ungleich Null ist, so enthlt das
               Rechteck 'rect' den ersten Ausgabebereich. Ansonsten (z.B.
               fehlerhaftes Fenster-Handle oder keine Ausgabe mglich) ist
               die Breite und Hhe des Ausgaberechtecks auf Null gesetzt.

        int window_next(WIN *win,GRECT *rect);
            -> Verkrzter und optimierter Aufruf von
               wind_xget(handle,WF_NEXTXYWH,...)
            -> Falls der Rckgabewert ungleich Null ist, so enthlt das
               Rechteck 'rect' den nchsten Ausgabebereich. Ansonsten (z.B.
               fehlerhaftes Fenster-Handle, kein vorheriger Aufruf von
               window_first() oder keine Ausgabe mglich) ist die Breite und
               Hhe des Ausgaberechtecks auf Null gesetzt.

        void window_size(WIN *win,GRECT *size)
            -> Ausmae des Fensters 'win' auf 'size' setzen
               (im ikonifizierten Zustand wird die Gre erst nach der
                Deikonifizierung gesetzt)
            -> Wurde eine SCROLL-Struktur beim ffnen des Fenster
               bergeben, so werden von dieser Funktion auch Slidergre
               und -position automatisch gesetzt, wobei evtl. der Fenster-
               inhalt verschoben wird.

        void window_slider(WIN *win,int vh,int pos,int size)
            -> Vertikalen (vh==VERT_SLIDER) oder horizontalen
               (vh==HOR_SLIDER) Slider des Fensters 'win' setzen
               (im ikonifizierten Zustand werden die Werte erst nach der
                Deikonifizierung gesetzt)
            -> Parameter:
               pos:  Position des Sliders (0-1000) oder negativer Wert
               size: Gre des Sliders (1-1000,0=minimale Gre) oder
                     negativer Wert

        void window_set_mouse(WIN *win,int in,int work,int out,int icon,
                              MFORM *in_form,MFORM *work_form,
                              MFORM *out_form,MFORM *icon_form)
            -> Form des Mauszeigers in Abhngigkeit von der Position rela-
               tiv zum Fenster 'win' festlegen und setzen (der Mauszeiger
               wird dann vollautomatisch in Abhngigkeit vom obersten
               Fenster/Dialog verwaltet, solange die Ausgabe nicht durch
               die Funktionen MouseUpdate() oder beg_ctrl() gesperrt wurde).
               Diese Funktion kann auch bei Fensterdialogen angewendet we-
               rden, wobei bei allen Fenstern der Pfeil fr alle Bereiche
               voreingestellt ist.
               Soll der Mauszeiger innerhalb eines Bereichs verschiedene
               Formen annehmen (z.B. abhngig vom Objekt unter dem Zeiger),
               so kann dies durch eine Mouse-Event, der das Verlassen oder
               Betreten dieser Objekte berwacht und dann diese Funktion
               mit entsprechend neuen Parametern aufruft, realisiert werden,
               wobei fr Dialoge die entsprechende Funktion dialog_mouse()
               genutzt werden kann/sollte.
            -> Parameter:
               in, in_form:     Mausform innerhalb des Fensterbereichs,
                                aber nicht im Arbeitsbereich (z.B. ber
                                Toolbar) (Bedeutung s. graf_mouse()).
               work, work_form: Mausform innerhalb des Arbeitsbereichs
               icon, icon_form: Mausform innerhalb des ikonifizierten
                                Fensterbereichs
               out, out_form:   Mausform auerhalb des Fensterbereichs

         void WindowItems(WIN *win,int cnt,MITEM *items)
            -> Hotkeys/Tastaturkommandos sowie evtl. dazugehrige
               Menpunkte fr das Fenster 'win' definieren. Die jeweiligen
               Aktionen (Auswahl des Menpunkts oder Tastendruck) werden
               automatisch ausgewertet. U.a. ist hierdurch ein auto-
               matisches Tastaturscrolling fr Fenster mglich.
            -> Parameter:
               cnt:   Anzahl der MITEM-Strukturen
               items: Zeiger auf Array mit MITEM-Strukturen

        void window_name(WIN *win,char *title,char *icon_title)
            -> Titel des Fensters 'win' setzen
            -> Parameter:
               title:      Zeiger auf Fenstertitel oder NULL
               icon_title: Zeiger auf Fenstertitel im ikonifizierten Zu-
                           stand oder NULL (in diesem Fall wird der Titel
                           'title' benutzt)

        void window_info(WIN *win,char *info)
            -> Info-Zeile des Fensters 'win' setzen (im ikonifizierten
               Zustand wird die Info-Zeile erst nach der Deikonifizierung
               gesetzt)
            -> Parameter:
               info: Zeiger auf Infozeile oder NULL

        void window_top(WIN *win)
            -> Fenster 'win' nach oben bringen (entspricht
               wind_set(handle,WF_TOP))

        void window_bottom(WIN *win)
            -> Fenster 'win' nach unten legen (entspricht
               wind_set(handle,WF_BOTTOM))

        WIN *window_find(int x,int y)
            -> WIN-Struktur des Fensters an den Koordinaten (x,y)
               ermitteln
            -> Rckgabewert gleich NULL, falls Struktur nicht gefunden
               werden konnte

        int window_work(WIN *win,GRECT *out)
            -> Arbeitsbereich des Fensters 'win' abzglich eventuell
               vorhandener Toolbarbereiche berechnen und im Rechteck
               'out' zurckgeben
            -> Rckgabewert:
               TRUE  -> Rechteck 'out' gltig
               FALSE -> Arbeitsbereich nicht sichtbar

        void window_calc(int wctype,int kind,GRECT *in,GRECT *out)
            -> Entspricht von der Funktionalitt der AES-Funktion
               wind_calc(), nur da anstatt einzelner Parameter Zeiger
               auf GRECT-Strukturen erwartet werden

        void window_border(int kind,int x,int y,int w,int h,GRECT *out)
            -> Koordinaten des Randbereichs (WC_BORDER) aus der linken,
               oberen Ecke (x,y) des Fensters und der Breite/Hhe des
               Arbeitsbereiches (w,h) berechnen und im Recheck 'out'
               zurckgeben. Dabei wird das Ausgaberechteck automatisch
               auf den Desktop begrenzt.

        void windial_calc(int calc_work,DIAINFO *info,GRECT *work)
            -> Objektbaumausmae oder Fensterarbeitsbereich des Dialogs
               'info' berechnen
            -> Parameter:
               calc_work: Arbeitsbereich des Fensters (calc_work!=0) aus
                          Ausmaen des Wurzelobjekts des Dialogobjektbaums
                          oder umgekehrt (calc_work==0) berechnen
               work:      Gewnschte Ausmae als GRECT-Struktur

        int window_output(void)
            -> Testet, ob Ausgabe in ein Fenster mglich ist
            -> Rckgabewert gleich Null, wenn Ausgabe unmglich (z.B.
               (fliegender) Dialog oder Popup geffnet)

        int WindowHandler(int mode,WIN *window,GRECT *icon)
            -> verschiedene Fenster-Funktionen (abhngig vom Parameter
               'mode') ausfhren
            -> Parameter:
               mode: Gewnschte Funktion:
                      W_CLOSE:       Fenster schlieen (entspricht dem An-
                                     klicken der Fenster-Schliebox, d.h.
                                     das Fenster wird NICHT sofort ge-
                                     schlossen)
                      W_CLOSEALL:    Alle Fenster schlieen (W_CLOSE fr
                                     alle Fenster). (i.A. sollte man diese
                                     Funktion nur verwenden, wenn beim
                                     Schlieen der Fenster keine Rckfra-
                                     gen an den Benutzer ntig sind oder
                                     diese nur in systemmodalen Alertboxen
                                     bzw. Dialogen erscheinen bzw. per
                                     beg/end_ctrl geklammert sind!).
                      W_CYCLE:       Fenster wechseln
                      W_INVCYCLE:    Fenster rckwrts wechseln
                      W_GLOBALCYCLE: Fenster global wechseln (nur mglich,
                                     wenn AV-Server oder neuere AES-Version
                                     mit wind_get(WF_OWNER) vorhanden ist)
                      W_FULL:        Fenster auf maximale Gre (entspricht
                                     dem Anklicken des Fenster-Fullers)
                      W_BOTTOM:      oberstes Fenster (unabhngig davon, ob
                                     es der Applikation gehrt) in Hinter-
                                     grund legen (wird diese Funktion nicht
                                     vom AES angeboten, so versucht die
                                     Library, diese Funktion zu simulieren)
                      W_ICONIFY:     Fenster ikonifizieren. Ist das Fenster
                                     bereits ikonifiziert, so wird es de-
                                     ikonifiziert.
                      W_ICONIFYALL:  Alle Fenster einzeln ikonifizieren.
                                     Sind bereits alle Fenster ikonifiziert,
                                     so werden die Fenster deikonifiziert.
                      W_ICONIFYALLINONE:
                                     Alle Fenster in EIN Fenster ikonifi-
                                     zieren (noch nicht implementiert).
                      W_UNICONIFY:   Fenster deikonifizieren
                      W_UNICONIFYALL:Alle Fenster deikonifizieren

              window: Gewnschtes Fenster (window!=NULL) oder oberstes
                      Fenster (window==NULL). Dieser Parameter ist nur bei
                      den Funktionen W_CLOSE, W_FULL, W_ICONIFY und
                      W_UNICONIFY von Bedeutung.

              icon:   Ausmae des ikonifizierten Fensters. Dieser Parameter
                      wird nur bei den Funktion W_ICONIFY und
                      W_ICONIFYALLINONE bentigt, sofern die MTOS-
                      Ikonifizierung aktiv ist.

           -> Rckgabewert:
              TRUE:  Funktion wurde ausgefhrt
              FALSE: Funktion konnte nicht ausgefhrt werden (z.B. Fenster
                     ist bereits (de-) ikonifiziert, oberstes Fenster ge-
                     hrt nicht der Applikation, keine Fensterausgabe mg-
                     lich, entsprechendes Fensterelement nicht vorhanden)

    16. Update/Control-Funktionen
        -------------------------

        Hinweis:
        --------
        Die folgenden Funktionen merken sich intern den aktuellen Status
        und vermeiden so unntige AES-Aufrufe, d.h. die AES-Funktion
        wind_update() sollte nicht mehr benutzt werden!

        int beg_update(int test,int off)
            -> Update-Status setzen (test==0) bzw. testen, ob Status
               gesetzt werden kann und dann evtl. setzen und optional
               Maus ausschalten (off!=0)
            -> Rckgabewert:
               TRUE:  Status konnte gesetzt werden
               FALSE: Status konnte nicht gesetzt werden (z.B. weil eine
                      andere Applikation bereits den Status gesetzt hat)

        void end_update(int on)
            -> Update-Status wieder lschen und Maus einschalten (on!=0)

        int beg_ctrl(int test,int output,int mouse)
            -> Maus-Kontrolle bernehmen und Update-Status (s. beg_update)
               setzen (nur innerhalb einer beg/end_ctrl()- oder
               MouseUpdate()-Klammerung kann der Mauszeiger beliebig ver-
               waltet/gendert werden; siehe window_set_mouse())
            -> Parameter:
               test:   Mouse-Status setzen (test==0) bzw. testen, ob Status
                       gesetzt werden kann und dann evtl. setzen (test!=0)
               output: Ausgabemglichkeit ber Bibliotheksfunktionen
                       whrend Klammerung sperren und zustzlich Maus
                       sperren (s.u.) (output!=0)
               mouse:  automatische Mauszeigerverwaltung whrend Klammerung
                       sperren (Maus wird automatisch nach Freigabe wieder
                       initialisiert) (mouse!=0)
            -> Rckgabewerte:
               TRUE:  Status konnte gesetzt werden
               FALSE: Status konnte nicht gesetzt werden (z.B. weil eine
                      andere Applikation bereits den Status gesetzt hat)

        void end_ctrl(int output,int mouse)
            -> Maus-Kontrolle wieder abgeben
            -> Parameter:
               output: Bildschirmausgabe wieder freigeben (output!=0)
               test:   Mausverwaltung wieder freigeben (mouse!=0)

        void MouseUpdate(int block)
            -> automatische Mauszeigerverwaltung sperren (block==TRUE) oder
               freigeben (block==FALSE). Innerhalb einer MouseUpdate()-
               Klammerung kann der Mauszeiger beliebig gendert werden und
               wird automatisch nach der Freigabe wieder initialisiert.

    17. Popup-Funktion
        --------------

        POPUP-Struktur:
        ---------------

            typedef struct
            {
                /* Zeiger auf DIAINFO-Struktur des Parent-Dialogs
                   oder NULL */
                DIAINFO *p_info;

                /* Zeiger auf Objektbaum des Popups (alle selektierbaren
                   Objekte (beliebiger Objekttyp) des Popups mssen Kinder
                   des Wurzelobjekts sein und innerhalb dieses Rahmenobjekts
                   liegen; ansonsten unterliegt der Popup-Aufbau keinen
                   Einschrnkungen) */
                OBJECT  *p_menu;

                /* Objektnummer des Info-Objekts (meistens Text links vom
                   Popup-Button) oder negativer Wert */
                int     p_parent;

                /* Objektnummer des Popup-Buttons oder negativer Wert */
                int     p_button;

                /* Objektnummer des Cycle-Buttons (dabei mu es sich nicht
                   um den erweiterten Typ CYCLE_BUTTON handeln) oder
                   negativer Wert */
                int     p_cycle;

                /* Beim Erreichen des ersten/letzten Eintrags mit den Cur-
                   sor-Tasten Hoch/Runter wird zum letzten/ersten Eintrag
                   gesprungen */
                boolean p_wrap;

                /* Der Text des Popup-Buttons wird automatisch auf den
                   Wert des aktuellen Eintrags gesetzt und nach dem Ende
                   der Popup-Bearbeitung neugezeichnet */
                boolean p_set;

                /* Zeiger auf Funktion, welche bei der Selektion oder der
                   Auswahl eines Popup-Eintrags (allerdings nicht im Cycle-
                   Modus!) aufgerufen wird (oder NULL). Hierdurch knnen
                   beispielsweise Submens realisiert werden (s. Beispiel-
                   programm 'DialDemo') */
                int (*p_func)(POPUP *popup,int current,int mode);

                /* Parameter:
                   popup:   Zeiger auf POPUP-Struktur des Popups
                   current: Objektnummer des ausgewhlten Eintrags oder
                            negativer Wert, falls kein Eintrag selektiert
                   mode:    Bitmap des Selektionmodus:
                            POPUP_MOUSE:    Eintrag wurde per Maus (Bit ge-
                                            setzt) oder Tastatur ausgewhlt
                            POPUP_EXITENTRY:Popup soll mit gewhltem Ein-
                                            trag verlassen werden
                            POPUP_DCLICK:   Eintrag wurde per Doppelklick
                                            bzw. bei gedrckter Shift-Taste
                                            ausgewhlt
                            POPUP_RCLICK:   Eintrag wurde per Rechtsklick
                                            bzw. bei gedrckter Control-
                                            Taste ausgewhlt
                   Rckgabewert:
                   POPUP_EXIT: Popup verlassen
                   POPUP_CONT: Popup weiter bearbeiten
                */
            } POPUP;

        XPOPUP-Struktur:
        ----------------

        typedef struct
        {
            /* POPUP-Struktur des Popups */
            POPUP  popup;

            /* Eindeutige positive Identifikationsnummer (wird nur beim
               Popup-Modus POPUP_MENU und der erweiterten MN_SELECTED-
               Nachricht bentigt */
            int    id;

            /* Popup-Modus (Auswahl des Popup-Buttons/Infotextes) und
               Cycle-Modus (Auswahl des Cycle-Buttons). Bei einem negativen
               Wert fr den Cycle-Modus wird beim Cycle-Button ebenfalls
               der Popup-Modus benutzt. Ist beim Cycle-Modus POPUP_CYCLE
               oder POPUP_INVCYCLE gesetzt, so wird gegebenenfalls auto-
               matisch die Richtung invertiert. Weitere Mglichkeiten s.
               Popup-Parameter 'mode' */
            int mode,cycle_mode;

            /* Popup-Zentrierung und -koordinaten (s. Popup-Parameter
               'center', 'x' und 'y'). Die Koordinaten knnen - falls diese
               bentigt werden und nicht konstant sind - z.B. nach einer
               OBJC_SIZED-Nachricht angepat werden. */
            int center,x,y;

            /* (vordefinierte) Werte fr Index des ausgewhlten Eintrags und
               aktuellen Eintrag (wird automatisch nach jedem Popup-Aufruf
               auf aktuelle Werte gesetzt, s. Popup-Paramter 'index' und
               'select') */
            int index,current;

            /* Popup ist geffnet (opened!=0) */
            int opened;
        } XPOPUP;

        int Popup(POPUP *popup,int mode,int center,int x,int y,
                  int *index,int select)
            -> Popup 'popup' ffnen, bearbeiten und wieder schlieen
            -> mode: Popup-Modus (Bitmap der folgenden Konstanten)

                /* Popup-Button wurde angewhlt (Popup wird geffnet, bear-
                   beitet und wieder geschlossen) */
                #define POPUP_BTN       0

                /* Cycle-Button wurde angewhlt (nchster Eintrag wird
                   ausgewhlt, wobei dies nur mglich ist, wenn entweder
                   der aktuelle Eintrag bergeben wird (Parameter 'select')
                   oder vor dem aktuellen Eintrag ein Hkchen ist und
                   POPUP_CHECK gesetzt ist */
                #define POPUP_CYCLE     1

                /* Hkchen vor aktuellem Eintrag (andernfalls knnen be-
                   liebig viele Eintrge ein Hkchen besitzen, wobei diese
                   von der Anwendung gesetzt/gelscht werden mssen) */
                #define POPUP_CHECK     2

                /* Cycle-Button wurde "invers" angewhlt (vorheriger
                   Eintrag wird ausgewhlt, wobei dies nur mglich ist,
                   wenn entweder der aktuelle Eintrag bergeben wird
                   (Parameter 'select') oder vor dem aktuellen Eintrag ein
                   Hkchen ist und POPUP_CHECK gesetzt ist (hat Vorrang
                   vor POPUP_CYCLE) */
                #define POPUP_INVCYCLE  4

                /* Popup-Men ist ein Drop-Down-Men (u.a. wird bei voll-
                   automatischen Popups (s. XPOPUP-Struktur) eine erweiterte
                    MN_SELECTED-Nachricht an den Event-Handler verschickt) */
                #define POPUP_MENU      8

                /* Das Popup-Men besitzt untergeordnete Submens. Die ber-
                   geordneten Objekte, welche Submens ffnen, knnen dann,
                   sofern die Objekt-Flags EXIT oder TOUCHEXIT gesetzt sind,
                   per Cursor-Right ausgewhlt und somit die Submens ge-
                   ffnet werden.
                   Wichtig:
                   Besitzt ein Popup Submens, so sollte das Popup keinen
                   Cycle-Button besitzen oder der Cycle-Modus manuell im-
                   plementiert werden! */
                #define POPUP_PARENT    16

                /* Das Popup-Men ist ein Submen eines anderen Popups
                   (Submens knnen u.a. per Cursor-Left verlassen werden) */
                #define POPUP_SUB       32

                /* Popup-Men mit 3D-Rand zeichnen (ansonsten schattierter
                   Rand; hat Vorrang vor POPUP_NO_SHADOW)
                #define POPUP_3D        64

                /* Popup-Men ohne Schatten zeichnen (z.B. fr Fenstermens) */
                #define POPUP_NO_SHADOW 128

                #define POPUP_BTN_CHK      (POPUP_BTN|POPUP_CHECK)
                #define POPUP_CYCLE_CHK    (POPUP_CYCLE|POPUP_CHECK)
                #define POPUP_INVCYCLE_CHK (POPUP_INVCYCLE|POPUP_CHECK)

            -> center: Position des Popups (werden fr die Koordianten
                       x oder y negative Werte angegeben, so werden statt-
                       dessen die Koordinaten des Popup-Buttons genommen)

                #define CENTER    1 /* in Bildschirm zentrieren */
                #define MOUSEPOS  2 /* um Mauszeiger zentrieren */
                #define XPOS      3 /* X-Koordinate x, vertikal
                                       um Mauszeiger zentrieren */
                #define YPOS      4 /* Horizontal um Mauszeiger zentrieren,
                                       Y-Koordinate y */
                #define XYPOS     5 /* Koordinaten (x,y) */
                #define OBJPOS    6 /* um aktuellen Eintrag zentrieren oder
                                       wie XYPOS */
                #define MENUPOS   7 /* Button-Objekt wird als Men-Titel
                                       betrachtet und Popup wird als Men
                                       dazu positioniert */

            -> select: aktueller Eintrag oder negativer Wert (in diesem
                       Fall wird der aktuelle Eintrag automatisch ermittelt,
                       sofern der POPUP_CHECK-Modus gesetzt ist)

            -> zurckgegeben wird die Objektnummer des selektierten
               Eintrags (oder 0) sowie in '*index' (sofern index!=NULL) der
               Index des selektierten Eintrags. Ist Bit 15 (0x8000,
               DOUBLE_CLICK) und/oder Bit 14 (0x4000, RIGHT_CLICK) des
               Rckgabewertes gesetzt, so wurde das Objekt per Doppel- bzw.
               Rechtsklick bzw. bei gedrckter Shift- bzw. Control-Taste
               ausgewhlt.

    18. XAcc-2- und AV-Protokoll-Funktionen
        -----------------------------------

        Allgemein:
        ----------

        Die Library verwaltet intern alle An- und Abmeldungen der Proto-
        kolle XAcc2 und AV selbstndig, wobei alle in der Struktur 'XAcc'
        gespeicherten Informationen in lokale Puffer kopiert wurden (auf-
        grund der fehlerhaften Protokoll-Implementationen diverser
        Programme, die sich nicht korrekt abmelden).

        Ebenso werden die Nachrichten AV_SENDKEY sowie ACC_KEY automatisch
        in Keyboard-Events umgewandelt bzw. nicht ausgewertete Keyboard-
        Events werden als AV_SENDKEY bzw. ACC_KEY an den AV-Server oder die
        Hauptapplikation geschickt.

        Die Nachrichten VA_START, VA_DRAGACCWIND und AV_OPENWIND sowie
        AV_XWIND werden automatisch ausgewertet und in eine OBJC_DRAGGED-
        Nachricht umgewandelt (VA_START wird mit AV_STARTED, AV_OPENWIND
        mit VA_WINDOPEN und AV_XWIND mit VA_XOPEN beantwortet), sofern die
        Library mit Drag&Drop bersetzt wurde.

        Weiterhin werden nicht untersttzte XAcc2-Nachrichten mit einer
        ACC_ACK-FALSE-Nachricht beantwortet und per ACC_TEXT empfangene
        Texte werden im das aktuelle Eingabefeld im obersten Dialog einge-
        fgt. Ist das oberste Fenster kein Dialog, so wird die Nachricht
        an die Applikation weitergeleitet, sofern diese Nachricht unter-
        sttzt wird.

        Alle Fensterdialoge sowie Fenster, die mit den Funktionen
        open_window() und close_window() geffnet bzw. geschlossen werden,
        werden bei einem eventuell vorhandenen AV-Server an- bzw. abge-
        meldet. Auerdem wird das neue Quoting von Dateinamen im AV-
        Protokoll untersttzt (s.a. Drag & Drop-Protokoll)

        #define XACC    1   /* XAcc-Protokoll */
        #define AV      2   /* AV-Protokoll */

        XAcc-Struktur:
        --------------
        typedef struct
        {
            /* untersttzte Protokolle (Bit 0: XAcc, Bit 1: AV) */
            int     flag;            /* XACC/AV */

            /* Applikations-Identifikation */
            int     id;              /* XAcc/AV-Protokoll */

            /* Bitmap der untersttzten AV/VA-Nachrichten (Format
               s. Funktion init_gem())
            int     av_msgs,va_msgs; /* nur AV-Protokoll */

            /* Highbyte: Programmversionsnummer
               Lowbyte:  untersttzte Nachrichtengruppen */
            int     version;         /* nur XAcc-Protokoll */

            /* ID des Meneintrags im Accessory-Men */
            int     menu_id;         /* nur XAcc-Protokoll */

            /* AV-Programmname (8 Zeichen) fr appl_find */
            char    name[];          /* nur AV-Protokoll */

            /* (erweiterter) XAcc2-Programmname oder NULL */
            char    *xname;          /* nur XAcc-Protokoll */

            /* Zeiger auf 'XDSC'-Informationen oder NULL */
            char    *xdsc;           /* nur XAcc-Protokoll */
        } XAcc;

        void XAccBroadCast(int msg[8])
            -> Nachrichtenpuffer 'msg' an alle erreichbaren Applikationen
               verschicken (Nachricht wird nicht an eigene Applikation
               oder System-Prozesse geschickt). Unter SingleTOS (<5.00)
               kann die Nachricht prinzipbedingt nur an die Hauptappli-
               kation sowie an Applikationen, die sich mit dem XAcc-Proto-
               koll angemeldet haben, geschickt werden.

        int XAccSendAck(int sendto, int answer)
            -> ACC_ACK-Rckmeldung 'answer' an Applikation 'sendto' senden
               (OK: answer!=0, Fehler: answer==0)
            -> Rckgabewert:
                TRUE:  Okay
                FALSE: Fehler

        int XAccSendKey(int sendto, int scan, int state)
            -> Tasten-Druck (Scancode 'scan', Status der Umschalttasten
               'state') an Applikation 'sendto' senden
            -> Rckgabewert:
                TRUE:   Okay
                FALSE:  Fehler
                FAIL:   Timeout (keine Besttigung des Empfngers)

        Hinweis:
        --------
        Bei den Funktionen XAccSendText/Img/Meta und VaStart wird whrend
        der Wartezeit bis zur Besttigung des Empfngers der Mauszeiger als
        "Biene" dargestellt.

        int XAccSendText(int sendto, char *txt)
            -> Zeichenkette 'txt' an Applikation 'sendto' senden
            -> Rckgabewert:
                TRUE:   Okay
                FALSE:  Fehler
                FAIL:   Timeout (keine Besttigung des Empfngers)

        int XAccSendMeta(int sendto, int last, char *data, long len)
            -> Metafile-Block 'data' der Lnge 'len' an Applikation 'sendto'
               senden (last!=0 -> letzter Datenblock)
            -> Rckgabewert:
                TRUE:   Okay
                FALSE:  Fehler
                FAIL:   Timeout (keine Besttigung des Empfngers)

        int XAccSendImg(int sendto, int last, char *data, long len)
            -> GEM-Image-Block 'data' der Lnge 'len' an Applikation 'sendto'
               senden (last!=0 -> letzter Datenblock)
            -> Rckgabewert:
                TRUE:   Okay
                FALSE:  Fehler
                FAIL:   Timeout (keine Besttigung des Empfngers)

        int AvSendMsg(int sendto,int msg_id,int msg[8])
            -> (AV-) Nachricht 'msg_id' an Applikation 'sendto' senden
               (Message-Puffer msg[3]-msg[7] enthlt gegebenenfalls weitere
               Daten, falls msg!=NULL), wobei Nachrichten an die eigene
               Applikation direkt in den internen Nachrichten-Puffer ge-
               schrieben werden
            -> Rckgabewert:
                TRUE:  Okay
                FALSE: Fehler

        int VaStart(int sendto,char *args)
            -> Argumente/Kommandozeile 'args' (Aufbau s. Funktion
               ParseArgs) an Applikation 'sendto' senden
            -> Rckgabewert:
                TRUE:  Okay
                FALSE: Fehler
                FAIL:  Timeout (keine Besttigung des Empfngers)

        Hinweis:
        --------
        Die XAcc/AV-Untersttzung der Applikation wird ebenfalls in die
        interne XAcc/AV-Liste integriert und kann somit mit Hilfe der
        folgenden 3 Funktionen find_id, find_xacc_xdsc und find_app eben-
        falls ermittelt werden!

        XAcc *find_xacc_xdsc(int app_id,char *xdsc)
            -> erweiterten XAcc-Programmnamen der Applikation 'app_id' nach
               Zeichenkette 'xdsc' durchsuchen (app<0 -> alle XAcc-Appli-
               kationen durchsuchen)
            -> Rckgabewert enthlt Zeiger auf XAcc-Struktur der
               Applikation, deren XAcc-Programmname die Zeichenkette ent-
               hlt, oder NULL, wenn die Zeichenkette nicht gefunden wurde

        XAcc *find_id(int app_id)
            -> XAcc-Struktur der Applikation 'app_id' ermitteln oder NULL,
               wenn es sich um keine XAcc-Applikation handelt

        XAcc *find_app(int first)
            -> XAcc-Struktur der ersten (first!=0) oder der nchsten
               (first==0) angemeldeten Applikation ermitteln (Rckgabewert
               gleich NULL, wenn keine weitere Applikation gefunden wurde)

        int AppLoaded(char *name)
            -> Ermittelt die Applikations-ID der Anwendung mit dem
               Dateinamen 'name', welcher auch Pfad- und Laufwerksangaben
               enthalten darf.
            -> Rckgabewert: Applikations-ID oder negativer Wert

     19. Drag & Drop-Funktionen
         ----------------------

        DRAG_DROP-Struktur:
        -------------------

        typedef struct
        {
            /* Art der Parameterbergabe */
            int dd_type;

                #define AV_DRAG     0 /* AV/Gemini-Drag&Drop */
                #define AV_START    1 /* VA_START-Nachricht */
                #define AV_OPEN     2 /* AV_OPENWIND/AV_XWIND-Nachricht */
                #define MINT_DRAG   3 /* MTOS-Drag&Drop */

            /* Applikations-ID des Senders */
            int dd_originator;

            /* Mausposition (oder negative Werte, falls nicht vom
               Benutzer verursacht bzw. Hintergrundfenster betroffen) */
            int dd_mx,dd_my;

            /* Status der Umschalttasten */
            int dd_kstate;

            /* Zeiger auf (Datei-/Pfad-) Namen der bergebenen Daten
               oder NULL */
            char *dd_name;

            /* Zeiger auf Argumente (z.B. Kommandozeile) oder NULL. Die
               einzelnen Argumente/Dateinamen sind durch Leerzeichen ge-
               trennt, wobei Argumente, die Leerzeichen enthalten, inner-
               halb von Hochkommatas (oder Anfhrungszeichen) stehen (z.B.
               'meine Datei'). Doppelte Hochkommatas stehen dann fr ein
               einzelnes Hochkommata (z.B. 'Christian''s Datei').
               Ist weder 'dd_mem' noch 'dd_args' gesetzt, so wurden keine
               Daten/Parameter bergeben. Darauf kann man z.B. entweder mit
               der normalen AC_OPEN-Routine (bei Accessories) oder mit
               dem ffnen des Fileselectors (bei Programmen) reagieren. */
            char *dd_args;

            /* Zeiger auf bergebene Daten oder NULL (dieser Speicher-
               bereich darf NICHT zur weiteren Verwendung benutzt wer-
               den, d.h. wird wieder freigegeben!) */
            char *dd_mem;

            /* Lnge der in 'dd_mem' bergebenen Daten oder Null */
            long dd_size;

            /* Extension der in 'dd_mem' bergebenen Daten oder Leer-
               string ""
            char dd_ext[4];

            /* Zeiger auf WIN-Struktur des Fensters, auf das die Daten
               gezogen wurden, oder NULL, falls Hintergrund bzw. nicht
               vom Benutzer verursacht.
               Achtung:
               Hierbei kann es sich auch um das Fenster eines Dialogs han-
               deln, also u.a. auch Alert-Boxen, Font-Selectorbox oder
               ASCII-Eingabebox. */
            WIN *dd_win;
        } DRAG_DROP;

        WICHTIG:
        --------
        Per Drag&Drop knnen nur dann Daten empfangen werden, wenn mit
        Hilfe der Funktion Event_Handler() ein Ereignis-Handler angemeldet
        wurde, der die Drag&Drop-Nachricht 'OBJC_DRAGGED' auswertet.

        void SetDragDrop(int any_extension,char *exts)
             -> gewnschte/bevorzugte Dateierweiterungen fr das Drag&Drop-
                Protokoll festlegen. Dabei zeigt 'exts' auf eine Zeichen-
                kette mit DD_EXTSIZE Zeichen (mit Nullbytes auffllen), die
                die gewnschten Erweiterungen (z.B. ".TXT.ASC.ARGS") ent-
                hlt, wobei die Erweiterungen jeweils 4 Zeichen umfassen
                mssen und 'ARGS' fr Argumente steht. Wird fr den
                Parameter 'any_extension' TRUE bergeben, so wird jede
                Erweiterung akzeptiert. (voreingestellt ist, da nur Argu-
                mente entgegengenommen werden.)

        int SendDragDrop(int msx,int msy,int kstate,char *name,
                         char *ext,long size,char *data)
             -> Daten per Drag&Drop-Protokoll an die Applikation senden,
                der das Fenster unter dem Mauszeiger gehrt (whrend der
                bertragung wird der Mauszeiger als "Biene" dargestellt)
             -> Parameter:
                msx,msy:  Mauskoordinaten
                kstate:   Status der Umschalttasten
                name:     Zeiger auf (Datei-) Namen der Daten oder NULL
                ext[4]:   Zeiger auf Zeichenkette, die die Erweiterung
                          bzw. den Typ der Daten enthlt
                size:     Lnge der Daten
                data:     Adresse der Daten
             -> Rckgabewert:
                NO_RECEIVER: Fenster oder Empfnger nicht gefunden bzw.
                             applikationseigenes Fenster
                NO_DD:       Drag&Drop-Pipe konnte nicht angelegt werden
                             (Betriebssystem untersttzt kein Drag&Drop!)
                DD_NAK:      Empfnger untersttzt kein Drag&Drop
                DD_EXT:      Empfnger kann Daten nicht empfangen (z.B.
                             unbekanntes Format)
                DD_LEN:      Nicht alle Daten konnten bermittelt werden
                             oder zuwenig Speicher
                DD_OK:       Alles in Ordnung

        char *ParseArgs(char *args)
            -> (Drag&Drop-) Kommandozeile auswerten (u.a. in einzelne
               Wrter trennen und Hochkommata/Anfhrungszeichen entfernen,
               s.a. Element 'dd_args' der DRAG_DROP-Struktur).
               Beim ersten Aufruf zeigt der Parameter 'args' auf die Origi-
               nal-Kommandozeile, welche in einen lokalen Puffer kopiert
               wird und somit unverndert bleibt, und bei allen folgenden
               Aufrufen wird ein NULL-Pointer bergeben.
            -> Rckgabewert:
               Pointer auf ein Element der Kommandozeile oder NULL, falls
               kein weiteres Element mehr vorhanden ist. Dabei darf der
               Pointer nur bis zum nchsten Aufruf dieser Funktion ver-
               wendet werden.

    20. Auskunftsfunktionen
        -------------------

        boolean driver_avaiable(int dev)
            -> Testet, ob der GDOS-Treiber mit der Gertenummer 'dev'
               existiert. Mgliche Gertenummern:
                 Screen     1..10
                 Plotter    11..20
                 Printer    21..30
                 Metafile   31..40
                 Camera     41..50
                 Tablett    51..60
                 Memory     61..70
                 Sonstige   71..99
            -> Rckgabewert:
                 TRUE:  Treiber existiert
                 FALSE: GDOS oder Treiber nicht vorhanden

        int mm2dpi(int size)
            -> DPI (dots per inch) eines Ausgabegerts berechnen
            -> Parameter 'size': Gre eine Pixels in Micrometer
               (=1/1000 Milimeter, s. work_out[]-Array)

        int objc_sysvar(int ob_smode,int ob_swhich,int ob_sival1,
                        int ob_sival2,int *ob_soval1,int *ob_soval2)
            -> erweiterte Variante der AES-Funktion objc_sysvar(), welche
               die Existenz diese Funktion selbstndig ermittelt. Ist
               die Funktion nicht vorhanden, so werden die Ausgabevariablen
               '*ob_soval1' und '*ob_soval2' nicht verndert! Fr die
               Ausgabevariablen knnen auch NULL-Pointer bergeben werden,
               wenn der Wert nicht von Bedeutung ist.
            -> Rckgabewerte und Parameter s. Beschreibung der ent-
               sprechenden AES-Funktion

        int appl_xgetinfo(int type,int *out1,int *out2,int *out3,int *out4);
            -> erweiterte appl_getinfo()-Routine, welche die Existenz von
               appl_getinfo() selbstndig ermittelt. Ist diese Funktion
               nicht vorhanden oder trat ein Fehler auf (Rckgabewert
               FALSE), so werden die Ausgabevariablen auf Null gesetzt.
            -> Rckgabewerte und Parameter wie bei appl_getinfo()

        int appl_getfontinfo(int font_type,int *height,int *id,int *type)
            -> Informationen ber groen (font_type=0) oder kleinen
               System-Font (font_type=1) ermitteln
            -> Rckgabewerte:
                height: Font-Hhe in Pixel
                id:     Font-ID
                type:   0 - System-Font
                        1 - FSM-Font

        int wind_xget(int w_handle, int w_field, int *w1, int *w2,
                      int *w3,int *w4);
            -> korrigierte wind_get()-Funktion fr erweiterte Aufrufe unter
               Winx sowie MTOS und zuknftigen Erweiterungen (die in der
               Pure C-GEM-Library bis V1.1 enthaltene, optimierte Routine
               funktioniert nicht mit neueren Aufrufen)

        int get_dialog_info(int *fly_dials,int *win_dials,int *wins,
                            DIAINFO **top);
            -> Informationen ber geffnete Dialoge und Fenster ermitteln
            -> Rckgabewert: TRUE:  Ausgabe in beliebiges Fenster mglich
                             FALSE: Ausgabe nur in obersten Dialog 'top'
                             FAIL:  Keine Ausgabe mglich (z.B. Popup ge-
                                    ffnet, Echtzeit-Funktion (graf_xxx)
                                    aufgerufen oder Ausgabe per beg_ctrl()
                                    gesperrt)
               *fly_dials: Anzahl der geffneten (fliegenden) Dialoge
                           (sofern fly_dials!=NULL)
               *win_dials: Anzahl der geffneten Fenster-Dialoge (sofern
                           win_dials!=NULL)
               *wins:      Anzahl der geffneten Fenster (sofern wins!=NULL)
                           inklusive der Fensterdialoge
               *top:       Zeiger auf obersten Dialog, falls Rckgabewert
                           gleich FALSE (sofern top!=NULL)

    21. Datei-/Pfadfunktionen
        ---------------------

        void drive_changed(int drive)
            -> Inhalt des Laufwerks 'drive' (0=A,1=B,2=C,...,-1=alle Lauf-
               werke) wurde verndert (SH_WDRAW-Nachricht wird (per
               XAccBroadCast) an alle Applikationen gesendet)

        char *GetFilename(char *path)
            -> Zeiger auf Dateiname des Pfades 'path' ermitteln. Enthlt
               der Pfad keinen Dateinamen, so zeigt der Rckgabewert auf
               das Ende (Nullbyte) des Pfades

        char *GetExtension(char *path)
            -> Zeiger auf Erweiterungs des Dateinamens des Pfades 'path'
               ermitteln. Enthlt der Pfad keinen Dateinamen oder keine
               Erweiterung, so zeigt der Rckgabewert auf das Ende
               (Nullbyte) des Pfades. Diese Funktion funktioniert auch bei
               erweiterten Dateinamen!

        char *GetPath(char *path)
            -> Dateiname des Pfades 'path' wird entfernt und ein Zeiger
               auf das Ende des Pfades (Nullbyte) zurckgegeben

        int GetDrive(char *path)
            -> Laufwerk des Pfades 'path' ermitteln
            -> Rckgabewert: 0=A,1=B,2=C,...

        void MakeFullpath(char *dest,char *path,char *file)
            -> kompletten Pfadnamen aus Pfad 'path' (sofern path!=NULL,
               wobei der Pfad keinen abschlieenden Backslash enthalten
               mu) und Datei 'file' erstellen und im String 'dest' zurck-
               geben. Wird fr den Pfad 'path' NULL bergeben, so mu
               sich der Pfad bereits in 'dest' befinden!

        boolean SaveInfoFile(char *file,boolean auto_path,void *info,
                             int len,char *id,int version)
            -> Einstellungen des Programms sichern. Die Informationsdatei
               verfgt dabei im automatisch erzeugten Header sowohl ber
               eine Identifikation als auch eine Prfsumme. Ebenso sind mit
               dieser Funktion (zusammen mit LoadInfoFile) auf- und abwrts-
               kompatible Informationsdateien mglich.
            -> Parameter:
               file:      Zeiger auf Dateinamen (evtl. inklusive Pfad)
               auto_path: Pfad der Informationsdatei automatisch ermitteln
                          (in Abhngigkeit davon, ob die Anwendung als
                          Accessory oder als Programm gestartet wurde)
               info:      Zeiger auf Speicherbereich mit den zu speichern-
                          den Einstellungen
               len:       Lnge des zu speichernden Bereichs
               id:        Zeiger auf Identifikationsstring, der vor den
                          eigentlichen Einstellungen gespeichert wird
               version:   Versionsnummer der Informationsdatei
            -> Rckgabewert:
               TRUE:  Einstellungen wurden gespeichert
               FALSE: Datei konnte nicht gespeichert werden

        int LoadInfoFile(char *file,boolean auto_path,void *info,int len,
                         int min_len,char *id,int min_version)
            -> Einstellungen des Programms laden. Der Speicherbereich
               mit den Einstellungen wird dabei nur verndert, wenn Daten
               erfolgreich geladen werden konnten und der Header allen
               Anforderungen entspricht (korrekte Prfsumme, Identifikation,
               Versionsnummer, Lnge der Einstellungen).
            -> Parameter:
               file:        Zeiger auf Dateinamen (evtl. inklusive Pfad)
               auto_path:   Pfad der Informationsdatei automatisch ermitteln
                            (in Abhngigkeit davon, ob die Anwendung als
                            Accessory oder als Programm gestartet wurde)
               info:        Zeiger auf Speicherbereich mit den zu ladenden
                            den Einstellungen
               len:         Lnge des zu ladenden Bereichs
               min_len:     Minimale Lnge der zu ladenden Dateien
               id:          Zeiger auf Identifikationsstring
               min_version: Minimale Versionsnummer der Einstellungen, die
                            geladen werden knnen
            -> Rckgabewert:
               >0:    Anzahl der geladenen Bytes
               FALSE: Fehlerhafte Informationsdatei
               FAIL:  Datei konnte nicht geladen werden/zu wenig Speicher

        int FileSelect(char *title,char *path,char *fname,char *sel,
                       int no_insel,int out,char *outptr[])
            -> Dateiselector aufrufen, wobei diese Funktion automatisch
               erkennt, ob ein erweiterter Fileselector vorliegt und/oder
               ob eine Titelzeile vom Betriebssystem untersttzt wird. Sind
               systemmodale (fliegende) Dialoge geffnet oder ist die
               Ausgabe gesperrt, so kann evtl. der Dateiselector aufgrund
               des Speicherbedarfs fr die Hintergrundrestaurierung nicht
               aufgerufen werden. In diesem Fall sollten die Dialoge vor dem
               Aufruf geschlossen und anschlieend wieder geffnet werden
               sowie die Ausgabe freigegeben werden (s. end_ctrl())
            -> Parameter:
               title:    Titel des Fileselectors
               path:     Pfad (sowohl Ein- als auch Ausgabeparameter)
               fname:    vorgegebene Datei (Eingabe) bzw. ausgewhlte Datei
                         (Ausgabe)
               sel:      Dateimaske oder NULL (in diesem Fall wird "*.*"
                         genommen) (die Dateimaske wird automatisch an
                         die Mglichkeiten des Dateisystems (Gro-/Klein-
                         schreibung) angepat)
               no_insel: keine vorgegebene Datei (no_insel!=0)
               out:      maximale Anzahl an Dateien, die ausgewhlt werden
                         knnen (nur gltig, wenn Parameter outptr ungleich
                         NULL ist und ein erweiterter Fileselector vor-
                         handen ist)
               outptr:   Adresse eines Arrays mit Zeigern auf Strings fr
                         die auszuwhlenden Dateinamen (oder NULL, falls
                         keine Mehrfachauswahl gewnscht wird). Der erste
                         Dateiname in diesem Array entspricht dabei dem
                         Rckgabewert von 'fname'. Beachtet werden mu,
                         da fr jeden Dateinamen mindestens 34 Bytes re-
                         serviert werden sollten (wegen erweiterter Datei-
                         systeme unter MiNT/MagiC)
            -> Rckgabewert:
                         FAIL:  Fileselector konnte nicht aufgerufen werden
                                (Speichermangel oder z.B. Popup geffnet)
                         FALSE: Abbruch (keine Datei ausgewhlt)
                         >0:    Anzahl der ausgewhlten Dateien

    22. Font-Funktionen
        ---------------

        FONTINFO-Struktur:
        ------------------

        typedef struct
        {
            /* Null-terminierter Name des Zeichensatzes (max. 32 Zeichen) */
            char name[];

            /* Zeichensatz-ID (Rckgabewert von vqt_name()) und -index fr
               die Funktion vqt_name()) */
            int id,index;

            /* Bitmap des Zeichensatztyps:
               FNT_PROP:     proportionaler Zeichensatz
               FNT_ASCII:    Zeichensatz enthlt nicht alle Zeichen
                             (ASCII 0-255)
               FNT_SYSTEM:   System-Zeichensatz
               FNT_VECTOR:   Vektor-Zeichensatz
               FNT_TRUETYPE: TrueType-Zeichensatz
               FNT_SPEEDO:   Bitstream-Zeichensatz
               FNT_TYPE1:    Type1-Zeichensatz
               FNT_CFN:      Calamus-Zeichensatz */
            int type;

            /* minimale und maximale Zeichensatzhhe in Punkt */
            int min_size,max_size

            /* erstes und letztes Zeichen im Zeichensatz */
            int min_ascii,max_ascii;

            /* alle weiteren Variablen dieser Struktur sind fr interne
               Zwecke reserviert */
        } FONTINFO;

        FONTINFO *FontInfo(int id)
            -> Zeiger auf FONTINFO-Struktur des Zeichensatzes mit der ID
               'id' ermitteln. Wird eine fehlerhafte Zeichensatz-ID ber-
               geben, so wird die FONTINFO-Struktur des Zeichensatzes
               ermittelt, der bei dieser ID gesetzt wird, d.h. der Rckgabe-
               wert ist immer gltig!

        FONTINFO *FastFontInfo(int id)
            -> entspricht der Funktion FontInfo() mit der Einschrnkung,
               da nur die Variablen 'name', 'id' und 'idx' der FONTINFO-
               Struktur gesetzt sind. Dadurch ist diese Funktion teilweise
               erheblich schneller.

        int FontList((int type,int min_size,int max_size,int max_fonts,
                     FONTINFO *fonts[],
                     int (*font_test)(FONTINFO *info,int size))
            -> Liste von Fonts mit den gewnschten Attributen erstellen.
               Besitzt ein Font keine Gre im Bereich zwischen 'min_size'
               und 'max_size', so wird er nicht in die Liste aufgenommen!
            -> Parameter:
               type:       Bitmap der gewnschten Fonts:
                           FS_FNT_BITMAP: Bitmap-Fonts
                           FS_FNT_VECTOR: Vektor-Fonts
                             -> Ist weder FS_FNT_BITMAP noch FS_FNT_VECTOR
                                gesetzt, so entspricht dies der Kombination
                                aus beiden Konstanten
                           FS_FNT_MONO:   nicht-proportionale Fonts
                           FS_FNT_PROP:   proportionale Fonts
                             -> Ist weder FS_FNT_MONO noch FS_FNT_PROP
                                gesetzt, so entspricht dies der Kombination
                                aus beiden Konstanten
                           FS_FNT_ALL:    Alle Fonts
               min_size:   Minimale Gre in Punkt oder negativer Wert
               max_size:   Maximale Gre in Punkt oder negativer Wert
               max_fonts:  Maximale Anzahl an Fonts, die die Liste auf-
                           nehmen kann
               fonts:      Zeiger auf FONTINFO-Pointer-Array der Gre
                           'max_fonts', welches mit der unsortierten Liste
                           der Fonts gefllt wird
               font_test:  Optionale flexible Routine, welche bei jedem
                           Font aufgerufen wird
                           Parameter:
                           info: Zeiger auf FONTINFO-Struktur des Fonts
                           size: Gewnschte Gre in Punkt (bei dieser
                                 Funktion wird immer ein negativer Wert
                                 bergeben). Sinn dieses Parameters ist,
                                 da man die gleiche Routine fr FontSizes
                                 und FontList verwenden kann.
                           Rckgabewert:
                           TRUE:  Font in Liste aufnehmen
                           FALSE: mit nchstem Font weitermachen
            -> Rckgabewert:
               Anzahl der Fonts in der Liste

        int FontSizes(int font_id,int free_scale,int min_size,int max_size,
                      int max_cnt,int *sizes,
                      int (*font_test)(FONTINFO *info,int size))
            -> Liste von Gren (in Punkt) des Fonts mit der ID 'font_id'
               erstellen
            -> Parameter:
               font_id:    ID des gewnschten Fonts
               free_scale: Bei Vektorfonts drfen auch Zwischengren von
                           der Library in die Liste integriert werden
                           (free_scale!=0). Diese Gren mssen per
                            vst_arbpt oder eine der Library-Routinen
                            v_set_text/v_set_point gesetzt werden)
               min_size:   Minimale Gre in Punkt oder negativer Wert
               max_size:   Maximale Gre in Punkt oder negativer Wert
               max_cnt:    Maximale Anzahl an Gren, die die Liste auf-
                           nehmen kann
               sizes:      Zeiger auf Integerarray der Gre 'max_cnt',
                           welches mit der grensortierten Liste gefllt
                           wird
               font_test:  Optionale flexible Routine, welche bei jeder
                           Gre aufgerufen wird
                           Parameter:
                           info: Zeiger auf FONTINFO-Struktur des Fonts
                           size: Gewnschte Gre in Punkt
                           Rckgabewert:
                           TRUE:  Gre 'size' in Liste aufnehmen
                           FALSE: mit nchster Gre weitermachen
            -> Rckgabewert:
               Anzahl der Gren in der Liste

        int FontChanged(int apID,int handle,int id,int size,int effect,
                         int color)
            -> Nachricht FONT_CHANGED (s. Font-Protokoll) an Applikation
               'apID' oder alle anderen Applikationen (apID<0) senden.
            -> Parameter: (negative Parameter bedeuten keine Vernderung)
               handle: Handle des Fensters, dessen Font gendert werden
                       soll, oder negativer Wert fr alle Fenster (wenn
                       die Nachricht an alle Applikationen gesendet wird,
                       dann hat dieser Parameter keine Bedeutung)
               id:     Font-ID
               size:   Font-Gre in Punkt
               effect: Effekte
               color:  Farbe
            -> Rckgabewert:
               TRUE:  Nachricht konnte verschickt werden
               FALSE: Nachricht wurde nicht verschickt (z.B. weil Em-
                      pfnger nicht existiert)

        int CallFontSelector(int handle,int id,int size,int color,int effects)
            -> D&D-FontSelector (gegenbenenfalls mit aktuellen Attributen)
               aufrufen (FONT_SELECT-Nachricht (s. Font-Protokoll) wird
               verschickt)
            -> Parameter (bei allen Parametern auer 'handle' bedeutet
               ein negativer Wert, da dieses Attribut nicht bentigt wird,
               nicht eingestellt werden soll oder noch nicht gesetzt ist)
               handle: Handle des Fensters, in dem die Font-Attribute ein-
                       gestellt werden sollen, (handle>0) oder alle Fenster
                       (handle<=0)
               id:     Font-ID
               size:   Font-Gre in Punkt
               effect: Effekte
               color:  Farbe
            -> Rckgabewert:
               TRUE:  FontSelector wurde aufgerufen
               FALSE: Kein Fontselector vorhanden

        int FontAck(int font_selector,boolean ack)
            -> Besttigungsnachricht FONT_ACK (s. Font-Protokoll) an
               D&D-Fontselector mit der ID 'font_selector' schicken
            -> Parameter:
               ack: TRUE  -> FONT_SELECT-Nachricht wurde ausgewertet
                    FALSE -> FONT_SELECT-Nachricht wurde ignoriert
            -> Rckgabewert:
               TRUE:  Nachricht wurde verschickt
               FALSE: Nachricht wurde nicht verschickt (z.B. existiert
                      Fontselector-ID nicht oder es handelt sich nicht
                      um einen Fontselector)

        FONTSEL-Struktur:
        -----------------

        typedef struct
        {
            /* Zeiger auf Fenstertitel (ohne Bedeutung bei Modus FSEL_DIAL)
               oder NULL (in diesem Fall wird der Titel automatisch auf
               'FontSelector' gesetzt) */
            char    *win_title;

            /* Zeiger auf Dialogtitel oder NULL (in diesem Fall wird der
               unterstrichene Titel versteckt) */
            char    *title;

            /* Zeiger auf Beispieltext oder NULL (in diesem Fall wird der
               vorgegebene Text benutzt) */
            char    *example;

            /* Zeiger auf TEDINFO-Struktur des Informationsbuttons oder
               NULL (der Text kann dabei maximal 8 (SMALL-Zeichensatz) bzw.
               6 (IBM-Zeichensatz) Zeichen lang sein!). Wird kein Zeiger
               definiert, dann wird der normale Informationsbutton ver-
               wendet. */
            TEDINFO *info;

            /* Objekttyp und -status des Informationsbuttons (nur von
               Bedeutung, wenn 'info' definiert ist) */
            int     info_type,info_state;

            /* Bitmap der Elemente des Fontselectors:
               FS_GADGETS_STANDARD: Keine zustzlichen Elemente
               FS_GADGETS_EFFECT:   Texteffekte
               FS_GADGETS_COLOR:    Textfarbe
               FS_GADGETS_SKEW:     Neigungswinkel bei Vektorfonts
               FS_GADGETS_SPEEDO:   Zwischengren bei Vektorfonts
               FS_GADGETS_INVERS:   inverser Texteffekt
               FS_GADGETS_ALL:      Alle Elemente */
            char    gadgets;

            /* Gewnschter Typ der Fonts, die zur Auswahl stehen sollen
               (s. Parameter 'type' der Funktion FontList) */
            char    fsel_type;

            /* Minimale und maximale Gre (in Punkt) der Fonts
               (s. Parameter 'min_size' und 'max_size' der Funktion
                FontList) */
            int     min_pts_size,max_pts_size;

            /* Optionen fr den Drag & Drop-Modus */
            struct
            {
                /* nur applikationsinternes Drag & Drop, d.h. die
                   FONT_CHANGED-Nachricht wird nicht an andere Anwendungen
                   geschickt */
                unsigned app_only : 1;

                /* 'All'- und '<Caller>'- (<Caller> steht fr den Aufrufer)
                   Button sichtbar */
                unsigned buttons  : 1;
            } drag;

            /* Allgemeine Optionen */
            struct
            {
                /* reserviert (0) */
                unsigned         : 7;

                /* automatischer Redraw des Beispiels nach einer
                   Vernderung der Attribute (diese Option kann auch vom
                   Benutzer eingestellt werden) */
                unsigned redraw  : 1;

                /* Zentrierung des Fontselectors beim ffnen (s.
                   Parameter 'center' der Funktion open_dialog) */
                signed center    : 3;

                /* Sich vergrernde/verkleinernde Boxen beim ffnen bzw.
                   Schlieen des FontSelectors zeichnen */
                unsigned boxes   : 1;

                /* Preview der Fonts in den Slidern (diese Option kann auch
                   vom Benutzer eingestellt werden) */
                unsigned preview : 1;

                /* Alphabetisch sortierte Font- und Schnitt-Liste (diese
                   Option kann auch vom Benutzer eingestellt werden) */
                unsigned sort    : 1;

                /* Gewnschte Aktion nach einer Drag & Drop-Aktion:
                   FS_ACT_NONE: Keine Aktion
                   FS_ACT_ICON: Fontselector ikonifizieren
                   FS_ACT_BACK: Fontselector in Hintergrund legen
                   FS_ACT_CLOSE: Fontselector schlieen
                   Diese Option kann auch vom Benutzer eingestellt werden. */
                unsigned action  : 2;
            } options;

            /* Zeiger auf Routine zur Auswahl der Fonts oder NULL
               (s. entsprechende Parameter der Funktionen FontList und
                FontSizes) */
            int     (*font_test)(FONTINFO *info,int size);

            /* Zeiger auf Hilfe-Funktion, die beim Anklicken des Infor-
               mations-Buttons aufgerufen wird, oder NULL (in diesem Fall
               erscheint die normale Meldung des Fontselectors) */
            void cdecl (*help_func)(void);

            /* Ein- und Ausgabevariablen der Zeichensatzattribute:
               Font-ID, -gre (in Punkt), Effekte, Farbe und Neigung.
               Die Werte werden gegebenenfalls automatisch auf gltige
               Werte gesetzt. Es werden nur die Ausgabevariablen verndert,
               die eingestellt werden knnen (s. 'gadgets') */
            int     id,size,effect,color,skew;

            /* Startposition (abhngig vom Zentrierungsmodus) bzw. Position
               des Fontselectors beim Schlieen (Ein- u. Ausgabevariablen) */
            int     x,y;

            /* Zeiger auf FONTINFO-Struktur des ausgewhlten Fonts (nur
               gltig nach Ende der Fontselector-Funktion mit Rckgabewert
               FS_OK oder nach einem Aufruf der Funktion UpdateFSel(TRUE,...) */
            FONTINFO *fnt;

            /* Voreingestellte Zielapplikation (oder negativer Wert, falls
               nicht vorhanden) fr den '<Caller>'-Button im Drag & Drop-
               Modus */
            int     app;

            /* Gewnschtes Fenster der Zielapplikation im Drag & Drop-Modus
               oder negativer Wert fr alle Fenster dieser Applikation
               (Parameter hat nur Bedeutung, wenn 'app' gesetzt ist) */
            int win;
        } FONTSEL;

        int FontSelect((int mode,FONTSEL *fs)
            -> Fontselector ffnen oder geffneten Fontselector neu setzen
            -> Parameter:
               mode: Gewnschter Modus des Fontselectors:
                     FSEL_DIAL: fliegender Dialog
                     FSEL_WIN:  modaler Fensterdialog
                     FSEL_DRAG: Drag & Drop-Fontselector (ebenfalls
                                modaler Fensterdialog mit Schliebox)
               fsel: Zeiger auf FONTSEL-Struktur mit den Parametern sowie
                     Ein- und Ausgabevariablen des Fontselectors
            -> Rckgabewert:
               FS_OK:        Font wurde ausgewhlt (Ok-Button, Fenster-
                             Schliebox oder Doppelklick auf gewnschten
                             Eintrag), d.h. die gewnschten Rckgabe-
                             variablen sind gltig
               FS_CANCEL:    Kein Font ausgewhlt (Abbruch-Button), keine
                             Vernderung der Rckgabevariablen
               FS_ABANDON:   Fontselector wurde geschlossen und kein Font
                             ausgewhlt (z.B. bei AC_CLOSE)
               FS_NO_WINDOW: Kein Fenster verfgbar
               FS_NO_FONTS:  Keine Fonts mit den gewnschten Attributen
                             vorhanden
               FS_RES_ERROR: Auflsung zu gering
               FS_ERROR:     allgemeiner Fehler (z.B. Bildschirmausgabe
                             gesperrt)
               FS_ACTIVE:    Fontselector bereits aktiv, aber andere
                             FONTSEL-Struktur als bergebene
               FS_SET:       Fontselector bereits aktiv (Fontselector
                             wurde auf neue Einstellungen aus FONTSEL-
                             Struktur gesetzt)

        boolean UpdateFsel(boolean all,boolean example)
            -> FONTSEL-Struktur eines geffneten Fontselectors aktualisieren
            -> Parameter:
               all:     Nur die Optionen (Struktur 'options') und die Posi-
                        tion (Variablen 'x' und 'y') des Dialoges
                        (all==FALSE) oder zustzlich noch alle Fontattribute
                        (Variablen 'id', 'size', 'fnt' und gegebenenfalls
                        'skew', 'effect' und 'color'), die eingestellt wer-
                        den sollen, setzen (all==TRUE)
               example: Beispiel aktualisieren (example==TRUE)
            -> Rckgabewert:
               TRUE:  FONTSEL-Struktur wurde aktualisiert
               FALSE: Kein Fontselector geffnet

    23. Paula-Protokoll
        ---------------

        int PaulaStop(void)
            -> Musikwiedergabe von Paula (ab Version 2.4) stoppen
            -> Rckgabewert:
               TRUE:  Paula hat die Funktion ausgefhrt
               FALSE: Paula nicht vorhanden oder
                      Funktion wurde nicht ausgefhrt
               FAIL:  Timeout (keine Antwort oder zu alte Paula-Version)

        int PaulaShutDown
            -> Musikwiedergabe von Paula (ab Version 2.4) stoppen,
               Speicher freigeben und Paula-Fenster schlieen
            -> Rckgabewert:
               TRUE:  Paula hat die Funktion ausgefhrt
               FALSE: Paula nicht vorhanden oder
                      Funktion wurde nicht ausgefhrt
               FAIL:  Timeout (keine Antwort oder zu alte Paula-Version)

        int PaulaStart(char *mod_files)
            -> Musikwiedergabe von Paula (auch bei lteren Versionen)
               starten. ber den Parameter 'mod_files' kann gegebenenfalls
               eine Liste von MOD-Files (getrennt durch Leerzeichen oder
               Semikolon) bergeben werden, sofern mod_files!=NULL
            -> Rckgabewert:
               TRUE:  Paula hat die Funktion ausgefhrt
               FALSE: Paula nicht vorhanden oder
                      Funktion wurde nicht ausgefhrt
               FAIL:  Timeout (keine Antwort)

    24. Timer-Funktionen
        ----------------

        MKSTATE-Struktur:
        -----------------

        typedef struct
        {
            /* X/Y-Koordinaten der Maus sowie Zustand der Mausknpfe */
            int mx,my,mbut;
            /* Zustand der Umschalttasten */
            int kstate;
        } MKSTATE;

        long NewTimer(long timer,long para,
                      long (*fkt)(long para,long time,MKSTATE *mk))
            -> Nach dem Verstreichen der Zeit 'timer' (in Milisekunden)
               wird die Funktion 'fkt' mit dem beliebigen Parameter (para),
               der aktuellen Systemzeit seit dem Booten in Milisekunden
               (time) und einem Zeiger auf eine MKSTATE-Struktur (mk) aufge-
               rufen (die Anzahl der gleichzeitig verwendbaren Timer ist nur
               durch den verfgbaren Speicher und die Rechenleistung be-
               grenzt).
               Mgliche Rckgabewerte der Funktion 'fkt':
               CONT_TIMER: Timer mit bisheriger Periode fortsetzen
               STOP_TIMER: Timer abbrechen
               Pos. Wert:  Timer mit Rckgabewert als neuer Periode fort-
                           setzen
            -> Rckgabewert: Timer-ID oder Null im Fehlerfall

        int KillTimer(long id)
            -> Timer mit der ID 'id' wieder entfernen.
            -> Rckgabewert: TRUE:  Timer wurde entfernt
                             FALSE: Timer existierte nicht (z.B. weil
                                    er bereits ausgelst wurde)

    25. Maus/Tastatur-Funktionen
        ------------------------

        int mouse(int *x,int *y)
            -> Position und Zustand der Knpfe der Maus ermitteln
            -> Ausgabewerte:
                   *x: X-Ordinate der Maus (falls x!=NULL)
                   *y: Y-Ordinate der Maus (falls y!=NULL)
            -> Rckgabewert: Zustand der Maustasten

        void MouseOn(void);
        void MouseOff(void);
            -> Mauszeiger an/-ausschalten. Diese Funktionen merken sich
               intern, ob der Mauszeiger bereits an- oder ausgeschaltet
               ist.

        int MouseForm(int index,MFORM *user)
            -> Funktionalitt und Parameter entsprechen der AES-Funktion
               graf_mouse(), nur da diese Funktion an die unterschiedliche
               Verwaltung des Mauszeigers in den diversen MultiTasking-
               Systemen angepat ist.

        void MouseArrow(void);
        void MouseCursor(void);
        void MouseBee(void);
        void MouseHourGlass(void);
        void MousePointHand(void);
        void MouseFlatHand(void);
        void MouseThinCross(void);
        void MouseThickCross(void);
        void MouseOutlineCross(void);
            -> Mausform einstellen

        void NoClick(void)
            -> auf das Loslassen beider Maustaste warten (Event/Timer-
               Handling wird dadurch NICHT blockiert). Ist keine
               Maustaste gedrckt, so kehrt diese Funktion sofort zurck.

        int key(int scan,int ascii) (Makro-Funktion!)
            -> Aus Scan-Code 'scan' und ASCII-Code 'ascii' Tastencode
               (Aufbau wie bei graf_mkstate(); u.a. fr SLKEY/MENUITEM-
               Strukturen) berechnen

        int scan_2_ascii(int scan,int state);
            -> Grobuchstabe eines Tastendrucks aus Scan-Code 'scan' und
               Status der Umschalttasten 'state' ermitteln

        void ClrKeybd(void)
            -> Tastatur-Puffer lschen (wird intern auch bei vollauto-
               matischen Echtzeitschiebern sowie tastaturgesteurten
               Fensterschiebern/pfeilen aufgerufen)

    26. Verschiedene Funktionen
        -----------------------

        int int2str(char *str,int val,int size)
            -> vorzeichenbehafteten Integer-Wert 'val' in String 'str'
               konvertieren
            -> Parameter 'size':
               >0: Lnge des Strings (Zahl wird rechtsbndig eingesetzt)
               0:  Lnge des Strings wird an die Zahl angepat
               <0: negative Lnge des Strings, wobei kein abschlieendes
                   Null-Byte geschrieben wird (dadurch kann man z.B. eine
                   Zahl innerhalb eines existierenden Textes einsetzen)
            -> Rckgabewert: Lnge des Strings

        char *strend(char *str)
            -> Liefert einen Zeiger auf das Null-Byte '\0' hinter dem String
               'str' zurck

        char *strlcpy(char *dest,char *source)
            -> Kopiert den String 'source' in den String 'dest'. Zurck-
               gegeben wird dabei im Gegensatz zu strcpy() nicht ein Zeiger
               auf den Anfang des Ziel-Strings, sondern auf das Null-Byte
               hinter dem kopierten String (strlcpy(dest,source) entspricht
               also strend(strcpy(dest,source)))

        char *strwild(char *string,char *wild)
            -> Testet, ob die Zeichenkette 'string' auf den Unix-Wildcard
               'wild' pat (v.a. fr Datei/Pfadnamen geeignet)
            -> Aufbau des Wildcardstrings:
               '*'         beliebige Zeichenkette (Allquantor)
               '?'         ein beliebiges Zeichen (Existenzquantor)
               '@'         Sonderzeichenquotierung/Interpunktions-Zeichen
               '^'         Ausschlieender Wildcard (nur am Anfang des
                           Wildcards von Bedeutung!)
               '[a-f|h]'   Menge von Zeichen, wobei das Oder-Zeichen '|'
                           auch weggelassen werden kann. Ebenso knnen meh-
                           rere Angaben in einer Menge gemacht werden, also
                           z.B. '[a-eo-sxyz]'. Sonderzeichenquotierung ist
                           innerhalb von Mengen ebenfalls mglich, aber nur
                           fr die Zeichen '-', '|' und '^' von Bedeutung.
               '[^akn]'    Ausschlieende Menge von Zeichen
            -> Rckgabewert:
               Zeiger auf String, sofern dieser auf den Wildcard pat,
               oder ein NULL-Zeiger

        int min(int val1,int val2);
            -> Minimum der Werte 'val1' und 'val2' berechnen und zurck-
               geben

        int max(int val1,int val2);
            -> Maximum der Werte 'val1' und 'val2' berechnen und zurck-
               geben

        void Min(int *var,int val);
            -> Minimum von der Variablen '*var' und dem Wert 'val'
               berechnen und in der Variablen '*var' speichern

        void Max(int *var,int val);
            -> Maximum von der Variablen '*var' und dem Wert 'val'
               berechnen und in der Variablen '*var' speichern

        void mfdb(MFDB *mfdb,int *bitmap,int width,int height,
                  int standard,int planes)
            -> Memory form definition block 'mfdb' initialisieren
            -> bitmap:       Zeiger auf Start der Bitmap
               width,height: Breite/Hhe der Bitmap in Pixeln
               standard:     Standardformat (1) oder gerteabhngiges
                             Format
               planes:       Anzahl der Farbebenen der Bitmap

        long mfdb_size(MFDB *mfdb);
            -> Speicherbedarf der Bitmap des Memory form definition
               block 'mfdb' berechnen

        char LowerChar(char ch)
            -> Zeichen 'ch' in Kleinbuchstaben umwandeln, wobei
               auch Umlaute beachtet werden

        char UpperChar(char ch)
            -> Zeichen 'ch' in Grobuchstaben umwandeln, wobei
               auch Umlaute beachtet werden

        void *GetMsgBuffer(long size)
            -> globalen Speicher (u.a. fr XAcc-2/AV-Kommunikation) der
               Gre 'size' anfordern (kann durch die Funktion Mfree()
               wieder freigegeben werden)
            -> Rckgabewert wie bei Malloc()

        int mm2dpi(int size)
            -> DPI (dots per inch) eines Ausgabegerts berechnen
            -> Parameter 'size': Gre eine Pixels in Micrometer
               (=1/1000 Milimeter, s. work_out[]-Array)

    27. Definitionen hufig bentigter (Protokoll-) Konstanten
        ------------------------------------------------------

        Konstanten der Library:
        -----------------------

        #define MAX_PATH    ??? /* maximale Lnge eines Datei/Pfadnamens */
        #define MAX_EDIT    ??? /* maximale Lnge eines Eingabefelds */
        #define MAX_WINDOWS ??? /* maximale Anzahl gleichzeitig geffneter
                                   Applikations-Fenster */
        #define MAX_DIALS   ??? /* maximale Anzahl gleichzeitig geffneter
                                   Dialoge */

        XAcc-2-Protokoll:
        -----------------
        (genaue Bedeutung s. XAcc-2-Dokumentation)

        #define ACC_ID      0x400
        #define ACC_OPEN    0x401
        #define ACC_CLOSE   0x402
        #define ACC_ACC     0x403
        #define ACC_EXIT    0x404

        #define ACC_ACK     0x500
        #define ACC_TEXT    0x501
        #define ACC_KEY     0x502
        #define ACC_META    0x503
        #define ACC_IMG     0x504

        AV-Protokoll:
        -------------
        (genaue Bedeutung s. AV-Dokumentation 'VA_PROTO.H')

        #define AV_PROTOKOLL        0x4700
        #define AV_GETSTATUS        0x4703
        #define AV_STATUS           0x4704
        #define AV_SENDKEY          0x4710
        #define AV_ASKFILEFONT      0x4712
        #define AV_ASKCONFONT       0x4714
        #define AV_ASKOBJECT        0x4716
        #define AV_OPENCONSOLE      0x4718
        #define AV_OPENWIND         0x4720
        #define AV_STARTPROG        0x4722
        #define AV_ACCWINDOPEN      0x4724
        #define AV_ACCWINDCLOSED    0x4726
        #define AV_COPY_DRAGGED     0x4728
        #define AV_PATH_UPDATE      0x4730
        #define AV_WHAT_IZIT        0x4732
        #define AV_DRAG_ON_WINDOW   0x4734
        #define AV_EXIT             0x4736
        #define AV_STARTED          0x4738
        #define AV_XWIND            0x4740

        #define VA_PROTOSTATUS      0x4701
        #define VA_SETSTATUS        0x4705
        #define VA_START            0x4711
        #define VA_FILEFONT         0x4713
        #define VA_CONFONT          0x4715
        #define VA_OBJECT           0x4717
        #define VA_CONSOLEOPEN      0x4719
        #define VA_WINDOPEN         0x4721
        #define VA_PROGSTART        0x4723
        #define VA_DRAGACCWIND      0x4725
        #define VA_COPY_COMPLETE    0x4729
        #define VA_THAT_IZIT        0x4733
        #define VA_DRAG_COMPLETE    0x4735
        #define VA_FONTCHANGED      0x4739
        #define VA_XOPEN            0x4741

        #define VA_OB_UNKNOWN       0
        #define VA_OB_TRASHCAN      1
        #define VA_OB_SHREDDER      2
        #define VA_OB_CLIPBOARD     3
        #define VA_OB_FILE          4
        #define VA_OB_FOLDER        5
        #define VA_OB_DRIVE         6
        #define VA_OB_WINDOW        7

        MTOS-Drag&Drop-Protokoll:
        -------------------------
        (genaue Bedeutung s. MTOS-Entwickler-Dokumentation)

        #define AP_DRAGDROP     63

        #define DD_OK           0
        #define DD_NAK          1
        #define DD_EXT          2
        #define DD_LEN          3
        #define DD_TRASH        4
        #define DD_PRINTER      5
        #define DD_CLIPBOARD    6

        #define DD_TIMEOUT      3000

        #define DD_NUMEXTS      8
        #define DD_EXTSIZE      32L
        #define DD_NAMEMAX      128

        #define DD_HDRMAX       (8+DD_NAMEMAX)

        Men-Protokoll:
        ---------------

        #define WM_CLOSED       0x0016  ^U
        #define WM_FULLED       0x0017  ^#* ('*' auf Ziffernblock)
        #define WM_SAVE         0x1000  ^S
        #define WM_SAVEAS       0x1001  ^M
        #define WM_PRINT        0x1002  ^P
        #define WM_UNDO         0x1003  Undo
        #define WM_CUT          0x1004  ^X
        #define WM_COPY         0x1005  ^C
        #define WM_PASTE        0x1006  ^V
        #define WM_SELECTALL    0x1007  ^A
        #define WM_FIND         0x1008  ^F
        #define WM_REPLACE      0x1009  ^R
        #define WM_FINDNEXT     0x100a  ^G
        #define WM_HELP         0x100b  Help
        #define WM_DELETE       0x100c  Delete

        View-Protokoll:
        ---------------
        (genaue Bedeutung s. View-Dokumentation V1.04)

        #define VIEW_FILE       0x5600
        #define VIEW_FAILED     0x5601
        #define VIEW_OPEN       0x5602
        #define VIEW_CLOSED     0x5603
        #define VIEW_DATA       0x5604
        #define VIEW_GETMFDB    0x5610

        #define VIEWERR_ERROR   0
        #define VIEWERR_SIZE    1
        #define VIEWERR_COLOR   2
        #define VIEWERR_WID     3
        #define VIEWERR_MEM     4

        Paula-Protokoll:
        ----------------
        (genaue Beschreibung s. Dokumentation des MOD-Fileplayers Paula
         ab Version 2.4)

        #define MP_ACK          0x4800
        #define MP_NAK          0x4801
        #define MP_START        0x4802
        #define MP_STOP         0x4803
        #define MP_SHUTDOWN     0x4804

        Clipboard-Protokoll:
        --------------------
        (s.a. Beschreibung der Funktion scrp_changed())

        Aufbau der Nachricht:
            msg[0]        = SC_CHANGED (80)
            msg[1]        = apID
            msg[2]        = 0
            msg[3]        = Bitmap des Dateiformats
                            (Parameter 'format' von scrp_changed())
            msg[4],msg[5] = 4 Zeichen fr die "beste" der abgespeicherten
                            Dateien (z.B. ".RTF"), damit beim Lesen mg-
                            lichst wenig Information verloren geht
                            (Parameter 'best_ext' von scrp_changed())
            msg[6],msg[7] = reserviert (auf Null setzen!)


        Font-Protokoll:
        ---------------

        Eine minimale Untersttzung des Font-Protokolls besteht in der Aus-
        wertung der FONT_CHANGED-Nachricht. Untersttzt eine Applikation das
        XAcc-2-Protokoll, so kann sie auch leicht die weiteren Nachrichten
        untersttzen.

        FONT_CHANGED-Nachricht:
          -> Nachricht des Fontselectors an eine Applikation, da der
             Zeichensatz bzw. die Zeichenattribute in einem oder mehreren
             Fenstern gewechselt werden sollen. Besitzt die Zielapplikation
             im erweiterten XAcc-Namen die Kennung 'XFontAck', so mu diese
             Nachricht mit der Nachricht FONT_ACK beantwortet werden.
          -> negative Werte in msg[4-7] stehen fr keine Vernderung

            msg[0]        = FONT_CHANGED (0x7a18)
            msg[1]        = apID
            msg[2]        = 0
            msg[3]        = Fenster-Handle oder negativer Wert, falls
                            Font in allen Fenstern gewechselt werden soll
            msg[4]        = Font-ID
            msg[5]        = Font-Gre in Punkt
            msg[6]        = Font-Farbe
            msg[7]        = Effekte:
                             Bit 0: Fett
                             Bit 1: Hell
                             Bit 2: Kursiv
                             Bit 3: Unterstrichen
                             Bit 4: Umrandet
                             Bit 5: Schattiert
                             Bit 6: Invers
                             (restliche Bits sind reserviert)

        FONT_SELECT-Nachricht:
          -> mit dieser Nachricht kann ein evtl. im Speicher vorhandener
             Fontselector, der im erweiterten XAcc-Namen die Kennung
             'XFontSelect' besitzt, aufgerufen werden. Zur passiven Unter-
             sttzung des Font-Protokolls gengt aber die Auswertung der
             o.g. Nachricht FONT_CHANGED.
          -> negative Werte in msg[4-7] bedeuten, da dieser Parameter
             nicht bentigt wird, nicht eingestellt werden soll oder noch
             nicht gesetzt wurde

            msg[0]        = FONT_SELECT (0x7a19)
            msg[1]        = apID
            msg[2]        = 0
            msg[3]        = Handle des Fensters, dessen Zeichensatz einge-
                            stellt werden soll, oder ein negativer Wert,
                            wenn der Zeichensatz in allen Fenstern der
                            Applikation gewechselt werden soll
            msg[4]        = Font-ID
            msg[5]        = Font-Gre in Punkt
            msg[6]        = Effekte (s.o.)
            msg[7]        = Farbe

        FONT_ACK-Nachricht:
          -> Fontselector darber informieren, ob die FONT_CHANGED-Nachricht
             ausgewertet bzw. die Zeichensatz-Attribute eingestellt werden
             konnten

           msg[0]         = FONT_ACK (0x7a1a)
           msg[1]         = apID
           msg[2]         = 0
           msg[3]         = TRUE (1):  Nachricht wurde ausgewertet
                            FALSE (0): Nachricht wurde ignoriert
           msg[4-7]       = 0 (reserviert)

        Scan-Codes:
        -----------

        #define SCANESC     1       /* Esc */
        #define SCANTAB     15      /* Tab */
        #define SCANRET     28      /* Return */
        #define SCANDEL     83      /* Delete */
        #define SCANBS      14      /* Backspace */
        #define SCANENTER   114     /* Enter */

        #define SCANHELP    98      /* Help */
        #define SCANUNDO    97      /* Undo */
        #define SCANINS     82      /* Insert */
        #define SCANHOME    71      /* Clr/Home */

        #define SCANUP      72      /* Up */
        #define SCANDOWN    80      /* Down */

        #define SCANLEFT    75      /* Left */
        #define SCANRIGHT   77      /* Right */

        #define CTRLLEFT    115     /* Ctrl-Left */
        #define CTRLRIGHT   116     /* Ctrl-Right */

        #define SCANF1      59      /* F1 - F10 */
        ...
        #define SCANF10     68

        #define CTRLF1      84      /* CTRL-F1 - CTRL-F10 */
        ...
        #define CTRLF10     93

        EGEM-Stringkonstanten:
        ----------------------

        E_GEM:         Name der Library ("EnhancedGEM")
        E_GEM_DATE:    Erstellungsdatum der Library, Format wie
                       bei __DATE__
        E_GEM_VERSION: Versionsnummer der Library ("x.xx")
