Whats new in Magic?
-------------------

--------------------------------------------------------------------
Version vom 02.01.95       RELEASE  10
--------------------------------------------------------------------
- MagicNeeded = $410

- Bugfixes:
  - Durch einen Fehler in der C-Lib wurde Magic von C-Programmen nicht
    richtig deinitialisiert.  Workaround fr C-Programme mit Libs
    kleiner < $410 eingebaut. Libs der Release 10 sollten richtig
    funktionieren.
  - Abbruch-Button im Fontselector funktioniert jetzt wieder.

--------------------------------------------------------------------
Version vom 18.12.94       RELEASE  9
--------------------------------------------------------------------
- MagicNeeded = $409

- M_Dials:

  FUNCTION FindExact (tree: POINTER; item, start: INTEGER; entry: STRING): INTEGER;
  VAR s: CSTRING;
  BEGIN
   StrPCopy (s, entry);
   App^.MagicPB^.AddrIn[0]:= tree;
   App^.MagicPB^.AddrIn[1]:= ADDR (s);
   App^.MagicPB^.IntIn[0]:= item;
   App^.MagicPB^.IntIn[1]:= start;
   CallMagic (1150);
   FindExact:= App^.MagicPB^.IntOut[0];
  END (*FindExaxt*);
  
  Such in List- und Dropboxen nach dem _exakten_ Vorkommen eines
  Eintrags. Im Prinzip wie FindEntry, nur das FindEntry grundstzlich
  mit den Wildcards * und ? arbeitet, und somit diese Zeichen nicht
  in Listboxen gefunden werden.
  
- Bugfixes:

  - Bug bei der Terminierung von Magic unter Mag!C behoben.
  - Bug in StrComp behoben, Lngenberechnung der Strings war falsch.
    Dadurch funktioniert auch der Fontselector wieder korrekt!
  - Disabled-Status an Iconbuttons und Coloricons funktioniert jetzt

--------------------------------------------------------------------
Version vom 04.12.94       RELEASE  8
--------------------------------------------------------------------
- MagicNeeded = $408  (in M_Sys, bitte nicht vergessen!)

- M_Fontselector:

  PROCEDURE RedrawSelector;
  BEGIN
   CallMagic (1503);
  END (*RedrawSelector*);
  
  Erzwingt einen Redraw des Selectors. zB. ntzlich wenn man eine 
  andere Grsse des Fonts eingestellt hat, als der Selector anzeigt.
  Die Daten werden dabei nmlich aktualisiert. 8-)

  
  PROCEDURE SelectorInfo (VAR win, xpos, ypos, font: INTEGER);
  BEGIN
   CallMagic (1505);
   win:=  App^.MagicPB^.IntOut[0];
   xpos:= App^.MagicPB^.IntOut[1];
   ypos:= App^.MagicPB^.IntOut[2];
   font:= App^.MagicPB^.IntOut[3];
  END (*SelectorInfo*);
  
  Liefert Fensterhandle (so vorhanden), sowie Position des Fensters
  (Arbeitsbereich) und die ID des Fonts, der im Selektor gerade 
  _angezeigt_ wird.

- M_Dials

  PROCEDURE SelectMatchPtr (tree: POINTER; item, start: INTEGER; data: POINTER;
                            state: Wordbits; sel, first: BOOLEAN);
  BEGIN
   App^.MagicPB^.AddrIn[0]:= tree;
   App^.MagicPB^.AddrIn[1]:= data;
   App^.MagicPB^.IntIn[0]:= item;
   App^.MagicPB^.IntIn[1]:= start;
   App^.MagicPB^.IntIn[2]:= ORD (sel);
   App^.MagicPB^.IntIn[3]:= ORD (first);
   App^.MagicPB^.IntIn[4]:= ORD (state);
   CallMagic (1148);
  END (*SelectMatching*);

  Selektiert alle Eintrge einer Listbox, deren 'data'-Feld (siehe AddEntry) auf 
  das hier bergebene 'data' passen.  Sonst wie SelectMatching.

- M_Sys

  PROCEDURE MagicVerString (VAR version: ARRAY OF CHAR);
  BEGIN
   App^.MagicPB^.AddrIn[0]:= ADDR (version);
   CallMagic (5);
  END (*MagicVersion*);

  Liefert den Versionstring aus der Abspannbox von Magic, also
  zb. "R8 04.12.94" als Null-terminierte Zeichenkette.

  
- Bugfixes:

  - Beim Einlesen eines Profiles wurde die interne Versionnummer der
    Lib berschrieben. Das fhrte zu Problemen bei den Fontroutinen,
    da die anhand der Libversionsnummer entscheiden, welche Daten an
    die Applikation bertragen werden knnen.
  
  - Gerds "Geisterevents" sollten jetzt gefixed sein. Ich hab heute
    den ganzen Sonntag mit Debuggen zugebracht, nur um herauszufinden,
    das ein mit graf_mkstate abgefragter Buttonstatus nicht unbedingt
    dem entsprechen muss, was evnt_multi glaubt melden zu mssen. 8-(
    M_Utils.Bounce arbeitet jetzt also nicht mehr mit graf_mkstate,
    sondern mit evnt_button.


--------------------------------------------------------------------
Version vom 20.11.94       RELEASE  7
--------------------------------------------------------------------
- MagicNeeded = $407

- Ab Library-Version $407 wird ein erweiterter WindowParameterblock
  bergeben (natrlich nur an Libs mit dieser Versionsnummer):

  TYPE  PtrWinPara =     ^WinParameter;
      WinParameter =   RECORD
                        window:   INTEGER;
                        mx, my:   INTEGER;
                        message:  INTEGER;
                        spec:     tRect;
                        extended: tExData;
                        action:   LONGBITSET;
                        appl:     PtrApp;
                        (* Ab Lib-Version $407 *)
                        tree:     POINTER;
                       END;

  In 'tree' wird bei einer WinClicked bzw. WinObject-Nachricht die
  Adresse des gefundenen Objektbaums bergeben.
  
- Implementation von Window-Toolboxen. Anstelle der Adresse einer 
  Resource kann bei M_Windows.OpenWindow jetzt ein Zeiger auf folgende 
  Struktur bergeben werden. Magic wertet dies nur aus, wenn das Flag 
  WinMultiRsc bergeben worden ist, fr die bisherigen Aufrufe ist das
  Verhalten vollkommen transparent!
  
        WinMultiRsc =   Bit15; (* der OpenWindow bergebene Zeiger ist ein
                                * Zeiger auf die Struktur WinTreelist.
                                *)
  
  CONST MaxResource =   15;    (* Maximal 16 Resourcen pro Fenster *)

  CONST tbUp =    0;
        tbDown =  1;
        tbLeft =  2;
        tbRight = 3;

  TYPE  WinResource =   RECORD
                         tree: tObjctree; (* Adresse des Objektbaums *)
                         xpos: INTEGER;   (* relative X-Position im Fenster *)
                         ypos: INTEGER;   (* relative Y-Position im Fenster *)
                         mode: INTEGER;   (* Positionsmodus der Toolbox *)
                         res1: INTEGER;   (* reserviert *)
                         res2: POINTER;   (* reserviert *)
                        END;

        WinTreelist =   ARRAY [0..MaxResource] OF WinResource;

  Soll eine Fenstermenzeile eingebunden werden, muss diese immer als
  erstes in der WinTreelist stehen!!!  Fr die weiteren Resourcen
  wird der Offset automatisch um die Hhe der Menzeile korrigiert.

  xpos, xpos = Offset zum 0-Punkt des Fensters. 
  mode =       Position der Toolbox, oben (tbUp), unten (tbDown), 
               links (tbLeft) oder Rechts (tbRight). Die Breite
               bzw. Hhe der Toolbox wird automatisch an die
               Fenstergrsse angepasst.
  res1, res2 = Reserviert, nicht verwenden!!!
  
  Die Offsets fr CalcUsableRect werden bei gesetztem WinMultiRsc-
  Flag automatisch berechnet. Eine bergabe bei OpenWindow (xo..ho)
  ist deshalb nicht notwendig. Werden dort Werte bergeben, werden 
  sie zustzlich addiert!!!
  
  Siehe hierzu auch das Demo und die Funktion OpenWin!
  
  Wurde die als Toolbox bergebene Resource vor mit M_Dials.NewDial
  initialisiert, werden alle Ereignisse an den dafr zustndigen
  Dialoghandler weitergeleitet!
  

- Bugfixes:

  - Die Selektion einer Zeichengrsse im FontSelector funktioniert
    jetzt wieder, auch wenn der Zeichensatz nicht der aktuelle ist.
  
  - 'Zurckschnappende' Slider sollten nicht mehr vorkommen.

  - Merkwrdiges Verhalten bei Dropboxen mit Eintragszahl > 10 und 
    < 20 gefixed.

--------------------------------------------------------------------
Version vom 11.11.94
--------------------------------------------------------------------
- Implementation von IconButtons.

  Iconbuttons bestehen aus einem normalen Icon oder Coloricon und
  erhalten den erweiterten Objekttyp 117.  Sie knnen mit allen 
  Flags ausgestattet werden wie Buttons, also mit 3D-Effekten, 
  Schatten etc.  Einziger Unterschied zum normalen Button ist, dass
  anstelle des Textes ein Icon gezeichnet wird. 
  
  Vom Programm aus muss also nur ein Icon mit der ExObjekt-Nummer
  117 versehen werden. Mehr ist nicht zu tun.

--------------------------------------------------------------------
Version vom 05.11.94
--------------------------------------------------------------------
- Bugfix

  - Rekursionsprobleme bei Events behoben
  - Rekursionsproblem bei Dialoghandlern behoben

--------------------------------------------------------------------
Version vom 31.10.94
--------------------------------------------------------------------
- MagicNeeded = $406

- M_Fonts

  TYPE tFontinfo = RECORD
                    name:   CSTRING;     (* Name des Fonts *)
                    id:     INTEGER;     (* Font-ID *)
                    color:  INTEGER;     (* Farbindex *)
                    rot:    INTEGER;     (* Rotationsrichtung *)
                    halign: INTEGER;     (* Horizontale Ausrichtung *)
                    valign: INTEGER;     (* Vertikale Ausrichtung *)
                    chw:    INTEGER;     (* Zeichenbreite *)
                    chh:    INTEGER;     (* Zeichenhhe *)
                    boxw:   INTEGER;     (* Zellenbreite *)
                    boxh:   INTEGER;     (* Zellenhhe *)
                    effect: BITSET;      (* Texteffekte *)
                    min:    INTEGER;     (* Minimale Gre des Fonts *)
                    max:    INTEGER;     (* Maximale Gre des Fonts *)
                    point:  INTEGER;     (* aktuelle Gre des Fonts *)
                    width:  INTEGER;     (* Breite bei FSM-Fonts *)
                    skew:   INTEGER;     (* Neigung bei FSM-Fonts *)
                    mono:   INTEGER;     (* TRUE, wenn Monospaced *)
                    fsm:    INTEGER;     (* TRUE, wenn FSM-Font *)
                    (* Ab Library-Version Nummer $406 *)
                    typ:    INTEGER;     (* Typnummer bei Libs >= $406 *)
                   END;

- M_Fontselector

  PROCEDURE RedrawSelector;
  BEGIN
   CallMagic (1503);
  END (*RedrawSelector*);

  Veranlasst das Neuzeichnen des Fontselectors. Ntzlich, wenn man 
  zum Beispiel eine andere Fontgrsse eingestellt hat, als vom 
  Selector bermittelt.

- Neue Rckgabeflags im Action-Bitfeld des Dialoghandlers:

  - aDelEdit = lBit23;

    MAGIC liefert einen Zeiger auf einen Puffer von 513 Words im 
    Parameter 'list' des DialParameterBlocks.  Beginnend mit list[0]
    kann hier eine Liste von Tedinfo-Objekten bergeben werden, deren 
    Inhalte autmatisch von MAGIC gelscht werden. Abgeschlossen wird 
    die Liste mit einem -1.
                
    Beispiel:
      
    list[0]:= EinTedObjekt;
    list[1]:= EinAnderesTedObjekt;
    list[2]:= -1;

  - aChangeEdit = lBit24;
  
    Das im Eintrag 'start' des Dialparameterblock gesetzte Element 
    wird als aktuelle Editfeld bernommen.
    
- Bugfix

  - Bug in der Auswertung der Tasten des Nummernblocks besonders
    bei ENTER behoben. (Grmblfx...)

--------------------------------------------------------------------
Version vom 27.10.94
--------------------------------------------------------------------
- Neue Flags bei Opendial:

  - dWintop = lBit16; 
  
    Der Dialog wird bei M_Windows.WinTop als Fenster gemeldet, nicht 
    als Dialog!  Dadurch erreichen auch Nachrichten wie WinChangeFont 
    oder hnliches den Dialog!

  - dForceWindow = lBit17;
  
    Dialog MUSS ein Fenster sein, sonst hats keinen Sinn. Nach Opendial
    steht entweder die Fensterkennung, oder -1 in Intin[0] des Magic-
    Parameterblocks

  - dWinKeys = lBit18;
  
    Cursortasten werden auf die Fenster-Sliderelemente des Dialog-
    fensters abgebildet. Natrlich nur sinnvoll, wenn man beim ffnen 
    des Dialogs auch Sliderelemente angefordert hat!

- Bugfixes:

  - Bug in der Auswertung der Tasten des Nummernblocks behoben.

--------------------------------------------------------------------
Version vom 19.10.94
--------------------------------------------------------------------

- Beim ffnen eines Dialoges wird die Nachricht 'DialOpen' (1067, 
  bitte in M_Messages deklarieren) an den zustndigen Handler ver-
  schickt. Bei Fensterdialogen *nach* dem ersten Redraw, bei normalen
  Dialogen sobald der Dialog gezeichnet wurde.

- Nachdem die Rechteckliste abgeklappert wurde, wird an den zustndigen
  Fensterhandler (bei Dialogen der Dialoghandler!) die Nachricht 
  'WinRedrawed' (1034) verschickt.  Da bei Fensterdialogen die Ausgabe 
  ebenfalls ber die Rechteckliste gemacht wird, bekommt man die 
  Nachricht praktisch nach jedem DialDraw-Aufruf.

--------------------------------------------------------------------
Version vom 16.10.94
--------------------------------------------------------------------

WICHTIG: Bitte ab sofort nur noch das Cookieprogramm 4.00/05 ver-
         wenden, da die Datenstruktur, auf die der Cookie zeigt 
         gendert wurde.  Der Cookie hat jetzt ein Eintragsfeld
         mehr:
         
         TYPE  PtrConfig =  ^TheConfig;
               TheConfig =  RECORD
                             version:    INTEGER;     (* Versionsnummer                *)
                             deadkeys:   BITSET;      (* Daten ber die DeadKeys       *)
                             flags:      LONGBITSET;  (* Flags siehe unten             *)
                             dispatcher: tDispatcher; (* Einsprung in MAGIC.PRG        *)
                             path:       PCHAR;       (* Pfad fr Magic.PRG            *)
                             colortable: tColortable; (* Zeiger auf Button-Farbtabelle *)
                             fkeytable:  tFkeytable;  (* Zeiger auf die Standardtasten *)
                             valuetable: tValuetable; (* Zeiger auf Werte-Tabelle      *)
                             actapp:     POINTER;     (* Zeiger auf den App-Block      *)
                             help:       PCHAR;       (* Default-Helpprogramm          *)
                            END;

         In 'help' wird der Name des zu verwendenden Help-Acc eingetragen, 
         so wie er von appl_find erwartet wird (also ohne Extension!).
         Defaultmssig wird hier 'ST-GUIDE' eingetragen.

- Neuer Extended-Objekt-Typ:  HelpObjc (118)

  Ein HelpObjc kann auf Objekte vom Typ GBUTTON und GSTRING ange-
  wandt werden. Dabei arbeiten Objekte beiden Typs quasi zusammen.
  
  Der GSTRING enthlt eine Anweisung, wie sie fr das Helpprogramm 
  ST-GUIDE vorgesehen ist. 

  Zb: "*:\MAGIC.HYP OpenDial"

  Das Objekt ist im Dialog nicht sichtbar, und sollte nur einmal im 
  Dialog vorkommen. Mehrfachnennungen werden ignoriert.

  Beim GBUTTON wird das Flag HelpButton (Bit 13) in den ob_flags
  gesetzt. Drckt man nun die Taste HELP (bzw. die durch die Konfi-
  guration vorgesehene Taste) wird der Button ausgelst. Dabei 
  ermittelt Magic das GSTRING-Objekt, welches die Hilfe-Anweisung
  enthlt und versucht das Default-Helpprogramm (zB. den ST-GUIDE) 
  via das VA-Protokoll zu aktivieren, und mit dem im Objekt 
  definierten Parametern aufzurufen.
  
  ACHTUNG! Das ganze arbeitet nur in Fensterdialogen, da bei Flydials
  das ACC nicht aktiviert werden kann!

  Dazu gibts auch eine neue Funktion in M_Appl:

  FUNCTION GetHelp (CONST cmd: ARRAY OF CHAR): INTEGER;
  BEGIN
   App^.MagicPB^.AddrIn[0]:= ADDR (txt);
   CallMagic (645);
   GetHelp:= App^.MagicPB^.IntOut[0];
  END (*GetHelp*);

  Ruft ein Help-Acc via VA-Protokoll, und bergibt das Kommando 
  'cmd'. Liefert 0, wenn Magic den Aufruf absetzen konnte, bzw. -1
  wenn das Help-Acc nicht gefunden werden konnte.

  Paralell dazu gibts in den Configfiles fr MAGICOOK bzw. Magic die
  Variable HELPACC, in der der Name des zu verwendenden ACCs vermerkt 
  ist. Ist die Variable nicht definiert, wird 'ST-GUIDE' als Default
  angenommen.
  
- Ab dieser Version wurde eine Versionsnummernkennung fr die Libs
  eingefhrt.  Im Valuetable der Application-Struktur ist im Eintrag
  0 die Konstante MagicNeeded als Kennung einzutragen:
  
  xapp^.ValTable.values[0]:= MagicNeeded; (* Versionsnummer fr die Lib! *)

- MagicNeeded sollte jetzt den Wert $0405 haben.

- An Applikationen, die Libs mit Versionsnummer $0405 oder grsser haben,
  wird eine erweiterte DailParameter-Struktur bergeben:
  
  TYPE PtrDialpara =      ^DialParameter;
     DialParameter =    RECORD
                         message: INTEGER;     (* Was ist passiert?    *)
                         tree:    tObjctree;   (* Objektbaum           *)
                         objc:    INTEGER;     (* Welches Objekt?      *)
                         mx, my:  INTEGER;     (* Mausposition         *)
                         key:     tKey;        (* Tastencode           *)
                         asc:     CHAR;        (* Ascii-Code           *)
                         mstate:  BITSET;      (* Maustastenstatus     *)
                         kstate:  BITSET;      (* Sondertastenstatus   *)
                         spec:    tRect;       (* Special-Parameter    *)
                         start:   INTEGER;     (* Edit-Element         *)
                         pos:     INTEGER;     (* Edit-Position        *)
                         action:  LONGBITSET;  (* Was ist noch zu tun? *)
                         list:    ^tCtrlArray; (* Zeiger auf Integer-Array *)
                         res:     POINTER;
                         (* Folgende Werte werden ab Magic Revison 5 eingetragen *)
                         window:  INTEGER;  (* Fensterkennung des Dialogs *)
                         open:    INTEGER;  (* > 0 Dialog ist geffnet *)  
                         mode:    Dialmode; (* Modus, in dem er geffnet wurde *)
                        END;

  'window'  enthlt die Fensterkennung oder -1 bei Flydials
  'open'    > 0 wenn der Dialog geffnet ist (was er eigentlich immer sollte...)
  'mode'    Modus, in dem der Dialog geffnet wirde

- neue Funktion in M_Strings

PROCEDURE StrICopy (VAR dest: ARRAY OF CHAR; CONST source: ARRAY OF CHAR;
                    start, len: INTEGER);
(* Kopiert aus 'source' 'len' Zeichen ab der Position 'start' nach 'dest' *)
BEGIN
 App^.MagicPB^.AddrIn[0]:= ADDR(dest);
 App^.MagicPB^.AddrIn[1]:= ADDR(source);
 App^.MagicPB^.Intin[0]:= start;
 App^.MagicPB^.Intin[1]:= len;
 CallMagic (318);
END (*StrICopy*);


- Bugfixes:

  - Listbox-Selektion via Maus nochmal berarbeitet. Ich kann jetzt
    Doppelselektion nicht mehr nachvollziehen.
  - Shift-Erkennung in Menzeilen funktioniert wieder.
  - Tastendrcke werden jetzt in folgender Reihenfolge vom Kernel
    bearbeitet: Dialoge -> Mens -> Fenster -> installierte Handler

--------------------------------------------------------------------
Version vom 09.10.94
--------------------------------------------------------------------
- nderung bei den Redraw-Messages: Im Feld 'extended' des Window-
  Parameterblocks steht im Eintrag 0 eine 1, wenn bei einer 
  WinRedraw-Message das _erste_ Rechteck bergeben worden ist, 
  ansonsten eine 0.


- M_Fontselector

CONST fsFlydial =      Bit0;   (* Normaler Dialog                 *)
      fsModal =        Bit1;   (* Selektor in Fenster             *)
      fsNonmodal =     Bit2;   (* Selektor ist nicht-modal        *)
      fsMonospaced =   Bit3;   (* Nur monospaced Fonts            *)
      fsEffect =       Bit4;   (* Texteffekte auswhlen           *)
      fsColor =        Bit5;   (* Farbe auswhlen                 *)
      fsRotation =     Bit6;   (* Rotation einstellen             *)
      fsWidth =        Bit7;   (* Breite bei FSM-Fonts einstellen *)
      fsSpeedoOnly =   Bit8;   (* Nur Speedofonts anzeigen        *)
      fsBitmapOnly =   Bit9;   (* Nur Speedofonts anzeigen        *)
      fsTruetypeOnly = Bit10;  (* Nur Truetypefonts anzeigen      *)
      fsType1Only =    Bit11;  (* Nur Type1-Fonts zulassen        *)
      fsFixType =      Bit12;  (* Typselektion nicht zulassen     *)
      fsOwntext =      Bit13;  (* Eigenen Text in die Auswahlbox  *)

PROCEDURE SampleSentence (CONST txt: STRING);
(* Bestimmt den Satz, der im Fontdisplay des Selectors angezeigt wird.
 * Achtung! Nur, wenn das Flag 'fsOwntext' beim ffnen des Selektors
 * gesetzt worden ist!
 *)
VAR x: CSTRING;
BEGIN
 StrPCopy (x, txt);
 App^.MagicPB^.AddrIn[0]:= ADDR (x);
 CallMagic (1502);
END (*SampleSentence*);


--------------------------------------------------------------------
Version vom 04.09.94
--------------------------------------------------------------------

- M_Profil

FUNCTION GetSV (token: ARRAY OF CHAR; num: INTEGER; VAR val: ARRAY OF LONGINT): BOOLEAN;
(* Liest num Werte aus dem Profil, und legt diese im Array val ab. 
 * Achtung! Es wird nicht geprft, ob num die passende Anzahl Eintrge
 * enthlt!
 *)
BEGIN
 App^.MagicPB^.IntIn[0]:= num;
 App^.MagicPB^.AddrIn[0]:= ADDR (token);
 App^.MagicPB^.AddrIn[1]:= ADDR (val);
 CallMagic (1205);
 GetSV:= BOOLEAN (App^.MagicPB^.IntOut[0]);
END (*GetSV*);

--------------------------------------------------------------------
Version vom 30.08.94
--------------------------------------------------------------------

- Bug bei den Listboxen behoben, wenn diese weniger Eintrge haben,
  als in der Listbox darzustellen sind.

- Coloricons implementiert.  Bitte nochmals auf Grafikkarten testen!
  Bei den Alerts und bei den Icons fr iconified Windows knnen jetzt
  ebenfalls Coloricons eingesetzt werden.

- MAGIC.PRG und MAGICOOK.PRG verwenden nun ein neues, tokenorientiertes
  Format fr die Konfigurationsdateien.  Also unbedingt neues Cookie-
  programm verwenden! (Version 4.00/3)  Das Konfig-Programm MAGICONF
  wird schnellstmglichst so angepasst, damit es das neue Format 
  erzeugen kann.

- neue Features fr den Anwender

  - Der Anwender kann durch Drcken einer der Shifttasten beim Anklicken 
    eines Dropbox-Circles 'rckwrts' blttern.
  
  - Tastatursteuerung der Drop- und Listboxen verbessert.

  - Der Fontselector kann jetzt auch mit UNDO verlassen werden.


- Neue Funktionen:

  - Modul M_Area
  
    PROCEDURE SetMFDB (VAR m: MFDB; adr: POINTER; w, h, fm, planes: INTEGER);
    (* Belegt eine MFDB-Struktur mit den bergebenen Werten:
     * m =      Der MFDB persnlich
     * adr =    Adresse des Grafikspeichers
     * w =      Breite des Bereichs in Pixel
     * h =      Hhe des Bereichs in Pixel
     * fm =     0 = Hardwareformat, 1 = Standardformat
     * planes = Anzahl der Bitplanes des Grafikbereichs
     *)
    BEGIN
     App^.MagicPB^.AddrIn[0]:= ADDR (m);
     App^.MagicPB^.AddrIn[1]:= adr;
     App^.MagicPB^.IntIn[0]:= w;
     App^.MagicPB^.IntIn[1]:= h;
     App^.MagicPB^.IntIn[2]:= fm;
     App^.MagicPB^.IntIn[3]:= planes;
     CallMagic (708);
    END (*SetMFDB*);

  - Modul M_Dials
  
    PROCEDURE DropEntry (tree: POINTER; item: INTEGER; dir: INTEGER);
    (* Wie DropNext, jedoch kann bestimmt werden, ob der nchste oder
     * der vorhergehende Eintrag in die Dropbox gesetzt wird. Ist 'dir'
     * grsser als 0 wird der nchste, ansonsten der vorhergehende Eintrag
     * gesetzt. Wird das Listenende erreicht, wird auf den ersten Eintrag
     * gewechselt und vice versa.
     *)
    BEGIN
     App^.MagicPB^.AddrIn[0]:= tree;
     App^.MagicPB^.IntIn[0]:= item;
     App^.MagicPB^.IntIn[1]:= dir;
     CallMagic (1147);
    END (*DropEntry*);

  - Neues Modul M_Profile: Liest Profildatei, und wertet diese aus.
    Ist eigentlich ein Abfallprodukt aus den neuen Konfig-Files...

UNIT M_Profile;

INTERFACE

FUNCTION  ReadProfile (CONST name: ARRAY OF CHAR): BOOLEAN;
(* Liest eine Profildatei ein. 'name' ist der vollstndige Pfad zur Datei.
 * Liefert TRUE, wenns geklappt hat.
 *
 * Eine Profildatei enthlt zB. Konfigurationsdaten oder Einstellungen
 * fr eine Applikation.  Um die folgenden Funktionen 'wirksam' zu 
 * machen, sollte eine gewisse Syntax innerhalb der Profildatei 
 * eingehalten werden.
 *
 * M_Profile geht von folgenden Voraussetzungen aus:
 *
 * 1. Alles was nach einem Semikolon steht wird bis zum Zeilenende
 *    ignoriert.
 *
 * 2. Alles was nach einem # steht, wird ignoriert, bis zum Zeilenende,
 *    oder bis zum nchsten #.  Beispiel:
 *
 *    MeinWert # Ein ziemlich doofer Name, nicht wahr? # = 33
 *
 * 3. Eine Angabe wird durch ein Schlsselwort eingeleitet, danach
 *    folgt das Zuweisungszeichen '=' und anschliessend der Wert.
 *    Beispiel:
 *
 *    MeinWert = 45
 *
 *    Es knnen auch mehrere Werte in eine Zeile angegeben werden, 
 *    die einzelnen Werte mssen jedoch durch mindestens ein Space-Zeichen
 *    voneinander getrennt sein.
 *
 * 4. Als Werte sind Strings, Booleans und einfache Zahlen vorgesehen.
 *
 *    - Strings sind in Anfhrungszeichen " einzuschliessen und enthalten
 *      Texte wie zB. Pfadnamen oder dergleichen. Beispiel:
 *
 *      MeinPfad = "C:\GEM\ODER\WAS\ANDRES\"
 *
 *    - Booleans enthalten den Wert TRUE fr wahr oder FALSE fr falsch.
 *      Es wird der Text ohne Anfhrungsstriche erwartet. Beispiel:
 *
 *      IstEsSo = FALSE
 *
 *    - Zahlen knnen im Bereich von -2147483647 bis +2147483647 sein.
 *      Die Angabe der Zahl wird im Dezimalsystem erwartet.
 *
 * Als Beispiel knnen Sie auch die Datei MAGICOOK.INF betrachten, die
 * vom Cookieprogramm oder dem Magic-Kernel eingelesen wird.
 *)

FUNCTION GetValue (token: ARRAY OF CHAR; VAR val: LONGINT): BOOLEAN;
(* Liest einen Wert aus der Profildatei aus. Liefert TRUE, wenn der 
 * Wert gefunden wurde.
 *
 * token = Schlsselwort, nachdem gesucht werden soll,
 * val =   der gefundene Wert, andernfalls UNDEFINIERT!
 *)

FUNCTION GetBoolean (token: ARRAY OF CHAR; VAR val: BOOLEAN): BOOLEAN;
(* Liest einen Boolean aus der Profildatei. Liefert TRUE, wenn der 
 * Boolean gefunden wurde.
 *
 * token = Schlsselwort, nachdem gesucht werden soll,
 * val =   der gefundene Wert, andernfalls UNDEFINIERT!
 *)

FUNCTION GetString (token: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN;
(* Liest einen String aus der Profildatei. Liefert TRUE, wenn der 
 * Boolean gefunden wurde.
 *
 * token = Schlsselwort, nachdem gesucht werden soll,
 * val =   der gefundene Wert, andernfalls Nullstring. Die "-Zeichen
 *         wurden bereits entfernt!
 *)

PROCEDURE FreeProfile;
(* Gibt die benutzen Datenstrukturen und -bereiche wieder frei. *)

IMPLEMENTATION

USES m_Sys;

FUNCTION ReadProfile (CONST name: ARRAY OF CHAR): BOOLEAN;
BEGIN
 App^.MagicPB^.AddrIn[0]:= ADDR (name);
 CallMagic (1200);
 ReadProfile:= BOOLEAN (App^.MagicPB^.IntOut[0]);
END (*ReadInfo*);

PROCEDURE FreeProfile;
BEGIN
 CallMagic (1204);
END (*FreeProfile*);

FUNCTION GetValue (token: ARRAY OF CHAR; VAR val: LONGINT): BOOLEAN;
BEGIN
 App^.MagicPB^.AddrIn[0]:= ADDR (token);
 CallMagic (1201);
 val:= App^.MagicPB^.LongOut[0];
 GetValue:= BOOLEAN (App^.MagicPB^.IntOut[0]);
END (*GetValue*);

FUNCTION GetBoolean (token: ARRAY OF CHAR; VAR val: BOOLEAN): BOOLEAN;
BEGIN
 App^.MagicPB^.AddrIn[0]:= ADDR (token);
 CallMagic (1202);
 val:= BOOLEAN (App^.MagicPB^.IntOut[1]);
 GetBoolean:= BOOLEAN (App^.MagicPB^.IntOut[0]);
END (*GetBoolean*);

FUNCTION GetString (token: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN;
BEGIN
 App^.MagicPB^.AddrIn[0]:= ADDR (token);
 App^.MagicPB^.AddrIn[1]:= ADDR (val);
 CallMagic (1203);
 GetString:= BOOLEAN (App^.MagicPB^.IntOut[0]);
END (*GetString*);

END (*MLProfile*).

